pub struct Stepper<P, S, So> { /* private fields */ }Expand description
Drive a solver one iteration at a time.
Owns the problem, state, solver and termination criteria, runs
solver.init exactly once on construction, and exposes
step / run_to_end so callers can
interleave their own work between iterations — recording trajectories,
animating from a UI, pausing on a button press, evaluating a custom
budget, etc.
Executor::run is self.into_stepper().run_to_end(); the stepper
is the building block, the executor is the convenience wrapper.
§Example
let mut stepper = Executor::new(problem, solver, state)
.max_iter(100)
.terminate_on(GradientTolerance(1e-6))
.into_stepper();
let reason = loop {
match stepper.step() {
StepOutcome::Continue => { /* observe `stepper.state()` */ }
StepOutcome::Stopped(reason) => break reason,
}
};Implementations§
Source§impl<P, S, So> Stepper<P, S, So>
impl<P, S, So> Stepper<P, S, So>
Sourcepub fn counts(&self) -> &EvalCounts
pub fn counts(&self) -> &EvalCounts
Wrapper-side evaluation counters. These are authoritative —
solvers can only call into the user’s problem through the
wrapper, so every cost / gradient / residual / Jacobian /
Hessian call is reflected here. The state mirror under
state is refreshed after every successful
Solver::init /
Solver::next_iter;
on the typed-Err path the state slot is dropped (see
step) but counts is still readable here for
diagnostics.
Sourcepub fn finished(&self) -> Option<&TerminationReason>
pub fn finished(&self) -> Option<&TerminationReason>
Termination reason if the stepper has stopped, else None.
Sourcepub fn iter(&self) -> u64
pub fn iter(&self) -> u64
Total iterations that have completed so far. Convenience read
equivalent to self.state().iter().
Sourcepub fn step(&mut self) -> Result<StepOutcome, So::Error>
pub fn step(&mut self) -> Result<StepOutcome, So::Error>
Advance one iteration. Once a Stopped outcome has been returned
the stepper is sticky: subsequent calls keep returning the same
Stopped(reason) without touching the state or solver.
Registered observers fire here:
observe_iter on
StepOutcome::Continue, gated by each observer’s
ObserverMode; observe_final once
when this call first returns StepOutcome::Stopped. See the
observer module for the lifecycle.
Returns Err when the underlying problem returns Err from any
cost / gradient / residual / Jacobian / Hessian call during the
step. The stepper is not made sticky on Err — the typical
downstream pattern is to surface the error and drop the stepper,
but callers may inspect state and try again.
Observers do not fire on the Err path (the state has been
consumed by the failing call).
Sourcepub fn run_to_end(self) -> Result<OptimizationResult<S>, So::Error>
pub fn run_to_end(self) -> Result<OptimizationResult<S>, So::Error>
Drive step to completion and return an
OptimizationResult.
Sourcepub fn into_state(self) -> S
pub fn into_state(self) -> S
Consume the stepper and return the final state.
Auto Trait Implementations§
impl<P, S, So> !RefUnwindSafe for Stepper<P, S, So>
impl<P, S, So> !Send for Stepper<P, S, So>
impl<P, S, So> !Sync for Stepper<P, S, So>
impl<P, S, So> !UnwindSafe for Stepper<P, S, So>
impl<P, S, So> Freeze for Stepper<P, S, So>
impl<P, S, So> Unpin for Stepper<P, S, So>
impl<P, S, So> UnsafeUnpin for Stepper<P, S, So>
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
impl<ST, DT> CastableFrom<ST, Initialized, Initialized> for DT
impl<ST, DT> CastableFrom<ST, Uninit, Uninit> for DT
impl<T, U> Imply<T> for U
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 moreSource§impl<T> Pointable for T
impl<T> Pointable for T
impl<T> Read<Exclusive, BecauseExclusive> for Twhere
T: ?Sized,
Source§impl<SS, SP> SupersetOf<SS> for SPwhere
SS: SubsetOf<SP>,
impl<SS, SP> SupersetOf<SS> for SPwhere
SS: SubsetOf<SP>,
Source§fn to_subset(&self) -> Option<SS>
fn to_subset(&self) -> Option<SS>
self from the equivalent element of its
superset. Read moreSource§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).Source§fn to_subset_unchecked(&self) -> SS
fn to_subset_unchecked(&self) -> SS
self.to_subset but without any property checks. Always succeeds.Source§fn from_subset(element: &SS) -> SP
fn from_subset(element: &SS) -> SP
self to the equivalent element of its superset.