From 54139a54a425eb2a97f85f51a8b2c8e16f796a78 Mon Sep 17 00:00:00 2001 From: agent-23e5c897f40fd19e Date: Wed, 15 Apr 2026 20:01:26 +0200 Subject: [PATCH] build(agent): molt-y#23e5c8 iteration --- .../__init__.py | 11 ++- .../reference_adapters.py | 75 +++++++++++++++++++ tests/test_adapters.py | 24 ++++++ 3 files changed, 109 insertions(+), 1 deletion(-) create mode 100644 src/cosmosmesh_privacy_preserving_federated_/reference_adapters.py create mode 100644 tests/test_adapters.py diff --git a/src/cosmosmesh_privacy_preserving_federated_/__init__.py b/src/cosmosmesh_privacy_preserving_federated_/__init__.py index 59f5831..41bd689 100644 --- a/src/cosmosmesh_privacy_preserving_federated_/__init__.py +++ b/src/cosmosmesh_privacy_preserving_federated_/__init__.py @@ -2,9 +2,18 @@ from .catopt_bridge import CatOptBridge from .contract_registry import REGISTRY, register_contract, get_contract +from .reference_adapters import RoverPlannerAdapter, HabitatLifeSupportAdapter def add(a, b): """Tiny compatibility helper used by tests.""" return a + b -__all__ = ["CatOptBridge", "REGISTRY", "register_contract", "get_contract", "add"] +__all__ = [ + "CatOptBridge", + "REGISTRY", + "register_contract", + "get_contract", + "RoverPlannerAdapter", + "HabitatLifeSupportAdapter", + "add", +] diff --git a/src/cosmosmesh_privacy_preserving_federated_/reference_adapters.py b/src/cosmosmesh_privacy_preserving_federated_/reference_adapters.py new file mode 100644 index 0000000..b88ba0f --- /dev/null +++ b/src/cosmosmesh_privacy_preserving_federated_/reference_adapters.py @@ -0,0 +1,75 @@ +"""Reference adapters for CosmosMesh CatOpt MVP. + +Two toy adapters illustrate how a rover planner and habitat life-support +module could interface with the CatOpt bridge. These are intentionally +lightweight, pure-Python stubs intended for MVP testing and demonstration. +""" + +from __future__ import annotations + +from typing import Any, Dict + + +class BaseAdapter: + def __init__(self, name: str) -> None: + self.name = name + + def readState(self) -> Dict[str, Any]: # pragma: no cover - interface only + raise NotImplementedError + + def exposeLocalProblemData(self) -> Dict[str, Any]: # pragma: no cover + raise NotImplementedError + + def applyCommand(self, command: Dict[str, Any]) -> Dict[str, Any]: # pragma: no cover + raise NotImplementedError + + +class RoverPlannerAdapter(BaseAdapter): + """Toy rover planner adapter. + + This adapter exposes a very small LocalProblem-like payload and can + accept simple commands. It serves as a scaffold for a real rover-planner + integration. + """ + + def __init__(self) -> None: + super().__init__("rover-planner") + + def readState(self) -> Dict[str, Any]: + return {"rover": {"id": "rover-1", "status": "idle"}} + + def exposeLocalProblemData(self) -> Dict[str, Any]: + return { + "name": "RoverTask", + "variables": [{"name": "x", "domain": "R"}], + "objective": {"type": "quadratic"}, + "constraints": [], + } + + def applyCommand(self, command: Dict[str, Any]) -> Dict[str, Any]: + # Echo back a simple acknowledgement for the MVP + return {"adapter": self.name, "status": "accepted", "command": command} + + +class HabitatLifeSupportAdapter(BaseAdapter): + """Toy habitat life-support adapter. + + Lightweight stand-in for a habitat module scheduler interface. + """ + + def __init__(self) -> None: + super().__init__("habitat-life-support") + + def readState(self) -> Dict[str, Any]: + return {"habitat": {"id": "hab-1", "status": "idle"}} + + def exposeLocalProblemData(self) -> Dict[str, Any]: + return { + "name": "HabitatTask", + "variables": [{"name": "p_supply", "domain": "R"}], + "objective": {"type": "quadratic"}, + "constraints": [], + } + + def applyCommand(self, command: Dict[str, Any]) -> Dict[str, Any]: + return {"adapter": self.name, "status": "accepted", "command": command} diff --git a/tests/test_adapters.py b/tests/test_adapters.py new file mode 100644 index 0000000..4543d2c --- /dev/null +++ b/tests/test_adapters.py @@ -0,0 +1,24 @@ +import pytest + +from cosmosmesh_privacy_preserving_federated_.reference_adapters import ( + RoverPlannerAdapter, + HabitatLifeSupportAdapter, +) + + +def test_rover_adapter_basic(): + rover = RoverPlannerAdapter() + assert isinstance(rover.readState(), dict) + data = rover.exposeLocalProblemData() + assert isinstance(data, dict) + resp = rover.applyCommand({"cmd": "test"}) + assert resp.get("status") == "accepted" + + +def test_habitat_adapter_basic(): + hab = HabitatLifeSupportAdapter() + assert isinstance(hab.readState(), dict) + data = hab.exposeLocalProblemData() + assert isinstance(data, dict) + resp = hab.applyCommand({"cmd": "test"}) + assert resp.get("status") == "accepted"