Genome restructurized

This commit is contained in:
rendo 2026-03-26 12:12:54 +05:00
commit 23d9ab696c
5 changed files with 109 additions and 20 deletions

View file

@ -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<Ordering> {
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;}
}
}

View file

@ -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,
}

View file

@ -0,0 +1,53 @@
use crate::genetics::{gene::Gene, edge::Edge};
pub struct PlantGenome {
genes: Vec<Gene>,
edges: Vec<Edge>
}
impl PlantGenome {
pub fn new() -> Self {
Self {
genes: Vec::new(),
edges: Vec::new()
}
}
fn insert_gene(&mut self, gene: Gene, parent: Option<Gene>) -> Option<PlantGenomeInsertError> {
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,
}

View file

@ -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<GeneID,Vec<GeneID>>,
pub vertices: HashMap<GeneID,Box<dyn Gene>>
}
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::*;
}

View file

@ -0,0 +1 @@