Genome builder basics

This commit is contained in:
rendo 2026-03-26 13:29:28 +05:00
commit fdb5e59eff
5 changed files with 86 additions and 5 deletions

View file

@ -11,3 +11,12 @@ pub enum GeneType {
Consumer, Consumer,
Modifier, Modifier,
} }
impl Gene {
pub fn new(place_str: impl Into<String>, kind: GeneType) -> Self {
Self {
place: place_str.into(),
kind,
}
}
}

View file

@ -1,8 +1,8 @@
use crate::genetics::{gene::Gene, edge::Edge}; use crate::genetics::{gene::Gene, edge::Edge};
pub struct PlantGenome { pub struct PlantGenome {
genes: Vec<Gene>, pub(crate) genes: Vec<Gene>,
edges: Vec<Edge> pub(crate) edges: Vec<Edge>
} }
impl PlantGenome { impl PlantGenome {
@ -16,13 +16,13 @@ impl PlantGenome {
if let None = parent && self.genes.len() > 0 { if let None = parent && self.genes.len() > 0 {
return Some(PlantGenomeInsertError::RootExists); return Some(PlantGenomeInsertError::RootExists);
} }
if let Some(_) = self.genes.iter().find(|g| **g == gene){ if self.genes.contains(&gene){
return Some(PlantGenomeInsertError::GeneExists); return Some(PlantGenomeInsertError::GeneExists);
} }
if let Some(parent_gene) = parent { if let Some(parent_gene) = parent {
let edge = Edge::new(parent_gene,gene.clone()); let edge = Edge::new(parent_gene,gene.clone());
if let Some(_) = self.edges.iter().find(|e| **e == edge) { if self.edges.contains(&edge) {
return Some(PlantGenomeInsertError::EdgeExists); return Some(PlantGenomeInsertError::EdgeExists);
} }
self.edges.push(edge); self.edges.push(edge);
@ -32,7 +32,7 @@ impl PlantGenome {
self.update_graph(); self.update_graph();
return None; return None;
} }
fn update_graph(&mut self) { pub(crate) fn update_graph(&mut self) {
// Sort by parent to guarantee root at [0] // Sort by parent to guarantee root at [0]
self.edges.sort(); self.edges.sort();
} }
@ -46,6 +46,7 @@ impl PlantGenome {
} }
} }
#[derive(Debug)]
pub enum PlantGenomeInsertError { pub enum PlantGenomeInsertError {
GeneExists, GeneExists,
EdgeExists, EdgeExists,

View file

@ -0,0 +1,63 @@
use crate::genetics::prelude::*;
pub struct GenomeBuilder {
genome: PlantGenome,
current_gene: usize,
}
impl GenomeBuilder {
pub fn new() -> Self {
Self {
genome: PlantGenome::new(),
current_gene: 0
}
}
pub fn finish(mut self) -> PlantGenome {
self.genome.update_graph();
return self.genome;
}
pub fn create_root(mut self, root: Gene) -> Result<Self,GenomeBuilderError> {
if self.genome.genes.len() > 0 {
return Err(GenomeBuilderError::RootExists);
}
self.genome.genes.push(root);
return Ok(self);
}
pub fn insert_gene(mut self, gene: Gene, parent: Gene) -> Result<Self,GenomeBuilderError> {
if self.genome.genes.contains(&gene){
return Err(GenomeBuilderError::GeneExists);
}
let edge = Edge::new(parent,gene.clone());
if self.genome.edges.contains(&edge) {
return Err(GenomeBuilderError::EdgeExists);
}
self.genome.edges.push(edge);
self.current_gene = self.genome.genes.len();
self.genome.genes.push(gene);
Ok(self)
}
pub fn add_gene(mut self, gene: Gene) -> Result<Self,GenomeBuilderError> {
if self.genome.genes.len() == 0 {
return Err(GenomeBuilderError::RootDoesntExist);
}
todo!();
}
}
#[derive(Debug)]
pub enum GenomeBuilderError {
RootExists,
RootDoesntExist,
GeneExists,
EdgeExists,
}

View file

@ -4,6 +4,7 @@ pub mod plant_templates;
pub mod edge; pub mod edge;
pub mod gene; pub mod gene;
pub mod genome; pub mod genome;
pub mod genome_builder;
pub mod prelude { pub mod prelude {
pub use crate::genetics::edge::*; pub use crate::genetics::edge::*;

View file

@ -0,0 +1,7 @@
use crate::genetics::{genome_builder::GenomeBuilder, prelude::*};
pub fn peashooter_template() -> PlantGenome {
GenomeBuilder::new()
.create_root(Gene::new("base", GeneType::Producer)).unwrap()
.finish()
}