Expand description

A collection of two- and multidimensional test functions (and their derivatives and Hessians) for optimization algorithms. For two-dimensional test functions, the derivate and Hessian calculation does not allocate. For multi-dimensional tes functions, the derivative and Hessian calculation comes in two variants. One variant returns Vecs and hence does allocate. This is needed for cases, where the number of parameters is only known at run time. In case the number of parameters are known at compile-time, the _const variants can be used, which return fixed size arrays and hence do not allocate.

The derivative and Hessian calculation is always named <test function name>_derivative and <test function name>_hessian, respectively. The const generics variants are defined as <test function name>_derivative_const and <test function name>_hessian_const.

Some functions, such as ackley, rosenbrock and rastrigin come with additional optional parameters which change the shape of the functions. These additional parameters are exposed in ackley_abc, rosenbrock_ab and rastrigin_a.

All functions are generic over their inputs and work with [f64] and [f32].

§Python wrapper

Thanks to the python module argmin-testfunctions-py, it is possible to use the functions in Python as well. Note that the derivative and Hessian calculation used in the wrapper will always allocate.

§Running the tests and benchmarks

The tests can be run with

cargo test

The test functions derivatives and Hessians are tested against finitediff using proptest to sample the functions at various points.

All functions are benchmarked using criterion.rs. Run the benchmarks with

cargo bench

The report is available in target/criterion/report/index.html.


This library is the most useful the more test functions it contains, therefore any contributions are highly welcome. For inspiration on what to implement and how to proceed, feel free to have a look at this issue.

While most of the implemented functions are probably already quite efficient, there are probably a few which may profit from performance improvements.


Licensed under either of

at your option.


Unless you explicitly state otherwise, any contribution intentionally submitted for inclusion in the work by you, as defined in the Apache-2.0 license, shall be dual licensed as above, without any additional terms or conditions.