# mir-optim ~jmh530-patch-1

Optimization Framework

To use this package, put the following dependency into your project's dependencies section:

dub.json
dub.sdl

## mir-optim

Dlang Nonlinear Optimisers with external C API.

#### Algorithms

• Modified Levenberg-Marquardt Algorithm (Nonlinear Least Squares).

#### Features

• Idiomatic BetterC library. See `examples/least_squares.cpp` for compilation details.
• Tiny BetterC library size, <38KB
• Based on LAPACK
• Fast compilaiton speed. There are two (for `float` and `double`) precompiled algorithm instatiations. All generic API is thin wrappers around them.
• Four APIs for any purpose:
• Extern C/C++ API
• Powerfull high level generic D API
• Nothrow middle level generic D API
• Low level nongeneric D API

## Examples

#### Least Squares. Analytical Jacobian.

``````unittest
{
import mir.least_squares;
import mir.ndslice.allocation: slice;
import mir.ndslice.slice: sliced;
import mir.blas: nrm2;

auto lm = LeastSquaresLM!double(2, 2);
lm.x[] = [100, 100]; // initial X
// argmin_x f_0(x)^^2 + f_1(x)^^2
lm.optimize!(
(x, y) // f(x)
{
y[0] = x[0];
y[1] = 2 - x[1];
},
(x, J) // J(x)
{
J[0, 0] = 1;
J[0, 1] = 0;
J[1, 0] = 0;
J[1, 1] = -1;
},
);

assert(nrm2((lm.x - [0, 2].sliced).slice) < 1e-8);
}
``````

#### Least Squares. Multithread Jacobian approximation.

Jacobian finite difference approximation computed in multiple threads.

``````unittest
{
import mir.least_squares;
import mir.ndslice.allocation: slice;
import mir.ndslice.slice: sliced;
import mir.blas: nrm2;

auto lm = LeastSquaresLM!double(2, 2);
lm.x[] = [-1.2, 1];
lm.optimize!(
(x, y) // Rosenbrock function
{
y[0] = 10 * (x[1] - x[0]^^2);
y[1] = 1 - x[0];
},

assert(nrm2((lm.x - [1, 1].sliced).slice) < 1e-8);
}
``````

• Registered by Ilya Yaroshenko
• ~jmh530-patch-1 released 9 months ago
• libmir/mir-optim
• BSL-1.0
Authors:
• Ilya Yaroshenko
Dependencies:
mir-lapack, mir-algorithm
Versions:
 1.4.4 2019-Jan-04 1.4.3 2019-Jan-04 1.4.2 2019-Jan-01 1.4.1 2019-Jan-01 1.4.0 2018-Dec-26