Source code for runtimepy.primitives.float
"""
A module implementing a floating-point primitive interface.
"""
# built-in
import math
from random import random
# internal
from runtimepy.primitives.evaluation import (
EvalResult,
Operator,
PrimitiveIsCloseMixin,
compare_latest,
)
from runtimepy.primitives.scaling import ChannelScaling, invert
from runtimepy.primitives.types.float import Double as _Double
from runtimepy.primitives.types.float import Float as _Float
from runtimepy.primitives.types.float import Half as _Half
[docs]
class BaseFloatPrimitive(PrimitiveIsCloseMixin[float]):
"""A simple primitive class for floating-point numbers."""
def __init__(
self, value: float = 0.0, scaling: ChannelScaling = None, **kwargs
) -> None:
"""Initialize this floating-point primitive."""
super().__init__(value=value, scaling=scaling, **kwargs)
[docs]
def randomize(self, timestamp_ns: int = None) -> None:
"""Set this primitive to a random integer."""
self.set_value(random(), timestamp_ns=timestamp_ns)
def _check_callbacks(self, curr: float, new: float) -> None:
"""Determine if any callbacks should be serviced."""
# Useless to provide NaN to callbacks.
if not math.isnan(new):
super()._check_callbacks(curr, new)
[docs]
async def wait_for_value(
self,
value: float,
timeout: float,
operation: Operator = Operator.EQUAL,
) -> EvalResult:
"""Wait for this primitive to reach a specified state."""
if self.scaling:
value = invert(value, scaling=self.scaling)
return await compare_latest(self, value, timeout, operation=operation)
[docs]
class HalfPrimitive(BaseFloatPrimitive):
"""A simple primitive class for half-precision floating-point."""
kind = _Half
Half = HalfPrimitive
[docs]
class FloatPrimitive(BaseFloatPrimitive):
"""A simple primitive class for single-precision floating-point."""
kind = _Float
Float = FloatPrimitive
[docs]
class DoublePrimitive(BaseFloatPrimitive):
"""A simple primitive class for double-precision floating-point."""
kind = _Double
Double = DoublePrimitive