extern crate argmin;
extern crate argmin_testfunctions;
use argmin::prelude::*;
use argmin::solver::linesearch::{ArmijoCondition, BacktrackingLineSearch};
use argmin_testfunctions::{sphere, sphere_derivative};
struct Sphere {}
impl ArgminOp for Sphere {
type Param = Vec<f64>;
type Output = f64;
type Hessian = ();
type Jacobian = ();
type Float = f64;
fn apply(&self, param: &Vec<f64>) -> Result<f64, Error> {
Ok(sphere(param))
}
fn gradient(&self, param: &Vec<f64>) -> Result<Vec<f64>, Error> {
Ok(sphere_derivative(param))
}
}
fn run() -> Result<(), Error> {
let init_param: Vec<f64> = vec![0.7, 0.0];
let operator = Sphere {};
let cond = ArmijoCondition::new(0.5)?;
let mut solver = BacktrackingLineSearch::new(cond).rho(0.9)?;
solver.set_search_direction(vec![-1.0, 0.0]);
solver.set_init_alpha(1.0)?;
let init_cost = operator.apply(&init_param)?;
let init_grad = operator.gradient(&init_param)?;
let res = Executor::new(operator, solver, init_param)
.add_observer(ArgminSlogLogger::term(), ObserverMode::Always)
.max_iters(10)
.cost(init_cost)
.grad(init_grad)
.run()?;
std::thread::sleep(std::time::Duration::from_secs(1));
println!("{}", res);
Ok(())
}
fn main() {
if let Err(ref e) = run() {
println!("{}", e);
}
}