2012年6月29日金曜日

初期化が終了

SDPA-C の実装は、初期化が終わってメインループに入るところまで来た。
初期点が対角行列なので、内積計算のデバッグが不完全ではあるが、これについては順次進めていくことになると考えている。

それにしても、SDPA-C の線形代数計算は、SDPA のときよりもデータ構造の種類が多い分、流用が効かないため、内積計算だけでも数種類が必要である。
このあたりは、新規に実装している。

今日の作業内容:SDPA-C 3h + プレゼン準備 1h
今日のランチ:たちばな 〆サバ
明日の予測作業時間:3h


2012年6月28日木曜日

Residual の計算をデバッグ

昨日組んだところを今日確認してみたが、やはりバグが残っていたので、それを取り除いた。
double 型を int に代入していて、それに気がついていなかった部分がバグとなっていた。
変数の初期化については8割程度まで進んだが、今のところは正常に動いているので、このまま順調に進めていきたい。


今日の作業内容:SDPA-C 2h + プレゼン準備 2h
今日のランチ:らく 焼き魚定食
明日の予測作業時間:4h


2012年6月27日水曜日

残差ベクトルの計算

今日のところで残差ベクトルの計算ルーチンを書いておいた。
ただ、データ構造を変更した部分があるので、ちょっとそれが煩雑になっている。
この計算ルーチンは、まだデバッグしていないので、動作するかどうかを確認する必要あり。

ところで、残差ベクトルは、いままで2つ保持していたが、よくよく考えたら一つで十分であった。
これでメモリをもう少し節約できそうだ。

今日の作業内容:SDPA-C 2h + プレゼン準備 2h
今日のランチ:味庵 白身魚のチリソース
明日の予測作業時間:4h


2012年6月26日火曜日

TeX で #if 0 ~ #endif と同じことをする

C 言語などだと プリプロセッサを使って
#if 0
   この範囲をコンパイルしない
#endif
ということができるので便利である。これで、必要に応じて #if 0 と #if 1 を切り替えるだけで十分である。
これを TeX で行おうとすると
\if0
   この範囲をコンパイルしない
\fi
とするとコンパイルからは外せるのだが、\if1 としても有効にならないので \fi を削除せねばならず面倒である。
このときには、\iftrue~\fi と \iffalse~\fi で切り替えられるが #if 0, #if 1 に比べると文字数が多く、面倒である。


この場合には、
\ifx11
   この範囲をコンパイル
\fi

\ifx10
   この範囲をコンパイルしない
\fi
としておけば、末尾の0,1 を切り替えるだけでOKとなる。
これは、\ifx が次の2文字列が同じであるかどうかでコンパイルを切り分けているためである。
おそらく、マクロを使うともっときれいに書けるはずである。


今日の作業内容:プレゼン準備 3h + SDPA-C 2h
今日のランチ:四川 鶏ニンニク炒め
明日の予測作業時間:3h



2012年6月25日月曜日

残差ベクトルのデータ保持

変数行列のデータ構造はある程度確定したが、これに依存して残差ベクトルのほうも修正する必要がある。
たとえば、Z と探索方向 dZ とDual 側の残差ベクトルはすべて Aggregate Sparsity Pattern で保持することになるので、これらを同じクラスに入れておきたい。
このように変数をクラス間で移動するときの整合性を調整している。

今日の作業内容:資料作成 2h
今日のランチ:つかさ かんぱちまかない丼
明日の予測作業時間:5h


2012年6月22日金曜日

Aggregate 取り出し

データ構造の修正を行いながらも、 Aggregate の取り出しまではできるようになった。
これで、clique の取り出しルーチンを呼び出して、clique のデータ構造を持つ各変数の初期化を行うことになる。
かなり進んできたと考えている。

今日の作業内容:SDPA-C 4h
今日のランチ:味庵 豚の生姜焼き
明日の予測作業時間:5h



2012年6月21日木曜日

今日はあまり進まず

データ構造を変えながら実行するために途中でコンパイルしているが、やはり途中の段階では整合性がない部分が多く、コンパイルエラーが頻発する。
とりあえずは、#if 0 と #endif で外すことで回避しているが、このあたりが蓄積しつつある。
あとで修正すべき個所として認識しておかなければ。

今日の作業内容:SDPA-C 1h
今日のランチ:角笛 豚ヒレカツ
明日の予測作業時間:4h

2012年6月20日水曜日

データ構造変更

昨日の計算過程の確認を経て、データ構造を修正した。
従来は inv(X) についても sparse で保持するステップがあったが、それは不要になったので外すことにした。
他にも変数をいくつか削っているので、いくらかはメモリ消費が抑えられるかと推測している。

今日の作業内容:SDPA-C 2h
今日のランチ:らく 焼き魚定食
明日の予測作業時間:3h


2012年6月19日火曜日

supernode での X inverse のコレスキー分解

SDPA-C の場合、X inverse のコレスキー分解について Running Intersection Property などの関係で複雑な計算が必要となっている。

しかし、supernode で計算される CHOLMOD の場合は、supernode から生成される clique が Running Intersection Property を満たすので、各 cliqueごとに Xinverse のコレスキー分解を行ってデータをコピーするだけで実現できる。

これを確認するのに時間がかかったが、この確認によってプログラムが大幅に簡単になりそうだ。

今日の作業内容:SDPA-C 計算式確認 5h
今日のランチ:角笛 塩焼きネギ鶏
明日の予測作業時間:2h


2012年6月18日月曜日

Solutions のデータ構造

SDPA-C はファイルから新規データ構造に読み込みをできるところまでは一通り動いている状態まできた。

基本的には、メモリをうまく利用しないと大きな問題が使えなくなるので、そのあたりに注意が必要である。
たとえば制約の本数 (m) とブロック(nBlock) の数の2次元配列を準備してしまうと、その時点でメモリ使用量が大きくなりすぎてアウトである(とくに LP があるときがきつい)。
この場合は、制約ごとに STL の vector を準備して、そこに push_back で追加していく。そのあとで、sort をかけて、必要なデータだけをアクセス面で有利な通常配列に書き戻す。

次は、Solutions のデータ構造の検討に移る予定。
やはり、Cholmod のクラスをどれだけ活用できるか、にポイントが来そうだ。

今日の作業内容:SDPA-C 4h
今日のランチ:シッダルータ キーマカレー
明日の予測作業時間:5h



2012年6月15日金曜日

Powerpoint 用数式を TeX からの png で作成する

PowerPoint の数式は TeX のものを直接利用できると便利であるため、Virtualbox の Debian で作った TeX ファイルから png ファイルに変更してドラッグ&ドロップで貼り付けられるようにする。
もちろん、Windows 側にも TeX を入れるのであれば、もっと手軽にする方法もあるが、今回は Windows には TeX を入れないこととする。

TeX はコンパイルして dvi, pdf に変換しておいて、そこから png を作成する。
(TeX としてコンパイルできるのであれば、数式に限らずほぼすべてのことが問題なく png に変換できる。)
たとえば、

$ platex pptequation.tex
$ convert -density 300 -trim -transparent white pptequation.dvi pptequation.png

とすれば、pptequation.tex をコンパイルした各ページを pptequation0.png, pptequation1.png, pptequation2.png のように連番で出力できる。
ここで、 -density 300 は解像度で、Powerpoint でどのくらいの大きさとして貼り付けるかにもよるが、たいていは 300 あれば十分で、大きいものでも 600 にすれば十分である。
-trim は各ページの余分な部分を削除している。ただし、
\pagestyle{empty}
としておかないと、ページ番号が各ページの下に入る関係で各ページのpngが大きくなってしまうので注意が必要である。
-transparent white は背景の白の部分を透過に設定している。

これでできあがった、pptequation0.png などをドラッグ&ドロップで PowerPoint に置けば数式が貼り付けられる。
この場合には、TeX のさまざまな機能が使えるので \usepackage{color} として色を挟み込むのもありだし、数式に限らず、表なども挟み込むことができる。

あと、上の方法だとすべてのページを一括処理するが、必要なページだけを png にしたいのであれば、例えば 11 ページから 20 ページであれば

$ dvipdfmx -s 11-20 pptequation.dvi
$ convert -density 300 -trim -transparent white pptequation.pdf pptequation.png
のように dvipdfmx で絞り込むか、あるいは全ページを PDF 化しておいて


$ dvipdfmx  pptequation.dvi
$ convert -density 300 -trim -transparent white pptequation.pdf[10-19] pptequation.png
のようにする。convert の場合、数字が0からカウントなのでページが一つずれることに注意が必要である。



今日の作業内容:PPT チェック 1h + SDPA-C 3h
今日のランチ:双葉屋 野菜箱天
明日の予測作業時間:5h

2012年6月14日木曜日

SDPA-C コンパイルにかけてみた

データ構造をとりあえず書いたところで、コンパイルにかけてみた。
ざっと100ぐらいのバグがあったので、それを取り除いた。
まだ、文法チェックの段階でのバグであって、ここからが本格的にチェックすることになる。

とは言っても、まだまだ本体を書いていないので、これでファイル読みから順に作っていって進める予定である。

今日の作業内容:SDPA-C 2h
今日のランチ:味庵 豚肉と野菜の四川炒め
明日の予測作業時間:4h

2012年6月13日水曜日

Lubuntu 12.04 のメモリ消費量

6月に入って、Lubuntu 12.04 のほうもだいぶ安定してきたようなので、どれくらいのメモリ消費量なのかを SDPA の開発に使っている Debian wheezy とで比較してみた。

基本的には、virtualbox で比較となるので、Lubuntu については、
(1) ふつうに日本語でインストール
(2) firefox, emacs, build-essentials を aptitude でインストール
(3) virtualbox の guest add-on をインストール
(4) 再起動してログインしたら、
     (4-1) firefox を起動して www.google.co.jp を開く
     (4-2) emacs を起動
     (4-3) lxterminal で top を実行

この top でメモリ消費量を測定した。
この結果、Lubuntu の場合は 607MB 使用していた。
ちなみに、lxtask だと 322MB の使用と表示される。

これに対して、Debian は business-card からインストールした日本語構成で、デスクトップは同じく LXDE としている。
Lubuntu と異なるのは、firefox ではなく iceweasel になっているところである。
Debian wheezy の場合は、top で 454MB, lxtask で 233MB となる。

つまり、Debian で必要なパッケージだけ入れると、top の表示で 150MB, lxtask の表示で 90MB 程度の省略ができる。

さらに Debian wheezy で iceweasel を利用していないと、top で 313MB, lxtask で 154MB と表示される。iceweasel のメモリ消費量は結構大きいが、この結果をみると、Lubuntu の場合には wheezy にもうひとつ iceweasel が走っている程度にメモリを消費している。

今日の作業内容:Lubuntu チェック 2h + SDPA-C 2h
今日のランチ:つかさ 生サーモン照り焼き
明日の予測作業時間:3h




2012年6月12日火曜日

CHOLMOD 関連のクラスを修正

今日実装していて、CHOLMOD 関連のクラスを修正が必要だと分かった。
基本的には、
A x = b
を何回も反復して解くので、x,b の両方をメモリ確保していたが、x については毎回 CHOLMOD が確保しなおすので、x を SDPA-C 側では確保しないこととした。
このあたりは、SDPA-C の反復内部でメモリ増減が起きるので、ちょっと厄介な部分ではある。

今日の作業内容:SDPA-C 2h
今日のランチ:らく まぐろのづけ丼(小鉢・サラダつき)
明日の予測作業時間:3h

2012年6月11日月曜日

インデックスづくり

SDPA-C のアルゴリズムは、おそらく extended sparsity pattern の行列を明示的に保持する必要がなくなるはずであって(ほとんどが cholmod_factor に集約されるため)、実装全体が簡素化できるはずである。
ただ、そのために clique で分解できるようにインデックス対応をつける必要があり、これが煩雑である。
インデックス対応は全体の効率化のために複数種類準備することとなり、そのあたりも複雑になっている。

論文のアルゴリズムでは単純に「行列の掛け算」となっているところも、実際の実装だと何種類もの掛け算があって、そのうちから適切に選択しなければならない。

今日の作業内容:SDPA-C インデックスづくり 3h
今日のランチ:サイゼリヤ きのこのスパゲッティ
明日の予測作業時間:5h


2012年6月8日金曜日

線形代数演算書き始め

データ構造体については、ある程度の主だったものは書いたので必要になった時点で追加することとし、線形代数演算を書き始めた。

今回は、入力行列と変数行列の内積計算である。
密行列であれば blas を呼んで終わりであるが、疎行列とクリーク分解した行列の内積となっていて、案外煩雑である。
このあたりも呼ばれる回数が多いので、できるだけ効率的に組んでおきたい。

今日の作業内容:SDPA-C 2h
今日のランチ:つかさ ネギトロ丼
明日の予測作業時間:3h


2012年6月7日木曜日

順列対応付け

今日は、普通の sparse matrix と clique で情報を持っている matrix の二つの間で内積を取れるようにするために、順列の対応付けをプログラムしておいた。
clique については、CHOLMOD のsupernode 情報から生成しているので、そのあたりの対応がうまく取れているかを、あとでデバッグする必要がありそうだ。

今日の作業内容:SDPA-C 2h
今日のランチ:シッダルータ ベジタブルカレー
明日の予測作業時間:4h


2012年6月6日水曜日

昨日のプログラムも一部書き直し

今日になって、昨日書いていたプログラムをそのままでは利用しづらいことが分かり、ある程度書き直しをしている。
問題となっているのは、ブロック対角構造に対してのところで、それぞれのブロックごとのクラスを作らなくてもいけるかと思ってコーディングしていたが、それだと煩雑になりすぎることが分かったので、クラスをもう一度書きなおしている。
今書いているのがデータ構造なので、こういったことが起こりがちであるが、ある程度進めば解消してくると期待している。

今日の作業内容:SDPA-C 3h
今日のランチ:味庵 バンバンジー
明日の予測作業時間:3h


2012年6月5日火曜日

SDPA-M on 64bit Windows がうまくできてない

32bit Windows と同じようにして 64bit Windows を mingw-64 で SDPA-M をコンパイルしてみたが、どうやらこれでは実行できないようだ。

考えられる点としては、
[1] 32bit Windows の mex は DLL が本体だが 64 bit Windows の mex は DLL ではないかもしれない。
[2] mingw-64 の DLL では Matlab が読み込めない
[3] Debian unstable では新しすぎて Matlab が対応できていない

[3]については、Debian unstable よりも遅れている Ubuntu 12.04 上でも Matlab が実行できないなど不具合が発生している。
最近の Matlab は、Linux への対応が遅れつつあるので、Ubuntu 12.04 などの新しい Linux ではなく少し古めの Linux があったほうがいいのかもしれない。(Debian unstable は、その名の通り不安定版なので、ここで実行できなくても特に問題はないが。)

ちなみに、SDPA-C のソースは

$ git diff | grep ^+ | wc -l
483
と483行程度進んでいる。
ただし、まだ実装中なので、コンパイルを試せる段階には程遠いが。


今日の作業内容:SDPA-C 4h
今日のランチ:らく 焼き魚定食
明日の予測作業時間:2h


2012年6月4日月曜日

200行ぐらいソースを書いて気がつく

データ構造から作っているが、200行程度書いてから、このままでは効率的にいかない部分があることが分かった。
問題は、入力行列が対角ブロックであり、ブロック数は多いながらも、そのほとんどが疎となりうる点にある。
これは、SDPA の場合は特に問題にならないが SDPA-C の場合は、検討すべき点の一つであった。
もうすこし再検討してみよう。

今日の作業内容:SDPA-C 3h
今日のランチ:角笛 焼きカレー
明日の予測作業時間:5h

2012年6月1日金曜日

SDPA-C の branch を作った

今日から SDPA-C のソースを実際に組み込んでいく、ということで、最初の作業として SDPA-C 用の branch を SDPA の git レポジトリに作成した。

もともと SDPA のソースは git で管理しているが、SDPA 7.3.8 のソースから branch で区切ったことになる。

だいたいのアルゴリズムは、これまでに飽きるほど確認してきたので、ここからは粛々と作業を進める段階である。

今日の作業内容:SDPA-C の branch 3h
今日のランチ: 味庵 鶏肉の黒胡椒炒め
明日の予測作業時間:4h