use crate::prelude::*;
use serde::{Deserialize, Serialize};
#[derive(Clone, Serialize, Deserialize)]
pub struct Landweber<F> {
omega: F,
}
impl<F> Landweber<F> {
pub fn new(omega: F) -> Self {
Landweber { omega }
}
}
impl<O, F> Solver<O> for Landweber<F>
where
O: ArgminOp<Float = F>,
O::Param: ArgminScaledSub<O::Param, O::Float, O::Param>,
F: ArgminFloat,
{
const NAME: &'static str = "Landweber";
fn next_iter(
&mut self,
op: &mut OpWrapper<O>,
state: &IterState<O>,
) -> Result<ArgminIterData<O>, Error> {
let param = state.get_param();
let grad = op.gradient(¶m)?;
let new_param = param.scaled_sub(&self.omega, &grad);
Ok(ArgminIterData::new().param(new_param))
}
}
#[cfg(test)]
mod tests {
use super::*;
use crate::test_trait_impl;
test_trait_impl!(landweber, Landweber<f64>);
}