From 8d46e9218a007d98e4a5af4867988e18ffc7d9bb Mon Sep 17 00:00:00 2001 From: rendo Date: Mon, 6 Apr 2026 11:01:15 +0500 Subject: [PATCH] Broad categoric --- godot-pvz-genetics/scenes/world.tscn | 6 ++++++ godot-pvz-genetics/ui/debug_modifiers.gd | 7 ++++++- rust-pvz-genetics/src/genetics/manipulations.rs | 14 +++++++++++--- .../src/godot_wrapper/reference_modifiers.rs | 4 ++-- 4 files changed, 25 insertions(+), 6 deletions(-) diff --git a/godot-pvz-genetics/scenes/world.tscn b/godot-pvz-genetics/scenes/world.tscn index fd4e232..d2e1538 100644 --- a/godot-pvz-genetics/scenes/world.tscn +++ b/godot-pvz-genetics/scenes/world.tscn @@ -49,9 +49,15 @@ layout_mode = 2 size_flags_horizontal = 3 text = "Категориальная трансформация" +[node name="CategoricBroad" type="Button" parent="CanvasLayer/HBoxContainer" unique_id=575186107] +layout_mode = 2 +size_flags_horizontal = 3 +text = "Категориальная трансформация (обобщённая)" + [node name="ReferencePairModifier" type="ReferencePairModifier" parent="CanvasLayer" unique_id=2068562861 node_paths=PackedStringArray("godot_genome_a", "godot_genome_b")] godot_genome_a = NodePath("../../GenomeA") godot_genome_b = NodePath("../../GenomeB") [connection signal="pressed" from="CanvasLayer/HBoxContainer/Allelic" to="CanvasLayer/HBoxContainer" method="_on_allelic_pressed"] [connection signal="pressed" from="CanvasLayer/HBoxContainer/Categoric" to="CanvasLayer/HBoxContainer" method="_on_categoric_pressed"] +[connection signal="pressed" from="CanvasLayer/HBoxContainer/CategoricBroad" to="CanvasLayer/HBoxContainer" method="_on_categoric_broad_pressed"] diff --git a/godot-pvz-genetics/ui/debug_modifiers.gd b/godot-pvz-genetics/ui/debug_modifiers.gd index 2a97896..f34dc5a 100644 --- a/godot-pvz-genetics/ui/debug_modifiers.gd +++ b/godot-pvz-genetics/ui/debug_modifiers.gd @@ -7,5 +7,10 @@ func _on_allelic_pressed() -> void: func _on_categoric_pressed() -> void: - reference_pair_modifier.categoric_crossingover() + reference_pair_modifier.categoric_crossingover(false) + + + +func _on_categoric_broad_pressed() -> void: + reference_pair_modifier.categoric_crossingover(true) diff --git a/rust-pvz-genetics/src/genetics/manipulations.rs b/rust-pvz-genetics/src/genetics/manipulations.rs index c38c418..bfb7a95 100644 --- a/rust-pvz-genetics/src/genetics/manipulations.rs +++ b/rust-pvz-genetics/src/genetics/manipulations.rs @@ -41,17 +41,25 @@ impl PairGenomeModificator { (self.genome_a.clone(),self.genome_b.clone()) } - pub fn categoric_crossingover(&mut self, chance: Option) -> (Genome,Genome) { + pub fn categoric_crossingover(&mut self, chance: Option,broad: Option) -> (Genome,Genome) { let threshold = chance.unwrap_or(2).max(2); let mut categories_a: HashMap> = HashMap::new(); let mut categories_b: HashMap> = HashMap::new(); for (i, (gene, _)) in self.genome_a.graph.iter().enumerate() { - categories_a.entry(gene.place.to_string()).or_default().push(i); + if broad.unwrap_or(false){ + categories_a.entry(gene.place.broad().to_string()).or_default().push(i); + } else { + categories_a.entry(gene.place.to_string()).or_default().push(i); + } } for (i, (gene, _)) in self.genome_b.graph.iter().enumerate() { - categories_b.entry(gene.place.to_string()).or_default().push(i); + if broad.unwrap_or(false){ + categories_b.entry(gene.place.broad().to_string()).or_default().push(i); + } else { + categories_b.entry(gene.place.to_string()).or_default().push(i); + } } for (category, indices_a) in &categories_a { diff --git a/rust-pvz-genetics/src/godot_wrapper/reference_modifiers.rs b/rust-pvz-genetics/src/godot_wrapper/reference_modifiers.rs index 71d100f..232f53c 100644 --- a/rust-pvz-genetics/src/godot_wrapper/reference_modifiers.rs +++ b/rust-pvz-genetics/src/godot_wrapper/reference_modifiers.rs @@ -53,9 +53,9 @@ impl ReferencePairModifier { } } #[func] - fn categoric_crossingover(&mut self) { + fn categoric_crossingover(&mut self, broad: bool) { if let Some(pair) = self.modifier.as_mut() { - let (genome_a,genome_b) = pair.categoric_crossingover(None); + let (genome_a,genome_b) = pair.categoric_crossingover(None,Some(broad)); self.godot_genome_a.as_mut().unwrap().bind_mut().set_genome(genome_a); self.godot_genome_b.as_mut().unwrap().bind_mut().set_genome(genome_b); }