Compare commits

..

2 commits

Author SHA1 Message Date
5c99e80670 Use of children count and simple error handling 2025-11-08 20:57:55 +05:00
c3b04be872 children count 2025-11-08 20:50:22 +05:00
2 changed files with 34 additions and 4 deletions

View file

@ -8,13 +8,19 @@ mod node_modifier;
pub struct Node { pub struct Node {
children: Vec<Node>, children: Vec<Node>,
handler: NodeHandler, handler: NodeHandler,
max_children_count: Option<usize>,
} }
impl Node { impl Node {
pub fn new(children: Option<Vec<Node>>, handler: NodeHandler) -> Self { pub fn new(
children: Option<Vec<Node>>,
handler: NodeHandler,
max_children_count: Option<usize>,
) -> Self {
Self { Self {
children: children.unwrap_or(vec![]), children: children.unwrap_or(vec![]),
handler: handler, handler: handler,
max_children_count,
} }
} }
pub fn get_value(&self) -> f64 { pub fn get_value(&self) -> f64 {
@ -35,18 +41,21 @@ impl Node {
Node { Node {
children: vec![], children: vec![],
handler: NodeHandler::Number { number: n }, handler: NodeHandler::Number { number: n },
max_children_count: None,
} }
} }
pub fn function(func: fn(Vec<f64>) -> f64) -> Node { pub fn function(func: fn(Vec<f64>) -> f64) -> Node {
Node { Node {
children: vec![], children: vec![],
handler: NodeHandler::Function { function: func }, handler: NodeHandler::Function { function: func },
max_children_count: Some(1),
} }
} }
pub fn variable(getter: fn() -> f64) -> Node { pub fn variable(getter: fn() -> f64) -> Node {
Node { Node {
children: vec![], children: vec![],
handler: NodeHandler::Variable { getter }, handler: NodeHandler::Variable { getter },
max_children_count: Some(0),
} }
} }
} }

View file

@ -1,10 +1,14 @@
use crate::node::Node; use crate::node::Node;
use crate::node::NodeHandler;
use crate::node::functions; use crate::node::functions;
use crate::node::handler::NodeHandler;
use rand::random_range; use rand::random_range;
const PICK_STOP_PROBABILITY: u8 = 2; const PICK_STOP_PROBABILITY: u8 = 2;
pub enum NodeManipulationError {
TooMuchChildren(Node),
}
pub struct NodeModifier<'a> { pub struct NodeModifier<'a> {
picked_node: &'a mut Node, picked_node: &'a mut Node,
function_mutation_pool: Vec<fn(Vec<f64>) -> f64>, function_mutation_pool: Vec<fn(Vec<f64>) -> f64>,
@ -57,16 +61,33 @@ impl<'a> NodeModifier<'a> {
} }
} }
pub fn add_node(&mut self, node: Node) { pub fn add_node(&mut self, node: Node) -> Result<(), NodeManipulationError> {
if let Some(x) = self.picked_node.max_children_count {
if self.picked_node.children.len() + 1 >= x {
return Err(NodeManipulationError::TooMuchChildren(node));
}
}
self.picked_node.children.push(node); self.picked_node.children.push(node);
Ok(())
} }
pub fn insert_node(&mut self, mut node: Node, between: Option<usize>) { pub fn insert_node(
&mut self,
mut node: Node,
between: Option<usize>,
) -> Result<(), NodeManipulationError> {
if let Some(x) = self.picked_node.max_children_count {
if self.picked_node.children.len() + 1 >= x {
return Err(NodeManipulationError::TooMuchChildren(node));
}
}
let children_count = self.picked_node.children.len(); let children_count = self.picked_node.children.len();
let operated_index = between.unwrap_or(random_range(0..children_count)); let operated_index = between.unwrap_or(random_range(0..children_count));
let moved = self.picked_node.children.remove(operated_index); let moved = self.picked_node.children.remove(operated_index);
node.children.push(moved); node.children.push(moved);
self.picked_node.children.insert(operated_index, node); self.picked_node.children.insert(operated_index, node);
Ok(())
} }
pub fn mutate_node(&mut self) { pub fn mutate_node(&mut self) {