use gp::*;
use rand::Rng;
#[derive(PartialEq, Clone, Copy, Debug)]
enum MutationMode {
Shrink,
Uniform,
NodeReplacement,
Ephemeral(EphemeralMode),
Insert,
}
#[derive(PartialEq, Clone, Copy, Debug)]
enum EphemeralMode {
One,
All,
}
#[derive(PartialEq, Clone, Copy, Debug)]
pub struct Mutation {
mode: MutationMode,
}
impl Mutation {
#[doc(hidden)]
pub fn shrink() -> Mutation {
Mutation { mode: MutationMode::Shrink }
}
pub fn uniform() -> Mutation {
Mutation { mode: MutationMode::Uniform }
}
#[doc(hidden)]
pub fn node_replacement() -> Mutation {
Mutation { mode: MutationMode::NodeReplacement }
}
#[doc(hidden)]
pub fn ephemeral_one() -> Mutation {
Mutation { mode: MutationMode::Ephemeral(EphemeralMode::One) }
}
#[doc(hidden)]
pub fn ephemeral_all() -> Mutation {
Mutation { mode: MutationMode::Ephemeral(EphemeralMode::All) }
}
#[doc(hidden)]
pub fn insert() -> Mutation {
Mutation { mode: MutationMode::Insert }
}
pub fn mutate<T, R>(&self, indv: &mut Individual<T>, tg: &mut TreeGen<R>)
where T: Tree,
R: Rng
{
match self.mode {
MutationMode::Shrink => self.mutate_shrink(indv, tg),
MutationMode::Uniform => self.mutate_uniform(indv, tg),
MutationMode::NodeReplacement => self.mutate_node_replacement(indv, tg),
MutationMode::Ephemeral(EphemeralMode::One) => self.mutate_ephemeral_one(indv, tg),
MutationMode::Ephemeral(EphemeralMode::All) => self.mutate_ephemeral_all(indv, tg),
MutationMode::Insert => self.mutate_insert(indv, tg),
}
}
fn mutate_shrink<T, R>(&self, _: &mut Individual<T>, _: &mut TreeGen<R>)
where T: Tree,
R: Rng
{
unimplemented!();
}
fn mutate_uniform<T, R>(&self, indv: &mut Individual<T>, tg: &mut TreeGen<R>)
where T: Tree,
R: Rng
{
let target_index = tg.gen_range(0, indv.nodes_count());
indv.tree.map_while(|node, index, _| if index == target_index {
*node = T::tree(tg).inner();
false
} else {
true
});
}
fn mutate_node_replacement<T, R>(&self, _: &mut Individual<T>, _: &mut TreeGen<R>)
where T: Tree,
R: Rng
{
unimplemented!();
}
fn mutate_ephemeral_one<T, R>(&self, _: &mut Individual<T>, _: &mut TreeGen<R>)
where T: Tree,
R: Rng
{
unimplemented!();
}
fn mutate_ephemeral_all<T, R>(&self, _: &mut Individual<T>, _: &mut TreeGen<R>)
where T: Tree,
R: Rng
{
unimplemented!();
}
fn mutate_insert<T, R>(&self, _: &mut Individual<T>, _: &mut TreeGen<R>)
where T: Tree,
R: Rng
{
unimplemented!();
}
}