mir-optim 0.0.3

Optimization Framework


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

dub.json
dub.sdl

Gitter Build Status Dub downloads Dub downloads License Latest version

mir-optim

Dlang Nonlinear Optimisers with external C API.

Algorithms

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

See also online documentation.

Features

  • Idiomatic BetterC library. See examples/least_squares.cpp for compilation details.
  • C/C++ header
  • Multithread C++ examples
  • Tiny BetterC library size, <38KB
  • Based on LAPACK
  • Fast compilaiton speed. There are two (for float and double) precompiled algorithm instatiations. Generic API is a 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

Required system libraries

See wiki: Link with CBLAS & LAPACK.

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. Multithreaded 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;
    import std.parallelism: taskPool;

    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];
        },
    )(taskPool);

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

Our sponsors

<img src="https://raw.githubusercontent.com/libmir/mir-algorithm/master/images/symmetry.png" height="80" />         <img src="https://raw.githubusercontent.com/libmir/mir-algorithm/master/images/kaleidic.jpeg" height="80" />

Authors:
  • Ilya Yaroshenko
Dependencies:
mir-algorithm, mir-lapack
Versions:
0.0.3 2018-Jul-23
0.0.2 2018-Jul-11
0.0.1 2018-Jul-08
0.0.0 2018-Jul-08
~master 2018-Jul-23
Show all 6 versions
Download Stats:
  • 0 downloads today

  • 0 downloads this week

  • 3 downloads this month

  • 3 downloads total

Score:
1.2
Short URL:
mir-optim.dub.pm