redsvdのwrapper RRedSVDとRパッケージ作成、公開についての覚え書き
疎行列に対する特異値分解の高速な近似実装 redsvdのR wrapperである RRedSVDを作成、公開しました。
https://github.com/xiangze/RRedsvd
ライセンスはBSDです。
TokyoRでは特異値分解とは何か、どんな手法があるかなどの基本的説明、RとC++を橋渡しするRcpp, RcppEigen packageの紹介などを解説しました(全ては説明しきれませんでした)。
アルゴリズムと性能に関してはredsvdのプロジェクトページ(https://code.google.com/p/redsvd/ 日本語、英語), 製作者のhillbigさんのブログ(http://hillbig.cocolog-nifty.com/do/2010/08/redsvd-aa59.html 日本語)、NIPS tutorial(http://amath.colorado.edu/faculty/martinss/Talks/2009_NIPS_tutorial.pdf 英語)が詳しいです。
以下はRcppを用いたパッケージ開発に関する覚書です。
- コンパイルにwafではなくMakevars(Makefile)を使うようにした。
- Rにはfloat型を渡せないのでredsvdのソースを改変する必要があった(コメントを参照)。
- 32bit,64bit両方対応のためのMakevarsバッドノウハウ
- https://github.com/xiangze/RRedsvd/blob/master/src/Makevars#L22
-
https://github.com/xiangze/RRedsvd/blob/master/src/Makevars.win#L22
- R CMD SHLIB pakegenameではMakevarsに書かれた内容が実行されるがR CMD install pakegename ではそれに加えてMakevarsのPKG_CXXFLAGS, PKG_LIBSの値に基づいてNAMESPACEファイルに書いたdynamic link libraryが自動的に生成され、挙動が異なる。
- R CMD check でドキュメントが生成される。Macではtexのフォントがインストールされていないためエラーが出た*1。その他texのエラーを見やすくするには
R CMD Rd2pdf --no-clean
を実行すると良い。
- CRANへの登録
http://cran.r-project.org/submit.htmlへsubmitする。各アーキテクチャ(Linux,Windows,MacOS)へのビルド、インストールの確認は手作業で行われているらしい。
手元の環境ではWindows32bit/64bitともにビルドできたがCRANの環境ではエラーメッセージ
があった(libRcppへのリンクがされていない?)。
Reference
- Writing R Extention http://cran.r-project.org/doc/manuals/r-devel/R-exts.html
- CRAN Repository Policy http://cran.r-project.org/web/packages/policies.html