Ipoptをビルドする
普段の生活で,ある関数の値が最小になるようなパラメータを求めたい,ということが稀によくあります.このようなとき,正攻法では,微分して 0 になるところを解析的に求めたり,それができなければ勾配法を使って数値解を求めたりしますが,正直面倒くさくてやりたくないです.
そういうとき,MATLAB みたいなツールがあると,関数を定義して投げるだけで,値が最小(実際は極小)になるそれっぽい数値解を求めてくれますが,普通の人はそんな高級なツールは持ってませんし,学生でも大学の計算機室に行かないと使えなかったりします.
Ipopt はそれをやってくれる C++ のライブラリで,定義されたインターフェース(仮想クラス)を継承して,いくつかのメソッドを実装するだけで,関数を最小化してくれます.しかも,Eclipse Public License なので,組み込んだプログラムの再配布もしやすく,いろいろな用途に使えます.
ただ,Ipopt を Windows でビルドするには,環境を整えたり,依存しているライブラリを入手したりするのが面倒だったり,公式ページに書いてあるとおりにやっても上手くいかなかったりと,いろいろと困難が多いです.一応,公式サイトにビルドされたバイナリ(.dll とそれを呼び出すための .lib)が公開されていますが,バージョンが古く,最新の Visual Studio からだと使えなかったりします.
ここでは,私が試行錯誤して得た Ipopt のビルド方法を紹介します.ついでにそのバイナリも配布します.
Visual Studio + Intel C++/Fortran コンパイラを使う場合
Microsoft Visual Studio 2015, Intel Parallel Studio XE 2016でビルドできることを確認した.Parallel Studio XE は学生なら無償で使用できる.
cygwin のインストール
- https://cygwin.com/install.html から setup-x86_64.exe をダウンロードし,インストールする.インストールするパッケージには,以下のものを追加する.
- Devel make(注1)
- Devel patch
- Devel pkg-config
- Devel subversion
- Archive unzip
- Web wget
- Utils dos2unix
- インストール後,cygwin 環境内の /bin/link.exe(注2), /bin/ln.exe(注3)を適当な別の名前に変更する.
- 注1: http://www.coin-or.org/Ipopt/documentation/node15.html には,make はインストールせずに後から自分でダウンロードしろと書いてあるが,それに従うとうまくいかなかった.
- 注2: こうしないと,Visual Studio の link.exe と名前が被ってうまくいかない
- 注3: こうしておくと,cygwin のシンボリックリンクの代わりに普通にファイルがコピーされるようになる.さもないと,cygwin のシンボリックリンクを Visual Studio のリンカが解釈できずにエラーになる.
cygwin の起動
- スタートメニューから,Intel コンパイラの「VS2015 x64 Native Tools コマンド プロンプト」を開く
- > C:\cygwin64\cygwin.bat
cygwin のシェルが立ち上がると,プロンプトが $ になる.コピペは,ウィンドウのタイトルバーを右クリック > 編集 でできる.
Ipoptのダウンロード
Mumps, Metis のダウンロード(お好みで)
これらをビルドに含めた場合,Metis の使用条件により,ライブラリの使用は学術目的に限られる.これらをダウンロードしなくても,Intel MKL 内の PARDISO というライブラリが代わりに使用されるため特に問題は無いが,最小化したい関数の種類によっては,Mumps+Metis を使った方がうまくいく場合があるらしい.このほかにも,いくつかのライブラリを追加してビルドすることができるが,メールでダウンロードを申請する必要があり面倒くさそうなので私は試してない.http://www.coin-or.org/Ipopt/documentation/node6.html
ビルド
- $ ./configure -enable-doscompile=msvc
- libtool をエディタで開き,func_extract_archives () 内 *) my_xabs=`pwd`"/$my_xlib" ;;を*) my_xabs=$(cygpath -m $(pwd))"/$my_xlib" ;;に置き換える
- $ export AM_CFLAGS="-QxAVX -DHAVE_SNPRINTF" $ export AM_CXXFLAGS="-QxAVX -D__builtin_huge_val\(\)=HUGE_VAL -D__builtin_huge_valf\(\)=HUGE_VALF -D__builtin_nan=nan -D__builtin_nanf=nanf -D__builtin_nans=nan -D__builtin_nansf=nanf -IC:/cygwin64/home/idzuna/CoinIpopt/ThirdParty/Metis/metis-4.0/Lib -IC:/cygwin64/home/idzuna/CoinIpopt/ThirdParty/Mumps/MUMPS/include -IC:/cygwin64/home/idzuna/CoinIpopt/ThirdParty/Mumps/MUMPS/libseq" $ export AM_FFLAGS="-QxAVX" $ make -j 7 $ make install
-QxAVXの部分は実行する CPU に合わせて変える.なくてもよい.
C:/cygwin64/home/idzuna/の部分は環境に応じて変える.Mumps, Metis をビルドに含めない場合は,このオプションは不要.
make -j 7の7は,ビルド時に同時実行するジョブの数で,(CPU の同時実行可能なスレッド数)-1 くらいが無難.ビルド中に PC がまったく使えなくなってもいいならもっと増やしてもよい.
ライブラリ使用時の Visual Studio の設定
- ライブラリを使用したい Visual Studio プロジェクトを開き,ソリューション構成を Release に,プラットフォームを x64 にする(注1)
- プロジェクトのプロパティページを開く
- [VC++ ディレクトリ] の「インクルード ディレクトリ」に,できあがった CoinIpopt/include を追加する
- [C/C++] > [コード生成] の「ランタイム ライブラリ」を「マルチスレッド (/MT)」に変更する
- [リンカー] > [入力] の追加の依存ファイルに,mkl_core.lib, mkl_sequential.lib, mkl_intel_lp64.libと,CoinIpopt/lib 内の .lib ファイルを追加する
注1: これ以外の構成でライブラリを使用したい場合には,それに合わせてライブラリをビルドし直す必要があるが,ここでは解説しない.
Visual Studio + Intel MKL を使う場合
Microsoft Visual Studio 2015, Intel MKL 11.3 でビルドできることを確認した.MKLは誰でも無償で使用できる.
cygwin のインストール
先ほどの Intel コンパイラを使う場合と同じ
cygwin の起動
- スタートメニューから「VS2015 x64 Native Tools コマンド プロンプト」を開く
- > C:\cygwin64\cygwin.bat
cygwin のシェルが立ち上がると,プロンプトが $ になる.コピペは,ウィンドウのタイトルバーを右クリック > 編集 でできる.
f2c のインストール
libf2c のビルド
- $ mkdir /usr/local/lib/libf2c $ cd /usr/local/lib/libf2c $ wget http://www.netlib.org/f2c/libf2c.zip $ unzip libf2c.zip $ rm libf2c.zip
- makefile.vc 9行目 CFLAGS に-DNO_SSIZE_Tを追加
- makefile.vc 最後から4行目のcomptry.batを消す(行をまるごと消すのではない)
- $ nmake -f makefile.vc all
Ipopt のダウンロード
ビルド
- $ cp BuildTools/compile_f2c/compile_f2c /usr/local/bin/
- Ipopt/configure 35745行目if test "$have_mkl" = "yes" -a "$use_pardiso" = "no"; thenの前に新たに行have_mkl=yesを挿入する
- $ ./configure -enable-doscompile=msvc $ export AM_CFLAGS="-arch:AVX -DHAVE_SNPRINTF" $ export AM_CXXFLAGS="-arch:AVX" $ make -j 7 $ make install
-arch:AVXの部分は実行する CPU に合わせて変える.なくてもよい.
C:/cygwin64/home/idzuna/の部分は環境に応じて変える.Mumps, Metis をビルドに含めない場合は,このオプションは不要.
make -j 7の7は,ビルド時に同時実行するジョブの数で,(CPU の同時実行可能なスレッド数)-1くらいが無難.ビルド中に PC がまったく使えなくなってもいいならもっと増やしてもよい.
ライブラリ使用時の Visual Studio の設定
- ライブラリを使用したい Visual Studio プロジェクトを開き,ソリューション構成を Release に,プラットフォームを x64 にする(注1)
- プロジェクトのプロパティページを開く
- [VC++ ディレクトリ] の「インクルード ディレクトリ」に,できあがった CoinIpopt/include を追加する
- [C/C++] > [コード生成] の「ランタイム ライブラリ」を「マルチスレッド (/MT)」に変更する
- [リンカー] > [入力] の追加の依存ファイルに,mkl_core.lib, mkl_sequential.lib, mkl_intel_lp64.libと,CoinIpopt/lib 内の .lib ファイルを追加する
注1: これ以外の構成でライブラリを使用したい場合には,それに合わせてライブラリをビルドし直す必要があるが,ここでは解説しない.
バイナリ
Microsoft Visual Studio 2015 + Intel Parallel Studio XE 2016 にてビルドしました.Intel64 + AVX な環境向けです.利用には別途 Intel MKL をインストールする必要があります.
コメント