Numo::Linalg Alternative (numo-linalg-alt) is an alternative to Numo::Linalg. Unlike Numo::Linalg, numo-linalg-alt depends on Numo::NArray Alterntive. Please note that this gem was forked from Numo::TinyLinalg, not Numo::Linalg, so its version numbering rule is not compatible with that of Numo::Linalg.
The project owner has the utmost respect for Numo::Linalg and its creator, Prof. Masahiro Tanaka. This project is in no way intended to adversely affect the development of the original Numo::Linalg.
numo-linalg-alt uses OpenBLAS as the default backend library. If BLAS/LAPACKE-related libraries and include files are not found during installation, the gem will automatically download and build OpenBLAS from source. This process can significantly increase installation time, so pre-installing OpenBLAS is recommended.
Install the OpenBLAS.
macOS:
$ brew install openblasUbuntu:
$ sudo apt-get install libopenblas-dev liblapacke-devInstall the gem and add to the application's Gemfile by executing.
macOS:
$ bundle config build.numo-linalg-alt "--with-opt-dir=/opt/homebrew/opt/openblas"
$ bundle add numo-linalg-altUbuntu:
$ bundle add numo-linalg-altIf bundler is not being used to manage dependencies, install the gem by executing.
macOS:
$ gem install numo-linalg-alt -- --with-opt-dir=/opt/homebrew/opt/openblasUbuntu:
$ gem install numo-linalg-altThe --with-blas and --with-lapacke options allow you to specify which BLAS/LAPACKE libraries
to use as the backend. The following instructions are intended for Ubuntu.
Install the BLIS:
$ sudo apt-get install libblis-dev liblapacke-devTo use BLIS as the BLAS library, execute the following gem command.
The --with-lapacke option is not required as LAPACKE is automatically selected.
$ gem install numo-linalg-alt -- --with-blas=blisInstall the Intel MKL:
sudo apt-get install intel-mklRun the following command to use Intel MKL's mkl_lapacke.h as lapacke.h:
sudo update-alternatives --install /usr/include/x86_64-linux-gnu/lapacke.h lapacke.h-x86_64-linux-gnu /usr/include/mkl/mkl_lapacke.h 10To use Intel MKL as the BLAS/LAPACKE libraries, execute the following gem command.
The --with-lapacke option is not required as the mkl_rt library includes LAPACKE functions.
$ gem install numo-linalg-alt -- --with-blas=mkl_rtAn example of singular value decomposition.
require 'numo/linalg'
x = Numo::DFloat.new(5, 2).rand.dot(Numo::DFloat.new(2, 3).rand)
# =>
# Numo::DFloat#shape=[5,3]
# [[0.104945, 0.0284236, 0.117406],
# [0.862634, 0.210945, 0.922135],
# [0.324507, 0.0752655, 0.339158],
# [0.67085, 0.102594, 0.600882],
# [0.404631, 0.116868, 0.46644]]
s, u, vt = Numo::Linalg.svd(x, job: 'S')
z = u.dot(s.diag).dot(vt)
# =>
# Numo::DFloat#shape=[5,3]
# [[0.104945, 0.0284236, 0.117406],
# [0.862634, 0.210945, 0.922135],
# [0.324507, 0.0752655, 0.339158],
# [0.67085, 0.102594, 0.600882],
# [0.404631, 0.116868, 0.46644]]
puts (x - z).abs.max
# => 4.440892098500626e-16preparation:
$ git clone https://github.com/yoshoku/numo-linalg-alt
$ cd numo-linalg-alt
$ bundle installbuild and test:
$ bundle exec rake compile
$ bundle exec rake test
linter:
$ bundle exec rubocop
$ clang-format --dry-run --Werror --style=file ext/**/*.h ext/**/*.cThis project follows Conventional Commits.
Please run npm install to set up husky and commitlint for commit message validation:
$ npm installBug reports and pull requests are welcome on GitHub at https://github.com/yoshoku/numo-linalg-alt. This project is intended to be a safe, welcoming space for collaboration, and contributors are expected to adhere to the code of conduct.
Everyone interacting in the Numo::Linalg Alternative project's codebases, issue trackers, chat rooms and mailing lists is expected to follow the code of conduct.
The gem is available as open source under the terms of the BSD-3-Clause License.