import random from multi_swarm.genome.crossover import uniform_crossover from multi_swarm.genome.hypothesis import HypothesisAgentGenome, ModelTier def make(name: str) -> HypothesisAgentGenome: return HypothesisAgentGenome( system_prompt=f"prompt-{name}", feature_access=["close"] if name == "A" else ["close", "volume"], temperature=0.7 if name == "A" else 1.1, top_p=0.9, model_tier=ModelTier.C, lookback_window=100 if name == "A" else 300, cognitive_style="physicist" if name == "A" else "biologist", ) def test_crossover_lineage() -> None: p1 = make("A") p2 = make("B") rng = random.Random(0) child = uniform_crossover(p1, p2, rng) assert sorted(child.parent_ids[-2:]) == sorted([p1.id, p2.id]) assert child.generation == max(p1.generation, p2.generation) + 1 def test_crossover_inherits_each_field_from_one_parent() -> None: p1 = make("A") p2 = make("B") rng = random.Random(0) child = uniform_crossover(p1, p2, rng) assert child.system_prompt in (p1.system_prompt, p2.system_prompt) assert child.temperature in (p1.temperature, p2.temperature) assert child.lookback_window in (p1.lookback_window, p2.lookback_window) assert child.cognitive_style in (p1.cognitive_style, p2.cognitive_style) def test_crossover_deterministic_with_same_seed() -> None: p1 = make("A") p2 = make("B") c1 = uniform_crossover(p1, p2, random.Random(42)) c2 = uniform_crossover(p1, p2, random.Random(42)) assert c1.to_dict() == c2.to_dict()