Skip to main content

CmaInject

Struct CmaInject 

Source
pub struct CmaInject<I, V, M, F = f64>
where F: Scalar, I: MemeticInner<V, F>,
{ /* private fields */ }
Expand description

Memetic CMA-ES with Hansen (2011) injection: outer CMA-ES proposes λ candidates per generation, an inner local solver (MemeticInner) refines the best k, and the refined points are Mahalanobis-clipped and injected back into the population for the next CMA update.

The only departure from the standard CmaEs update is clipping each injected point’s normalized step in Mahalanobis distance:

  y_i ← min(1, c_y / ‖C^{-1/2} y_i‖) · y_i        (Hansen 2011 eq. 4)
  c_y = √n + 2n/(n+2)                              (Table 1 default)

with y_i = (x_i − m)/σ and C^{-1/2} = B D^{-1} Bᵀ from the post-update eigendecomposition CMA-ES already maintains. After clipping, replaced candidates re-enter the population on equal footing with regular samples; all subsequent CMA updates (m, p_σ, p_c, C, σ) run the standard equations unchanged. Lamarckian by construction; no Baldwinian mode in the paper.

§Inner solver

Generic over any I: MemeticInner<V>. The associated I::State determines the inner state shape. Shipped impls cover NelderMead, LevenbergMarquardt, and Lbfgsb. For L-BFGS-B inner with consistent bound flow, use the bounded sibling BoundedCmaInject over BoundedCmaEs.

§Eval aggregation

Same-problem composition: the inner shares the outer’s Problem wrapper, so every inner cost/gradient/Jacobian/ Hessian call bumps the same EvalCounts as the outer’s own evaluations. CmaEsState’s CountsMirror folds every kind of work into the outer’s single cost_evals via delta.total_work(); CMA-ES outer state has no gradient_evals field, so a derivative-based inner (LM, L-BFGS-B) has its gradient work honestly collapse into cost_evals with no per-trait cross-type fold. See CONTRIBUTING.md “Solver composition” rule 1.

§Backends

Same coverage as CmaEs: the default Vec<f64> (via DenseMatrix), nalgebra, ndarray, and faer. The matrix bound is SymmetricEigen, which every backend satisfies, and the shipped MemeticInner inners are backend-generic.

§Examples

See CmaEs for the base population-based Executor pattern; CmaInject adds a local-search inner via Hansen-2011 injection.

Implementations§

Source§

impl<I, V, M, F> CmaInject<I, V, M, F>
where F: Scalar, I: MemeticInner<V, F>, I::State: CountsMirror,

Source

pub fn with_inner_solver(cma: CmaEs<V, M, F>, inner: I) -> Self

Wrap a configured CmaEs with inner as the local refinement step. Defaults: k = 1 refinement per generation, inner max_iter = 50, c_y = Hansen-2011 Table 1 default.

Source

pub fn with_k(self, k: usize) -> Self

Number of best-ranked candidates to refine and inject each generation. Default 1.

§Panics

Panics if k == 0. k > λ is silently clamped at runtime.

Source

pub fn with_c_y(self, c_y: F) -> Self

Override the Hansen-2011 clipping threshold c_y (default √n + 2n/(n+2)).

§Panics

Panics if c_y <= 0.

Source

pub fn with_inner_max_iter(self, n: u64) -> Self

Inner solver iteration budget per outer generation (default 50).

Source

pub fn inner_terminate_on<C>(self, criterion: C) -> Self
where C: TerminationCriterion<I::State> + 'static,

Register a termination criterion on the inner loop. Criteria are reused across every outer iteration’s inner run, but each is reset at the start of every run, so stateful criteria, including MaxTime, are safe. See CONTRIBUTING.md “Solver composition” rule 2.

Trait Implementations§

Source§

impl<P, I, V, M, F> Solver<P, CmaEsState<V, M, F>> for CmaInject<I, V, M, F>
where F: Scalar, P: CostFunction<Param = V, Output = F>, I: MemeticInner<V, F> + Solver<P, <I as InitialState<V>>::State, Error = P::Error>, I::State: State<Param = V, Float = F> + CountsMirror, V: VectorLen + Clone + ScaledAdd<F> + ScaleInPlace<F> + ComponentMulAssign + NormSquared<F> + SampleStandardNormal + Index<usize, Output = F> + IndexMut<usize, Output = F>, M: MatrixIdentity + MatrixFromDiagonal<V> + MatVec<V> + MatTransposeVec<V> + ScaleInPlace<F> + RankOneUpdate<V, F> + SymmetricEigen<V> + Clone, CmaEs<V, M, F>: Solver<P, CmaEsState<V, M, F>, Error = P::Error>,

Source§

type Error = <P as CostFunction>::Error

Hard-abort error type, mirroring the underlying problem’s type Error. See the trait docs.
Source§

fn init( &mut self, problem: &mut Problem<P>, state: CmaEsState<V, M, F>, ) -> Result<CmaEsState<V, M, F>, Self::Error>

One-time setup before the iteration loop. Read more
Source§

fn next_iter( &mut self, problem: &mut Problem<P>, state: CmaEsState<V, M, F>, ) -> Result<(CmaEsState<V, M, F>, Option<TerminationReason>), Self::Error>

Advance one iteration. Read more
Source§

fn terminate(&self, _state: &S) -> Option<TerminationReason>

Optional pre-iteration solver-specific termination test. Read more

Auto Trait Implementations§

§

impl<I, V, M, F = f64> !RefUnwindSafe for CmaInject<I, V, M, F>

§

impl<I, V, M, F = f64> !Send for CmaInject<I, V, M, F>

§

impl<I, V, M, F = f64> !Sync for CmaInject<I, V, M, F>

§

impl<I, V, M, F = f64> !UnwindSafe for CmaInject<I, V, M, F>

§

impl<I, V, M, F> Freeze for CmaInject<I, V, M, F>
where I: Freeze, F: Freeze,

§

impl<I, V, M, F> Unpin for CmaInject<I, V, M, F>
where I: Unpin, F: Unpin, V: Unpin, M: Unpin,

§

impl<I, V, M, F> UnsafeUnpin for CmaInject<I, V, M, F>
where I: UnsafeUnpin, F: UnsafeUnpin,

Blanket Implementations§

Source§

impl<T> Any for T
where T: 'static + ?Sized,

Source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
Source§

impl<T> Borrow<T> for T
where T: ?Sized,

Source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
Source§

impl<T> BorrowMut<T> for T
where T: ?Sized,

Source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
Source§

impl<T> ByRef<T> for T

Source§

fn by_ref(&self) -> &T

Source§

impl<ST, DT> CastableFrom<ST, Initialized, Initialized> for DT
where ST: ?Sized, DT: ?Sized,

Source§

impl<ST, DT> CastableFrom<ST, Uninit, Uninit> for DT
where ST: ?Sized, DT: ?Sized,

Source§

impl<T> From<T> for T

Source§

fn from(t: T) -> T

Returns the argument unchanged.

Source§

impl<T, U> Imply<T> for U
where T: ?Sized, U: ?Sized,

Source§

impl<T, U> Into<U> for T
where U: From<T>,

Source§

fn into(self) -> U

Calls U::from(self).

That is, this conversion is whatever the implementation of From<T> for U chooses to do.

Source§

impl<T> IntoEither for T

Source§

fn into_either(self, into_left: bool) -> Either<Self, Self>

Converts 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 more
Source§

fn into_either_with<F>(self, into_left: F) -> Either<Self, Self>
where F: FnOnce(&Self) -> bool,

Converts 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
Source§

impl<T> Pointable for T

Source§

const ALIGN: usize

The alignment of pointer.
Source§

type Init = T

The type for initializers.
Source§

unsafe fn init(init: <T as Pointable>::Init) -> usize

Initializes a with the given initializer. Read more
Source§

unsafe fn deref<'a>(ptr: usize) -> &'a T

Dereferences the given pointer. Read more
Source§

unsafe fn deref_mut<'a>(ptr: usize) -> &'a mut T

Mutably dereferences the given pointer. Read more
Source§

unsafe fn drop(ptr: usize)

Drops the object pointed to by the given pointer. Read more
Source§

impl<T> Read<Exclusive, BecauseExclusive> for T
where T: ?Sized,

Source§

impl<T> Same for T

Source§

type Output = T

Should always be Self
Source§

impl<SS, SP> SupersetOf<SS> for SP
where SS: SubsetOf<SP>,

Source§

fn to_subset(&self) -> Option<SS>

The inverse inclusion map: attempts to construct self from the equivalent element of its superset. Read more
Source§

fn is_in_subset(&self) -> bool

Checks if self is actually part of its subset T (and can be converted to it).
Source§

fn to_subset_unchecked(&self) -> SS

Use with care! Same as self.to_subset but without any property checks. Always succeeds.
Source§

fn from_subset(element: &SS) -> SP

The inclusion map: converts self to the equivalent element of its superset.
Source§

impl<T, U> TryFrom<U> for T
where U: Into<T>,

Source§

type Error = Infallible

The type returned in the event of a conversion error.
Source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
Source§

impl<T, U> TryInto<U> for T
where U: TryFrom<T>,

Source§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
Source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
Source§

impl<V, T> VZip<V> for T
where V: MultiLane<T>,

Source§

fn vzip(self) -> V