Source code for habitat.analysis.operation
[docs]class Operation:
"""
Abstract representation of a logical operation in a model.
"""
[docs] def __repr__(self):
return self.name
@property
[docs] def run_time_ms(self):
if self.backward is None:
return self.forward.run_time_ms
return self.forward.run_time_ms + self.backward.run_time_ms
@property
[docs] def ktime_ns(self):
if self.backward is None:
return self.forward.ktime_ns
return self.forward.ktime_ns + self.backward.ktime_ns
@property
[docs] def arguments(self):
return None
@property
[docs] def forward(self):
raise NotImplementedError
@property
[docs] def backward(self):
raise NotImplementedError
@property
[docs] def name(self):
raise NotImplementedError
@property
[docs] def device(self):
raise NotImplementedError
[docs] def to_device(self, dest_device, predictor):
raise NotImplementedError
[docs]class MeasuredOperation(Operation):
def __init__(
self,
name,
arguments,
forward,
backward,
device,
):
super().__init__()
self._name = name
self._arguments = arguments
self._forward = forward
self._backward = backward
self._device = device
@property
[docs] def name(self):
return self._name
@property
[docs] def arguments(self):
return self._arguments
@property
[docs] def forward(self):
return self._forward
@property
[docs] def backward(self):
return self._backward
@property
[docs] def device(self):
return self._device
[docs] def to_device(self, dest_device, predictor):
if dest_device.name == self._device.name:
return self
return predictor.predict_operation(self, dest_device)
[docs]class PredictedOperation(Operation):
def __init__(
self,
measured_operation,
forward,
backward,
device
):
self._measured_operation = measured_operation
self._forward = forward
self._backward = backward
self._device = device
@property
[docs] def name(self):
return self._measured_operation.name
@property
[docs] def arguments(self):
return self._measured_operation.arguments
@property
[docs] def forward(self):
return self._forward
@property
[docs] def backward(self):
return self._backward
@property
[docs] def device(self):
return self._device
[docs] def to_device(self, dest_device, predictor):
raise RuntimeError(
'Cannot make a prediction using a predicted operation.',
)