empty2.gms : Empty Row Test

Description

With some effort GAMS produces a model instance with an empty row (no variables).
The solver should still digest such a model instance and report infeasible.
In a second instance the empty row is only slightly infeasible (rhs 1e-12) and
the model should be declared optimal.

Contributor: M. Bussieck, July 2019


Small Model of Type : LP


Category : GAMS Test library


Main file : empty2.gms

$title Empty Row Test (EMPTY2,SEQ=801)

$onText
With some effort GAMS produces a model instance with an empty row (no variables).
The solver should still digest such a model instance and report infeasible.
In a second instance the empty row is only slightly infeasible (rhs 1e-12) and
the model should be declared optimal.

Contributor: M. Bussieck, July 2019
$offText


Set
   i 'canning plants' / seattle,  san-diego /
   j 'markets'        / new-york, chicago, topeka /;

Parameter
   a(i) 'capacity of plant i in cases'
        / seattle    350
          san-diego  600 /

   b(j) 'demand at market j in cases'
        / new-york   325
          chicago    300
          topeka     275 /;

Table d(i,j) 'distance in thousands of miles'
              new-york  chicago  topeka
   seattle         2.5      1.7     1.8
   san-diego       2.5      1.8     1.4;

Scalar f 'freight in dollars per case per thousand miles' / 90 /;

Parameter c(i,j) 'transport cost in thousands of dollars per case';
c(i,j) = f*d(i,j)/1000;

Variable
   x(i,j) 'shipment quantities in cases'
   z      'total transportation costs in thousands of dollars';

Positive Variable x;

Equation
   cost      'define objective function'
   supply(i) 'observe supply limit at plant i'
   demand(j) 'satisfy demand at market j';

cost..      z =e= sum((i,j), c(i,j)*x(i,j));

supply(i).. sum(j, x(i,j)) =l= a(i);

demand(j).. sum(i, x(i,j)) =g= b(j);

scalar rhs; equation dummy; dummy.. 0 =e= rhs;
Model transport / all /;

MaxExecError = 1;
option sys12 = 1;

rhs = 1;
solve transport using lp minimizing z;
abort$(transport.modelstat<>%modelStat.infeasible% and
       transport.modelstat<>%modelStat.infeasibleNoSolution%) 'modelstatus not infeasible', transport.modelstat;
* Clear execError from previous model generation
execError = 0;
rhs = 1e-12;
solve transport using lp minimizing z;
abort$(transport.modelstat<>%modelStat.optimal% and transport.modelstat<>%modelStat.infeasible% and transport.modelstat<>%modelStat.infeasibleNoSolution%) 'modelstatus not optimal or infeasible', transport.modelstat;