Dynamic genome building

This commit is contained in:
Rendo 2026-03-28 20:21:12 +05:00
commit a9615c07a7
5 changed files with 94 additions and 12 deletions

View file

@ -0,0 +1,13 @@
use std::collections::HashMap;
pub enum Variant {
Int(isize),
Float(f32)
}
pub struct ArgumentList(HashMap<String,Variant>);
/*impl ArgumentList {
pub fn get(name: impl Into<String>) -> Option<&Variant> {
}
}*/

View file

@ -6,10 +6,24 @@ pub struct Gene {
#[derive(PartialEq,Eq,Clone)] #[derive(PartialEq,Eq,Clone)]
pub enum GeneType { pub enum GeneType {
Producer, PureProducer {
Transport, create_flow: fn()
Consumer, },
Modifier, Transport {
distribute_between_children: fn()
},
Consumer {
consume: fn()
},
Modifier {
modify_flow: fn()
},
Trigger {
check_trigger: fn()
},
Observer {
observe: fn()
},
} }
impl Gene { impl Gene {
@ -20,3 +34,27 @@ impl Gene {
} }
} }
} }
impl GeneType {
pub fn pure_producer(flow_function: fn()) -> Self {
Self::PureProducer { create_flow: flow_function }
}
pub fn random_distribution() -> Self {
Self::Transport { distribute_between_children: ||{} }
}
pub fn fill_all() -> Self {
Self::Transport { distribute_between_children: ||{} }
}
pub fn consumer(consumer_function: fn()) -> Self {
Self::Consumer { consume: consumer_function }
}
pub fn modifier(modifier_function: fn()) -> Self {
Self::Modifier { modify_flow: modifier_function }
}
pub fn trigger(trigger_function: fn()) -> Self {
Self::Trigger { check_trigger: trigger_function }
}
pub fn observer(observer_function: fn()) -> Self {
Self::Observer { observe: observer_function }
}
}

View file

@ -20,6 +20,7 @@ impl GenomeBuilder {
} }
pub fn create_root(mut self, root: Gene) -> Result<Self,GenomeBuilderError> { pub fn create_root(mut self, root: Gene) -> Result<Self,GenomeBuilderError> {
// Check for root existance
if self.genome.genes.len() > 0 { if self.genome.genes.len() > 0 {
return Err(GenomeBuilderError::RootExists); return Err(GenomeBuilderError::RootExists);
} }
@ -29,15 +30,12 @@ impl GenomeBuilder {
} }
pub fn insert_gene(mut self, gene: Gene, parent: Gene) -> Result<Self,GenomeBuilderError> { pub fn insert_gene(mut self, gene: Gene, parent: Gene) -> Result<Self,GenomeBuilderError> {
// Check for gene collision
if self.genome.genes.contains(&gene){ if self.genome.genes.contains(&gene){
return Err(GenomeBuilderError::GeneExists); return Err(GenomeBuilderError::GeneExists);
} }
let edge = Edge::new(parent,gene.clone()); let edge = Edge::new(parent,gene.clone());
if self.genome.edges.contains(&edge) {
return Err(GenomeBuilderError::EdgeExists);
}
self.genome.edges.push(edge); self.genome.edges.push(edge);
self.current_gene = self.genome.genes.len(); self.current_gene = self.genome.genes.len();
@ -46,10 +44,37 @@ impl GenomeBuilder {
Ok(self) Ok(self)
} }
pub fn add_gene(mut self, gene: Gene) -> Result<Self,GenomeBuilderError> { pub fn add_gene(mut self, gene: Gene) -> Result<Self,GenomeBuilderError> {
if self.genome.genes.len() == 0 { // Check for root existance
if self.genome.genes.len() == 0 {
return Err(GenomeBuilderError::RootDoesntExist); return Err(GenomeBuilderError::RootDoesntExist);
} }
todo!(); // Check for gene collision
if self.genome.genes.contains(&gene){
return Err(GenomeBuilderError::GeneExists);
}
let edge = Edge::new(self.get_current_gene().clone(),gene.clone());
self.genome.edges.push(edge);
self.current_gene = self.genome.genes.len();
self.genome.genes.push(gene);
Ok(self)
}
pub fn back(mut self, amount: Option<usize>) -> Self {
for _ in 0..amount.unwrap_or(0) {
}
self
}
#[inline(always)]
pub fn get_current_gene(&self) -> &Gene {
&self.genome.genes[self.current_gene]
}
#[inline(always)]
pub fn get_current_gene_mut(&mut self) -> &mut Gene {
&mut self.genome.genes[self.current_gene]
} }
} }

View file

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

View file

@ -2,6 +2,11 @@ use crate::genetics::{genome_builder::GenomeBuilder, prelude::*};
pub fn peashooter_template() -> PlantGenome { pub fn peashooter_template() -> PlantGenome {
GenomeBuilder::new() GenomeBuilder::new()
.create_root(Gene::new("base", GeneType::Producer)).unwrap() .create_root(Gene::new("root", GeneType::pure_producer(||{}))).unwrap()
.add_gene(Gene::new("stem", GeneType::fill_all())).unwrap()
.add_gene(Gene::new("head",GeneType::random_distribution())).unwrap()
.add_gene(Gene::new("leaf",GeneType::modifier(||{}))).unwrap()
.back(None)
.add_gene(Gene::new("face",GeneType::consumer(||{}))).unwrap()
.finish() .finish()
} }