Source code for momba.engine.time
# -*- coding:utf-8 -*-
#
# Copyright (C) 2021, Saarland University
# Copyright (C) 2021, Maximilian Köhl <koehl@cs.uni-saarland.de>
from __future__ import annotations
import dataclasses as d
import typing as t
import abc
from .. import model
from ._engine import engine as _engine
from . import zones
from .translator import Translation, translate_network
if t.TYPE_CHECKING:
from .explore import Parameters
class InvalidModelType(Exception):
pass
T = t.TypeVar("T")
@d.dataclass(frozen=True)
class CompiledNetwork:
translation: Translation
internal: t.Any
[docs]
class TimeType(abc.ABC):
"""
Base class for time representations.
"""
@staticmethod
@abc.abstractmethod
def compile(
network: model.Network, *, parameters: Parameters = None
) -> CompiledNetwork:
raise NotImplementedError()
@classmethod
@abc.abstractmethod
def load_valuations(cls: t.Type[T], valuations: t.Any) -> T:
raise NotImplementedError()
[docs]
class DiscreteTime(TimeType):
"""
A representation of time without continuous-time clocks.
"""
@staticmethod
def compile(
network: model.Network, *, parameters: Parameters = None
) -> CompiledNetwork:
translation = translate_network(network, parameters=parameters)
if not network.ctx.model_type.is_untimed:
raise InvalidModelType(
f"{network.ctx.model_type} is not a discrete time model type"
)
return CompiledNetwork(
translation, _engine.Explorer.new_no_clocks(translation.json_network)
)
@classmethod
def load_valuations(cls, valuations: t.Any) -> DiscreteTime:
return cls()
@d.dataclass(frozen=True)
class GlobalTime(TimeType):
zone: zones.Zone[float]
@staticmethod
def compile(
network: model.Network, *, parameters: Parameters = None
) -> CompiledNetwork:
translation = translate_network(
network, parameters=parameters, global_clock=True
)
return CompiledNetwork(
translation, _engine.Explorer.new_global_time(translation.json_network)
)
@classmethod
def load_valuations(cls, valuations: t.Any) -> GlobalTime:
return cls(zones._wrap_zone(valuations, zones.ZoneF64))
@d.dataclass(frozen=True)
class ZoneF64(TimeType):
zone: zones.Zone[float]
@staticmethod
def compile(
network: model.Network, *, parameters: Parameters = None
) -> CompiledNetwork:
translation = translate_network(
network, parameters=parameters, global_clock=False
)
return CompiledNetwork(
translation, _engine.Explorer.new_global_time(translation.json_network)
)
@classmethod
def load_valuations(cls, valuations: t.Any) -> ZoneF64:
return cls(zones._wrap_zone(valuations, zones.ZoneF64))