This file documents major changes to PICOS. The format is based on Keep a Changelog.



  • Support for MOSEK 9.

  • Support for ECOS 2.0.7.

  • Support for multiple subsystems with partial_trace.

  • Possibility to use picos.sum to sum over the elements of a single multidimensional expression.


  • Upgrading the PyPI package via pip.

  • A regression that rendered the Kronecker product unusable.

  • Noisy exception handling in spmatrix.

  • Shape detection for matrices given by string.

  • The hotstart option when solving with CPLEX.

1.2.0 - 2019-01-11


  • A scalar expression's value and a scalar constraint's dual are returned as scalar types as opposed to 1×1 matrices.

  • The dual value returned for rotated second order cone constraints is now a proper member of the dual cone (which equals the primal cone up to a factor of 4). Previously, the dual of an equivalent second order cone constraint was returned.

  • The Python 2/3 compatibility library six is no longer a dependency.


  • Support for the ECOS solver.

  • Experimental support for MOSEK’s new Fusion API.

  • Full support for exponential cone programming.

  • A production testing framework featuring around 40 novel optimization test cases that allows quick selection of tests, solvers, and solver options.

  • A “glyph” system that allows the user to adjust the string representations of future expressions and constraints. For instance, picos.latin1() disables use of unicode symbols.

  • Support for symmetric variables with all solvers, even if they do not support semidefinite programming.


  • Solver implementations each have a source file of their own, and a common interface that makes implementing new solvers easier.

  • Likewise, constraint implementations each have a source file of their own.

  • The implementations of CPLEX, Gurobi, MOSEK and SCIP have been rewritten.

  • Solver selection takes into account how well a problem is supported, distinguishing between native, secondary, experimental and limited support.

  • Unsupported operations on expressions now produce meaningful exceptions.

  • add_constraint and add_list_of_constraints always return the constraints passed to them.

  • add_list_of_constraints and picos.sum find a short string representation automatically.


  • The old production testing script.

  • Support for the SDPA solver.

  • Support for sequential quadratic programming.

  • The options convert_quad_to_socp_if_needed, pass_simple_cons_as_bound, return_constraints, handleBarVars, handleConeVars and smcp_feas.

  • Support for GLPK and MOSEK through CVXOPT.


  • Performance issues when exporting variable bounds to CVXOPT.

  • Hadamard product involving complex matrices.

  • Adding constant terms to quadratic expression.

  • Incorrect or redundant expression string representations.

  • GLPK handling of the default maxit option.

  • Miscellaneous solver-specific bugs in the solvers that were re-implemented.

1.1.3 - 2018-10-05



  • The main repository has moved to GitLab.

  • Releases of packages and documentation changes are automated and thus more frequent. In particular, post release versions are available.

  • Test bench execution is automated for greater code stability.

  • Improved test bench output.

  • Improved support for the SDPA solver.

  • partial_trace can handle rectangular subsystems.

  • The documentation was restructured; examples were converted to Python 3.


  • Upper bounding the norm of a complex scalar.

  • Multiplication with a complex scalar.

  • A couple of Python 3 specific errors, in particular when deleting constraints.

  • All documentation examples are reproducible with the current state of PICOS.

1.1.2 - 2016-07-04



  • Improved efficiency when processing large expressions.

  • Improved support for the SDPA solver.

  • add_constraint returns a handle to the constraint when the option return_constraints is set.

  • New signature for the function partial_transpose, which can now transpose arbitrary subsystems from a kronecker product.

  • PICOS no longer turns constraints into variable bounds, unless the new option pass_simple_cons_as_bound is enabled.


  • Minor bugs with complex expressions.

1.1.1 - 2015-08-29


  • Support for the SDPA solver.

  • Partial trace of an affine expression, see partial_trace.


  • Improved PEP 8 compliance.


  • Compatibility with Python 3.

1.1.0 - 2015-04-15


  • Compatibility with Python 3.


  • The main repository has moved to GitHub.

1.0.2 - 2015-01-30



  • Improved efficiency of the sparse SDPA file format writer.

  • Improved efficiency of to_real.


  • Scalar product of hermitian matrices.

  • Conjugate of a complex expression.

1.0.1 - 2014-08-27



  • Significantly improved slicing performance for affine expressions.

  • Improved performance of retrieve_matrix.

  • Improved performance when retrieving primal solution from CPLEX.

  • The documentation received an overhaul.

1.0.0 - 2013-07-19


  • Ability to express rational powers of affine expressions with the ** operator, traces of matrix powers with picos.tracepow, (generalized) p-norms with picos.norm and n-th roots of a determinant with picos.detrootn.

  • Ability to specify variable bounds directly rather than by adding constraints, see add_variable, set_lower(), set_upper(), set_sparse_lower() and set_sparse_upper().

  • Problem dualization, see dualize.

  • Option solve_via_dual which controls passing the dual problem to the solver instead of the primal problem. This can result in a significant speedup for certain problems.

  • Semidefinite programming interface for MOSEK 7.0.

  • Options handleBarVars and handleConeVars to customize how SOCPs and SDPs are passed to MOSEK. When these are set to True, PICOS tries to minimize the number of variables of the MOSEK instance.


  • If the chosen solver supports this, updated problems will be partially re-solved instead of solved from scratch.


  • Option onlyChangeObjective.

0.1.3 - 2013-04-17


  • A geomean function to construct geometric mean inequalities that will be cast as SOCP constraints.

  • Options uboundlimit and lboundlimit to tell CPLEX to stop the search as soon as the given threshold is reached for the upper and lower bound, respectively.

  • Option boundMonitor to inspect the evolution of CPLEX lower and upper bounds.

  • Ability to use the weak inequality operators as an alias for the strong ones.


  • The solver search time is returned in the dictionary returned by solve.


  • Access to dual values of fixed variables with CPLEX.

  • Evaluation of constant affine expressions with a zero coefficient.

  • Number of constraints not being updated in remove_constraint.

0.1.2 - 2013-01-10


  • Writing SDPA files. The lower triangular part of the constraint matrix was written instead of the upper triangular part.

  • A wrongly raised IndexError from remove_constraint.

0.1.1 - 2012-12-08


  • Interface to Gurobi.

  • Ability to give an initial solution to warm-start mixed integer optimizers.

  • Ability to get a reference to a constraint that was added.


  • Minor bugs with quadratic expressions.

0.1.0 - 2012-06-22


  • Initial release of PICOS.