From 23d9ab696c094fe03eb8535a2368a7a6b22c1d7a Mon Sep 17 00:00:00 2001 From: rendo Date: Thu, 26 Mar 2026 12:12:54 +0500 Subject: [PATCH] Genome restructurized --- rust-pvz-genetics/src/genetics/edge.rs | 31 ++++++++++++++ rust-pvz-genetics/src/genetics/gene.rs | 13 ++++++ rust-pvz-genetics/src/genetics/genome.rs | 53 ++++++++++++++++++++++++ rust-pvz-genetics/src/genetics/mod.rs | 29 +++++-------- rust-pvz-genetics/src/genetics/tests.rs | 1 + 5 files changed, 108 insertions(+), 19 deletions(-) create mode 100644 rust-pvz-genetics/src/genetics/edge.rs create mode 100644 rust-pvz-genetics/src/genetics/gene.rs create mode 100644 rust-pvz-genetics/src/genetics/genome.rs create mode 100644 rust-pvz-genetics/src/genetics/tests.rs diff --git a/rust-pvz-genetics/src/genetics/edge.rs b/rust-pvz-genetics/src/genetics/edge.rs new file mode 100644 index 0000000..281d81f --- /dev/null +++ b/rust-pvz-genetics/src/genetics/edge.rs @@ -0,0 +1,31 @@ +use std::cmp::Ordering; +use crate::genetics::gene::Gene; + +#[derive(PartialEq,Eq,Clone)] +pub struct Edge { + pub from: Gene, + pub to: Gene +} + +impl Edge{ + pub fn new(from: Gene, to: Gene) -> Self { + Self { + from, + to + } + } +} + +impl PartialOrd for Edge { + fn partial_cmp(&self, other: &Self) -> Option { + Some(self.cmp(other)) + } +} + +impl Ord for Edge { + fn cmp(&self, other: &Self) -> Ordering { + if self.from == other.to {return Ordering::Greater;} + else if self.to == other.from {return Ordering::Less;} + else {return Ordering::Equal;} + } +} diff --git a/rust-pvz-genetics/src/genetics/gene.rs b/rust-pvz-genetics/src/genetics/gene.rs new file mode 100644 index 0000000..11b73fb --- /dev/null +++ b/rust-pvz-genetics/src/genetics/gene.rs @@ -0,0 +1,13 @@ +#[derive(PartialEq,Eq,Clone)] +pub struct Gene { + pub place: String, + pub kind: GeneType +} + +#[derive(PartialEq,Eq,Clone)] +pub enum GeneType { + Producer, + Transport, + Consumer, + Modifier, +} diff --git a/rust-pvz-genetics/src/genetics/genome.rs b/rust-pvz-genetics/src/genetics/genome.rs new file mode 100644 index 0000000..f95bf40 --- /dev/null +++ b/rust-pvz-genetics/src/genetics/genome.rs @@ -0,0 +1,53 @@ +use crate::genetics::{gene::Gene, edge::Edge}; + +pub struct PlantGenome { + genes: Vec, + edges: Vec +} + +impl PlantGenome { + pub fn new() -> Self { + Self { + genes: Vec::new(), + edges: Vec::new() + } + } + fn insert_gene(&mut self, gene: Gene, parent: Option) -> Option { + if let None = parent && self.genes.len() > 0 { + return Some(PlantGenomeInsertError::RootExists); + } + if let Some(_) = self.genes.iter().find(|g| **g == gene){ + return Some(PlantGenomeInsertError::GeneExists); + } + + if let Some(parent_gene) = parent { + let edge = Edge::new(parent_gene,gene.clone()); + if let Some(_) = self.edges.iter().find(|e| **e == edge) { + return Some(PlantGenomeInsertError::EdgeExists); + } + self.edges.push(edge); + } + + self.genes.push(gene); + self.update_graph(); + return None; + } + fn update_graph(&mut self) { + // Sort by parent to guarantee root at [0] + self.edges.sort(); + } + pub fn crossingover(&mut self, other: &mut Self) { + + self.update_graph(); + other.update_graph(); + } + pub fn mutation(&mut self) { + self.update_graph(); + } +} + +pub enum PlantGenomeInsertError { + GeneExists, + EdgeExists, + RootExists, +} diff --git a/rust-pvz-genetics/src/genetics/mod.rs b/rust-pvz-genetics/src/genetics/mod.rs index 13f71f5..62cc2bf 100644 --- a/rust-pvz-genetics/src/genetics/mod.rs +++ b/rust-pvz-genetics/src/genetics/mod.rs @@ -1,21 +1,12 @@ -use std::collections::HashMap; +#[cfg(test)] +mod tests; +pub mod plant_templates; +pub mod edge; +pub mod gene; +pub mod genome; -#[derive(Clone,Copy,PartialEq,Eq)] -pub struct GeneID; - -pub trait Gene {} - -#[derive(Default)] -pub struct PlantGenome { - pub edges: HashMap>, - pub vertices: HashMap> -} - -impl PlantGenome { - pub fn new() -> Self { - Self { - edges: HashMap::new(), - vertices: HashMap::new() - } - } +pub mod prelude { + pub use crate::genetics::edge::*; + pub use crate::genetics::genome::*; + pub use crate::genetics::gene::*; } diff --git a/rust-pvz-genetics/src/genetics/tests.rs b/rust-pvz-genetics/src/genetics/tests.rs new file mode 100644 index 0000000..8b13789 --- /dev/null +++ b/rust-pvz-genetics/src/genetics/tests.rs @@ -0,0 +1 @@ +