All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros Groups Pages
Frequently Asked Questions
How can I contribute?
bugs and problems.
So, how do I start working with SoPlex?
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).
Can I use SoPlex with Branch-and-cut or MIP solvers?
Yes, but the corresponding software needs an interface. Currently, the following frameworks have an interface to SoPlex.
Why is <iostream> used but <assert.h> and not <cassert>?
The reason is twofold. From the theoretical point we were not able to exactly find out in TC++PL in what namespace cassert should load its declarations. Surely in std. But since these are normally functions with C linkage, this won't work. Then some of them, like assert, are macros which have no namespace. The practical point is that the compiler vendors seem to be unsure as well. Most of them put everything in both namespaces std and global. So there is no advantage in using <cassert>. Compaq even left them off because it seemed unclear to them. So our reasoning was: If it is a C++ header we use the correct form without the .h and in std. If it is a C header, according to the standard the .h header has to be there and uses the global namespace. That seems acceptable to us, especially for C functions.
Why is malloc/free sometimes used and not new/delete?
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.
Can SoPlex solve Integer Programs (IPs)?
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 http://scip.zib.de/ and is distributed under the ZIB academic license, like SoPlex.
Is there a Windows version?
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
I want a primal and a dual simplex, where are they?
That is nearly easy. You can set SoPlex 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. The only problem is that SoPlex is a composite simplex algorithm. That means it switches between entering and leaving algorithm as it needs. So all you can choose is which algorithm is used first, but then an arbitrary number of switches may occur. (Even so, often no switch at all happens.)
I got a segment violation or a signal 11.
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.
I got messages or exceptions stating "This shall not be." or similar.
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.
Can SoPlex handle basis files?
Yes, the binary version allows to read and write basis files using the
SoPlex means "Sequential Simplex". Is there a parallel version available?
Is there a wrapper class/library to use SoPlex instead of CPLEX ?
How can I make LP generation easier?
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.
What kind of preprocessing is done?
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
The preprocessing can be switched off by using the option