An IPOpt connector for Python
Project description
IPyOpt
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.
Installation
Note the pypi repo only provides linux builds for now.
pip install [--user] ipyopt
This will install a precompiled binary version from pypi. Please note, that the precompiled binary is linked against the unoptimized reference implementation of blas/lapack. If you want to take advantage of optimized versions of blas/lapack, compile from source:
pip install --no-binary ipyopt ipyopt
In this case, you also need Ipopt and Numpy. On a debian based system:
sudo apt-get install python3-numpy coinor-ipopt
If coinor-ipopt
does not link correctly, you might have to compile
ipopt
yourself.
See the section Build below or .ci/Dockerfile on
how this can be done.
Usage
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 help()
command.
Build
IPyOpt
depends on the following packages:
- A compiler and a linker, e.g. gcc, ld
- Ipopt
- Numpy
- Python.h (part of the python source code, you can download it from Python.org)
To build from source, first, get the latest source code using:
git clone https://gitlab.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 pkg-config
(on unix systems:
/usr/lib/pkgconfig
, /usr/share/pkgconfig
, /usr/local/lib/pkgconfig
,
/usr/local/share/pkgconfig
), nothing has to be modified.
In this case run
python setup.py build
sudo python setup.py install
If pkg-config
is not available for your system, you will need to
pass appropriate information to setup.py
by setting the environment
variable CFLAGS
. Example:
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 pkgconfig/ipopt.pc.
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.
Then do
PKG_CONFIG_PATH=<dir containing ipopt.pc> python setup.py build
sudo python setup.py install
Testing
To see if you have IPyOpt
ready, use the following command under the
examples directory.
python hs071.py
The file examples/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 optimization problems.
IPyOpt
is a legitimate Python module, you can inspect it by using
standard Python commands like dir
or 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 examples/hs071.py
demonstrates the idea. If you provide the ipyopt.Problem
constructor
with an eval_h
callback 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).
Contributing
- 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 merge request
Troubleshooting
Check Ipopt
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
$IPOPT_DIR/Ipopt/examples/hs071_c/
and issue make
to ensure you can compile and run the toy example
supplied by Ipopt
.
Miscellaneous problems
-
Error:
import ipyopt
ImportError: can not find libipopt.so.0
-
Solution: find it and copy it to a folder that ld can access
-
Error:
import ipyopt
ImportError: /usr/lib/libipopt.so.0: undefined symbol: _gfortran_XXX
-
Solution: check if your
hs071_c
example work. It is very likely that your ipopt library is not correctly compiled. -
Error:
import ipyopt
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
-
Error:
import ipyopt
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.0
is not aware oflibcoinhsl.so.0
. You can fix this by adding-lcoinhsl
to theCFLAGS
variable (see section install). It seems to me that this happens in the recent versions ofipopt
. EventuallyIPyOpt
will have a better building mechanism, and I will fix this soon. -
Error:
import ipyopt
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 compilingIPyOpt
.First, use
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
-lWhateverLibrary
to theCFLAGS
variable (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 toIPyOpt
. Please do not report a missing symbol error as a "bug" to me unless you are 100% sure it is the problem ofIPyOpt
.
Contact
Gerhard Bräunlich g.braeunlich@disroot.org
Credits
- 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
Project details
Release history Release notifications | RSS feed
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distributions
Hashes for ipyopt-0.11.0-cp39-cp39-manylinux1_x86_64.whl
Algorithm | Hash digest | |
---|---|---|
SHA256 | 33ac5523142e04094098cbf38375f9b4cd09e4f1d8c790ac42293d37f81f8e02 |
|
MD5 | d36b122b4b0f056f1f7a0c2984efc986 |
|
BLAKE2b-256 | 324d25c2978df18831ba56c9aa2fede793d760c68c28ee2c20fbd8738b0bc83d |
Hashes for ipyopt-0.11.0-cp38-cp38-manylinux1_x86_64.whl
Algorithm | Hash digest | |
---|---|---|
SHA256 | 3f909947cf8f9f1557a6d9b12f46bd37756e8bf94e0af03165d587b23e271a55 |
|
MD5 | 826146bcbc66ab52bad9908f5310dba1 |
|
BLAKE2b-256 | 6957419f2419394093b5423002b912354536c808fd070b37ccff000aba2b97bc |
Hashes for ipyopt-0.11.0-cp37-cp37m-manylinux1_x86_64.whl
Algorithm | Hash digest | |
---|---|---|
SHA256 | 6140bbf26ccc1177ae076b63d67dedf8f2d3b86fd2412b6b3fd3f00479d9ff3a |
|
MD5 | 5a50b3c40d925800f3170b2b75bcef31 |
|
BLAKE2b-256 | c7c2cceda3eaa0ef633183c15316571b9504210e404f885551387f53d86ea573 |
Hashes for ipyopt-0.11.0-cp36-cp36m-manylinux1_x86_64.whl
Algorithm | Hash digest | |
---|---|---|
SHA256 | 8942dfe66ffb71e0f86467dfc876d7fd0fe0c13416940cc54547bb0cba2e5579 |
|
MD5 | 86cb80c7ed17309689e242067499be97 |
|
BLAKE2b-256 | 025a6295fc4fc59d1f5dde35d76ad0e3c2b6083e81a74ba06a56c2a9038bdcec |
Hashes for ipyopt-0.11.0-cp35-cp35m-manylinux1_x86_64.whl
Algorithm | Hash digest | |
---|---|---|
SHA256 | 59bd2c07f21f0223c313594e070f731c53dec233d026ddd5aec1dad9f8d4e6a6 |
|
MD5 | 254a94e1f89f731293478b8c4516ea9c |
|
BLAKE2b-256 | adc45b12a2890b92e939dd82bf8cef376187f5b7fd8ec2829f1d4cd2920edbae |