Skip to main content

ConjugateGradient

Struct ConjugateGradient 

Source
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

  1. Initialize with steepest descent: d_0 = -∇f(x_0)
  2. Line search: find α_k minimizing f(x_k + α_k d_k)
  3. Update: x_{k+1} = x_k + α_k d_k
  4. Compute β_{k+1} using chosen formula (FR, PR, or HS)
  5. Update direction: d_{k+1} = -∇f(x_{k+1}) + β_{k+1} d_k
  6. 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

Source

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, or HestenesStiefel)
§Example
use aprender::optim::{ConjugateGradient, CGBetaFormula};

let optimizer = ConjugateGradient::new(100, 1e-5, CGBetaFormula::PolakRibiere);
Source

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

Source§

fn clone(&self) -> ConjugateGradient

Returns a duplicate of the value. Read more
1.0.0 · Source§

fn clone_from(&mut self, source: &Self)

Performs copy-assignment from source. Read more
Source§

impl Debug for ConjugateGradient

Source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result

Formats the value using the given formatter. Read more
Source§

impl Optimizer for ConjugateGradient

Source§

fn step(&mut self, _params: &mut Vector<f32>, _gradients: &Vector<f32>)

Stochastic update (mini-batch mode) - for SGD, Adam, RMSprop. Read more
Source§

fn minimize<F, G>( &mut self, objective: F, gradient: G, x0: Vector<f32>, ) -> OptimizationResult
where F: Fn(&Vector<f32>) -> f32, G: Fn(&Vector<f32>) -> Vector<f32>,

Batch optimization (deterministic mode) - for L-BFGS, CG, Damped Newton. Read more
Source§

fn reset(&mut self)

Resets the optimizer state (momentum, history, etc.). Read more

Auto Trait Implementations§

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> CloneToUninit for T
where T: Clone,

Source§

unsafe fn clone_to_uninit(&self, dest: *mut u8)

🔬This is a nightly-only experimental API. (clone_to_uninit)
Performs copy-assignment from self to dest. Read more
Source§

impl<T> From<T> for T

Source§

fn from(t: T) -> T

Returns the argument unchanged.

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> ToOwned for T
where T: Clone,

Source§

type Owned = T

The resulting type after obtaining ownership.
Source§

fn to_owned(&self) -> T

Creates owned data from borrowed data, usually by cloning. Read more
Source§

fn clone_into(&self, target: &mut T)

Uses borrowed data to replace owned data, usually by cloning. Read more
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