peterwittek / ncpol2sdpa

Solve global polynomial optimization problems of either commutative variables or noncommutative operators through a semidefinite programming (SDP) relaxation
http://ncpol2sdpa.readthedocs.org/
GNU General Public License v3.0
50 stars 19 forks source link

Ncpol2sdpa

Ncpol2sdpa solves global polynomial optimization problems of either commutative variables or noncommutative operators through a semidefinite programming (SDP) relaxation. The optimization problem can be unconstrained or constrained by equalities and inequalities, and also by constraints on the moments. The objective is to be able to solve large scale optimization problems. Example applications include:

The implementation has an intuitive syntax for entering problems and it scales for a larger number of noncommutative variables using a sparse representation of the SDP problem. Further details are found in the following paper:

Dependencies

The implementation requires SymPy <http://sympy.org/> and Numpy <http://www.numpy.org/>. The code is compatible with both Python 2 and 3. The code is compatible with Pypy>=5.10. Using it yields a 10-20x speedup.

By default, Ncpol2sdpa does not require a solver, but then it will not be able to solve a generated relaxation either. Install any supported solver and it will be detected automatically.

Optional dependencies include:

Usage

Documentation is available on Read the Docs <http://ncpol2sdpa.readthedocs.io/>_. The following code replicates the toy example from Pironio, S.; Navascués, M. & Acín, A. Convergent relaxations of polynomial optimization problems with noncommuting variables SIAM Journal on Optimization, SIAM, 2010, 20, 2157-2180.

.. code:: python

from ncpol2sdpa import generate_operators, SdpRelaxation

# Number of operators
n_vars = 2
# Level of relaxation
level = 2

# Get Hermitian operators
X = generate_operators('X', n_vars, hermitian=True)

# Define the objective function
obj = X[0] * X[1] + X[1] * X[0]

# Inequality constraints
inequalities = [-X[1] ** 2 + X[1] + 0.5 >= 0]

# Simple monomial substitutions
substitutions = {X[0]**2: X[0]}

# Obtain SDP relaxation
sdpRelaxation = SdpRelaxation(X)
sdpRelaxation.get_relaxation(level, objective=obj, inequalities=inequalities,
                             substitutions=substitutions)
sdpRelaxation.solve()
print(sdpRelaxation.primal, sdpRelaxation.dual, sdpRelaxation.status)

Further examples are found in the documentation.

Installation

The code is available on PyPI, hence it can be installed by

$ sudo pip install ncpol2sdpa

If you want the latest git version, follow the standard procedure for installing Python modules after cloning the repository:

$ sudo python setup.py install

Acknowledgment

This work is supported by the European Commission Seventh Framework Programme under Grant Agreement Number FP7-601138 PERICLES <http://pericles-project.eu/>, by the Red Espanola de Supercomputacion <http://www.bsc.es/RES> grants number FI-2013-1-0008 and FI-2013-3-0004, and by the Swedish National Infrastructure for Computing <http://www.snic.se/>_ projects SNIC 2014/2-7 and SNIC 2015/1-162.