Genome builder basics
This commit is contained in:
parent
23d9ab696c
commit
fdb5e59eff
5 changed files with 86 additions and 5 deletions
|
|
@ -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,
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
|
||||||
|
|
@ -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,
|
||||||
|
|
|
||||||
63
rust-pvz-genetics/src/genetics/genome_builder.rs
Normal file
63
rust-pvz-genetics/src/genetics/genome_builder.rs
Normal 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,
|
||||||
|
}
|
||||||
|
|
@ -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::*;
|
||||||
|
|
|
||||||
7
rust-pvz-genetics/src/genetics/plant_templates.rs
Normal file
7
rust-pvz-genetics/src/genetics/plant_templates.rs
Normal 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()
|
||||||
|
}
|
||||||
Loading…
Add table
Add a link
Reference in a new issue