52 lines
1.6 KiB
Python
52 lines
1.6 KiB
Python
from catopt_swarm import (
|
|
ADMMSolver,
|
|
ContractRegistry,
|
|
ContractSpec,
|
|
DroneControllerAdapter,
|
|
GroundRoverControllerAdapter,
|
|
LocalProblem,
|
|
SafetyPolicy,
|
|
verify_swarm_solution,
|
|
)
|
|
from catopt_swarm.registry import check_adapter_conformance
|
|
|
|
|
|
def test_solver_converges_and_respects_safety_policy():
|
|
robots = [
|
|
LocalProblem(robot_id="drone-1", target_pos=0.0, current_pos=0.0),
|
|
LocalProblem(robot_id="drone-2", target_pos=10.0, current_pos=10.0),
|
|
]
|
|
policy = SafetyPolicy(max_travel_distance=15.0, min_separation=1.0, energy_budget=20.0)
|
|
solution = ADMMSolver(rho=1.5, max_iter=40, epsilon=1e-4).solve(robots, policy)
|
|
|
|
assert solution.certificate.converged
|
|
assert abs(solution.consensus - 5.0) < 0.25
|
|
assert verify_swarm_solution(solution, policy).passed
|
|
|
|
|
|
def test_contract_registry_and_adapter_conformance():
|
|
registry = ContractRegistry()
|
|
spec = ContractSpec(
|
|
contract_id="drone-patrol-v1",
|
|
adapter_name="drone-controller",
|
|
domain="aerial",
|
|
version="1.0.0",
|
|
invariants=("collision_free", "energy_budgeted"),
|
|
)
|
|
registry.register(spec)
|
|
|
|
adapter = DroneControllerAdapter()
|
|
report = check_adapter_conformance(adapter, spec)
|
|
|
|
assert registry.has_contract("drone-patrol-v1")
|
|
assert report.passed
|
|
|
|
|
|
def test_rover_adapter_maps_mission_to_problem():
|
|
adapter = GroundRoverControllerAdapter()
|
|
problem = adapter.to_local_problem("rover-1", {"target_pos": 3.5, "initial_pos": 1.0})
|
|
|
|
assert problem.robot_id == "rover-1"
|
|
assert problem.target_pos == 3.5
|
|
assert problem.initial_pos == 1.0
|