0.5.0で導入予定のクラスタリングにおいてEigenを使っている。 この文書には以下の情報を掲載する。
- Eigenをどの範囲で使っているか、Eigenの利用をoptionalにできるか
- Eigenを導入するやり方にはどういう選択肢があるか
これらの情報をもとに、Eigenを導入するかどうか、どう導入するかを決めたい。 依存ライブラリが増えるかもしれない話なので開発陣はひと通り目を通して欲しい。
Eigenは効率よい行列演算を簡潔に記述するためのC++のヘッダライブラリである。
- 3.1.0まではLGPL3.0+
- LGPL2と互換性がない
- 3.1.1以降は一部を除いてMPL2
- 条件付きでLGPL2と互換?
- 一部: SimplicialCholesky, AMD ordering and constrained_cg (ref. http://eigen.tuxfamily.org/index.php?title=Main_Page#License )
- これらを除くには#define EIGEN_MPL2_ONLYする
なので利用するなら3.1.1+。
jubatus/core/clustering内のGMMアルゴリズム内で使っている。
クラスタリングではk-Meansと混合ガウスモデル(GMM)という二つの手法を実装している。 このうちGMMにおいて、連立一次方程式のソルバーや行列式計算、行列の掛け算などが必要である。 特に連立一次方程式ソルバーや行列式計算を一から自分で書くのはコストが高く非効率なので、何らかのライブラリを利用する必要がある。 現状はそこでEigenを使用している。 Eigen以外の選択肢は特に検討していない。
使用箇所は以下のとおり。
- jubatus/core/clustering/eigen_feature_mapper.{hpp|cpp}
- jubatus/core/clustering/gmm.{hpp|cpp}
- jubatus/core/clustering/gmm_clustering_method.cpp
Eigenを使わないでビルドできるようにするには、GMMをdisableできるようにすれば良い。 必要な作業は以下のとおり。
- configureのオプションでGMMに関するソースコードを外せるようにする
- clustering_method_factoryのコードに#ifを入れる
jubatus/core/third_party ディレクトリを作り、その中にEigen以下をまるっと入れる。
- 依存パッケージが増えない
- バージョンを自由に選べる
- GMMのoptional化をしなくて良い
- ソースツリーが太る
waf configure時にEigenがあるかどうか調べ、なかったらその場でダウンロードしてその場で展開、include pathを通す。
- ソースツリーをいじらないで済む
- バージョンを自由に選べる
- Eigenがない環境でGMM enabledでビルドしたい場合、ビルド時にインターネット環境が必要になる
未調査。Eigen3.1.1がJuly, 2012なのでUbuntuのLTSなどで使えなさそう。
Eigenヘッダのインクルードでソースツリーに埋め込む方針で良いと思います。他のプログラムからライブラリとしてJubatusを利用されることを想定するなら注意が必要。
またdefine EIGEN_MPL2_ONLYで無効化される機能が必要かどうか。