Skip to main content

A fast nnls solver for python implemented in C++ using Eigen

Project description

fnnlsEigen

pypi

fnnlsEigen implements the fast non-negativity-constrained least squares algorithm (fnnls, Link to article). The algorithm is implemented in C++ using Eigen (Link) and is callable from Python using a Cython interface.

The nnls and the fnnls algorithms

The non-negative least squares algorithm solves the following problem for a given matrix Z and vector x:

where d is the solution vector.

The fnnls algorithm in this repository is optimised for intermediary sparsed matrices and is considerably faster than e.g. SciPy's nnls algorithm for large matrices.

Installing

$ python3 -m pip install fnnlsEigen

API

Direct usage

The fnnls solver accepts both np.float32 and np.float64 precision; dtype via fnnls and fnnlsf respectively.

>>> import numpy as np
>>> import fnnlsEigen as fe

>>> Z = np.array([[1.0, 0.0], [0.0, 1.0], [0.5, 0.5]], dtype=np.float64)
>>> x = np.array([1.0, 1.0, 0.0], dtype=np.float64)
>>> d = fe.fnnls(Z, x)
>>> d
array([0.66666667, 0.66666667])

Optionally, the breaking tolerance (tolerance) and maximum number of iterations (max_iterations) can be adjusted.

    max_iterations : int
        Defaults to 3 * array_Z.shape[1].
    tolerance : float32 / float64
        Defaults to machine epsilon of float32 / float64 times #columns in the given matrix.

Batched usage

Should the provided matrix Z change very little or not at all between calls to the solver; Performance can be enhanced by caching the Z.transpose() * Z product since this product is expensive. Two classes (float32 / float64) are provided as to enable memory mapping for the Z.transpose() * Z product:

CachePreComputeNNLS
>>> import numpy as np
>>> import fnnlsEigen as fe

>>> pc = fe.CachePreComputeNNLS()

>>> Z = np.abs(np.random.rand(500, 1000))

>>> for _ in range(0, 100):
>>>     x = np.abs(np.random.rand(500))
>>>     d = pc.fnnls(Z, x)

Contributing

Clone the project from github. Create a topic branch and issue a pull request for said branch. Wait for review.

Setup - Linux

On Linux platforms the environment can be easily set up as follows (after entering the cloned directory):

$ ./install_setup.sh

This creates a virtual environment and installs the python dependencies.

Enable the environment:

$ source env.sh

Compile the project:

$ make build

Tests and style checks can be accessed via:

$ make test

and

$ make check

Setup - Windows

Windows shell scripts and setup environments for Windows is a welcomed contribution.

Project details


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

fnnlsEigen-1.0.1.tar.gz (1.0 MB view hashes)

Uploaded Source

Built Distributions

fnnlsEigen-1.0.1-cp38-cp38-manylinux_2_24_x86_64.whl (3.8 MB view hashes)

Uploaded CPython 3.8 manylinux: glibc 2.24+ x86-64

fnnlsEigen-1.0.1-cp37-cp37m-win_amd64.whl (81.1 kB view hashes)

Uploaded CPython 3.7m Windows x86-64

Supported by

AWS AWS Cloud computing and Security Sponsor Datadog Datadog Monitoring Fastly Fastly CDN Google Google Download Analytics Microsoft Microsoft PSF Sponsor Pingdom Pingdom Monitoring Sentry Sentry Error logging StatusPage StatusPage Status page