radiate_gp/collections/graphs/
chromosome.rs1use 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}