Skip to content

yoshoku/numo-linalg-alt

Numo::Linalg Alternative

Gem Version Build Status BSD 3-Clause License Documentation

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.

Installation

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 openblas

Ubuntu:

$ sudo apt-get install libopenblas-dev liblapacke-dev

Install 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-alt

Ubuntu:

$ bundle add numo-linalg-alt

If 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/openblas

Ubuntu:

$ gem install numo-linalg-alt

Using alternative backend libraries

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

BLIS

Install the BLIS:

$ sudo apt-get install libblis-dev liblapacke-dev

To 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=blis

Intel MKL

Install the Intel MKL:

sudo apt-get install intel-mkl

Run 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 10

To 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_rt

Documentation

Usage

An 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-16

Development

preparation:

$ git clone https://github.com/yoshoku/numo-linalg-alt
$ cd numo-linalg-alt
$ bundle install

build and test:

$ bundle exec rake compile
$ bundle exec rake test

linter:

$ bundle exec rubocop
$ clang-format --dry-run --Werror --style=file ext/**/*.h ext/**/*.c

This project follows Conventional Commits. Please run npm install to set up husky and commitlint for commit message validation:

$ npm install

Contributing

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

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.

License

The gem is available as open source under the terms of the BSD-3-Clause License.

About

Numo::Linalg Alternative (numo-linalg-alt) is an alternative to Numo::Linalg.

Topics

Resources

License

Code of conduct

Stars

Watchers

Forks

Contributors 3

  •  
  •  
  •