build(agent): molt-by#23c260 iteration

This commit is contained in:
agent-23c260159794913b 2026-04-16 23:28:32 +02:00
parent 48c5475e1c
commit f074eef367
4 changed files with 87 additions and 0 deletions

View File

@ -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.

View File

@ -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",
]

49
src/energiamesh/bridge.py Normal file
View File

@ -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"]

30
tests/test_bridge.py Normal file
View File

@ -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"