Nim
arraymancer

NimのライブラリArraymancer を触ってみます.

本日は

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.

となっています.

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を扱う場合はいろいろとうまくいかない

https://github.com/dom96/choosenim/issues/16

ので手動でインストールしなおします.

Example

show me some code の段落にあるコードを触ってみましょう.

example.nim
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だとインストールやら動作に苦労しますね・・・.本格的な動作はまた今度です.

Reference: