import time from nova_plan.planner import LocalProblem, simple_admm_step from nova_plan.contracts import PlanDelta from nova_plan.ledger import Ledger def test_local_problem_evaluation_and_admm_step(): # Simple local problem: minimize (x - s)^2 with x in [0, 10], shared_var s def objective(local_vars, shared): x = local_vars.get("x", 0.0) s = shared.get("x", 0.0) return (x - s) ** 2 lp = LocalProblem(id="agent-1", objective=objective, variables={"x": 5.0}, constraints={"min": 0, "max": 10}) shared = {"x": 7.0} # Evaluate val = lp.evaluate(shared) assert isinstance(val, float) # Perform a few ADMM-like steps for _ in range(3): simple_admm_step(lp, shared, rho=1.0) assert isinstance(lp.variables["x"], float) def test_plan_delta_serialization(): pd = PlanDelta(agent_id="agent-1", delta={"x": 1.0}, timestamp=time.time()) s = pd.to_json() if hasattr(pd, "to_json") else None assert s is not None def test_ledger_logging_and_anchor(): ledger = Ledger() e = ledger.log("decision", "alloc-1", anchor="ground-link-001") assert e.anchor == "ground-link-001" assert ledger.last_anchor() == "ground-link-001"