## Thursday, January 18, 2018

### CBC and semi-continuous variables

The Coin CBC MIP solver [5] does not seem to have a way to specify semi-continuous variables in either an LP file or an MPS file [1] (slightly edited):

Hi,

I am using version 2.9.9 of cbc in ubuntu 17.10 docker image.  My test.lp file has following content:

Maximize
obj: x1 + 2 x2 + 3 x3 + x4
Subject To
c1: - x1 + x2 + x3 + 10 x4 <= 20
c2: x1 - 3 x2 + x3 <= 30
c3: x2 - 3.5 x4 = 0
Bounds
0 <= x1 <= 40
2 <= x4 <= 3
General
x4
Semis
x1 x2 x3


When trying with semis section I get an error "terminate called after throwing an instance of 'CoinError?' Aborted"

On a Mac I get: libc++abi.dylib: terminating with uncaught exception of type CoinError? Abort trap: 6

However if I comment out Semis it works fine. I was hoping that Semis are supported. Am I doing something wrong?

My command is : cbc -presolve on -import test.lp solve solu out.txt

On further analysis I found out when in cbc prompt I type "import test.lp" it fails and shows same error is I tried in MPS format as well there i got

Bad image at line 19 < SC BND1 YTWO 3 >

Contents of mps file are :

NAME          TESTPROB
ROWS
N  COST
L  LIM1
G  LIM2
E  MYEQN
COLUMNS
XONE      COST                 1   LIM1                 1
XONE      LIM2                 1
YTWO      COST                 4   LIM1                 1
YTWO      MYEQN               -1
ZTHREE    COST                 9   LIM2                 1
ZTHREE    MYEQN                1
RHS
RHS1      LIM1                 5   LIM2                10
RHS1      MYEQN                7
BOUNDS
UP BND1      XONE                 4
SC BND1      YTWO                 3
ENDATA


Some notes:

• The LP file parser crashes hard. Preferably, a parser should never crash on erroneous input and always produce a (good) error message,
• The MPS file reader does not crash, but the error message "bad image" seems a bit strange to me (what has this to do with an image? In prehistoric times an "image" was sometimes used as the equivalent of "file". "Bad file" is still somewhat of a bad message.).
• CBC actually supports semi-continuous variables.
• Semi-continuous behavior can be modeled with binary variables [3]: \begin{align} &\delta \cdot \ell \le x \le \delta \cdot u\\&\delta \in \{0,1\}\\&x \in [0,u]\\&\ell > 0\end{align}
• If you have good upper bounds, this may actually solve faster (MIP solvers do like binary variables).
• Semi-continuous variables with a zero lower bound do not make much sense.
• The LP and MPS file in this post do not represent the same problem.