修士・博士課程時代

    • 流体の直接数値計算

 

    • 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が有効

データ並列ライブラリRayonを使ってみた

MPI並列の例がない(?)

PythonからRustの関数を呼べるようにしたい

呼ぶだけならできる:rust-cpython

NumPy C APIも併せてrust-ndarrayとシームレスに連携したい