2010年4月23日金曜日

本が届いた!! & Matlab で SDPA の実行結果を読み取り

今日は、注文しておいた本がついに届いた。
すでに絶版になっていたために簡単に購入できず、インターネット上で4日間ぐらい探してしまった。
結局、古本屋さんで数冊だけ奇跡的に残っており、今回は関西からの取り寄せとなった。

これだけ苦労したので、頑張って読んでいこうと思う。

あと、今日はちょっと疲れが出たので(金曜日はいつもより忙しい)、原稿の続きは後回しにして、メールで問い合わせが来ていたプログラムを実装した。
内容は簡単で、SDPA が出力したファイルから x,X,Y を Matlab 上に読み込むというもの。
だいたい2時間半程度で実装完了。
これによって、
$ ./sdpa -ds example1.dat-s -o example1.output
と解いた結果を
>> [objVal,x,X,Y,INFO] = read_output('example1.out',mDIM,nBLOCK,bLOCKsTRUCT);
の形式で読み込むようにした。
さらに、これを経由することで
>> [x,y,info] = read_outputSedumi('example1.out',length(b),K);
とすると sedumi で解いたときのように x,y,info が設定される。(info は SDPA ベースなので一部のみ)

ただし、SDPA はデフォルトで %8.3e の精度で x,X,Y を出力するので、param.sdpa で %8.16e などに変更しないと数値精度が悪くなってしまう。

あと、途中でバグにはまって1時間ぐらいかかった。

mwSize* blockStruct;
... 途中 ...
if (blockStruct[l] > 0) {
printf("PLUS: %zd",blockStruct[l]);
} else {
printf("MINUS: %zd",blockStruct[l]);
}
とすると、blockStruct[l] がマイナスのときにも if が成立して else に入らない。
しかも、printf では blockStruct[l] はマイナスで表示される。

原因は気がつけば簡単なことで、mwSize が size_t で格納されているため、
blockStruct[l] > 0 が size_t での比較となり、size_t だから必ずプラスか0の値になっているためだった。
これは、今後気をつけよう。

今日の作業内容: Matlab プログラム 2.5h
今日の BGM: MADLAX OST [1-2]
今日のランチ: ジョーナン メロンパン,スイートポテト,カレーパン,胡麻クロワッサンx2
明日の予測作業時間: 4h

0 件のコメント:

コメントを投稿