Skip to content

Instantly share code, notes, and snippets.

@beam2d
Last active December 26, 2015 22:59
Show Gist options
  • Save beam2d/7227556 to your computer and use it in GitHub Desktop.
Save beam2d/7227556 to your computer and use it in GitHub Desktop.

Eigen導入の検討

概要

0.5.0で導入予定のクラスタリングにおいてEigenを使っている。 この文書には以下の情報を掲載する。

  • Eigenをどの範囲で使っているか、Eigenの利用をoptionalにできるか
  • Eigenを導入するやり方にはどういう選択肢があるか

これらの情報をもとに、Eigenを導入するかどうか、どう導入するかを決めたい。 依存ライブラリが増えるかもしれない話なので開発陣はひと通り目を通して欲しい。

前提知識: Eigen

概要

Eigenは効率よい行列演算を簡潔に記述するためのC++のヘッダライブラリである。

ライセンス

  • 3.1.0まではLGPL3.0+
    • LGPL2と互換性がない
  • 3.1.1以降は一部を除いてMPL2

なので利用するなら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のソースツリー内に埋め込む

jubatus/core/third_party ディレクトリを作り、その中にEigen以下をまるっと入れる。

Pros

  • 依存パッケージが増えない
  • バージョンを自由に選べる
  • GMMのoptional化をしなくて良い

Cons

  • ソースツリーが太る

configure時にダウンロード

waf configure時にEigenがあるかどうか調べ、なかったらその場でダウンロードしてその場で展開、include pathを通す。

Pros

  • ソースツリーをいじらないで済む
  • バージョンを自由に選べる

Cons

  • Eigenがない環境でGMM enabledでビルドしたい場合、ビルド時にインターネット環境が必要になる

パッケージを使う

未調査。Eigen3.1.1がJuly, 2012なのでUbuntuのLTSなどで使えなさそう。

@suma
Copy link

suma commented Nov 5, 2013

Eigenヘッダのインクルードでソースツリーに埋め込む方針で良いと思います。他のプログラムからライブラリとしてJubatusを利用されることを想定するなら注意が必要。
またdefine EIGEN_MPL2_ONLYで無効化される機能が必要かどうか。

@kumagi
Copy link

kumagi commented Nov 6, 2013

埋め込んだ方がこちらで利用バージョンを確定できる上、ネット環境などの前提条件が増えないので合理的かと思います。
現状でJubatus全体で4MB前後のソースコードなので太るにしても大きな差ではないとおもいます。

@suma
Copy link

suma commented Nov 6, 2013

ミーティングでの結論

  • third_party以下へEigenのコードを入れて利用する
    • Eigenのバージョンは 3.2を予定(詳細は @beam2d 作業)
    • GMMでのoptional化はしない
  • Jubatus 0.5.0で自作サービスを作る人・モジュールをリンクする人向け
    • ユーザ(開発者)が独自にEigenを利用することは想定しない。利用者がいたら解決法を考える
    • 懸念)Jubatusのthird_partyと異なるバージョンのEigenヘッダを利用(include)しようとするとシンボル衝突等のリスクがある

@odasatoshi
Copy link

3.2.0のCOPYING.READMEには、

All the LGPL code is either LGPL 2.1-only, or LGPL 2.1-or-later.
For this reason, the COPYING.LGPL file contains the LGPL 2.1 text.

とあります。
なので、LGPL2.1にせよ、or laterにせよ、リンクには問題ないかと思います。
なので、#define EIGEN_MPL2_ONLYの必要もないと思います。

@beam2d
Copy link
Author

beam2d commented Nov 6, 2013

@suma
まとめありがとうございます。

@odasatoshi
おお、そうでしたか。
確認不足でした。ありがとうございます。

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment