BLASとLAPACKとIpOptのインストール
BLASとLAPACKとIpOptをインストールしたのでそのメモ。
BLASとLAPACKのインストール
LAPACKのDL先はここ。
LAPACKにBLASが付属しているので、BLASはDLする必要なし。
とりあえずDLした後は適当な場所で解凍する。
解凍したディレクトリに移動して、make.inc.exampleをmake.incにする。
cd lapack-3.4.2
cp make.inc.example make.inc
make blaslib
make lapacklib
makeすると、librefblas.aとliblapack.aがmakeしたディレクトリに作られるので、適切な場所にコピーしてやる。
sudo cp librefblas.a /usr/lib/libblas.a
sudo cp liblapack.a /usr/lib/liblapack.a
でOK。
IpOptのインストール
マニュアルはここ。
手順は
- ファイルをDL
- LinearSolverのDL
- ASL(AMPLSolverLibrary)のDL(任意)
- ./configure
- makeなど
IpOptはLinearSolverが必須なので何かしら導入しなければならないらしい。
LinearSolverのDL
Solverでマニュアルにのっているのは以下の
DLに登録が必要で、非商用、アカデミックなら無料で使えるっぽい。
無料で使えるがMPIと競合する?
非商用、非営利、internal research目的で、アカデミックならOKらしい。
ライセンス的に90日間だけ使えるっぽい。
登録が面倒くさかったのでMUMPSを使うことにして話を進める。
MUMPSのサイトから適切なファイルをDLして、Ipopt-3.10.3/ThirdParty/Mumpsに解凍する。解凍されたディレクトリはバージョン番号が付いてるだろうからMUMPSに変更すればOK。
なのだがwgetが使えるならば付属のスクリプトで一瞬で終わる。
cd Ipopt-3.10.3/ThridParty/Mumps
./get.Mumps
でおk。
configureを実行
buildを作って(作らなくても良いが)、configureを実行。
configureはオプションがつけられる。
- --prefixはインストール先の指定。指定したフォルダ以下のlibにライブラリ等がインストールされる。
- CXX,CC,F77はそれぞれC++,C,Fortranのコンパイラ
- --with-blas="-L/usr/lib -lblas"
- --with-lapack="-L/usr/lib -llapack"
で既にインストール済みのライブラリを指定できる。他のThirdPartyのも同様にできるはず。
cd ../..
mkdir build
cd build
../configure --prefix=/usr/local --enable-static CXX=g++ CC=gcc F77=gfortran
configure: Main configuration of Ipopt successful
が出れば成功。
おまけ
ubuntuやいくつかのLinuxだとライブラリは毎回読まれるのではなくキャッシュされるので、インストール直後だとipoptとやっても
ipopt: error while loading shared libraries: libipoptamplinterface.so.0: cannot open shared object file: No such file or directory
などと怒られてしまう。
再起動すればOKだろうが、以下のコマンドでもおk
sudo ldconfig
せっかく使えるようになったので試しに実行してみる。
以下はIpOptのチュートリアルの問題をAMPLで記述したもの。
var x{1..4};
minimize f:
x[1]*x[4]*(x[1]+x[2]+x[3])+x[3];c1: x[1]*x[2]*x[3]*x[4] >= 25;
d1: x[1]^2 + x[2]^2 + x[3]^2 + x[4]^2 = 40;
d2 {i in 1..4}: 1 <= x[i] <= 5;data;
var x :=
1 1
2 5
3 5
4 1
;
上の問題をnlファイルに変換したのが下記。
IpOptSample.nl
g3 1 1 0 # problem IpOptSample
4 2 1 0 1 # vars, constraints, objectives, ranges, eqns
2 1 # nonlinear constraints, objectives
0 0 # network constraints: nonlinear, linear
4 4 4 # nonlinear vars in constraints, objectives, both
0 0 0 1 # linear network variables; functions; arith, flags
0 0 0 0 0 # discrete variables: binary, integer, nonlinear (b,c,o)
8 4 # nonzeros in Jacobian, gradients
2 4 # max name lengths: constraints, variables
0 0 0 0 0 # common exprs: b,c,o,c1,o1
C0 #c1
o2 #*
o2 #*
o2 #*
v0 #x[1]
v1 #x[2]
v2 #x[3]
v3 #x[4]
C1 #d1
o54 #sumlist
4
o5 #^
v0 #x[1]
n2
o5 #^
v1 #x[2]
n2
o5 #^
v2 #x[3]
n2
o5 #^
v3 #x[4]
n2
O0 0 #f
o2 #*
o2 #*
v0 #x[1]
v3 #x[4]
o54 #sumlist
3
v0 #x[1]
v1 #x[2]
v2 #x[3]
x4 # initial guess
0 1
1 5
2 5
3 1
r #2 ranges (rhs's)
2 25
4 40
b #4 bounds (on variables)
0 1 5
0 1 5
0 1 5
0 1 5
k3 #intermediate Jacobian column lengths
2
4
6
J0 4
0 0
1 0
2 0
3 0
J1 4
0 0
1 0
2 0
3 0
G0 4
0 0
1 0
2 1
3 0
上のファイルを適当な場所において次のコマンドを実行する。
ipopt IpOptSample.nl
と最適値が求まる。
最適解が見たい場合は面倒だが
ipopt IpOptSample.nl -AMPL
として出力されたIpOptSample.solの適当な箇所を見ないといけないようで、オプションのprint_levelをいじっても表示はしてくれなかった。