[Coin-ipopt] PARDISO linear solver for IPOPT in Matlab

Peter Carbonetto pcarbo at cs.ubc.ca
Fri Nov 9 20:11:09 EST 2007


After a great deal of trial and error, I managed to get the Pardiso linear 
solver working for IPOPT with the Matlab interface. My understanding is 
that the Pardiso solver performs quite well (as the 2005 study by Gould, 
Yu and Scott suggests) so I thought it might be interest to describe my 
installation procedure.

I downloaded the Intel 32-bit PARDISO library that was compiled using gcc 
4.1.0. As it so happens, my copy of MATLAB is version 7.5, and it was 
compiled using gcc 4.1.1. So there is some hope that the libraries will 
link properly.

Here are the basic steps I followed:

1. I built shared libraries for the BLAS and LAPACK routines, libblas.so 
and liblapack.so. It appears that it is necessary to compile the BLAS and 
LAPACK libraries on your own, rather than let the IPOPT installation do 
the work if you were to follow the default installation steps described in 
the manual. I used gfortran to compile the Fortran code and built the 
libraries with the commands:

   gfortran -fPIC -fexceptions -funroll-all-loops -O3 -shared \
     -o libblas.so *.f

   gfortran -fPIC -fexceptions -funroll-all-loops -O3 -shared \
     -o liblapack.so *.f

2. I downloaded the PARDISO library. I put the pardiso.lic license file 
in the directory pointed to by the environment ariable PARDISO_LIC_PATH. I 
also set the environment variable OMP_NUM_THREADS to 1.

3. Next, I downloaded and unpacked the latest release of IPOPT (version 
3.3.3). I configured IPOPT with something like:

   ./configure CC=gcc CXX=g++ F77=gfortran                             \
     --with-blas="-L$HOME/blas -lblas"                                 \
     --with-lapack="-L$HOME/lapack -llapack"                           \
     --with-pardiso="-L$HOME/pardiso -lpardiso_GFORTRAN_IA32"          \
     ADD_CXXFLAGS="-fPIC -fexceptions" ADD_CFLAGS="-fPIC -fexceptions" \
     ADD_FFLAGS="-fPIC -fexceptions"

4. I get complaints from the linker when I try to compile one of the C++ 
examples. (It may be because I forgot to include the gfortran library in 
the configuration above.) I can, however, run the Matlab interface for 
IPOPT using the Pardiso linear solver. The command I used to compile the 
MEX file looks something like this:

   mex -cxx -O CXX="g++" -L$(IPOPT_HOME)/lib -L$(PARDISO_HOME)         \
       -L$(BLAS_HOME) -I$(IPOPT_HOME)/include -L$(LAPACK_HOME) -lipopt \
       -lpardiso_GFORTRAN_IA32 -llapack -lblas -output ipopt.mexglx    \
       *.cpp

Then I tried an example. I ran the Matlab script examplehs071.m
located in MatlabInterface/examples/hs071. In order to test the
PARDISO solver, I modified the call to IPOPT like so:

   x = ipopt(x0,lb,ub,lbc,ubc,'computeObjectiveHS071','computeGradientHS071',...
             'computeConstraintsHS071','computeJacobianHS071',...
             'computeHessianHS071',[],'',[],'linear_solver','pardiso);

And it works! It converges to the correct solution.

Peter Carbonetto
Ph.D. Candidate
Dept. of Computer Science
University of British Columbia



More information about the Coin-ipopt mailing list