スコルの知恵袋

主にプログラミング関係の気になったこと等をまとめたブログ

VC++でIpoptをビルドする(with Intel MKL, HSL)

この記事はVC++でIpoptをビルドするためのメモ。

Ipoptは大規模な非線形計画問題を解くことができる便利なツール。しかし、VC++でビルドしようとすると厄介で、公式ドキュメント通りに進めても全くうまくいかない。 ググっても「IpoptをVC++でビルドした」という日本語の記事は

ぐらいで、しかも、僕の環境ではこの記事の方法そのままではうまくいかなかった。 ところが、上のリンクの記事をもとに色々試行錯誤したところビルドできたので、ここではその方法をメモとして残しておく。

目次

要るもの

  1. Visual Studio (僕はVisual Studio Community 2019でビルドした。他でできるかは不明)
  2. Intel Parallel Studio XE (学生は無償で使用可能、僕が使用したのは2019年版)
  3. Cygwin
  4. Ipoptのソース (ver.3.12.13)
  5. 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.exeln.exeを適当な別の名前に変更する。理由は 七色雑記 | Ipoptをビルドするを参照。

Ipoptのダウンロード

下のリンクから、Ipopt-3.12.13.zipをダウンロード・解凍し適当な場所に保存する。保存場所はどこでもいいと思うがパス名に日本語や空白文字が入る場所はやめておくのが吉。

HSLのダウンロード(オプション)

これは別にしなくてもいい。でも、する方が良い(速くなる)。 以下は学術的使用のみで可能。

  1. http://www.hsl.rl.ac.uk/ipopt/にアクセスし、右のほうにある"Coin-HSL Full(Stable)"直下の"[Source]"をクリック
  2. "Personal Academic Licence"を選択し、必要事項を記入
  3. メールが来るまでしばらく待つ(1, 2日程度)
  4. メール内のリンクからダウンロード
  5. ダウンロードしたフォルダのフォルダ名をcoinhslに変更しIpopt-3.12.13\ThirdParty\HSL内へフォルダごとコピー

学術的使用でない個人使用の場合はソルバーが限定されるが手順1.で"Coin-HSL Archive"のソースをダウンロードすればいい(たぶん)。

Ipoptのビルド

ビルド環境の準備

  1. スタートメニューを開き、[Intel Parallel Studio XE 2019] > [コンパイラー 19.0 UP4 インテル(R) 64 VS2019 環境]をクリックし、起動する
  2. Ipopt-3.12.13内へ移動する
    例) cd C:\Users\scol\Desktop\Ipopt-3.12.13
  3. 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への機能の統合が行われているはず。以下の手順はそれを仮定している。

  1. プロジェクトのプロパティページを開く
  2. [全般]の「プラットフォーム・ツールセット」を「Intel C++ Compiler 19.0」に変更し、「適用」をクリック
  3. [インテル(R)パフォーマンス・ライブラリ]の「Intel(R)MKLを使用する」を「シーケンシャル」に変更する
  4. [C++] > [コード生成]の「ランタイム・ライブラリー」を「マルチスレッド(/MT)」に変更する
  5. [C++] > [全般]の「追加のインクルード・ディレクトリー」に上で生成されたIpopt-3.12.13\includeを追加する
  6. [リンカー] > [全般]の「追加のライブラリー・ディレクトリー」に上で生成されたIpopt-3.12.13\libを追加する
  7. [リンカ―] > [入力]の「追加の依存ファイル」にIpopt-3.12.13\lib内のすべての.libファイルを追加する

Ipopt-3.12.13\Ipopt\examples\hs071_cpp内にサンプルプログラムがある。上の手順を行った後に、サンプルプログラムをビルドし期待通りに動作するかをチェックするのが良い。

リンク