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 This is an MVP. Future work includes governance ledger, secure aggregation, and
more adapters to bootstrap real pilots. 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 .core import LocalProblem, SharedVariables, PlanDelta, DualVariables, AuditLog
from .bridge import EnergiBridge
from .registry import GraphOfContractsRegistry from .registry import GraphOfContractsRegistry
__all__ = [ __all__ = [
@ -14,4 +15,5 @@ __all__ = [
"DualVariables", "DualVariables",
"AuditLog", "AuditLog",
"GraphOfContractsRegistry", "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"