半正定値計画 (semidefinite programming, SDP) 問題を解く、MATLAB 用のソフトウェア SeDuMi を GNU Octave 上で動かすメモ。 自分では頑張っていません。 最近の Octave で動くことを SeDuMi Forum で報告された adb014 (David Bateman) さんと、それを FreeBSD の ports にされた maho@FreeBSD (Nakata Maho) さんに感謝。
^M
は CR を直に入力): % for i in *.c *.m; do sed 's/^M$//' "$i" > "$i".new && mv "$i".new "$i"; done
% octave install_sedumi.m
% cp -p *.m /usr/local/sedumi/m/ % cp -p *.mex /usr/local/sedumi/m/ % cp -pR doc /usr/local/sedumi
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