diff --git a/rust-pvz-genetics/Cargo.lock b/rust-pvz-genetics/Cargo.lock index 0e71028..d8f2725 100644 --- a/rust-pvz-genetics/Cargo.lock +++ b/rust-pvz-genetics/Cargo.lock @@ -55,6 +55,12 @@ version = "1.0.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "877a4ace8713b0bcf2a4e7eec82529c029f1d0619886d18145fea96c3ffe5c0f" +[[package]] +name = "fixedbitset" +version = "0.5.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1d674e81391d1e1ab681a28d99df07927c6d4aa5b027d7da16ba32d1d21ecd99" + [[package]] name = "foldhash" version = "0.1.5" @@ -247,6 +253,18 @@ version = "0.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "a846cbc04412cf509efcd8f3694b114fc700a035fb5a37f21517f9fb019f1ebc" +[[package]] +name = "petgraph" +version = "0.8.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8701b58ea97060d5e5b155d383a69952a60943f0e6dfe30b04c287beb0b27455" +dependencies = [ + "fixedbitset", + "hashbrown 0.15.5", + "indexmap", + "serde", +] + [[package]] name = "prettyplease" version = "0.2.37" @@ -332,6 +350,7 @@ name = "rust-pvz-genetics" version = "0.1.0" dependencies = [ "godot", + "petgraph", "rand", "serde", ] diff --git a/rust-pvz-genetics/Cargo.toml b/rust-pvz-genetics/Cargo.toml index 86b8d32..e1ba692 100644 --- a/rust-pvz-genetics/Cargo.toml +++ b/rust-pvz-genetics/Cargo.toml @@ -5,6 +5,7 @@ edition = "2024" [dependencies] godot = "0.4.5" +petgraph = "0.8.3" rand = "0.10.0" serde = { version = "1.0.228", features = ["derive"] } diff --git a/rust-pvz-genetics/src/genetics/manipulations.rs b/rust-pvz-genetics/src/genetics/manipulations.rs index bfb7a95..9a844aa 100644 --- a/rust-pvz-genetics/src/genetics/manipulations.rs +++ b/rust-pvz-genetics/src/genetics/manipulations.rs @@ -79,6 +79,13 @@ impl PairGenomeModificator { (self.genome_a.clone(),self.genome_b.clone()) } pub fn combine(&mut self) -> (Genome,Genome){ + let donor_gene: usize = self.generator.random_range(0..self.genome_a.graph.len()); + let mut extracted = vec![self.genome_a.graph.remove(donor_gene)]; + let mut idx = 0; + while idx < extracted.len() { + for child_idx + idx += 1; + } (self.genome_a.clone(),self.genome_b.clone()) } pub fn cancel(&self) -> (Genome,Genome) { diff --git a/rust-pvz-genetics/src/godot_wrapper/reference_modifiers.rs b/rust-pvz-genetics/src/godot_wrapper/reference_modifiers.rs index 232f53c..f2e2e1f 100644 --- a/rust-pvz-genetics/src/godot_wrapper/reference_modifiers.rs +++ b/rust-pvz-genetics/src/godot_wrapper/reference_modifiers.rs @@ -12,6 +12,15 @@ pub struct ReferencePairModifier { base: Base, } +#[derive(GodotClass)] +#[class(base=Node)] +pub struct ReferenceSingleModifier { + #[export] + godot_genome: Option>, + modifier: Option, + base: Base +} + #[godot_api] impl INode for ReferencePairModifier{ fn init(base: Base) -> Self { @@ -39,6 +48,30 @@ impl INode for ReferencePairModifier{ } +#[godot_api] +impl INode for ReferenceSingleModifier { + fn init(base: Base) -> Self { + Self { + godot_genome: None, + modifier: None, + base + } + } + fn ready(&mut self) { + let Some(genome) = self.godot_genome.as_ref() else { + godot_warn!("The genome is not specified!"); + return; + }; + + let Some(genome) = genome.bind().get_genome() else { + godot_warn!("Genome does not contain a genome!"); + return; + }; + + self.modifier = Some(SingleGenomeModificator::new(genome)); + } +} + #[godot_api] impl ReferencePairModifier { #[func] @@ -63,5 +96,15 @@ impl ReferencePairModifier { godot_error!("Modifier is not initialized!"); } } + #[func] + fn combine(&mut self) { + if let Some(pair) = self.modifier.as_mut() { + let (genome_a,genome_b) = pair.combine(); + 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); + } + else { + godot_error!("Modifier is not initialized!"); + } + } } -