The Sequential object-oriented simPlex
The Sequential object-oriented simPlex
SoPlex is an optimization package for solving linear programming problems (LPs) based on an advanced implementation of the primal and dual revised simplex algorithm. It provides special support for the exact solution of LPs with rational input data. It can be used as a standalone solver reading MPS or LP format files via a command line interface as well as embedded into other programs via a C++ class library. The main features of SoPlex are:
SoPlex has been used in numerous reasearch and industry projects and is the standard LP solver linked to the constraint integer programming solver SCIP. SoPlex is free for academic research and available in source code. It can be licensed for commercial use.
|01/Jul/2015||Version 2.2.0 released. Release Notes|
|23/Mar/2015||Binaries for Windows available for download.|
|18/Dec/2014||Version 2.0.1 released. Release Notes|
|07/Mar/2014||Binaries for Linux and Windows available for download.|
|27/Feb/2014||Version 2.0.0 released. Release Notes|
|16/Oct/2013||Version 1.7.2 released. Release Notes|
|04/Jan/2013||Version 1.7.1 released. Release Notes|
|31/Jul/2012||Version 1.7.0 released. Release Notes|
|28/Oct/2011||Version 1.6.0 released. Release Notes|
|30/Sep/2010||Version 1.5.0 released. Release Notes|
|06/Aug/2010||Patch 1.4.2c available for download providing an additional interface method to set a starting basis in the SoPlex class.|
|19/Jan/2010||Patch 1.4.2b available for download. Please update if you encounter problems in combination with older compiler versions.|
|12/Jun/2009||Patch 1.4.2a available for download. Please update.|
|11/Sep/2009||Version 1.4.2 released. Release Notes|
|20/Feb/2009||Version 1.4.1 released. Release Notes|
|30/Sep/2008||Version 1.4.0 released. Release Notes|
|27/Aug/2007||Version 1.3.2 released. Release Notes|
|17/Nov/2006||Version 1.3.1 released. Release Notes|
|03/Feb/2006||Version 1.3.0 released. Release Notes|
|10/Apr/2002||Version 1.2.1 released. Release Notes|
|14/Jan/2002||Version 1.2.0 released. Release Notes|
SoPlex is distributed under the ZIB Academic License. You
are allowed to retrieve SoPlex for research
purposes as a member of a non-commercial and
If you want to use SoPlex commercially or if you are interested in maintenance and support, please contact us by sending an email to Thorsten Koch.
Any publication for which SoPlex is used must include an acknowledgment and a reference to the Ph.D. thesis:Roland Wunderling,
The files you can download here come without any warranty. Use at your own risk!
SoPlex is completely implemented in C++. The code should be compliant with the current ANSI standard. RTTI and STL (other than iostream) are not used. With a decent modern C++ compiler you should have a chance.
We have tested SoPlex with compilers from
More details can be found in the Doxygen documentation.
Please have a look at the
INSTALL file. If you are using SoPlex
version 2.0.0 or higher you should try to recompile with
This will restore the previous command line interface and disable some new
features like iterative refinement with rational arithmetic.
bugs and problems.
In fact, a couple of improvements of SoPlex are possible. If you are interested in helping please contact us.
To just read LPs from a file and solve them without modifying the LPs, compile SoPlex and use it on the command line. Calling the binary without parameters gives you some usage information. To use SoPlex as a callable library, see src/example.cpp or src/soplexmain.cpp (from which the SoPlex binary is compiled) on how to construct an LP, solve it, and extract the solution. For further details, you have to consult the doxygen documentation of the code (or even the code itself). Another good starting point might also be the SoPlex interface of SCIP.
Because there is no realloc with new/delete. Because malloc is faster. And we only use it for builtin types or so called "Data Objects" . If you do not like this decision, it is quite easy to change spxalloc.h such as to use new/delete.
No. You need an IP-Solver for this. Most IP-Solver use LP-Solvers as a subroutine and do some kind of Branch-and-Bound. For instance, you can use SCIP (Solving Constraint Integer Programs) together with SoPlex to solve IPs. SCIP can be obtained at here and is distributed under the ZIB academic license, like SoPlex.
The code is tested to compile under Microsoft Visual Studio 2008 and 2010. It should also be possible to create a Windows version by compiling it with the GCC under Cygwin or minGW
SoPlex implements a composite simplex, i.e., it switches between primal and dual simplex and the user can only specify the starting algorithm via the integer parameter "int:algorithm = 0 (primal) / 1 (dual)".
When using the low-level class SPxSolver, you can specify to use the ENTERing and LEAVEing algorithm and COLUMN and ROW representation.
COLUMN oriented is the "usual" representation. Then Entering is the Primal and Leaving is the Dual algorithm. In ROW oriented representation, we have in principle the explicit dual and then the algorithms are reversed.
If all of the test instances from Netlib work, but your LP gives this problem, mail your LP in as an gzip'ed MPS of LP file and we will check. If you have this problem also with the test instances, check your stack space: ulimit -s will report the current size in kilobytes. Try a higher value. If this doesn't help, maybe your compiler is broken. Try compiling without optimization.
Such messages are an indication of numerical trouble, which may happen from time to time especially on LPs with weird numbers. If the problem occurs with the binary, try using another scaler (call soplex without parameters to see how to specify this). If the problem occurs while using the callable library of SoPlex, you can try to add a scaler and a preprocessor yourself (see the SoPlex class) unless you solve the same LP repeatedly with small changes (as in a Branch-and-cut process, for instance). If you send us an LP or MPS file with the offending linear program together with a description of your settings, we may have a closer look at it to see if we can do something about it.
Yes, the binary version allows to read and write basis files using the
writebas=, respectively. The library
version allows to read or write a basis file from within the code as well.
This can be useful for debugging. If you cannot reconstruct an error occurring
in the library code with the binary version, try to save a basis and try again.
Note that the LP needs to be in MPS format in order to ensure compatability of the
basis and the LP (the LP format cannot store ranged rows).
You can use ZIMPL, available at under the ZIB academic license. It takes a (human readable) file describing the linear program together with a data file as input and generates LPs or MIPs in LP- or MPS-format.
In the default setting SoPlex presolves the given LP in order to simplify the problem as far as possible by removing rows, columns, and bounds. Moreover, infeasibility or unboundedness may be detected. The simplification cannot be undone, but given a primal/dual solution for the simplified LP, the simplifier can reconstruct the primal/dual solution and basis of the unsimplified LP.
The preprocessing can be switched off by using the option
If you find one, it would be nice if you send a description together with a data file that shows the problem or even better a working fix to Thorsten Koch.
For information about new releases, patches, or for posting your questions about SoPlex, subscribe to the SoPlex mailing list here.
|Tobias Achterberg||now at Gurobi|
|Andreas Bley||now at University Kassel|
|Wei Huang||now at Siemens AG, Corporate Technology|
|Sebastian Orlowski||now at atesio|
|Marc Pfetsch||now at TU Darmstadt|
|Roland Wunderling||former main developer - now at IBM|