本日は
Nimにおける多次元配列を扱うライブラリ Arraymancer を触ってみました.
Nimの多次元配列ライブラリはどんなものが?
知ろうとしたきっかけはNimの標準ライブラリで多次元配列を扱う標準ライブラリがないかを探していたことです.Nim Standard Library - Math libraries には basic2d basic3d が紹介されていますが,これらは非推奨とされているようです.実際
https://github.com/nim-lang/basic2d および
https://github.com/nim-lang/basic3d のReadmeでは
basic3d
This module is deprecated and should not be used in newly written software
Use neo
or arraymancer
or glm
packages instead.
となっています.
- neo: https://github.com/unicredit/neo (linalg をfork したものらしい??? https://forum.nim-lang.org/t/3000)
- arraymancer: https://github.com/mratsim/Arraymancer
- glm: https://github.com/stavenko/nim-glm
Arraymancer の概要はリポジトリで次のように言及されています.
Arraymancer is a tensor (N-dimensional array) project in Nim. The main focus is providing a fast and ergonomic CPU, Cuda and OpenCL ndarray library on which to build a scientific computing and in particular a deep learning ecosystem.
The library is inspired by Numpy and PyTorch. The library provides ergonomics very similar to Numpy, Julia and Matlab but is fully parallel and significantly faster than those libraries. It is also faster than C-based Torch.
Nimで科学技術計算をしたりDeepLearningをしたいというときには重宝しそうです.
install
Windowsで動作を確認してみましょう. (Linux, Macでもいけるっしょ)
> nimble install arraymancer
これだけでOKです.Nim本体のバージョンが 0.17.2 以上を要請するので古いNimを使っている場合はNimのアップグレードをしておきましょう.
余談ですが,Nimの導入・バージョンの更新には choosenim が便利なのでしょうけれども,Windows上で64bitのNimを扱う場合はいろいろとうまくいかない
ので手動でインストールしなおします.
Example
show me some code の段落にあるコードを触ってみましょう.
import math, arraymancer, future
const
x = @[1, 2, 3, 4, 5]
y = @[1, 2, 3, 4, 5]
var
vandermonde: seq[seq[int]]
row: seq[int]
vandermonde = newSeq[seq[int]]()
for i, xx in x:
row = newSeq[int]()
vandermonde.add(row)
for j, yy in y:
vandermonde[i].add(xx^yy)
let foo = arraymancer.toTensor(vandermonde)
# let foo = vandermonde.toTensor() <- you can write
echo foo
これをコンパイルします.
> nim c -d:release example.nim
> example.exe
could not load: blas.dll
ヌーン・・・.動かない.Windowsだとだめなのか???
解決方法
Arraymancer の依存ライブラリの nimblas のReadmeを読んでみましょう.https://github.com/unicredit/nimblas#linking-blas-implementations
-d
オプションを追加することで解決できました.
> nim c -d:release -d:blas example.nim
> example.exe
Tensor[system.int] of shape [5, 5] of type "int" on backend "Cpu"
|1 1 1 1 1|
|2 4 8 16 32|
|3 9 27 81 243|
|4 16 64 256 1024|
|5 25 125 625 3125|
Windowsだとインストールやら動作に苦労しますね・・・.本格的な動作はまた今度です.