diff --git a/nova_plan/examples/demo_cross_domain.py b/nova_plan/examples/demo_cross_domain.py new file mode 100644 index 0000000..d8b9df7 --- /dev/null +++ b/nova_plan/examples/demo_cross_domain.py @@ -0,0 +1,69 @@ +"""Demo: Cross-Domain NovaPlan Interop (Rover <-> Habitat). + +This tiny script demonstrates a minimal end-to-end flow across two domain adapters +using the existing bridge primitives. It serves as a quick sanity-check for the +interoperability story and is safe to run in unit-test contexts. +""" + +from __future__ import annotations + +import time + +from nova_plan.planner import LocalProblem +from nova_plan.contracts import PlanDelta +from nova_plan.catopt_bridge import to_object, delta_to_morphism +from nova_plan.energi_bridge import EnergiBridge +from nova_plan.adapters.rover_adapter import RoverAdapter +from nova_plan.adapters.habitat_adapter import HabitatAdapter + + +def run_demo() -> None: + # Create a tiny local rover problem + def rover_objective(local_vars, shared): + # simple quadratic in speed toward a desired velocity in shared space + v = local_vars.get("speed", 0.0) + w = shared.get("speed", 0.0) + return (v - w) ** 2 + + lp = LocalProblem( + id="rover-1", + objective=rover_objective, + variables={"speed": 1.0}, + constraints=None, + ) + + # Canonical object for interoperability + canonical_obj = to_object(lp) + + # Create a PlanDelta from this local problem + delta = PlanDelta(agent_id=lp.id, delta={"speed": lp.variables["speed"]}, timestamp=time.time(), contract_id="rover-1") + morph = delta_to_morphism(delta, contract_id="rover-1") + + # Initialize adapters (toy stubs) + rover = RoverAdapter("rover-1") + habitat = HabitatAdapter("hab-ctrl-01") + + # Rover consumes the morphism-like delta (as a planning task) + rover_status = rover.get_status() + rover_ack = rover.plan_task({"morphism": morph}) + + # Habitat module consumes a related task derived from the delta + habitat_status = habitat.get_status() + habitat_ack = habitat.plan_task({"task_from_delta": morph.data}) + + # Simple printout for inspection + print("Canonical Object:", canonical_obj) + print("Canonical Morphism:", morph) + print("Rover status:", rover_status) + print("Rover ack:", rover_ack) + print("Habitat status:", habitat_status) + print("Habitat ack:", habitat_ack) + + # Demonstrate EnergiBridge contract publishing (signed CaC artifact) + eb = EnergiBridge() + signed_contract = eb.register_contract("demo-cross-domain-contract", {"type": "DemoCrossDomain"}, key="demo-key-123") + print("SignedCaCContract:", signed_contract) + + +if __name__ == "__main__": + run_demo()