pub struct ConjugateGradient { /* private fields */ }Expand description
Nonlinear Conjugate Gradient (CG) optimizer.
CG is an iterative method for solving optimization problems that uses conjugate directions rather than steepest descent. It’s particularly effective for quadratic problems but extends to general nonlinear optimization.
§Algorithm
- Initialize with steepest descent:
d_0= -∇f(x_0) - Line search: find
α_kminimizingf(x_k+α_kd_k) - Update: x_{k+1} =
x_k+α_kd_k - Compute β_{k+1} using chosen formula (FR, PR, or HS)
- Update direction: d_{k+1} = -∇f(x_{k+1}) + β_{k+1}
d_k - Restart if β < 0 or every n iterations
§Parameters
max_iter: Maximum number of iterations- tol: Convergence tolerance (gradient norm)
beta_formula: Method for computing β (FR, PR, or HS)restart_interval: Restart with steepest descent every n iterations (0 = no periodic restart)
§Example
use aprender::optim::{ConjugateGradient, CGBetaFormula, Optimizer};
use aprender::primitives::Vector;
let mut optimizer = ConjugateGradient::new(100, 1e-5, CGBetaFormula::PolakRibiere);
// Minimize Rosenbrock function
let f = |x: &Vector<f32>| {
let a = x[0];
let b = x[1];
(1.0 - a).powi(2) + 100.0 * (b - a * a).powi(2)
};
let grad = |x: &Vector<f32>| {
let a = x[0];
let b = x[1];
Vector::from_slice(&[
-2.0 * (1.0 - a) - 400.0 * a * (b - a * a),
200.0 * (b - a * a),
])
};
let x0 = Vector::from_slice(&[0.0, 0.0]);
let result = optimizer.minimize(f, grad, x0);Implementations§
Source§impl ConjugateGradient
impl ConjugateGradient
Sourcepub fn new(max_iter: usize, tol: f32, beta_formula: CGBetaFormula) -> Self
pub fn new(max_iter: usize, tol: f32, beta_formula: CGBetaFormula) -> Self
Creates a new Conjugate Gradient optimizer.
§Arguments
max_iter- Maximum number of iterations (typical: 100-1000)tol- Convergence tolerance for gradient norm (typical: 1e-5)beta_formula- Method for computing β (FletcherReeves,PolakRibiere, orHestenesStiefel)
§Example
use aprender::optim::{ConjugateGradient, CGBetaFormula};
let optimizer = ConjugateGradient::new(100, 1e-5, CGBetaFormula::PolakRibiere);Sourcepub fn with_restart_interval(self, interval: usize) -> Self
pub fn with_restart_interval(self, interval: usize) -> Self
Sets the restart interval.
CG will restart with steepest descent every n iterations. Setting to 0 disables periodic restart (only restarts on β < 0).
§Arguments
interval- Number of iterations between restarts (typical: n, where n is problem dimension)
§Example
use aprender::optim::{ConjugateGradient, CGBetaFormula};
let optimizer = ConjugateGradient::new(100, 1e-5, CGBetaFormula::PolakRibiere)
.with_restart_interval(50);Trait Implementations§
Source§impl Clone for ConjugateGradient
impl Clone for ConjugateGradient
Source§fn clone(&self) -> ConjugateGradient
fn clone(&self) -> ConjugateGradient
Returns a duplicate of the value. Read more
1.0.0 · Source§fn clone_from(&mut self, source: &Self)
fn clone_from(&mut self, source: &Self)
Performs copy-assignment from
source. Read moreSource§impl Debug for ConjugateGradient
impl Debug for ConjugateGradient
Source§impl Optimizer for ConjugateGradient
impl Optimizer for ConjugateGradient
Source§fn step(&mut self, _params: &mut Vector<f32>, _gradients: &Vector<f32>)
fn step(&mut self, _params: &mut Vector<f32>, _gradients: &Vector<f32>)
Stochastic update (mini-batch mode) - for SGD, Adam,
RMSprop. Read moreAuto Trait Implementations§
impl Freeze for ConjugateGradient
impl RefUnwindSafe for ConjugateGradient
impl Send for ConjugateGradient
impl Sync for ConjugateGradient
impl Unpin for ConjugateGradient
impl UnsafeUnpin for ConjugateGradient
impl UnwindSafe for ConjugateGradient
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
Mutably borrows from an owned value. Read more
Source§impl<T> CloneToUninit for Twhere
T: Clone,
impl<T> CloneToUninit for Twhere
T: Clone,
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>
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 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>
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