idea159-arbsphere-federated.../arbsphere/energi_bridge.py

57 lines
2.4 KiB
Python

"""EnergiBridge-like canonical IR bridge for ArbSphere primitives.
Provides simple to_json / from_json translations between ArbSphere primitives
and a lightweight Graph-of-Contracts (GoC) like payload format.
This is intentionally minimal as a scaffold for MVP interoperability.
"""
from __future__ import annotations
from typing import Dict, Any
from .primitives import LocalArbProblem, SharedSignals, PlanDelta, DualVariables, PrivacyBudget, AuditLog, TimeRounds, GoCRegistry
def to_ir(obj: object) -> Dict[str, Any]:
"""Serialize a primitive to a canonical IR dict."""
if isinstance(obj, LocalArbProblem):
return {"contract_type": "LocalArbProblem", "payload": obj.to_json()}
if isinstance(obj, SharedSignals):
return {"contract_type": "SharedSignals", "payload": obj.to_json()}
if isinstance(obj, PlanDelta):
return {"contract_type": "PlanDelta", "payload": obj.to_json()}
if isinstance(obj, DualVariables):
return {"contract_type": "DualVariables", "payload": obj.to_json()}
if isinstance(obj, PrivacyBudget):
return {"contract_type": "PrivacyBudget", "payload": obj.to_json()}
if isinstance(obj, AuditLog):
return {"contract_type": "AuditLog", "payload": obj.to_json()}
if isinstance(obj, TimeRounds):
return {"contract_type": "TimeRounds", "payload": obj.to_json()}
if isinstance(obj, GoCRegistry):
return {"contract_type": "GoCRegistry", "payload": obj.to_json()}
raise TypeError(f"Unsupported type for IR translation: {type(obj)}")
def from_ir(payload: Dict[str, Any]) -> object:
"""Deserialize a canonical IR payload back into a primitive instance when possible."""
ct = payload.get("contract_type")
data = payload.get("payload", {})
if ct == "LocalArbProblem":
return LocalArbProblem.from_json(data)
if ct == "SharedSignals":
return SharedSignals.from_json(data)
if ct == "PlanDelta":
return PlanDelta.from_json(data)
if ct == "DualVariables":
return DualVariables.from_json(data)
if ct == "PrivacyBudget":
return PrivacyBudget.from_json(data)
if ct == "AuditLog":
return AuditLog.from_json(data)
if ct == "TimeRounds":
return TimeRounds.from_json(data)
if ct == "GoCRegistry":
return GoCRegistry.from_json(data)
raise ValueError(f"Unknown contract_type in IR payload: {ct}")