cygwinでredsvdを動かそうとして失敗したログ

追記: redsvd 0.1.2リリースによりeigen3beta2に対応しました。また、いくつかのバグらしきものについては報告済みです。以下の内容は古いですが一応残しておく。あとで整理。


なんでコンパイルごときに苦労せねばならぬのだパッケージ管理は闇だエラーメッセージは混沌だファッキンファッキン、云々。

環境

あらすじ

ビルドは通るところまでいったけど結果がおかしい…… → 挫折

手順

基本的には、

  1. eigen3-beta1をインストール
  2. redsvdをインストール

以上。
注意が必要なのはeigen3-beta2では動かないと言うことです(beta2ではEign::SVDクラスが削除されたらしい)。
beta2を入れた状態でredsvdをビルドしようとすると以下のメッセージが。

[10-29 20:40:09] $ ./waf
Waf: Entering directory `/cygdrive/c/home/src/redsvd-0.1.1/build'
[ 1/17] cxx: src/redsvd.cpp -> build/default/src/redsvd_1.o
[ 2/17] cxx: src/redsvd.cpp -> build/default/src/redsvd_2.o
In file included from ../src/redsvd.cpp:21:
../src/redsvd.hpp: In member function `void REDSVD::RedSVD::run(Mat&, int)':
../src/redsvd.hpp:84: error: `SVD' is not a member of `Eigen'
../src/redsvd.hpp:84: error: expected primary-expression before '>' token
../src/redsvd.hpp:84: error: there are no arguments to `svdOfC' that depend on a template parameter, so a declaration of `svdOfC' must be available
../src/redsvd.hpp:84: error: (if you use `-fpermissive', G++ will accept your code, but allowing the use of an undeclared name is deprecated)
../src/redsvd.hpp:88: error: `svdOfC' undeclared (first use this function)
../src/redsvd.hpp:88: error: (Each undeclared identifier is reported only once for each function it appears in.)
In file included from ../src/redsvd.cpp:21:
../src/redsvd.hpp: In member function `void REDSVD::RedSVD::run(Mat&, int)':
../src/redsvd.hpp:84: error: `SVD' is not a member of `Eigen'
../src/redsvd.hpp:84: error: expected primary-expression before '>' token
../src/redsvd.hpp:84: error: there are no arguments to `svdOfC' that depend on a template parameter, so a declaration of `svdOfC' must be available
../src/redsvd.hpp:84: error: (if you use `-fpermissive', G++ will accept your code, but allowing the use of an undeclared name is deprecated)
../src/redsvd.hpp:88: error: `svdOfC' undeclared (first use this function)
../src/redsvd.hpp:88: error: (Each undeclared identifier is reported only once for each function it appears in.)
Waf: Leaving directory `/cygdrive/c/home/src/redsvd-0.1.1/build'
Build failed:
 -> task failed (err #1):
        {task: cxx redsvd.cpp -> redsvd_2.o}
 -> task failed (err #1):
        {task: cxx redsvd.cpp -> redsvd_1.o}
eigen3-beta のインストール

手動でもできるらしいけどcmakeを入れたほうが楽じゃないかしら(cmakeはcygwinのパッケージに入ってます)。
pkg-configのデータであるpcファイルがデフォルトだと生成されないので、CMakeLists.txtを編集する必要がある。

# CMakeList.txt
...
# if(NOT WIN32)
  option(EIGEN_BUILD_PKGCONFIG "Build pkg-config .pc file for Eigen" ON)
# endif(NOT WIN32)
...
$ cd eign
$ mkdir build
$ cd build
$ cmake ..
 (カレントディレクトリにmakeに必要な一式が生成される)
$ make install
redsvd 0.1.1のインストール

PKG_CONFIG_PATHを設定してやらないとwaf(謎のビルドシステム)がeigen3を認識してくれないことに注意(eigen3の.pcファイルは/usr/local/share/pkgconfig/以下に配置される)

$ PKG_CONFIG_PATH=/usr/lib/pkgconfig/:/usr/local/share/pkgconfig/ ./waf configure
$ ./waf

で、めでたくビルド+インストール完了。

$ build/default/test/accuracy_test.exe
dense 100       100     10      10
0       0       -1.19209e-07    1       1
1       -0.105361       -0.105361       1       1
2       -0.210721       -0.210721       1       1
3       -0.316082       -0.316081       1       1
4       -0.421442       -0.421442       1       1
5       -0.526803       -0.526802       1       1
...

ふむ、動くようだ。
と思って公式サイトのサンプルを試してみたところ

$ cat file1
 1.0  2.0  3.0  4.0  5.0
-2.0 -1.0  0.0  1.0  2.0
 1.0 -2.0  3.0 -5.0  7.0
$ redsvd -i file1 -o file1 -r 2 -f dense && cat file1.U file1.S file1.V
compute SVD
read matrix from file1 ... -7.69505e-08 sec.
rows:   3
cols:   5
rank:   2
compute ... 0.000999923 sec.
write file1.U
write file1.S
write file1.V
0.0109999 sec.
finished.
+nan +nan
+nan +nan
+nan +nan
+nan
+nan
+nan +nan
+nan +nan
+nan +nan
+nan +nan
+nan +nan

うっ……(涙)