SeDuMi を Octave 上で動かす

半正定値計画 (semidefinite programming, SDP) 問題を解く、MATLAB 用のソフトウェア SeDuMi を GNU Octave 上で動かすメモ。 自分では頑張っていません。 最近の Octave で動くことを SeDuMi Forum で報告された adb014 (David Bateman) さんと、それを FreeBSD の ports にされた maho@FreeBSD (Nakata Maho) さんに感謝。

TODO

環境および準備したもの

手順

  1. SeDuMi_1_1R3.zip を展開する。
  2. Readme.txt と Install.txt を読む。
  3. 改行コードを CR+LF から LF に変換する。
    例 (^M は CR を直に入力):
    % for i in *.c *.m; do sed 's/^M$//' "$i" > "$i".new && mv "$i".new "$i"; done
    
  4. ports の 3 つのパッチを当てる。
  5. コンパイルする。
    % octave install_sedumi.m
    
    この段階ではコンパイルされるだけ。 MATLAB にパスを登録したというメッセージが出るので、MATLAB を使っている場合はカレントディレクトリが自動で登録されるのかもしれないが、 Octave ではされない。
  6. 適当な場所にインストールする。 MI なファイルと MD なファイルを別の場所に起きたくなるかもしれないが、 パスを通しても見つけられないようなので、同じディレクトリに置く。
    % cp -p *.m /usr/local/sedumi/m/
    % cp -p *.mex /usr/local/sedumi/m/
    % cp -pR doc /usr/local/sedumi
    
  7. Octave にパスを設定する。
    ~/.octaverc
    path(path, "/usr/local/sedumi/m")
    

動くかな

わくわく。

octave:2> A = [-2 2 1 -1 0; 1 4 -1 0 -1];
octave:3> b = [1 1]';
octave:4> c = [2 9 3 0 0]';
octave:5> x = sedumi(A, b, c);
zsh: illegal hardware instruction (core dumped)  octave
%

ひー。

うーむ。 パス問題で、Octave 起動中に .mex ファイルを移動したりしたせいだろうか。 もう一度やったら動いた。

octave:1> A = [-2 2 1 -1 0; 1 4 -1 0 -1];
octave:2> b = [1 1]';
octave:3> c = [2 9 3 0 0]';
octave:4> x = sedumi(A, b, c);
SeDuMi 1.1R3 by AdvOL, 2006 and Jos F. Sturm, 1998-2003.
Alg = 2: xz-corrector, Adaptive Step-Differentiation, theta = 0.250, beta = 0.500
eqs m = 2, order n = 6, dim = 6, blocks = 1
nnz(A) = 8 + 0, nnz(ADA) = 4, nnz(L) = 3
 it :     b*y       gap    delta  rate   t/tP*  t/tD*   feas cg cg  prec
  0 :            2.52E+01 0.000
  1 :   2.41E+00 6.99E+00 0.000 0.2774 0.9000 0.9000   2.13  1  1  1.5E+00
  2 :   3.30E+00 1.96E+00 0.000 0.2796 0.9000 0.9000   1.73  1  1  3.6E-01
  3 :   3.90E+00 4.79E-01 0.000 0.2450 0.9000 0.9000   0.97  1  1  9.3E-02
  4 :   4.00E+00 4.23E-03 0.000 0.0088 0.9990 0.9990   1.05  1  1  
iter seconds digits       c*x               b*y
  4      0.8   Inf  4.0000000000e+00  4.0000000000e+00
|Ax-b| =   1.9e-16, [Ay-c]_+ =   0.0E+00, |x|=  4.7e-01, |y|=  3.5e+00

Detailed timing (sec)
   Pre          IPM          Post
8.130E-01    7.996E-01    8.629E-02    
Max-norms: ||b||=1, ||c|| = 9,
Cholesky |add|=0, |skip| = 0, ||L.L|| = 1.43915.
octave:5> x
x =

Compressed Column Sparse (rows = 5, cols = 1, nnz = 2)

  (2, 1) ->  0.33333
  (3, 1) ->  0.33333