修士・博士課程時代
- 流体の直接数値計算
- C++でシミュレーションを実装
- Pythonで可視化+統計量の解析(on Jupyter)
- データはmsgpackで保存
データ同化の研究を始める
- 既存のコードベースを廃棄
- Pythonで実装を始める
- NumPy/SciPy使用
Python遅い(´・ω・`)
- Pythonでは関数の呼び出しがインライン展開できない
- 汎用性高く実装できない
- でも、もうC++は書きたくない
- コンパイルに1分かかるのはちょっと・・・
何で書く?
- Haskellで書いてみた
- ものすごく遅いコードが出来上がった(涙)
- 配列を部分的に書き換えていくコードが書きづらい
- コンパイル遅い
- GoかRustか
- Goが流行ってるのでRustにした
Rustを覚える
- C++の不満点が解消されている
- ビルドシステム(cargo)
- moveが自然に導入
- template -> traits (concepts)
- iterator周りの機能が豊富
- itertoolsでさらに拡張
- 所有権はC++より簡単
- ライフタイムはコンパイラが教えてくれる
Rustで実装開始
- 線形代数ライブラリの選択(参考:Linear Algebra in Rust)
- rusty-machine (rulinalg): Machine Learning library for Rust
- ndarray : Arrays inspired by numpy.
- nalgebra : Low dimensional linear algebra.
- servo/euclid : Basic linear algebra used by Servo.
- cgmath : Linear algebra for game development.
- 一番単純そうなndarrayを選択
- 純粋な線形演算ライブラリで、低次元に特化していない
- もともとC++で実装してい自作ライブラリに似てた(Eigenは使っていなかった)
LAPACK相当の機能がndarrayにない
-
ndarray-linalgを開発
- LAPACKを共有ライブラリとしてリンク(lapack crateを使用)
- Rustによる数値計算: 線形代数編
- 同時期に同じ目的の別crate linxalも開発される
FFTできない
- rust-fftw3を開発
- Cのバインディングの作成を覚えた
現状の課題
- データの管理
- 現状msgpackに保存しているがMongoDBに保存したい
- dieselで簡単にSQLサーバーに保存できるかも?
- 並列化・大規模化
- 数値計算はデータ並列なのでRayonが有効
- MPI並列の例がない(?)
- PythonからRustの関数を呼べるようにしたい
- 呼ぶだけならできる:rust-cpython
- NumPy C APIも併せてrust-ndarrayとシームレスに連携したい