Skip to content
BetterC Nonlinear Optimization Framework
Branch: master
Clone or download
Fetching latest commit…
Cannot retrieve the latest commit at this time.
Permalink
Type Name Latest commit message Commit time
Failed to load latest commit information.
examples
include/mir/optim
source/mir/optim
subprojects
.gitignore
.travis.yml
README.md
dub.sdl
meson.build
meson_options.txt

README.md

Gitter Build Status Dub downloads Dub downloads License Latest version

mir-optim

Dlang Nonlinear Optimisers with external C API.

Konwn bugs

  • Random wrong results when taskPool is passed.

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.optim.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.optim.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

       

You can’t perform that action at this time.