use liblbfgs::{lbfgs, Progress};
fn main() {
const N: usize = 100;
let mut x = [0.0 as f64; N];
for i in (0..N).step_by(2) {
x[i] = -1.2;
x[i + 1] = 1.0;
}
let evaluate = |x: &[f64], gx: &mut [f64]| {
let n = x.len();
let mut fx = 0.0;
for i in (0..n).step_by(2) {
let t1 = 1.0 - x[i];
let t2 = 10.0 * (x[i + 1] - x[i] * x[i]);
gx[i + 1] = 20.0 * t2;
gx[i] = -2.0 * (x[i] * gx[i + 1] + t1);
fx += t1 * t1 + t2 * t2;
}
Ok(fx)
};
let progress = |prgr: &Progress| {
let x = &prgr.x;
println!("Iteration {}:", &prgr.niter);
println!(" fx = {}, x[0] = {}, x[1] = {}", &prgr.fx, x[0], x[1]);
println!(
" xnorm = {}, gnorm = {}, step = {}",
&prgr.xnorm, &prgr.gnorm, &prgr.step
);
println!("");
false
};
let prb = lbfgs()
.minimize(&mut x, evaluate, progress)
.expect("lbfgs minimize");
println!(" fx = {:}, x[0] = {}, x[1] = {}\n", prb.fx, x[0], x[1]);
}