argmin/solver/conjugategradient/
beta.rsuse crate::prelude::*;
use serde::{Deserialize, Serialize};
#[derive(
Default, Serialize, Deserialize, Copy, Clone, Eq, PartialEq, Ord, PartialOrd, Hash, Debug,
)]
pub struct FletcherReeves {}
impl FletcherReeves {
pub fn new() -> Self {
FletcherReeves {}
}
}
impl<T, F> ArgminNLCGBetaUpdate<T, F> for FletcherReeves
where
T: Clone + ArgminDot<T, F>,
F: ArgminFloat,
{
fn update(&self, dfk: &T, dfk1: &T, _pk: &T) -> F {
dfk1.dot(&dfk1) / dfk.dot(&dfk)
}
}
#[derive(
Default, Serialize, Deserialize, Copy, Clone, Eq, PartialEq, Ord, PartialOrd, Hash, Debug,
)]
pub struct PolakRibiere {}
impl PolakRibiere {
pub fn new() -> Self {
PolakRibiere {}
}
}
impl<T, F> ArgminNLCGBetaUpdate<T, F> for PolakRibiere
where
T: Clone + ArgminDot<T, F> + ArgminSub<T, T> + ArgminNorm<F>,
F: ArgminFloat,
{
fn update(&self, dfk: &T, dfk1: &T, _pk: &T) -> F {
let dfk_norm_sq = dfk.norm().powi(2);
dfk1.dot(&dfk1.sub(&dfk)) / dfk_norm_sq
}
}
#[derive(
Default, Serialize, Deserialize, Copy, Clone, Eq, PartialEq, Ord, PartialOrd, Hash, Debug,
)]
pub struct PolakRibierePlus {}
impl PolakRibierePlus {
pub fn new() -> Self {
PolakRibierePlus {}
}
}
impl<T, F> ArgminNLCGBetaUpdate<T, F> for PolakRibierePlus
where
T: Clone + ArgminDot<T, F> + ArgminSub<T, T> + ArgminNorm<F>,
F: ArgminFloat,
{
fn update(&self, dfk: &T, dfk1: &T, _pk: &T) -> F {
let dfk_norm_sq = dfk.norm().powi(2);
let beta = dfk1.dot(&dfk1.sub(&dfk)) / dfk_norm_sq;
F::from_f64(0.0).unwrap().max(beta)
}
}
#[derive(
Default, Serialize, Deserialize, Copy, Clone, Eq, PartialEq, Ord, PartialOrd, Hash, Debug,
)]
pub struct HestenesStiefel {}
impl HestenesStiefel {
pub fn new() -> Self {
HestenesStiefel {}
}
}
impl<T, F> ArgminNLCGBetaUpdate<T, F> for HestenesStiefel
where
T: Clone + ArgminDot<T, F> + ArgminSub<T, T> + ArgminNorm<F>,
F: ArgminFloat,
{
fn update(&self, dfk: &T, dfk1: &T, pk: &T) -> F {
let d = dfk1.sub(&dfk);
dfk1.dot(&d) / d.dot(&pk)
}
}
#[cfg(test)]
mod tests {
use super::*;
use crate::test_trait_impl;
test_trait_impl!(fletcher_reeves, FletcherReeves);
test_trait_impl!(polak_ribiere, PolakRibiere);
test_trait_impl!(polak_ribiere_plus, PolakRibierePlus);
test_trait_impl!(hestenes_stiefel, HestenesStiefel);
}