from __future__ import annotations from dataclasses import dataclass from typing import Literal from app.simulation.core.ports import VariableRole EquationOwner = Literal["connection", "component"] EquationRelation = Literal["equal", "sumToZero", "constitutive", "state"] @dataclass(frozen=True, slots=True) class EquationDefinition: """One declarative equation in the compiled model interface.""" id: str owner: EquationOwner owner_id: str relation: EquationRelation variables: tuple[str, ...] role: VariableRole | None = None def as_definition_dict(self) -> dict[str, object]: return { "id": self.id, "owner": self.owner, "ownerId": self.owner_id, "relation": self.relation, "variables": list(self.variables), "role": self.role, } def as_interface_dict(self) -> dict[str, object]: return self.as_definition_dict()