build(agent): molt-by#23c260 iteration
This commit is contained in:
parent
48c5475e1c
commit
f074eef367
|
|
@ -20,3 +20,9 @@ How to run tests and build:
|
|||
|
||||
This is an MVP. Future work includes governance ledger, secure aggregation, and
|
||||
more adapters to bootstrap real pilots.
|
||||
|
||||
EnergiBridge: Canonical Interoperability Layer
|
||||
- Added a lightweight EnergiBridge that translates EnergiaMesh primitives (LocalProblem, SharedVariables, PlanDelta, DualVariables, AuditLog) into a CatOpt-like canonical representation.
|
||||
- Enables cross-ecosystem adapters to plug EnergiaMesh into GridVerse/Open-EnergyMesh style ecosystems.
|
||||
- Public API: EnergiBridge.to_catopt(obj) and EnergiBridge.translate_batch(objs).
|
||||
- Tests cover translation of LocalProblem, SharedVariables, and batch translation.
|
||||
|
|
|
|||
|
|
@ -5,6 +5,7 @@ contract-driven federation across devices.
|
|||
"""
|
||||
|
||||
from .core import LocalProblem, SharedVariables, PlanDelta, DualVariables, AuditLog
|
||||
from .bridge import EnergiBridge
|
||||
from .registry import GraphOfContractsRegistry
|
||||
|
||||
__all__ = [
|
||||
|
|
@ -14,4 +15,5 @@ __all__ = [
|
|||
"DualVariables",
|
||||
"AuditLog",
|
||||
"GraphOfContractsRegistry",
|
||||
"EnergiBridge",
|
||||
]
|
||||
|
|
|
|||
|
|
@ -0,0 +1,49 @@
|
|||
from __future__ import annotations
|
||||
|
||||
"""EnergiBridge: canonical bridge for cross-ecosystem interoperability.
|
||||
|
||||
This module provides a minimal, production-friendly bridge that maps
|
||||
EnergiaMesh core primitives to a CatOpt-like canonical form. It is designed
|
||||
to be lightweight MVP-friendly, serializable, and usable by adapters across
|
||||
vendors. The bridge intentionally delegates complex translation to the
|
||||
CatOptBridge for core primitives to keep concerns separated.
|
||||
"""
|
||||
|
||||
from typing import Any, Dict
|
||||
|
||||
from energiamesh.catopt_bridge import CatOptBridge
|
||||
from energiamesh.core import (
|
||||
LocalProblem,
|
||||
SharedVariables,
|
||||
PlanDelta,
|
||||
DualVariables,
|
||||
AuditLog,
|
||||
)
|
||||
|
||||
|
||||
class EnergiBridge:
|
||||
"""Canonical bridge translating EnergiaMesh primitives into CatOpt-like dicts."""
|
||||
|
||||
def __init__(self, version: str = "0.1") -> None:
|
||||
self.version = version
|
||||
self._bridge = CatOptBridge()
|
||||
|
||||
def to_catopt(self, obj: Any) -> Dict[str, Any]:
|
||||
"""Translate a single EnergiaMesh object into a CatOpt-like dict.
|
||||
|
||||
Supported types: LocalProblem, SharedVariables, PlanDelta,
|
||||
DualVariables, AuditLog.
|
||||
"""
|
||||
# Decorate with version at the top level for traceability
|
||||
base = self._bridge.to_catopt(obj) if obj is not None else {}
|
||||
if not base:
|
||||
raise TypeError(f"Unsupported object type for EnergiBridge: {type(obj)!r}")
|
||||
base["bridge_version"] = self.version
|
||||
return base
|
||||
|
||||
def translate_batch(self, objs: list[Any]) -> list[Dict[str, Any]]:
|
||||
"""Translate a list of EnergiaMesh objects to a list of CatOpt-like dicts."""
|
||||
return [self.to_catopt(o) for o in objs]
|
||||
|
||||
|
||||
__all__ = ["EnergiBridge"]
|
||||
|
|
@ -0,0 +1,30 @@
|
|||
from energiamesh.bridge import EnergiBridge
|
||||
from energiamesh.core import LocalProblem, SharedVariables, PlanDelta, DualVariables, AuditLog
|
||||
|
||||
|
||||
def test_energi_bridge_local_problem_translation():
|
||||
lb = LocalProblem(site_id="site-1", objective="minimize_cost")
|
||||
bridge = EnergiBridge()
|
||||
data = bridge.to_catopt(lb)
|
||||
assert data["type"] == "LocalProblem"
|
||||
assert data["site_id"] == "site-1"
|
||||
assert data["version"] == bridge.version
|
||||
|
||||
|
||||
def test_energi_bridge_shared_variables_translation():
|
||||
sv = SharedVariables(signals={"forecast": {"temp": 20}})
|
||||
bridge = EnergiBridge()
|
||||
data = bridge.to_catopt(sv)
|
||||
assert data["type"] == "SharedVariables"
|
||||
assert "signals" in data
|
||||
|
||||
|
||||
def test_energi_bridge_batch_translation():
|
||||
bridge = EnergiBridge()
|
||||
lb = LocalProblem(site_id="site-2", objective="dispatch")
|
||||
dv = DualVariables(multipliers={"lambda": 1.0})
|
||||
ad = AuditLog()
|
||||
results = bridge.translate_batch([lb, dv, ad])
|
||||
assert isinstance(results, list)
|
||||
assert len(results) == 3
|
||||
assert results[0]["type"] == "LocalProblem"
|
||||
Loading…
Reference in New Issue