2017年5月16日火曜日

IguanaTex の新しいバージョンと新しいバグ

IguanaTex のバージョンが新しくなっていて、なんとベクター画像を扱えるようになっていた。
いままでは基本的に png で画像ができて、それを貼っていたわけだけど、今度はベクターになるので、拡大や縮小したときにもスムーズにできる。


で、そのベクター画像の機能だけど、変なバグがあるようで、カラーにするとおかしなことが起こる。
たとえば、
\textcolor{red}{ここは赤色}
とかしても、なぜかカラーにならない。
ところが、Vector ではなくて Bitmap にするとちゃんと赤い文字になる。
そのあとでVectorとして画像を生成させると、今度はベクター画像で赤い文字になる。
なかなかに面白い現象だ。

いずれにしても、IguanaTex は beamer の100倍程度の便利さなので、いつまでもなくならないでほしいところだ。

Stochastic subgradient descent method for large-scale robust chance-constrained support vector machines

新しい論文
Stochastic subgradient descent method for large-scale robust chance-constrained support vector machines
https://link.springer.com/article/10.1007/s11590-016-1026-4
について読んでみた。

使っている手法としては、よくある感じのものだった。
ただ、理論的な解析がほとんどないので、どうしたんだろうと思っていたら、解いている最適化問題が非凸最適化問題だった。
したがって、first-order method によくあるような O(1/epsilon) などの収束レートは出てこない。

数値実験を見てみると、非凸最適化の定式化でも、そこそこ最適値を得られるようで、局所的最適解にはちゃんと到達できているのかもしれない。
そのあたりを詳しく解析してみると面白そう。

2017年5月2日火曜日

A doubly inexact interior proximal bundle method for convex optimization

Optimization Online に面白そうな内容が載っていたので、チェック。

A doubly inexact interior proximal bundle method for convex optimization
http://www.optimization-online.org/DB_HTML/2017/04/5960.html

基本的なアイデアとしては、inexact  Level-Set method と内点法を組み合わせたところ。
この中では、最適解に収束する、ということが証明されているが、こういった inexact の解法についてはどれくらいの収束レートになるか、ということを扱っている本があるので、それと合わせると収束レートが分かって面白いかもしれない。
気になるのは、内点法のように超一時収束できるのか、あるいはinexact が効いてあまり収束レートは良くないのか、というところ。

あと、主問題の解を構成していたり、Bregman distance を使っていたりするところは、他にも使ってみたい。

2017年5月1日月曜日

Model Building in Mathematical Programming

Model Building in Mathematical Programming
http://as.wiley.com/WileyCDA/WileyTitle/productCd-1118443330.html
をぱらぱらとチェックしてみた。

タイトルにある通り、数理最適化問題にどのように定式化するか、というのがメインだけど、いろんな定式化が載っていて為になる。

たとえば、x = {0} \cup [a, b] \cup {c} のように x の範囲がとびとびになってしまう場合に、どうやると整数計画問題にできるか、など書いてあったりもする。

実際の問題を数理最適化問題にするときには、いろんな定式化があって、どの定式化を選ぶかで計算時間に大きな影響があるので、こういうのを読んでおくっていうのは、いいことなんだろうなぁ、と思ったりする。

というか、日本語訳を出したらいいんじゃないだろうか、とも思う。
できれば最新の第5版で。(いろいろと追加されているし。)


2017年4月26日水曜日

Julia の Windows 用エディタとしては Notepad++ がベスト

Julia の Windows 用エディタとして、Atom や Visual Studio Code, IJupyter などを試してきたが、これらでは今一つであった。
最大の問題点は、動作が遅いことで、特に Atom はショートカットをクリックしてから30秒以上しないと Julia のソースファイル編集に入れない状態だった。

結局のところ、Notepad++ と REPL を使うのが現状ではベストのようだ。

便利なところとしては、

1.Julia 用の表示にできる

https://github.com/JuliaLang/julia/blob/master/contrib/Julia_Notepad%2B%2B.xml
このファイルをダウンロードして、Notepad++ のフォルダに入れて、[言語]からユーザー定義として「インポート」すれば、Julia 用にできる。

2.編集中のファイルのあるフォルダで Julia の REPL を起動できる。
実行コマンドの登録は、
http://so-zou.jp/software/tech/tool/editor/notepad-plus/commands/
に載っている方法でできるが、Julia の REPL を起動するときには、

cmd /c "cd /d $(CURRENT_DIRECTORY) & c:\Users\ユーザー名\AppData\Local\Julia-0.5.0\bin\julia.exe"

を登録すればよい。ただし、ユーザー名と Julia のバージョンで若干の修正が必要である。
このショートカットを、例えば Alt+F5 に割り当てれば、Alt+F5 で REPL が起動する。
REPL の中で cd で移動するのは大変なので、これが地味に便利である。

3.自動保存ができる。
Notepad++ のプラグインで Autosave を入れると、オプションで設定すれば Notepad++ からフォーカスが外れたタイミングで自動保存をできる。
つまり、Notepad++ で example1.jl を編集しているときに、Alt+Tab で REPL のウィンドウに移動したときに自動的に example1.jl が保存される。
そこで、include("example1.jl"); を実行すればよい。
(何回も実行するのであれば、ctrl+p で前のコマンドを REPL は呼び出せるので、Alt+Tab, ctrl+p, Enter で実行できる。)

4.速い。
Notepad++ を起動してから Julia のファイルの編集に入るまでに1秒以内でできる。自分のところでは、Atom の30倍以上高速である。


とりあえず、Notepad++ を使い込んでみようと思う。



2017年4月25日火曜日

scip には、合わないデータだったみたい

昨日までだいぶかかってインストールした SCIP に早速データを投入して数値実験。
結果としては、CPLEX のほうが性能が良かった。
このあたりは入力データ依存なので、たまたま SCIP に合わないデータなのかもしれない。

分かった点としては、
1.primal bound (実行可能点)が5時間ぐらいたっても1つも得られない。したがって duality gap も出てきていない。
   CPLEX の場合は、数分で実行可能点をとりあえずは発見している。ついでに、dual bound も CPLEX の値のほうがいい。
2.メモリ使用量が劇的に増える。
   分枝の方法があってないのかもしれないけど、とりあえず5時間ぐらいで300万ノードぐらいが生成されていて、100GB のメモリを使用。

このままだと「コンピュータに負担はかかるけど、有益な情報が得られない」ということになりそうなので、計算をストップすることにしてみた。

やはり、入力データにどれだけ性能が出せるかはやってみないと分からないものだ。

2017年4月24日月曜日

SCIP を Linux 上の Matlab から呼び出す、ってお話

SCIP を Linux 上 の Matlab から呼び出すのは、あまり推奨されていないのかもしれないが、コンパイルを頑張って、とりあえずはサンプルプログラムまでは実行できるようになった。(ちなみに、Matlab から呼び出すのでなく単純にコマンドラインから使うだけなら、それほど険しい道のりではない。)

ここにはインストールの記録を残しておく。なお、Ubuntu 系の Linux を想定しているので、ディレクトリ名などは適宜変更が必要かもしれないし、apt-get で必要なファイルなどをインストールする必要もあるかもしれない。
また、インストールするディレクトリは、とりあえず $HOME/lib としている。

1. SoPlex をコンパイル
cd $HOME/lib
wget http://soplex.zib.de/download.php?fname=soplex-3.0.0.tgz
tar xzf soplex-3.0.0.tgz
cd soplex-3.0.0
make SHARED=true

(SHARED=true は Matlab の mex にリンクするときに必須なので忘れないように。)

2. ZIMPL をコンパイル
cd $HOME/lib
wget http://zimpl.zib.de/download/zimpl-3.3.4.tgz
tar xzf zimpl-3.3.4.tgz
cd zimpl-3.4.4
make SHARED=true

(このあたりの wget は、ライセンスの関係でうまくいかないかもしれないので、ホームページからダウンロードしたほうがいいかもしれない。)

3. IPOPT をコンパイル
cd $HOME/lib
wget  https://www.coin-or.org/download/source/Ipopt/Ipopt-3.12.7.tgz
tar xzf Ipopt-3.12.7.tgz
cd Ipopt-3.12.7
./configure
make

(make install は特に必要なし。)

4. SCIP をコンパイル
cd $HOME/lib
wget http://scip.zib.de/download.php?fname=scip-4.0.0.tgz
tar xzf scip-4.0.0.tgz
cd scip-4.0.0
make SHARED=true

(このあたりのコンパイルで、ZIMPLE や SOPLEX, IPOPT がどこにあるか指定する必要あり。画面上のメッセージは分かりにくいけど、20回ぐらいトライ&エラーをすれば、なんとかなった。)

5. OPTI をコンパイル
cd $HOME/lib
wget https://github.com/jonathancurrie/OPTI/archive/master.zip
unzip master.zip
cd OPTI-master/Solvers/Source/scip

ここで、以下のようなスクリプトでコンパイル。

******************************
#!/bin/sh -x

SCIP_DIR=$HOME/lib/scip-4.0.0
SOPLEX_DIR=$HOME/lib/soplex-3.0.0
OPTI_DIR=$HOME/lib/OPTI-master
IPOPT_DIR=$HOME/lib/Ipopt-3.12.7
mex -largeArrayDims -output scip.mexa64 -I$SCIP_DIR/src -I$SOPLEX_DIR/src -I$OPTI_DIR/Solvers/Source/scip/Include \
    -I$IPOPT_DIR/Ipopt/src/Common -I$OPTI_DIR/Solvers/Source/opti\
    -L$SCIP_DIR/lib/shared \
    scipmex.cpp scipeventmex.cpp scipnlmex.cpp -lscip -lnlpi.cppad -lut
******************************

基本的には、リンクで見つからない関数があれば、そのつど nm コマンドで *.so を全解列挙して、grep で検索すればよい。

6. Matlab でパスを追加
addpath(genpath(getenv('HOME'),'/lib/OPTI-master'));

7. Matlab を以下のスクリプトで起動

******************************
export LD_LIBRARY_PATH=/usr/lib/gcc/x86_64-linux-gnu/6.3.0:$HOME/lib/
scip-4.0.0/lib/shared:/usr/lib/x86_64-linux-gnu:$HOME/lib/scip-4.0.0/
lib/shared:$LD_LIBRARY_PATH

LD_PRELOAD=/usr/lib/gcc/x86_64-linux-gnu/6.3.0/libgcc_s.so:/usr/lib/gcc/x86_64-linux-gnu/6.3.0/libstdc++.so:/usr/lib/gcc/x86_64-linux-gnu/6.3.0/libgfortran.so:$HOME/lib/scip-4.0.0/lib/shared/libscip.so:/usr/lib/x86_64-linux-gnu/libreadline.so:$HOME/lib/scip-4.0.0/lib/shared/libnlpi.cppad.so:$HOME/lib/scip-4.0.0/lib/shared/libscipsolver.so  /usr/local/bin/matlab -nodisplay $*
******************************

実行時にうまく行かない場合も、nm と grep で探し当てて、LD_LIBRARY_PATH と LD_PRELOAD に載せれば何とかなる。
(なぜか LD_PRELOAD だけでは、うまく行かない時があるので、LD_LIBRARY_PATH にもフォルダをあわせて書く方がよいようだ。)

7. サンプルソースの実行
あとは、$HOME/lib/OPTI-master/Examples/Global_NonlinearProgramming.m にある SCIP 用のサンプルを実行すればよい。
具体的には、Example 4 - White Box Quartic となっているところである。



途中途中であまりスリムになっていないところもあるが、これでサンプルプログラムを実行できる。
Matlab から $ help scip とすれば使い方も分かるようになっている。

たぶん、Mac でも同じような手順でコンパイルできるかと思うが、Mac は OS 自体が複雑なので、もっと大変なのかもしれない。