build(agent): molt-y#23e5c8 iteration
This commit is contained in:
parent
97519bc61a
commit
69f0cddaa4
|
|
@ -0,0 +1,74 @@
|
|||
"""Minimal CatOpt bridge for EnergiaMesh primitives.
|
||||
|
||||
This module provides a lightweight, language-agnostic translation layer
|
||||
that maps EnergiaMesh core primitives (LocalProblem, SharedVariables,
|
||||
PlanDelta, DualVariables, AuditLog) into a canonical CatOpt-like
|
||||
representation. The goal is to bootstrap interoperability while keeping
|
||||
the implementation tiny and well-scoped for the MVP.
|
||||
"""
|
||||
|
||||
from __future__ import annotations
|
||||
|
||||
from dataclasses import dataclass
|
||||
from typing import Any, Dict
|
||||
|
||||
from energiamesh.core import LocalProblem, SharedVariables, PlanDelta, DualVariables, AuditLog
|
||||
|
||||
|
||||
@dataclass
|
||||
class CatOptBridge:
|
||||
"""Tiny bridge translating EnergiaMesh primitives to CatOpt-like dicts."""
|
||||
|
||||
version: str = "0.1"
|
||||
|
||||
def to_catopt(self, obj: Any) -> Dict[str, Any]:
|
||||
"""Translate a supported EnergiaMesh object to a CatOpt-like dict.
|
||||
|
||||
This is intentionally minimal and focuses on the structural
|
||||
information needed for cross-domain interoperability in the MVP.
|
||||
"""
|
||||
if isinstance(obj, LocalProblem):
|
||||
return {
|
||||
"type": "LocalProblem",
|
||||
"version": self.version,
|
||||
"site_id": obj.site_id,
|
||||
"objective": obj.objective,
|
||||
"variables": obj.variables,
|
||||
"constraints": obj.constraints,
|
||||
"status": obj.status,
|
||||
}
|
||||
if isinstance(obj, SharedVariables):
|
||||
return {
|
||||
"type": "SharedVariables",
|
||||
"version": self.version,
|
||||
"signals": obj.signals,
|
||||
"version_tag": obj.version,
|
||||
"timestamp": obj.timestamp,
|
||||
}
|
||||
if isinstance(obj, PlanDelta):
|
||||
return {
|
||||
"type": "PlanDelta",
|
||||
"version": self.version,
|
||||
"delta_id": obj.delta_id,
|
||||
"updates": obj.updates,
|
||||
"metadata": obj.metadata,
|
||||
"timestamp": obj.timestamp,
|
||||
}
|
||||
if isinstance(obj, DualVariables):
|
||||
return {
|
||||
"type": "DualVariables",
|
||||
"version": self.version,
|
||||
"multipliers": obj.multipliers,
|
||||
"primal": obj.primal,
|
||||
"timestamp": obj.timestamp,
|
||||
}
|
||||
if isinstance(obj, AuditLog):
|
||||
return {
|
||||
"type": "AuditLog",
|
||||
"version": self.version,
|
||||
"entries": obj.entries,
|
||||
}
|
||||
raise TypeError(f"Unsupported object type for CatOptBridge: {type(obj)!r}")
|
||||
|
||||
|
||||
__all__ = ["CatOptBridge"]
|
||||
|
|
@ -0,0 +1,36 @@
|
|||
from energiamesh.catopt_bridge import CatOptBridge
|
||||
from energiamesh.core import LocalProblem, SharedVariables, PlanDelta, DualVariables, AuditLog
|
||||
|
||||
|
||||
def test_catopt_bridge_local_problem():
|
||||
lp = LocalProblem(site_id="SiteA", objective="minimize_cost")
|
||||
bridge = CatOptBridge()
|
||||
catopt = bridge.to_catopt(lp)
|
||||
assert catopt["type"] == "LocalProblem"
|
||||
assert catopt["site_id"] == "SiteA"
|
||||
|
||||
|
||||
def test_catopt_bridge_shared_variables():
|
||||
sv = SharedVariables()
|
||||
sv.update("forecast", {"temp": 20})
|
||||
bridge = CatOptBridge()
|
||||
catopt = bridge.to_catopt(sv)
|
||||
assert catopt["type"] == "SharedVariables"
|
||||
assert "forecast" in catopt["signals"]
|
||||
|
||||
|
||||
def test_catopt_bridge_plan_delta_and_dual_variables():
|
||||
pd = PlanDelta(delta_id="d1", updates={"x": 1})
|
||||
dv = DualVariables(multipliers={"p": 0.5}, primal={"y": 2})
|
||||
bridge = CatOptBridge()
|
||||
assert bridge.to_catopt(pd)["type"] == "PlanDelta"
|
||||
assert bridge.to_catopt(dv)["type"] == "DualVariables"
|
||||
|
||||
|
||||
def test_catopt_bridge_audit_log():
|
||||
al = AuditLog()
|
||||
al.add_entry({"event": "start"})
|
||||
bridge = CatOptBridge()
|
||||
catopt = bridge.to_catopt(al)
|
||||
assert catopt["type"] == "AuditLog"
|
||||
assert isinstance(catopt["entries"], list)
|
||||
Loading…
Reference in New Issue