ganesh 0.26.2

Minimization and sampling in Rust, simplified
Documentation
use criterion::{black_box, criterion_group, criterion_main, BatchSize, BenchmarkId, Criterion};
use ganesh::{
    algorithms::line_search::HagerZhangLineSearch,
    core::transforms::Bounds,
    test_functions::Rosenbrock,
    traits::{LineSearch, Transform},
    DVector,
};

fn bench_hager_zhang_origin(c: &mut Criterion) {
    let mut group = c.benchmark_group("Micro/HagerZhang");
    for n in [4usize, 16] {
        group.bench_with_input(BenchmarkId::new("origin_eval", n), &n, |b, &ndim| {
            let x0 = DVector::from_element(ndim, 1.25);
            let p = DVector::from_element(ndim, -0.5);
            b.iter_batched(
                || {
                    (
                        HagerZhangLineSearch::default(),
                        Rosenbrock { n: ndim },
                        ganesh::algorithms::gradient::GradientStatus::default(),
                    )
                },
                |(mut ls, problem, mut status)| {
                    let _ = black_box(
                        ls.search(&x0, &p, Some(1.0), &problem, None, &(), &mut status)
                            .unwrap(),
                    );
                },
                BatchSize::SmallInput,
            );
        });
    }
    group.finish();
}

fn bench_bounds_jacobians(c: &mut Criterion) {
    let mut group = c.benchmark_group("Micro/BoundsTransform");
    for n in [4usize, 16] {
        let bounds = Bounds::from(vec![(-4.0, 4.0); n]);
        let x = DVector::from_element(n, 0.75);
        let z = bounds.to_internal(&x).into_owned();
        group.bench_with_input(BenchmarkId::new("to_external_jacobian", n), &n, |b, _| {
            b.iter(|| black_box(bounds.to_external_jacobian(&z)));
        });
        group.bench_with_input(BenchmarkId::new("to_internal_jacobian", n), &n, |b, _| {
            b.iter(|| black_box(bounds.to_internal_jacobian(&x)));
        });
        group.bench_with_input(
            BenchmarkId::new("to_internal_component_hessian", n),
            &n,
            |b, _| {
                b.iter(|| black_box(bounds.to_internal_component_hessian(0, &x)));
            },
        );
    }
    group.finish();
}

criterion_group!(benches, bench_hager_zhang_origin, bench_bounds_jacobians);
criterion_main!(benches);