BLASとLAPACKとIpOptのインストール

BLASLAPACKとIpOptをインストールしたのでそのメモ。

  • LAPACK version 3.4.2
  • IpOpt version 3.10.3
  • Ubuntu 11.10
  • gfortran,gcc,g++インストール済み

BLASLAPACKのインストール

LAPACKのDL先はここ
LAPACKBLASが付属しているので、BLASはDLする必要なし。

とりあえずDLした後は適当な場所で解凍する。

gunzip lapack-3.4.2.tgz
tar xvf lapack-3.4.2.tar

解凍したディレクトリに移動して、make.inc.exampleをmake.incにする。

cd lapack-3.4.2
cp make.inc.example make.inc

後はBlAS,LAPACKの順にmakeする。

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

マニュアルはここ
手順は

  1. ファイルをDL
  2. LinearSolverのDL
  3. ASL(AMPLSolverLibrary)のDL(任意)
  4. ./configure
  5. makeなど

IpOptはLinearSolverが必須なので何かしら導入しなければならないらしい。

ファイルのDL

ここから適当にDLする。
DLしたものを解凍する。

gunzip Ipopt-3.10.3.tgz
tar xvf Ipopt-3.10.3.tar

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。

ASLのDL

ASLもNetlibレポジトリからDLして解凍しても良いが、付属のスクリプトを使えば速い。

cd ../ASL
./get.ASL

でOK。

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
が出れば成功。

makeする

同じディレクトリでmakeをする。

make
make test

Errorがでなければ多分OK

sudo make install

でライブラリと実行ファイルが追加される。

おまけ

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をいじっても表示はしてくれなかった。