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 のインストール

  1. 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
  2. インストール後,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 の起動

  1. スタートメニューから,Intel コンパイラの「VS2015 x64 Native Tools コマンド プロンプト」を開く

  2. > C:\cygwin64\cygwin.bat

cygwin のシェルが立ち上がると,プロンプトが $ になる.コピペは,ウィンドウのタイトルバーを右クリック > 編集 でできる.

Ipoptのダウンロード

$ cd ~ $ svn co https://projects.coin-or.org/svn/Ipopt/stable/3.12 CoinIpopt $ cd CoinIpopt

Mumps, Metis のダウンロード(お好みで)

$ cd ThirdParty/Mumps $ ./get.Mumps $ cd ../Metis $ ./get.Metis $ cd ../..

これらをビルドに含めた場合,Metis の使用条件により,ライブラリの使用は学術目的に限られる.これらをダウンロードしなくても,Intel MKL 内の PARDISO というライブラリが代わりに使用されるため特に問題は無いが,最小化したい関数の種類によっては,Mumps+Metis を使った方がうまくいく場合があるらしい.このほかにも,いくつかのライブラリを追加してビルドすることができるが,メールでダウンロードを申請する必要があり面倒くさそうなので私は試してない.http://www.coin-or.org/Ipopt/documentation/node6.html

ビルド


  1. $ ./configure -enable-doscompile=msvc
  2. libtool をエディタで開き,func_extract_archives () 内 *) my_xabs=`pwd`"/$my_xlib" ;;*) my_xabs=$(cygpath -m $(pwd))"/$my_xlib" ;;に置き換える

  3. $ 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 77は,ビルド時に同時実行するジョブの数で,(CPU の同時実行可能なスレッド数)-1 くらいが無難.ビルド中に PC がまったく使えなくなってもいいならもっと増やしてもよい.

ライブラリ使用時の Visual Studio の設定

  1. ライブラリを使用したい Visual Studio プロジェクトを開き,ソリューション構成を Release に,プラットフォームを x64 にする(注1)
  2. プロジェクトのプロパティページを開く
  3. [VC++ ディレクトリ] の「インクルード ディレクトリ」に,できあがった CoinIpopt/include を追加する
  4. [C/C++] > [コード生成] の「ランタイム ライブラリ」を「マルチスレッド (/MT)」に変更する
  5. [リンカー] > [入力] の追加の依存ファイルに,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 の起動

  1. スタートメニューから「VS2015 x64 Native Tools コマンド プロンプト」を開く

  2. > C:\cygwin64\cygwin.bat

cygwin のシェルが立ち上がると,プロンプトが $ になる.コピペは,ウィンドウのタイトルバーを右クリック > 編集 でできる.

f2c のインストール

$ cd /usr/local/bin $ wget http://www.netlib.org/f2c/mswin/f2c.exe.gz $ gunzip -d f2c.exe.gz $ chmod +x f2c.exe

libf2c のビルド


  1. $ mkdir /usr/local/lib/libf2c $ cd /usr/local/lib/libf2c $ wget http://www.netlib.org/f2c/libf2c.zip $ unzip libf2c.zip $ rm libf2c.zip
  2. makefile.vc 9行目 CFLAGS に-DNO_SSIZE_Tを追加
  3. makefile.vc 最後から4行目のcomptry.batを消す(行をまるごと消すのではない)

  4. $ nmake -f makefile.vc all

Ipopt のダウンロード

$ cd ~ $ svn co https://projects.coin-or.org/svn/Ipopt/stable/3.12 CoinIpopt $ cd CoinIpopt

ビルド


  1. $ cp BuildTools/compile_f2c/compile_f2c /usr/local/bin/
  2. Ipopt/configure 35745行目if test "$have_mkl" = "yes" -a "$use_pardiso" = "no"; thenの前に新たに行have_mkl=yesを挿入する

  3. $ ./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 77は,ビルド時に同時実行するジョブの数で,(CPU の同時実行可能なスレッド数)-1くらいが無難.ビルド中に PC がまったく使えなくなってもいいならもっと増やしてもよい.

ライブラリ使用時の Visual Studio の設定

  1. ライブラリを使用したい Visual Studio プロジェクトを開き,ソリューション構成を Release に,プラットフォームを x64 にする(注1)
  2. プロジェクトのプロパティページを開く
  3. [VC++ ディレクトリ] の「インクルード ディレクトリ」に,できあがった CoinIpopt/include を追加する
  4. [C/C++] > [コード生成] の「ランタイム ライブラリ」を「マルチスレッド (/MT)」に変更する
  5. [リンカー] > [入力] の追加の依存ファイルに,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 をインストールする必要があります.

ipopt3.12.5_160127.zip

技術系 > ソフトウェア | comments (0) | trackbacks (0)

コメント

コメント投稿






トラックバック