VC++でIpoptをビルドする(with Intel MKL, HSL)
この記事はVC++でIpoptをビルドするためのメモ。
Ipoptは大規模な非線形計画問題を解くことができる便利なツール。しかし、VC++でビルドしようとすると厄介で、公式ドキュメント通りに進めても全くうまくいかない。 ググっても「IpoptをVC++でビルドした」という日本語の記事は
ぐらいで、しかも、僕の環境ではこの記事の方法そのままではうまくいかなかった。 ところが、上のリンクの記事をもとに色々試行錯誤したところビルドできたので、ここではその方法をメモとして残しておく。
目次
要るもの
- Visual Studio (僕はVisual Studio Community 2019でビルドした。他でできるかは不明)
- Intel Parallel Studio XE (学生は無償で使用可能、僕が使用したのは2019年版)
- Cygwin
- Ipoptのソース (ver.3.12.13)
- HSLのソース (オプション)
準備
Visual Studioは既にインストールされているものとする。
Intel Parallel Studio XE のダウンロード&インストール
下のリンクから、ダウンロード&インストールする。学生は無償で使用することができる。これに入っているIntel MKLとIntel Fortran Compilerを使う。
Cygwinのインストール
下のリンクからsetup-x86_64.exe
をダウンロードし実行する。
パッケージは次のものをインストールする。
- "Devel": make
- "Devel": pkg-config
- "Devel": patch
- "Archive": unzip
- "Web": wget
- "Utils": dos2unix
インストールが完了したら、cygwin64\bin
内のlink.exe
とln.exe
を適当な別の名前に変更する。理由は
七色雑記 | Ipoptをビルドするを参照。
Ipoptのダウンロード
下のリンクから、Ipopt-3.12.13.zip
をダウンロード・解凍し適当な場所に保存する。保存場所はどこでもいいと思うがパス名に日本語や空白文字が入る場所はやめておくのが吉。
HSLのダウンロード(オプション)
これは別にしなくてもいい。でも、する方が良い(速くなる)。 以下は学術的使用のみで可能。
- http://www.hsl.rl.ac.uk/ipopt/にアクセスし、右のほうにある"Coin-HSL Full(Stable)"直下の"[Source]"をクリック
- "Personal Academic Licence"を選択し、必要事項を記入
- メールが来るまでしばらく待つ(1, 2日程度)
- メール内のリンクからダウンロード
- ダウンロードしたフォルダのフォルダ名を
coinhsl
に変更しIpopt-3.12.13\ThirdParty\HSL
内へフォルダごとコピー
学術的使用でない個人使用の場合はソルバーが限定されるが手順1.で"Coin-HSL Archive"のソースをダウンロードすればいい(たぶん)。
Ipoptのビルド
ビルド環境の準備
- スタートメニューを開き、[Intel Parallel Studio XE 2019] > [コンパイラー 19.0 UP4 インテル(R) 64 VS2019 環境]をクリックし、起動する
Ipopt-3.12.13
内へ移動する
例)cd C:\Users\scol\Desktop\Ipopt-3.12.13
C:\cygwin64\Cygwin.bat
を入力し実行する。Cygwinが立ち上がる
Mumps, Metis のダウンロード(オプション)
HSLを準備したならたぶん要らない。HSLがないなら一応ダウンロードしておこう。
cd ThirdParty/Mumps ./get.Mumps cd ../Metis ./get.Metis cd ../../
Configure
./configure -enable-doscompile=msvc --disable-libtool-lock CXX=cl CC=cl F77=ifort
CコンパイラやC++コンパイラにiclではなくclを選択しているのがポイント。何も指定しなければiclが選択されるが、この場合、コンパイラのオプションとして入力されるインクルードディレクトリ名などがunix形式のものになってしまい、うまく動かなくなる。
ビルド
make
make install
注:make -j 〇
をしてはならない。
上の二つを実行すればビルドが完了しIpopt-3.12.13\include
にヘッダーファイル、Ipopt-3.12.13\lib
にライブラリファイル(.lib)が保存される。
Ipoptライブラリ使用時のVisual Studioの設定
おそらく、Intel Parallel Studioをインストールしたときに、Visual Studioへの機能の統合が行われているはず。以下の手順はそれを仮定している。
- プロジェクトのプロパティページを開く
- [全般]の「プラットフォーム・ツールセット」を「Intel C++ Compiler 19.0」に変更し、「適用」をクリック
- [インテル(R)パフォーマンス・ライブラリ]の「Intel(R)MKLを使用する」を「シーケンシャル」に変更する
- [C++] > [コード生成]の「ランタイム・ライブラリー」を「マルチスレッド(/MT)」に変更する
- [C++] > [全般]の「追加のインクルード・ディレクトリー」に上で生成された
Ipopt-3.12.13\include
を追加する - [リンカー] > [全般]の「追加のライブラリー・ディレクトリー」に上で生成された
Ipopt-3.12.13\lib
を追加する - [リンカ―] > [入力]の「追加の依存ファイル」に
Ipopt-3.12.13\lib
内のすべての.libファイルを追加する
Ipopt-3.12.13\Ipopt\examples\hs071_cpp
内にサンプルプログラムがある。上の手順を行った後に、サンプルプログラムをビルドし期待通りに動作するかをチェックするのが良い。