pub struct TreeGenome<T: Terminal = ArithmeticTerminal, F: Function = ArithmeticFunction> {
pub root: TreeNode<T, F>,
pub max_depth: usize,
}Expand description
Tree genome for genetic programming
Fields§
§root: TreeNode<T, F>Root node of the tree
max_depth: usizeMaximum allowed depth
Implementations§
Source§impl<T: Terminal, F: Function> TreeGenome<T, F>
impl<T: Terminal, F: Function> TreeGenome<T, F>
Sourcepub fn evaluate(&self, variables: &[f64]) -> f64
pub fn evaluate(&self, variables: &[f64]) -> f64
Evaluate the tree with given variable bindings.
Uses an explicit work stack (iterative post-order traversal) rather than recursion, so a pathologically deep tree cannot overflow the call stack (see the module note on deep trees).
Sourcepub fn dismantle(self)
pub fn dismantle(self)
Free this tree without deep recursion.
Consumes the genome and dismantles its tree iteratively (see the module note on deep trees). Use this for pathologically deep trees that would otherwise overflow the stack when dropped implicitly.
Sourcepub fn generate_full<R: Rng>(
rng: &mut R,
depth: usize,
max_depth: usize,
) -> Self
pub fn generate_full<R: Rng>( rng: &mut R, depth: usize, max_depth: usize, ) -> Self
Generate a random tree using the “full” method
Sourcepub fn generate_grow<R: Rng>(
rng: &mut R,
max_depth: usize,
terminal_prob: f64,
) -> Self
pub fn generate_grow<R: Rng>( rng: &mut R, max_depth: usize, terminal_prob: f64, ) -> Self
Generate a random tree using the “grow” method
Sourcepub fn generate_ramped_half_and_half<R: Rng>(
rng: &mut R,
min_depth: usize,
max_depth: usize,
) -> Self
pub fn generate_ramped_half_and_half<R: Rng>( rng: &mut R, min_depth: usize, max_depth: usize, ) -> Self
Generate using ramped half-and-half
Sourcepub fn generate_with_depth<R: Rng>(rng: &mut R, max_depth: usize) -> Self
pub fn generate_with_depth<R: Rng>(rng: &mut R, max_depth: usize) -> Self
Generate a random tree with an explicit maximum depth.
This is the honest constructor for random generation: unlike
EvolutionaryGenome::generate,
which overloads MultiBounds and remaps its dimension count to a depth,
this takes the maximum depth directly. It uses ramped half-and-half
between depth 2 and max_depth (both clamped to at least 1).
Trait Implementations§
Source§impl<T: Clone + Terminal, F: Clone + Function> Clone for TreeGenome<T, F>
impl<T: Clone + Terminal, F: Clone + Function> Clone for TreeGenome<T, F>
Source§fn clone(&self) -> TreeGenome<T, F>
fn clone(&self) -> TreeGenome<T, F>
1.0.0 (const: unstable) · Source§fn clone_from(&mut self, source: &Self)
fn clone_from(&mut self, source: &Self)
source. Read moreSource§impl<T: Terminal, F: Function> CrossoverOperator<TreeGenome<T, F>> for SubtreeCrossover
impl<T: Terminal, F: Function> CrossoverOperator<TreeGenome<T, F>> for SubtreeCrossover
Source§fn crossover<R: Rng>(
&self,
parent1: &TreeGenome<T, F>,
parent2: &TreeGenome<T, F>,
rng: &mut R,
) -> OperatorResult<(TreeGenome<T, F>, TreeGenome<T, F>)>
fn crossover<R: Rng>( &self, parent1: &TreeGenome<T, F>, parent2: &TreeGenome<T, F>, rng: &mut R, ) -> OperatorResult<(TreeGenome<T, F>, TreeGenome<T, F>)>
Source§fn crossover_probability(&self) -> f64
fn crossover_probability(&self) -> f64
Source§impl<'de, T: Terminal, F: Function> Deserialize<'de> for TreeGenome<T, F>
impl<'de, T: Terminal, F: Function> Deserialize<'de> for TreeGenome<T, F>
Source§fn deserialize<__D>(__deserializer: __D) -> Result<Self, __D::Error>where
__D: Deserializer<'de>,
fn deserialize<__D>(__deserializer: __D) -> Result<Self, __D::Error>where
__D: Deserializer<'de>,
Source§impl<T: Terminal, F: Function> EvolutionaryGenome for TreeGenome<T, F>
impl<T: Terminal, F: Function> EvolutionaryGenome for TreeGenome<T, F>
Source§fn generate<R: Rng>(rng: &mut R, bounds: &MultiBounds) -> Self
fn generate<R: Rng>(rng: &mut R, bounds: &MultiBounds) -> Self
Generate a random tree.
Only bounds.dimension() is consulted — it is remapped (clamped to
[3, 10]) to a maximum tree depth — and the per-dimension min/max
values are ignored. Prefer TreeGenome::generate_with_depth to make the
depth explicit instead of overloading MultiBounds.
Source§type Phenotype = TreeGenome<T, F>
type Phenotype = TreeGenome<T, F>
Source§fn try_distance(&self, other: &Self) -> Result<f64, GenomeError>
fn try_distance(&self, other: &Self) -> Result<f64, GenomeError>
Source§fn as_slice(&self) -> Option<&[Self::Allele]>
fn as_slice(&self) -> Option<&[Self::Allele]>
Source§fn as_mut_slice(&mut self) -> Option<&mut [Self::Allele]>
fn as_mut_slice(&mut self) -> Option<&mut [Self::Allele]>
Source§impl GenomeLikelihood<TreeGenome> for GaussianRegression
impl GenomeLikelihood<TreeGenome> for GaussianRegression
Source§fn model(
&self,
tree: &TreeGenome<ArithmeticTerminal, ArithmeticFunction>,
beta: f64,
) -> Model<()>
fn model( &self, tree: &TreeGenome<ArithmeticTerminal, ArithmeticFunction>, beta: f64, ) -> Model<()>
genome, at likelihood
temperature beta.Source§impl<T: Terminal, F: Function> MutationOperator<TreeGenome<T, F>> for PointMutation
impl<T: Terminal, F: Function> MutationOperator<TreeGenome<T, F>> for PointMutation
Source§impl<T: Terminal, F: Function> MutationOperator<TreeGenome<T, F>> for SubtreeMutation
impl<T: Terminal, F: Function> MutationOperator<TreeGenome<T, F>> for SubtreeMutation
Source§impl<T: Terminal, F: Function> MutationOperator<TreeGenome<T, F>> for HoistMutation
impl<T: Terminal, F: Function> MutationOperator<TreeGenome<T, F>> for HoistMutation
Source§impl<T: Terminal, F: Function> MutationOperator<TreeGenome<T, F>> for ShrinkMutation
impl<T: Terminal, F: Function> MutationOperator<TreeGenome<T, F>> for ShrinkMutation
Source§impl<T: Terminal, F: Function> MutationOperator<TreeGenome<T, F>> for AdaptiveTreeMutation
impl<T: Terminal, F: Function> MutationOperator<TreeGenome<T, F>> for AdaptiveTreeMutation
impl<T: PartialEq + Terminal, F: PartialEq + Function> StructuralPartialEq for TreeGenome<T, F>
Source§impl<T: Terminal, F: Function> TraceGenome for TreeGenome<T, F>
Available on crate feature ppl only.
impl<T: Terminal, F: Function> TraceGenome for TreeGenome<T, F>
ppl only.Source§fn from_trace(trace: &Trace) -> Result<Self, GenomeError>
fn from_trace(trace: &Trace) -> Result<Self, GenomeError>
Source§fn trace_prefix() -> &'static str
fn trace_prefix() -> &'static str
"gene").Source§impl<T: Terminal, F: Function> TreeGenomeType for TreeGenome<T, F>
impl<T: Terminal, F: Function> TreeGenomeType for TreeGenome<T, F>
Auto Trait Implementations§
impl<T, F> Freeze for TreeGenome<T, F>
impl<T, F> RefUnwindSafe for TreeGenome<T, F>where
T: RefUnwindSafe,
F: RefUnwindSafe,
impl<T, F> Send for TreeGenome<T, F>
impl<T, F> Sync for TreeGenome<T, F>
impl<T, F> Unpin for TreeGenome<T, F>
impl<T, F> UnsafeUnpin for TreeGenome<T, F>where
T: UnsafeUnpin,
F: UnsafeUnpin,
impl<T, F> UnwindSafe for TreeGenome<T, F>where
T: UnwindSafe,
F: UnwindSafe,
Blanket Implementations§
Source§impl<T> BorrowMut<T> for Twhere
T: ?Sized,
impl<T> BorrowMut<T> for Twhere
T: ?Sized,
Source§fn borrow_mut(&mut self) -> &mut T
fn borrow_mut(&mut self) -> &mut T
Source§impl<T> CloneToUninit for Twhere
T: Clone,
impl<T> CloneToUninit for Twhere
T: Clone,
impl<T> DeserializeOwned for Twhere
T: for<'de> Deserialize<'de>,
Source§impl<T> IntoEither for T
impl<T> IntoEither for T
Source§fn into_either(self, into_left: bool) -> Either<Self, Self> ⓘ
fn into_either(self, into_left: bool) -> Either<Self, Self> ⓘ
self into a Left variant of Either<Self, Self>
if into_left is true.
Converts self into a Right variant of Either<Self, Self>
otherwise. Read moreSource§fn into_either_with<F>(self, into_left: F) -> Either<Self, Self> ⓘ
fn into_either_with<F>(self, into_left: F) -> Either<Self, Self> ⓘ
self into a Left variant of Either<Self, Self>
if into_left(&self) returns true.
Converts self into a Right variant of Either<Self, Self>
otherwise. Read more§impl<T> Pointable for T
impl<T> Pointable for T
impl<T> Scalar for T
§impl<SS, SP> SupersetOf<SS> for SPwhere
SS: SubsetOf<SP>,
impl<SS, SP> SupersetOf<SS> for SPwhere
SS: SubsetOf<SP>,
§fn to_subset(&self) -> Option<SS>
fn to_subset(&self) -> Option<SS>
self from the equivalent element of its
superset. Read more§fn is_in_subset(&self) -> bool
fn is_in_subset(&self) -> bool
self is actually part of its subset T (and can be converted to it).§fn to_subset_unchecked(&self) -> SS
fn to_subset_unchecked(&self) -> SS
self.to_subset but without any property checks. Always succeeds.§fn from_subset(element: &SS) -> SP
fn from_subset(element: &SS) -> SP
self to the equivalent element of its superset.