IPyOpt is a python module that allows you to use Ipopt in Python. It was developed by Eric Xu when he was a PhD student at Washington University and issued under the BSD license. Original repository: xuy/pyipopt.
IPyOpt depends on the following packages:
- A compiler and a linker, e.g. gcc, ld
- Python.h (part of the python source code, you can download it from Python.org)
First, get the latest source code using:
$ git clone http://github.com/g-braeunlich/IPyOpt.git
Check whether a file
ipopt.pc was distributed with your Ipopt installation.
If this is the case and
ipopt.pc is in the search path of
(on unix systems:
/usr/local/share/pkgconfig), nothing has to be modified.
In this case run
$ python setup.py build $ sudo python setup.py install
pkg-config is not available for your system, you will need to
pass appropriate information to
setup.py by setting the environment
$ CFLAGS="-I/usr/include/coin/ -l/usr/lib64 -lipopt -lmumps_common -ldmumps -lzmumps -lsmumps -lcmumps -llapack -lblas -lblas -lblas -lm -ldl' ./setup.py build $ sudo python setup.py install
If you have an
ipopt.pc which is not in the
pkg-config search path,
specify the path via the
PKG_CONFIG_PATH environment variable (see below).
If you cannot find an
ipopt.pc in your
ipopt installation, there is an
example pc file in the directory
Copy it to a location (best of all directly in a subfolder named
pkgconfig of your Ipopt installation) and edit it to reflect the
library and include paths of the dependencies.
$ PKG_CONFIG_PATH=<dir containing ipopt.pc> python setup.py build $ sudo python setup.py install
You can use IPyOpt like this:
import ipyopt # define your call back functions nlp = ipyopt.Problem(...) nlp.solve(...)
You can also check out
examples/hs071.py to see how to use IPyOpt.
IPyOpt as a module comes with docstring. You can poke around
it by using Python's
I have included an example
To see if you have IPyOpt ready, use the following command under the
$ python hs071.py
hs071.py contains a toy optimization problem. If everything
is OK, IPyOpt will invoke Ipopt to solve it for you. This python file
is self-documented and can be used as a template for writing your own
IPyOpt is a legitimate Python module, you can inspect it by using
standard Python commands like
help. All functions in
IPyOpt are documented in details.
Hessian Estimation: since Hessian estimation is usually tedious,
Ipopt can solve problems without Hessian estimation. IPyOpt also
supports this feature. The file
hs071.py demonstrates the idea. If
you provide the
ipyopt.Problem constructor with an
function as well as the
apply_new callback function, Ipopt will
delegate the Hessian matrix calculation to your function (otherwise
Ipopt will approximate Hessian for you).
- Fork it.
- Create a branch (
git checkout -b new_branch)
- Commit your changes (
git commit -am "your awesome message")
- Push to the branch (
git push origin new_branch)
- Create a pull request
- Nag me about it if I am lazy.
IPyOpt links to Ipopt's C library. If that library is not available IPyOpt will fail
during module initialization. To check the availability of this library, you can go to
make to ensure you can compile and run the toy example supplied by Ipopt.
ImportError: can not find libipopt.so.0
Solution: find it and copy it to a folder that ld can access
ImportError: /usr/lib/libipopt.so.0: undefined symbol: _gfortran_XXX
Solution: check if your
hs071_cexample work. It is very likely that your ipopt library is not correctly compiled.
ImportError: /usr/lib/libipopt.so.0: undefined symbol: SetIntermediateCallback
Solution: SetIntermediateCallback is a function added since Ipopt 3.9.1. (see https://projects.coin-or.org/Ipopt/changeset/1830 ) Make sure you have an Ipopt version >= 3.9.1
ImportError: /usr/lib/libipopt.so.0: undefined symbol: ma19ad_
Solution: First, use
nm /usr/lib/libipopt.so.0 | grep ma19ad_
to see if it is marked with U. It should. This means that
libipopt.so.0is not aware of
libcoinhsl.so.0. You can fix this by adding
CFLAGSvariable (see section install). It seems to me that this happens in the recent versions of ipopt. Eventually IPyOpt will have a better building mechanism, and I will fix this soon.
ImportError: /usr/lib/libipopt.so.0: undefined symbol: SomeKindOfSymbol
Solution: I can assure you that it is NOT a bug of IPyOpt. It is very likely that you did not link the right package when compiling IPyOpt.
nm /usr/lib/libipopt.so.0 | grep SomeKindOfSymbol
to see if this symbol is indeed missing. Do a Google search to find the library file, and add
CFLAGSvariable (see section install).
Ipopt is built using various third-party libraries. Different machines may have different set of libraries. You should try to locate these dependencies and indicate them when compiling IPyOpt. This is just a limitation of dynamic linking libraries and is not related to IPyOpt. Please do not report a missing symbol error as a "bug" to me unless you are 100% sure it is the problem of IPyOpt.
Gerhard Bräunlich firstname.lastname@example.org
- Modifications on logger made by OpenMDAO at NASA Glenn Research Center, 2010 and 2011
- Added "eval_intermediate_callback" by OpenMDAO at NASA Glenn Research Center, 2010 and 2011
- Modifications on the SAFE_FREE macro made by Guillaume Jacquenot, 2012
- Changed logger from code contributed by alanfalloon