半正定値計画問題(Semidefinite Programming)を解くためのライブラリCSDP
CまたはC++で半正定値計画問題を取り扱うことのできるライブラリを探していたところ以下のライブラリが見つかった。
・CSDP
https://github.com/coin-or/Csdp
WindowsのVisual Studioで利用するためには少し作業が必要だったので軽くメモをしておく。基本的には、以下のサイトを見ながらライブラリを生成した。ただ、バージョンの違いなのか、いくつか修正する点があった。
・CSDPのVisual Studio2010でのコンパイル方法
http://buaiso.blogspot.com/2013/01/csdpvisual-studio2010.html
・CSDP
https://github.com/coin-or/Csdp
WindowsのVisual Studioで利用するためには少し作業が必要だったので軽くメモをしておく。基本的には、以下のサイトを見ながらライブラリを生成した。ただ、バージョンの違いなのか、いくつか修正する点があった。
・CSDPのVisual Studio2010でのコンパイル方法
http://buaiso.blogspot.com/2013/01/csdpvisual-studio2010.html
CLAPACKの準備
上記サイトに書かれているように内部でLAPACKが使用されているため、まずはCLAPACKを準備する。上記サイトとは異なり、CMake版をダウンロードして用いた。- http://www.netlib.org/clapack/よりclapack-3.2.1-CMAKE.tgzをダウンロードし解凍する。
- CMakeを使ってVisual Studioのプロジェクトを生成する。ただし、今回はx64環境でライブラリを使いたいのでx64でプロジェクトを生成する。(ConfigureするといくつかWarningが出るが無視)
- 出来上がったプロジェクトを開きビルドする。
- Debug, Release各々でlapack.lib, blas.lib, libf2c.libが生成されていればOK。
CSDPのビルド
- GitHubからCSDPのコードをCloneする。
https://github.com/coin-or/Csdp - ここから Csdp-6.1.1_vcproj.zipをダウンロードして解凍する。(誰がアップしているんだろう。。。)
- 解凍するとvcbuildというフォルダができるので、これをCSDP直下にコピーする。※参考にしたウェブではlibsというフォルダができるとあるが私の環境では生成されませんでした。
- CSDP直下にlibsフォルダを作成する。
- vcbuild内にあるvcbuild.slnを開く。Visual Studioのバージョンによってはアップグレードのダイアログが出てくるので、とりあえずOKを押して進む。
- ビルド->構成マネージャーを開き、アクティブソリューションプラットフォームをx64に変更する。
- この状態でビルドするとstrings.hが見つからないというエラーなどが出る。CSDPのlibフォルダの中にあるinitparams.cの6行目を以下のように変更する。
変更前:#include <strings.h>
変更後:#include <string.h> - CSDPのincludeフォルダの中にあるdeclarations.hの9行目あたりに以下の4行を追記する。
#ifdef _MSC_VER
#define strncasecmp _strnicmp
#define strcasecmp _stricmp
#endif - lapack_win32_MD.lib, BLAS_nowrap.libなどが見つからないというエラーがでるので、各プロジェクトのリンカーの設定でビルド済みのCLAPACKの各ライブラリを設定する。
- ビルドするとCSDPのlibsフォルダにlibcsdp.libが出来上がる。
exampleを実行すると以下のような出力が得られる。
CSDPはOpenMPもサポートしているようだが、一部OpenMP4.0の機能(#pragma omp simd)が使われており、Visual Studio 2017ではビルドできなかった。Visual Studio 2019ならできるかも。
コメント
コメントを投稿