from __future__ import annotations from dovla_cil.interventions.samplers import InterventionSampler, RandomInterventionSampler from dovla_cil.sim.registry import get_simulator_backend from dovla_cil.tasks.library import ToyTaskLibrary def test_sampler_returns_exactly_k_or_less_when_impossible() -> None: task = ToyTaskLibrary().get_by_id("toy_pick_object_among_distractors") sim = get_simulator_backend("toy") sim.seed(3) sim.reset_task(task) expert = RandomInterventionSampler(k=1, seed=3).sample(sim.render_observation(), task)[0].action actions = InterventionSampler(seed=9).sample( task=task, observation=sim.render_observation(), symbolic_state=sim.get_symbolic_state(), expert_actions=[expert], k=6, ) assert len(actions) == 6 assert len({action.action_id for action in actions}) == len(actions) def test_sampler_candidate_metadata_and_determinism() -> None: task = ToyTaskLibrary().get_by_id("toy_put_red_mug_in_blue_bowl") sim = get_simulator_backend("toy") sim.seed(5) sim.reset_task(task) expert = RandomInterventionSampler(k=1, seed=5).sample(sim.render_observation(), task)[0].action first = InterventionSampler(seed=11).sample( task, sim.render_observation(), sim.get_symbolic_state(), [expert], 8 ) second = InterventionSampler(seed=11).sample( task, sim.render_observation(), sim.get_symbolic_state(), [expert], 8 ) assert [action.to_dict() for action in first] == [action.to_dict() for action in second] for action in first: assert "candidate_type" in action.metadata assert "intended_target" in action.metadata assert "intended_relation" in action.metadata assert "difficulty" in action.metadata def test_wrong_target_actions_use_distractors_if_present() -> None: task = ToyTaskLibrary().get_by_id("toy_pick_object_among_distractors") sim = get_simulator_backend("toy") sim.seed(7) sim.reset_task(task) actions = InterventionSampler(seed=7).sample( task, sim.render_observation(), sim.get_symbolic_state(), [], 8, ) wrong_targets = [ action.metadata["intended_target"] for action in actions if action.metadata.get("candidate_type") == "wrong_target" ] assert wrong_targets assert set(wrong_targets).issubset(set(task.distractor_object_ids)) def test_near_miss_actions_differ_from_expert() -> None: task = ToyTaskLibrary().get_by_id("toy_put_red_mug_in_blue_bowl") sim = get_simulator_backend("toy") sim.seed(13) sim.reset_task(task) expert = RandomInterventionSampler(k=1, seed=13).sample( sim.render_observation(), task )[0].action actions = InterventionSampler(seed=13).sample( task, sim.render_observation(), sim.get_symbolic_state(), [expert], 8, ) near_misses = [ action for action in actions if action.metadata.get("candidate_type") == "near_miss" ] assert near_misses assert all(action.values != expert.values for action in near_misses)