Compare commits
2 commits
6d6141471f
...
5c99e80670
| Author | SHA1 | Date | |
|---|---|---|---|
| 5c99e80670 | |||
| c3b04be872 |
2 changed files with 34 additions and 4 deletions
|
|
@ -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),
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -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) {
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue