Important: This documentation covers Yarn 1 (Classic).
For Yarn 2+ docs and migration guide, see yarnpkg.com.

Package detail

lalg

rcorbish134Unlicense0.0.31

Linear algebra library - backed by C++.

linear algebra, svd, pca, openblas, solver, lbfgs, bfgs

readme

lalg - blas/cuda integration with nodejs

Join the chat at https://gitter.im/node-linalg/Lobby

This module integrates the efficient libraries created by really smart folks into the rich javascript environment provided by nodejs.

At present this is in alpha mode. It's tested in real ML apps and holds up very well.

I need to make the install easier - sorry. Check the Docker file for linux prerequistes.

Of note:

  • underlying data type is float (can we template this?)
  • matrices are stored in column major order (for cuda compatibility)
  • limited validation of inputs is present in this version (to be be improved)
  • more non-blocking options ( e.g. svdp and pinvp )

Help

  • need anyone who can build on windows
  • (polite) suggestions for matrix operations

Coming Soon

  • NVIDIA CUDA support - beta testing in progress (20kx20k mul() in 500ms!!!)
  • caffe integration - let's get the caffe chaps' good work into nodejs :)

Contribute

This library builds on the following. Great work chaps - so good it's worth stealing!

Installation

npm install lalg

BUT there are several prerequesites (see below) Promise to make this better, but I am still learning about software.

Prerequisites

  • nodejs of course ( tested on 7.2.0 )
  • gyp - npm install -g node-gyp
  • make
  • python ( oh boy! - can't avoid python - even integrating C++ to javascript !!! )
  • C++ compiler
  • openblas
  • lapacke

The Dockerfile shows the requirements in detail

    docker run -i -t rcorbish/lalg 
    var lalg = require ( "lalg" ) ;
        lalg.rand( 5 ) ;

Verify correct installation by: node node_modules/lalg/test/test.js

API

This is the C++ docs, which shows all the nodejs functions and a few examples. I'll keep this up to date as the unerlying code changes. NB. the javascript calls start with lowercase letters.

documentation

Examples

Create a matrix

Create an uninitialized array (not too useful really)

    var lalg = require('lalg');
    var A = new lalg.Array( 10, 5 ) ;

Create an randomly initialized array

    var lalg = require('lalg');
    var A = lalg.rand( 10, 5 ) ;

Create two arrays one initialized to all 0.0, the other to all 1.0

    var lalg = require('lalg');
    var Zeros = lalg.zeros( 10, 5 ) ;
    var Ones = lalg.ones( 10, 5 ) ;

Create the identity matrix ( identity is square, only need 1 arg )

    var lalg = require('lalg');
    var Identity5 = lalg.eye( 5 ) ;

Scalar functions

Add a value to each element in the matrix Multiply each element in the matrix by a single value. NB add() also takes vectors and matrices as args too (see later).

    var lalg = require('lalg');
    var A = lalg.zeros( 5 ) ;
    var T = A.add( 10 ) ;   // now all elements in T are equal to 10

Multiply each element in the matrix by a single value. NB mul() also takes vectors and numbers (be careful with vectors, they must be compatible shapes)

    var lalg = require('lalg');
    var A = lalg.ones( 5 ) ;
    var T = A.mul( 10 ) ;   // now all elements in T are equal to 10

Linear functions

Multiply two matrices. This is the same call as the scalar version, but passing in a matrix or vector fires off the linear matrix multiplies

    var lalg = require('lalg');
    var A = lalg.rand( 5 ) ;
    var B = lalg.rand( 5 ) ;
    var T = A.mul( B ) ;   // T = A x B  - another 5x5 matrix
    console..log( T ) ;

Other functions

Other functions that may be useful:

  • mean - calculate the mean of rows or columns
  • sum - calculate the sum of elements in rows or columns
  • norm - calculates the Euclidean norm of rows or columns
  • inv - the matrix inverse
  • pinv - the pseudo inverse, can calculate an inverse for non-square and singular matrices
  • log - calculate the log of each element
  • abs - absolute value of each element
  • sqrt - the sqrt of each element
  • svd - singular value decomp of a matrix - return U,S, Vt in once object
  • pca - principal components analysis, reduces the dimension of a vector
  • transpose - transpose a matyix
  • dup - copy a matrix

Element manipulation

Some functions of a matrix are provided to extract/add/move rows and columns

  • rotate - rotate the columns in a matrix
  • addColumn - adds a row vector to a matrix
  • addRow - adds a column vector to a matrix
  • removeRow - rfemoves a row vector from a matrix
  • removeCoOlumn - removes a column from a matrix
  • getRows - copies rows from a matrix to a new matrix
  • getColumns - copies columns from a matrix to a new matrix

Linear regression

OK we'll try a more complex example. It showcases the non-blocking features of the library.

This implements the linear regression simple cals: theta = inv(X' X) X' y where X' is a transpose operation ( thanks MATLAB )

This needs fast-csv npm install fast-csv

Click here for a sample. Linear regression as a first step.

Plot the results (in a spreadsheet for example) to see if we're accurate. Don't worry we'll do better with logistic regression.

Equation solving

This implements a solver to find the minimum value of a function. Given a matrix of features and a means to calculate a partial differential (gradients) finds the global minimum.

Click here for a sample.

See the docs for the requirements to define the gradient calculations.

changelog

Changes for 1.7.0:

  • All new improvements in Google Test 1.7.0.
  • New feature: matchers DoubleNear(), FloatNear(), NanSensitiveDoubleNear(), NanSensitiveFloatNear(), UnorderedElementsAre(), UnorderedElementsAreArray(), WhenSorted(), WhenSortedBy(), IsEmpty(), and SizeIs().
  • Improvement: Google Mock can now be built as a DLL.
  • Improvement: when compiled by a C++11 compiler, matchers AllOf() and AnyOf() can accept an arbitrary number of matchers.
  • Improvement: when compiled by a C++11 compiler, matchers ElementsAreArray() can accept an initializer list.
  • Improvement: when exceptions are enabled, a mock method with no default action now throws instead crashing the test.
  • Improvement: added class testing::StringMatchResultListener to aid definition of composite matchers.
  • Improvement: function return types used in MOCK_METHOD*() macros can now contain unprotected commas.
  • Improvement (potentially breaking): EXPECT_THAT() and ASSERT_THAT() are now more strict in ensuring that the value type and the matcher type are compatible, catching potential bugs in tests.
  • Improvement: Pointee() now works on an optional<T>.
  • Improvement: the ElementsAreArray() matcher can now take a vector or iterator range as input, and makes a copy of its input elements before the conversion to a Matcher.
  • Improvement: the Google Mock Generator can now generate mocks for some class templates.
  • Bug fix: mock object destruction triggerred by another mock object's destruction no longer hangs.
  • Improvement: Google Mock Doctor works better with newer Clang and GCC now.
  • Compatibility fixes.
  • Bug/warning fixes.

Changes for 1.6.0:

  • Compilation is much faster and uses much less memory, especially when the constructor and destructor of a mock class are moved out of the class body.
  • New matchers: Pointwise(), Each().
  • New actions: ReturnPointee() and ReturnRefOfCopy().
  • CMake support.
  • Project files for Visual Studio 2010.
  • AllOf() and AnyOf() can handle up-to 10 arguments now.
  • Google Mock doctor understands Clang error messages now.
  • SetArgPointee<> now accepts string literals.
  • gmock_gen.py handles storage specifier macros and template return types now.
  • Compatibility fixes.
  • Bug fixes and implementation clean-ups.
  • Potentially incompatible changes: disables the harmful 'make install' command in autotools.

Potentially breaking changes:

  • The description string for MATCHER*() changes from Python-style interpolation to an ordinary C++ string expression.
  • SetArgumentPointee is deprecated in favor of SetArgPointee.
  • Some non-essential project files for Visual Studio 2005 are removed.

Changes for 1.5.0:

  • New feature: Google Mock can be safely used in multi-threaded tests on platforms having pthreads.
  • New feature: function for printing a value of arbitrary type.
  • New feature: function ExplainMatchResult() for easy definition of composite matchers.
  • The new matcher API lets user-defined matchers generate custom explanations more directly and efficiently.
  • Better failure messages all around.
  • NotNull() and IsNull() now work with smart pointers.
  • Field() and Property() now work when the matcher argument is a pointer passed by reference.
  • Regular expression matchers on all platforms.
  • Added GCC 4.0 support for Google Mock Doctor.
  • Added gmock_all_test.cc for compiling most Google Mock tests in a single file.
  • Significantly cleaned up compiler warnings.
  • Bug fixes, better test coverage, and implementation clean-ups.

    Potentially breaking changes:

  • Custom matchers defined using MatcherInterface or MakePolymorphicMatcher() need to be updated after upgrading to Google Mock 1.5.0; matchers defined using MATCHER or MATCHER_P* aren't affected.

  • Dropped support for 'make install'.

Changes for 1.4.0 (we skipped 1.2.* and 1.3.* to match the version of Google Test):

  • Works in more environments: Symbian and minGW, Visual C++ 7.1.
  • Lighter weight: comes with our own implementation of TR1 tuple (no more dependency on Boost!).
  • New feature: --gmock_catch_leaked_mocks for detecting leaked mocks.
  • New feature: ACTION_TEMPLATE for defining templatized actions.
  • New feature: the .After() clause for specifying expectation order.
  • New feature: the .With() clause for for specifying inter-argument constraints.
  • New feature: actions ReturnArg<k>(), ReturnNew<T>(...), and DeleteArg<k>().
  • New feature: matchers Key(), Pair(), Args<...>(), AllArgs(), IsNull(), and Contains().
  • New feature: utility class MockFunction<F>, useful for checkpoints, etc.
  • New feature: functions Value(x, m) and SafeMatcherCast<T>(m).
  • New feature: copying a mock object is rejected at compile time.
  • New feature: a script for fusing all Google Mock and Google Test source files for easy deployment.
  • Improved the Google Mock doctor to diagnose more diseases.
  • Improved the Google Mock generator script.
  • Compatibility fixes for Mac OS X and gcc.
  • Bug fixes and implementation clean-ups.

Changes for 1.1.0:

  • New feature: ability to use Google Mock with any testing framework.
  • New feature: macros for easily defining new matchers
  • New feature: macros for easily defining new actions.
  • New feature: more container matchers.
  • New feature: actions for accessing function arguments and throwing exceptions.
  • Improved the Google Mock doctor script for diagnosing compiler errors.
  • Bug fixes and implementation clean-ups.

Changes for 1.0.0:

  • Initial Open Source release of Google Mock