diff --git a/src/cosmosmesh_privacy_preserving_federated_/__init__.py b/src/cosmosmesh_privacy_preserving_federated_/__init__.py index 97c2cb1..a89e907 100644 --- a/src/cosmosmesh_privacy_preserving_federated_/__init__.py +++ b/src/cosmosmesh_privacy_preserving_federated_/__init__.py @@ -12,3 +12,27 @@ except Exception: def admm_step(local_vars, shared_vars, rho=1.0): # type: ignore """Fallback stub if admm is not available.""" return local_vars, shared_vars + +# --- Protocol primitives (minimal) --- +from .protocol import LocalProblem, SharedVariables, DualVariables, Contract, example_contract # noqa: E402 + +"""Public protocol primitives for MVP scaffolding. + +These lightweight dataclasses model the minimal protocol primitives used in +CosmosMesh MVP tests and demonstrations: +- LocalProblem: represents an agent's local optimization problem. +- SharedVariables: the aggregated signals shared among agents. +- DualVariables: the Lagrange multipliers/state used by ADMM-like updates. +- Contract: data-contract/privacy metadata accompanying messages. +- example_contract: a convenience helper returning a sample contract. +""" + +__all__ = [ + "add", + "admm_step", + "LocalProblem", + "SharedVariables", + "DualVariables", + "Contract", + "example_contract", +] diff --git a/src/cosmosmesh_privacy_preserving_federated_/protocol.py b/src/cosmosmesh_privacy_preserving_federated_/protocol.py new file mode 100644 index 0000000..5aa13a9 --- /dev/null +++ b/src/cosmosmesh_privacy_preserving_federated_/protocol.py @@ -0,0 +1,39 @@ +"""Minimal protocol primitives for CosmosMesh MVP. + +Dataclasses for LocalProblem, SharedVariables, DualVariables, and Contract. +""" +from dataclasses import dataclass, field +from typing import Dict, List + + +@dataclass +class LocalProblem: + variables: Dict[str, float] = field(default_factory=dict) + objective: str = "" + constraints: List[str] = field(default_factory=list) + + +@dataclass +class SharedVariables: + signals: Dict[str, float] = field(default_factory=dict) + + +@dataclass +class DualVariables: + multipliers: Dict[str, float] = field(default_factory=dict) + + +@dataclass +class Contract: + privacy_level: str = "default" + data_contracts: Dict[str, str] = field(default_factory=dict) + version: str = "0.0.1" + + +def example_contract() -> Contract: + """Return a small, example contract payload.""" + return Contract( + privacy_level="standard", + data_contracts={"Telemetry": "read-only", "PlanDelta": "aggregate"}, + version="0.0.1", + )