2010年10月27日水曜日

査読レポート作成

今日は午前中に査読レポートを作成。
査読なので、詳細はここでは省略。
レポートとして一通り書いたので、あとでもう一度見直してから提出すればOKそうだ。

今日の作業内容:
6:30-7:30 [ok] 査読論文読み込み
8:00-9:00 [ok] 査読論文プログラムチェック
10:00-11:00 [ok] 査読論分の周辺情報確認
10:30-11:30 [ok] 査読論文 Major Comment 作成
11:30-12:30 [ok] 査読論文 Minor Comment 作成
今日のBGM: DQ III,IV
今日のランチ: 食堂 ハンバーグ定食
明日の予測作業時間:2h

2010年10月26日火曜日

objdump で dll の確認 & semidefinite embedding

昨日の SDPA を mingw でコンパイルしたものであるが、mingw でコンパイルしたときにどの dll が必要となるかは Linux 同様に objdump で確認できる。
実行すると
$ i586-mingw32msvc-objdump -p sdpa.exe | grep "DLL Name"
DLL Name: KERNEL32.dll
DLL Name: msvcrt.dll
DLL Name: msvcrt.dll
となり、pthreadGC2.dll を必要としていないことが確認できる。ちなみに、pthreadGC2.dll 自身は
$ i586-mingw32msvc-objdump -p pthreadGC2.dll | grep "DLL Name"
DLL Name: KERNEL32.dll
DLL Name: msvcrt.dll
DLL Name: WSOCK32.DLL
となり、WSOCK32.DLL を必要としていることが解る。(static でリンクしたときに、libwsock32.a をリンクしていたのは、このため)


あと、semidefinite embedding については、ここ最近で以下の論文を読んでおいた。
[1] Fast Graph Mixing Markov Process on a Graph and a Connection to a Maximum Variance Unfolding Problem
by X. Wu, A. So, Z. Li, S.Li
[2] Embedded in the Shadow of the Separator
by F. Goring, C. Helmberg, M. Wappler
[3] Dimensionality Reduction: A comparative Review
by L. Maaten, E. Postna, J. Herik

[1] は Semidefinite Embedding が、 Markov Process の収束を最適化する問題と primal-dual になっている、という点が面白い。
[2] は、低次元に埋め込んだときに、あるカットで点を2つのセットに分割すると、どちらかのセットのすべての点は原点とその点の間にカットが挟まる、ことを言っている。ただ、証明の難しさの割には、今後の展開には使えなさそうである。
[3] は survey 論文。これまでの手法を整理し、数値実験で比較している。特に、Appendix に数値実験用の人工データをどう作るか、という式が載っており、Swiss Roll はこの式で生成できるようだ。

今日の作業内容:
6:30-7:00 [ok] Dimension Reduction Survey 読み p14-p18
7:00-7:30 [ok] Dimension Reduction Survey 読み p19-p26
7:30-8:30 [ok] 読んできた論文の整理
10:20-11:00 [ok] 査読論文読みはじめ
17:00-18:00 [ok] 査読論文続き
今日のランチ:らく 焼魚定食
明日の予測作業時間:3h

2010年10月25日月曜日

DLL なしのSDPA の Windows バイナリのコンパイル方法

昨日のコンパイル方法では、pthread が dll となってしまうため、これを static でリンクすることにした。
これによって pthreadGC2.dll を別途コピーする必要なく Windows 上で実行できるようになる。

static にするのは、pthread-win32 のページで配布されている tar.gz ではうまく行かなかったため、cvs でソースを持ってくる。参考にしたのは、
http://blog.k-tai-douga.com/article/39079027.html
であるが、つまり
$ cvs -d :pserver:anoncvs@sourceware.org:/cvs/pthreads-win32 login
で cvs のログイン情報を乗せる(パスワードは、anoncvs である。)
このあと、
$ cvs -d :pserver:anoncvs@sourceware.org:/cvs/pthreads-win32 checkout pthreads
とすると、pthread-win32 が取り出せる。
コンパイルは、
$ make -f GNUmakefile CROSS=i586-mingw32msvc- clean GC-static
である。
これにより、libpthreadGC2.a が作られる。pthreadGC2.dll があると dll が必要となるので、これが生成されていないことを確認しておきたい。

次に、SDPA 7.3.2 の configure としては、

export CFLAGS="-D__CLEANUP_C -O3 -finline-functions -DPTW32_BUILD_INLINED -DPTW32_STATIC_LIB -I(どこか)/pthreads -I. -DHAVE_CONFIG_H -Wall"
export FCFLAGS="${CFLAGS}"
export CXXFLAGS="${CFLAGS}"
./configure --prefix=(どこか)/sdpa-install --build=x86_64-unknown-linux-gnu --host=i586-mingw32msvc --target=i586-mingw32msvc --with-blas="(どこか)/lapack-3.2.2/blas_LINUX.a (どこか)/pthreads/libpthreadGC2.a /usr/i586-mingw32msvc/lib/libwsock32.a" --with-lapack=(どこか)/lapack-3.2.2/lapack_LINUX.a

ポイントは、
[1] PTW32_STATIC_LIB を define した上で pthread.h を include すること。(これをしないと __imp__pthread_??? という関数ができてしまい、リンクできなくなってしまう。)
[2] libpthreadGC2.a と一緒に libwsock32.a もリンクすること。
である。
SDPA の場合、--with-blas のところに来ているライブラリが最後の方にリンクされるので、ここに無理に追加している。

これで
$ make
とするが、もちろん、MUMPS で失敗する。
$ cd mumps/build
として、
Makefile.inc の最後に以下の2行を追加する。
AR = i586-mingw32msvc-ar vr
RANLIB = i586-mingw32msvc-ranlib
このあとで mumps/build で
$ make clean d
で mumps のライブラリはコンパイルできる。
(このとき、PTW32_STATIC_LIBが define されていることも分かる)

そのあと、sdpa-7.3.2 のディレクトリに戻って
sdpa_tool.cpp, sdpa_newton.h
に昨日と同じ修正を施して、
$ make
とすると、sdpa.exe ができる。
$ wine ./sdpa.exe example1.dat-s example1.result
で実行できるのを確認してから Windows 上にコピーする。
(もちろん、dat-s ファイルは nkf で改行コードを変更しておく。)

なお、ros_500.dat-s を解いたところ、native の SDPA と wine 上の SDPA だと 10 倍程度の計算速度の違いが出る。

最終的には出来上がったが、PTW32_STATIC_LIB に気づくまでに1時間間30分以上をロスしてしまった。

今日の作業内容:
6:30-7:30 [ok] Embedded in the shadow 読み p1-p10
7:45-8:30 [ok] 会議用投稿の査読
10:00-10:30 [ng] pthread-win32 static compile
10:30-11:00 [ng] pthread-win32 static compile
11:00-11:30 [ng] pthread-win32 static compile
13:00-14:00 [ok] SDPARA 原稿校正
13:30-14:30 [ng] pthread-win32 static compile
14:30-15:30 [ok] pthread-win32 static compile
15:30-16:00 [ok] Embedded in the shadow 読み
今日のランチ:しなの カツオのタタキ丼とうどんのセット
明日の予測作業時間:5h

2010年10月24日日曜日

SDPA の Windows バイナリのコンパイル方法

前回、一度行ったが、今日改めてやって見たところ、メモに残さないと覚えていられないほど面倒であることが分かった。

ここにメモを書いておく。

まずは、Debian or Ubuntu で Synaptic を使って
gcc-mingw32, mingw32-runtime, mingw32-binutils, wine
をインストールする。
これにより、以下のコマンドが使えるはずである。
i586-mingw32msvc-g++,i586-mingw32msvc-gfortran,i586-mingw32msvc-ar,i586-mingw32msvc-ranlib, wine

次に、lapack-3.2.2 の lapack.tgz をダウンロードしてきて、
cd lapack-3.2.2
cp INSTALL/make.inc.gfortran make.inc
でそのあと、以下の修正をする。
$ diff INSTALL/make.inc.gfortran make.inc
19c19
< FORTRAN = gfortran
> FORTRAN = i586-mingw32msvc-gfortran
23c23
< LOADER = gfortran
> LOADER = i586-mingw32msvc-gfortran
43c43
< ARCH = ar
> ARCH = i586-mingw32msvc-ar
45c45
< RANLIB = ranlib
> RANLIB = i586-mingw32msvc-ranlib
さらに、Makefile も以下のように修正する。
$ diff Makefile.org Makefile
17,18c17,18
< ( cd INSTALL; $(MAKE); ./testlsame; ./testslamch; \
< ./testdlamch; ./testsecond; ./testdsecnd; ./testversion )
---
> ( cd INSTALL; $(MAKE); wine ./testlsame; wine ./testslamch; \
> wine ./testdlamch; wine ./testsecond; wine ./testdsecnd; wine ./testversion )

これで、
make blaslib lapacklib
により、blas_LINUX.a, lapack_LINUX.a が生成される。

次に、pthread-win32 をダウンロードしてくる。
mkdir -p (どっか)/pthread-win32/include
cd (どっか)/pthread-win32/include
wget http://mirrors.kernel.org/sources.redhat.com/pthreads-win32/prebuilt-dll-2-8-0-release/include/pthread.h
wget http://mirrors.kernel.org/sources.redhat.com/pthreads-win32/prebuilt-dll-2-8-0-release/include/sched.h
wget http://mirrors.kernel.org/sources.redhat.com/pthreads-win32/prebuilt-dll-2-8-0-release/include/semaphore.h
mkdir -p (どっか)/pthread-win32/lib
cd -p (どっか)/pthread-win32/
wget http://mirrors.kernel.org/sources.redhat.com/pthreads-win32/prebuilt-dll-2-8-0-release/lib/pthreadGC2.dll
wget http://mirrors.kernel.org/sources.redhat.com/pthreads-win32/prebuilt-dll-2-8-0-release/lib/libpthreadGC2.a

次に、sdpa-7.3.2 のソースディレクトリに移動して、

./configure --prefix=${HOME}/sdpa-install --build=x86_64-unknown-linux-gnu --host=i586-mingw32msvc --target=i586-mingw32msvc --with-blas=(どっか)/blas_LINUX.a --with-lapack=(どっか)/lapack_LINUX.a

によりコンフィグを通す。
これで make をすると mumps のコンパイル中に pthread.h が見つからず止まる。

cd mumps/build で Makefile.inc に以下の修正。
$ diff Make.inc/Makefile.inc.generic.SEQ Makefile.inc
77c77
< AR = ar
> AR = i586-mingw32msvc-ar
80c80
< RANLIB = ranlib
> RANLIB = i586-mingw32msvc-ranlib
117c117
< inc = $(INCSEQ)
> INC = $(INCSEQ) -I(pthreadのディレクトリ)/include
119a120,127
> CC = i586-mingw32msvc-gcc
> FC = i586-mingw32msvc-gfortran
> FL = i586-mingw32msvc-gfortran
> OPTC = -g -O2 -O2 -funroll-all-loops
> OPTF = -g -O2 -O2 -funroll-all-loops
> OPTL = -g -O2 -O2 -funroll-all-loops
> LPORDDIR = (どっか)/sdpa-7.3.2/mumps/build/PORD/lib/
> IPORDDIR = (どっか)/sdpa-7.3.2/mumps/build/PORD/include/

これで mumps/build で
make clean; make d
を実行する。

さらに、sdpa-7.3.2のディレクトリの Makefile を以下のように修正する。
$ diff Makefile.org Makefile
104,105c104,105
< $(LDFLAGS) -o $@
< default_includes = -I.
> $(LDFLAGS) -o $@
> DEFAULT_INCLUDES = -I. -I(pthreadのどっか)/include
200c200
< FCLIBS =
> FCLIBS = -L/usr/lib/gcc/i586-mingw32msvc/4.4.4 -L/usr/lib/gcc/i586-mingw32msvc/4.4.4/../../../../i586-mingw32msvc/lib (pthreadのどっか)/lib/libpthreadGC2.a -lgfortranbegin -lgfortran -lmingw32 -lmoldname -lmingwex -lmsvcrt -luser32 -lkernel32 -ladvapi32 -lshell32

さらに sdpa_newton.h の 33 行目に
#include <pthread.h>
を追加し、sdpa_tool.cpp では、
#include <sys/times.h>をコメントにし、
double Time::rGetUseTime() 関数を削除する。

これで make すると sdpa.exe が完成する。
Linux 上でテストするには、pthreadGC2.dll を sdpa-7.3.2 にコピーしてきて
$ wine ./sdpa.exe example1.dat-s example1.result
である。

これを最終的に Windows に持っていくには、
$ nkf --windows param.sdpa > param.sdpa.windows
$ nkf --windows example1.dat-s > example1.dat-s.windows
として windows 用のテキストファイルにしてから、
sdpa.exe, pthreadGC2.dll, param.sdpa.windows, example1.dat-s.windows を Windows にコピーし、param.sdpa.windows を param.sdpa, example1.dat-s.windows を example1.dat-s にする。
最後にWindows のアクセサリにあるコマンドプロンプトからディレクトリを移動しておき、
sdpa.exe example1.dat-s example1.result
で実行できる。

ここまでで気がついたと思うが、この場合、 reference-blas に接続しているので、ATLAS,GotoBLAS などの性能は出ない。
ATLAS は mingw だとやはりうまくコンパイルができず、GotoBLAS はコンパイルと実行はできるがライセンスの関係で配布できない。

いずれにしても、この程度まで頑張れば、Windows 用のバイナリを生成できる。

2010年10月22日金曜日

semidefinite embedding の論文の読み込み

semidefinite embedding 関係の論文を2本チェック。

[1] Colored Maximum Variance Unfolding
by L. Song, A. Smola, K. Borgward, A. Gretton
[2] Fast Graph Laplacian Regularized Kernel Learning via Semidefinite-Quadratic-Linear Programming
by X. M. Wu, A. M. So, Z. Li, S. R. Li

[1] は、空間ベクトルの他にもうひとつラベル分けが入力情報として得られるときの embedding である。基本的には、ラベル分けの情報が使える分、目的関数に組み込まれている。
あと、Hilbert-Schmidt Independt Criterion というキーワードもあり、これは使えそうである。

[2] は、ずれを最小化する項を目的関数に入れたときに計算量が大きくなるが、SDP に定式化しているものを一部、SOCP で表現できることに着目して計算量を抑えている。アイデア勝負と言って単純な感じなので、学生が書いたものかもしれない。

あと、[2]については、データ生成の元になっている URL が6ページ目に掲載されている。
http://www.cs.toronto.edu/~roweis/lle/code.html
http://www-stat.stanford.edu/~tibs/ElemStatLearn/
これについては、あとで調べることにする。

今日の作業内容:
6:30-7:30 [ok] semidefinite embedding 論文チェック
8:15-8:45 [ok] SparsePOP の confiugure 調整

13:30-14:00 [ng] SparsePOP の configure 調整
14:00-14:30 [ok] SparsePOP の configure 調整
14:50-16:00 [ok] 楕円計算メモ更新
15:20-16:00 [ok] semidefinite embedding の論文読み(一つめ)
16:20-17:00 [ok] semidefinite embedding の論文読み(ふたつめ)の前半
17:00-17:45 [ok] semidefinite embedding の論文読み(ふたつめ)の後半

今日のBGM: FF5 OST [1-2]
今日のランチ:味庵 炸醤麺
明日の予測作業時間: 4h

2010年10月21日木曜日

ドイツホテル予約と semidefinite embedding の論文読み

今朝のうちに semidefinite embedding の論文をチェック。
読んだのは、
K.Q.Weinberger, L.K.Saul, "Unsupervised Learning of Image Manifolds by Semidefinite Programming", Intl. J. Comp. Vision, 70(1), 77-90, 2006

定式化はセンサーネットワーク問題と同じ制約で、目的関数が異なる。
問題設定の関係から、かなりの疎性が見込まれるので、SFSDP で高速に解ける可能性あり。

ただ、探していた方向とはちょっとずれたか。
なお、semidefinite embedding は、他の専門用語でも同じ内容があるようなので、それについてはあとで調べたい。

あと、ドイツのホテルを予約。
複数人数なのでシングルベッドを複数あるところを検索しようとするが、ダブルルームばかりでツインルームが少なく、かなりてこずる。
それぞれのホテルのサイトまで確認して写真をチェックしないとダブるかツインか解らないのが大変だった。
結果的には、それなりのホテルを安く泊まれそうなので、これまでの検索時間は無駄でなかったと考えている。
予約を取るまでに、市内の便利な地域、交通路、治安関係など、実は12時間以上調べている。

今日の作業内容:
6:15-6:45 [ng] semidefinite embedding の論文読み p79-p85
6:45-7:15 [ng] semidefinite embedding の論文読み p81-p85
8:45-9:15 [ok] semidefinite embedding の論文読み p83-p89

10:45-11:30 [ok] SparsePOP インストール確認
13:20-14:00 [ng] ドイツホテル選択
14:00-14:40 [ok] ドイツホテル選択続き
16:30-17:30 [ok] ホテル予約
明日にまわす semidefinite embedding の情報集め

今日のランチ:いろは カキフライ
明日の予測作業時間:4h

2010年10月20日水曜日

Lassere の論文読みと semidefinite embedding

今日は午前中のうちに、多項式最適化の SDP緩和の基本である Lassere の論文を復習しておいた。

有名どころなのではあるが、いちおう書いておくと
J.Lassere, Global Optimization with polynomials and the problem of moments, SIAM J. OPTIM., 11(3), 796-817
である。
この論文の中で特に重要なのは定理 3.2 であり、これによって SDP 緩和が多項式最適化に使えることの根拠となっている。定理 3.2 は1変数のものであるが、多変数についても定理 3.2 の証明と似たような流れを使うことになっている。

あと、他に検索していたところ、semidefinite embedding というキーワードを発見。
なにか関係があるのか、ベースとなっている論文を見つけてきて読みはじめたところである。


今日の作業内容:
5:30-6:30 [ng] Lassere の論文読み P796-808
10:40-11:40 [ok] Lassere の論文読み P805-P810
11:30-11:50 [ok] メモの内容の確認
13:00-13:20 [ok] semidefinite embedding を調べる
16:00-17:00 [ok] semidefinite embedding の論文読み 第1部
今日のランチ:角笛 オムライス
明日の予測作業時間:3h