2018年6月22日金曜日

Ipopt を Linux 上の Matlab で使えるようにコンパイルする

Matlab 用の Ipopt の Linux でのインストール方法をまとめておいたら、どこかで役に立つかもしれないので書いておくことにする。

ただ、前回も書いたように Ipopt を使うときには、SeDuMi とか fmincon は使えないので、普段は Ipopt を使わないようにしておいて、必要な時だけ Matlab を起動したら Ipopt に関する部分だけを実行するようにしたほうがよい。

まずは、コンパイル。ホームの下に展開したものとして書いておく。 Matlab のバージョンは適宜修正のこと
tar xzf Ipopt-3.12.10.tgz
cd ~/Ipopt-3.12.10/ThirdParty/Mumps
./get.Mumps
mkdir ~/Ipopt-3.12.10/share
cp ~/Ipopt-3.12.10/Ipopt/contrib/MatlabInterface/MatlabInterface.site ~/Ipopt-3.12.10/share/
cd ~/Ipopt-3.12.10/share/
mv MatlabInterface.site config.site
~/Ipopt-3.12.10/configure --prefix=~/Ipopt-3.12.10/install --with-matlab-home=/usr/local/MATLAB/R2015a
make && make install
cd ~/Ipopt-3.12.10/share/Ipopt/contrib/MatlabInterface/src
make
cp .libs/*.o .
make

ここでは、下から2個目の make は失敗で終わるので、cp .libs/*.o . をしてから、再度 make を実行している。

このあと、Matlab の実行時に
LD_PRELOAD=/usr/lib/x86_64-linux-gnu/libstdc++.so.6:/usr/lib/x86_64-linux-gnu/li
bgfortran.so.3:/lib/x86_64-linux-gnu/libgcc_s.so.1:/usr/lib/x86_64-linux-gnu/lib
quadmath.so.0.0.0:~/Ipopt-3.12.10/install/lib/libipopt.so.1  /usr/local/MATLAB/R2015a/bin/matlab -nodisplay
のように ~/Ipopt-3.12.10/install/lib/libipopt.so.1 をロードする。
(この libipopt.so.1 が SeDuMi や fmincon と相性が悪い様子。)
ちなみに、libstdc++, libgfortran, libgcc_s, libquadmath もロードしているが、このあたりはそれぞれのコンピュータごとにパスが変わっているかもしれない。

あとは、Matlab の中でパスを設定する。
addpath(strcat(getenv('HOME'),'Ipopt-3.12.10/share/Ipopt/contrib/MatlabInterface/src'));

これで Ipopt を Matlab から実行できるはず。


0 件のコメント:

コメントを投稿