import time import uuid from typing import Dict, Any from .contracts import LocalProblem, ConstraintSet class DeltaDict(dict): """Dictionary subclass that also allows attribute-style access for keys. E.g., d.id -> same as d['id'] and d.updates -> d['updates'] """ def __getattr__(self, item): try: return self[item] except KeyError as e: raise AttributeError(item) from e def admm_solve(local_problem: Any, shared: Dict[str, Any], constraints: ConstraintSet = None, rho: float = 1.0): # Toy ADMM-lite step: return a delta dict and an updated dict to satisfy tests delta_id = f"pd-{uuid.uuid4()}" ts = time.time() updates: Dict[str, Any] = {} # Support dict-based and object-based local_problem representations if isinstance(local_problem, dict): updates.update(local_problem) elif hasattr(local_problem, "parameters"): updates.update(getattr(local_problem, "parameters")) if isinstance(shared, dict): updates.update(shared) if constraints and hasattr(constraints, "constraints") and constraints.constraints: updates["applied_constraints"] = list(constraints.constraints.keys()) delta = DeltaDict({"id": delta_id, "timestamp": ts, "updates": updates}) # If constraints are provided as a 3rd positional arg, return only the delta object if constraints is not None and isinstance(constraints, ConstraintSet): return delta # Otherwise, return both delta and updates to satisfy 2-arity contract in tests return delta, updates