radiate_gp/collections/graphs/
chromosome.rs

1use crate::{Factory, GraphNode, NodeStore, node::Node};
2use radiate::{Chromosome, Gene, Valid};
3use std::fmt::Debug;
4
5#[derive(Clone)]
6pub struct GraphChromosome<T> {
7    nodes: Vec<GraphNode<T>>,
8    store: Option<NodeStore<T>>,
9}
10
11impl<T> GraphChromosome<T> {
12    pub fn new(nodes: Vec<GraphNode<T>>, factory: NodeStore<T>) -> Self {
13        GraphChromosome {
14            nodes,
15            store: Some(factory),
16        }
17    }
18
19    pub fn set_nodes(&mut self, nodes: Vec<GraphNode<T>>) {
20        self.nodes = nodes;
21    }
22
23    pub fn store(&self) -> Option<&NodeStore<T>> {
24        self.store.as_ref()
25    }
26}
27
28impl<T> Factory<Option<NodeStore<T>>, GraphChromosome<T>> for GraphChromosome<T>
29where
30    T: Clone + PartialEq + Default,
31{
32    fn new_instance(&self, input: Option<NodeStore<T>>) -> GraphChromosome<T> {
33        let maybe_store = input.or_else(|| self.store.clone());
34        if let Some(store) = maybe_store {
35            return GraphChromosome {
36                nodes: self
37                    .iter()
38                    .enumerate()
39                    .map(|(index, node)| {
40                        let new_node = store.new_instance((index, node.node_type()));
41                        if new_node.arity() == node.arity() {
42                            node.with_allele(new_node.allele())
43                        } else {
44                            node.clone()
45                        }
46                    })
47                    .collect(),
48                store: Some(store),
49            };
50        }
51
52        self.clone()
53    }
54}
55
56impl<T> Chromosome for GraphChromosome<T>
57where
58    T: Clone + PartialEq + Default,
59{
60    type Gene = GraphNode<T>;
61}
62
63impl<T> Valid for GraphChromosome<T> {
64    fn is_valid(&self) -> bool {
65        self.nodes.iter().all(|gene| gene.is_valid())
66    }
67}
68
69impl<T> AsRef<[GraphNode<T>]> for GraphChromosome<T> {
70    fn as_ref(&self) -> &[GraphNode<T>] {
71        &self.nodes
72    }
73}
74
75impl<T> AsMut<[GraphNode<T>]> for GraphChromosome<T> {
76    fn as_mut(&mut self) -> &mut [GraphNode<T>] {
77        &mut self.nodes
78    }
79}
80
81impl<T: PartialEq> PartialEq for GraphChromosome<T> {
82    fn eq(&self, other: &Self) -> bool {
83        self.nodes == other.nodes
84    }
85}
86
87impl<T> FromIterator<GraphNode<T>> for GraphChromosome<T> {
88    fn from_iter<I: IntoIterator<Item = GraphNode<T>>>(iter: I) -> Self {
89        GraphChromosome {
90            nodes: iter.into_iter().collect(),
91            store: None,
92        }
93    }
94}
95
96impl<T> Debug for GraphChromosome<T>
97where
98    T: Clone + PartialEq + Debug,
99{
100    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
101        write!(f, "Graph {{\n")?;
102        for node in self.as_ref() {
103            write!(f, "  {:?},\n", node)?;
104        }
105        write!(f, "}}")
106    }
107}