$title 'sensitivity / ranging test' (SENS01,SEQ=833) $if not '%GAMS.lp%' == '' $set solver %GAMS.lp% $if not set solver $set solver cplex $onText Tests GMS / GDX export of post-optimality sensitivity (or ranging) information of solvers that support this feature. Contributor: Renke Kuhlmann, October 2020 $offText $call gamslib -q 1 $include trnsport.gms $ifThenI %solver% == gurobi $echo sensitivity 1 > %solver%.opt $elseIfI %solver% == gurobiold $echo sensitivity 1 > %solver%.opt $elseIfI %solver% == cplex $echo rhsrng all > %solver%.opt $echo objrng all >> %solver%.opt $echo bndrng all >> %solver%.opt $elseIfI %solver% == highs $echo sensitivity = 1 > %solver%.opt $else $abort 'choose solver that supports sensitivity analysis'; $endIf $call =gams trnsport lo=%GAMS.lo% solver=%solver% optfile=1 $call =grep -q "LOWER.*CURRENT.*UPPER" "trnsport.lst" $if errorlevel 1 $abort 'problem with obj/rhsrng option in lst file'; $ifThenI %solver% == highs $call =grep -q "supply(seattle) *300 *350 *350" "trnsport.lst" $if errorlevel 1 $abort 'problem with equation rhs ranging in lst file'; $call =grep -q "x(seattle,new-york) *0 *0 *50" "trnsport.lst" $if errorlevel 1 $abort 'problem with lower bound ranging in lst file'; $else $call =grep -q "cost.*-INF.*NA.*INF" "trnsport.lst" $if errorlevel 1 $abort 'problem with obj/rhsrng option in lst file'; $call =grep -q "z.*-INF.*NA.*INF" "trnsport.lst" $if errorlevel 1 $abort 'problem with obj/rhsrng option in lst file'; $endIf $ifThenI %solver% == gurobi $echo sensitivity 1 > %solver%.opt $echo rngrestart rng.gms >> %solver%.opt $elseIfI %solver% == gurobiold $echo sensitivity 1 > %solver%.opt $echo rngrestart rng.gms >> %solver%.opt $elseIfI %solver% == cplex $echo rhsrng all > %solver%.opt $echo objrng all >> %solver%.opt $echo bndrng all >> %solver%.opt $echo rngrestart rng.gms >> %solver%.opt $elseIfI %solver% == highs $abort.noError 'rngrestart not implemented for gams/highs' $else $abort 'choose solver that supports sensitivity analysis'; $endIf $call =gams trnsport lo=%GAMS.lo% solver=%solver% optfile=1 $ifThenI %solver% == gurobi $echo sensitivity 1 > %solver%.opt $echo rngrestart rng.gdx >> %solver%.opt $elseIfI %solver% == gurobiold $echo sensitivity 1 > %solver%.opt $echo rngrestart rng.gdx >> %solver%.opt $elseIfI %solver% == cplex $echo rhsrng all > %solver%.opt $echo objrng all >> %solver%.opt $echo bndrng all >> %solver%.opt $echo rngrestart rng.gdx >> %solver%.opt $else $abort 'choose solver that supports sensitivity analysis'; $endIf $call =gams trnsport lo=%GAMS.lo% solver=%solver% optfile=1 Set RNGLIM / LO, CUR, UP /; $include rng.gms abort$(cost_RHSRNG('LO') <> -INF or cost_RHSRNG('UP') <> INF) 'false ranging value (cost_RHSRNG)'; abort$(sum(i, supply_RHSRNG(i,'LO') > supply_RHSRNG(i,'CUR') or supply_RHSRNG(i,'CUR') > supply_RHSRNG(i,'UP'))) 'false ranging value (supply_RHSRNG)'; abort$(sum(j, demand_RHSRNG(j,'LO') > demand_RHSRNG(j,'CUR') or demand_RHSRNG(j,'CUR') > demand_RHSRNG(j,'UP'))) 'false ranging value (demand_RHSRNG)'; abort$(sum((i,j), x_OBJRNG(i,j,'LO') > x_OBJRNG(i,j,'CUR') or x_OBJRNG(i,j,'CUR') > x_OBJRNG(i,j,'UP'))) 'false ranging value (x_OBJRNG)'; abort$(z_OBJRNG('LO') <> -INF or z_OBJRNG('UP') <> INF) 'false ranging value (z_OBJRNG)'; abort$(sum((i,j), x_LBRNG(i,j,'LO') > x_LBRNG(i,j,'CUR') or x_LBRNG(i,j,'CUR') > x_LBRNG(i,j,'UP'))) 'false ranging value (x_LBRNG)'; abort$(z_LBRNG('LO') <> -INF or z_LBRNG('UP') <> INF) 'false ranging value (z_LBRNG)'; abort$(sum((i,j), x_UBRNG(i,j,'LO') > x_UBRNG(i,j,'CUR') or x_UBRNG(i,j,'CUR') > x_UBRNG(i,j,'UP'))) 'false ranging value (x_UBRNG)'; abort$(z_UBRNG('LO') <> -INF or z_UBRNG('UP') <> INF) 'false ranging value (z_UBRNG)'; Parameter cost_RHSRNG2(RNGLIM), supply_RHSRNG2(i,RNGLIM), demand_RHSRNG2(j,RNGLIM), x_OBJRNG2(i,j,RNGLIM), z_OBJRNG2(RNGLIM), x_LBRNG2(i,j,RNGLIM), z_LBRNG2(RNGLIM), x_UBRNG2(i,j,RNGLIM), z_UBRNG2(RNGLIM); cost_RHSRNG2(RNGLIM) = cost_RHSRNG(RNGLIM); supply_RHSRNG2(i,RNGLIM) = supply_RHSRNG(i,RNGLIM); demand_RHSRNG2(j,RNGLIM) = demand_RHSRNG(j,RNGLIM); x_OBJRNG2(i,j,RNGLIM) = x_OBJRNG(i,j,RNGLIM); z_OBJRNG2(RNGLIM) = z_OBJRNG(RNGLIM); x_LBRNG2(i,j,RNGLIM) = x_LBRNG(i,j,RNGLIM); z_LBRNG2(RNGLIM) = z_LBRNG(RNGLIM); x_UBRNG2(i,j,RNGLIM) = x_UBRNG(i,j,RNGLIM); z_UBRNG2(RNGLIM) = z_UBRNG(RNGLIM); cost_RHSRNG(RNGLIM) = NA; supply_RHSRNG(i,RNGLIM) = NA; demand_RHSRNG(j,RNGLIM) = NA; x_OBJRNG(i,j,RNGLIM) = NA; z_OBJRNG(RNGLIM) = NA; x_LBRNG(i,j,RNGLIM) = NA; z_LBRNG(RNGLIM) = NA; x_UBRNG(i,j,RNGLIM) = NA; z_UBRNG(RNGLIM) = NA; execute_load 'rng.gdx', cost_RHSRNG, supply_RHSRNG, demand_RHSRNG, x_OBJRNG, z_OBJRNG, x_LBRNG, z_LBRNG, x_UBRNG, z_UBRNG; abort$(cost_RHSRNG('LO') <> -INF or cost_RHSRNG('UP') <> INF) 'false ranging value (cost_RHSRNG)'; abort$(sum(i, supply_RHSRNG(i,'LO') > supply_RHSRNG(i,'CUR') or supply_RHSRNG(i,'CUR') > supply_RHSRNG(i,'UP'))) 'false ranging value (supply_RHSRNG)'; abort$(sum(j, demand_RHSRNG(j,'LO') > demand_RHSRNG(j,'CUR') or demand_RHSRNG(j,'CUR') > demand_RHSRNG(j,'UP'))) 'false ranging value (demand_RHSRNG)'; abort$(sum((i,j), x_OBJRNG(i,j,'LO') > x_OBJRNG(i,j,'CUR') or x_OBJRNG(i,j,'CUR') > x_OBJRNG(i,j,'UP'))) 'false ranging value (x_OBJRNG)'; abort$(z_OBJRNG('LO') <> -INF or z_OBJRNG('UP') <> INF) 'false ranging value (z_OBJRNG)'; abort$(sum((i,j), x_LBRNG(i,j,'LO') > x_LBRNG(i,j,'CUR') or x_LBRNG(i,j,'CUR') > x_LBRNG(i,j,'UP'))) 'false ranging value (x_LBRNG)'; abort$(z_LBRNG('LO') <> -INF or z_LBRNG('UP') <> INF) 'false ranging value (z_LBRNG)'; abort$(sum((i,j), x_UBRNG(i,j,'LO') > x_UBRNG(i,j,'CUR') or x_UBRNG(i,j,'CUR') > x_UBRNG(i,j,'UP'))) 'false ranging value (x_UBRNG)'; abort$(z_UBRNG('LO') <> -INF or z_UBRNG('UP') <> INF) 'false ranging value (z_UBRNG)'; abort$(cost_RHSRNG('LO') <> cost_RHSRNG2('LO') or cost_RHSRNG('CUR') <> cost_RHSRNG2('CUR') or cost_RHSRNG('UP') <> cost_RHSRNG2('UP')) 'false ranging value (cost_RHSRNG)'; abort$(sum(i, supply_RHSRNG(i,'LO') <> supply_RHSRNG2(i,'LO') or supply_RHSRNG(i,'CUR') <> supply_RHSRNG2(i,'CUR') or supply_RHSRNG(i,'UP') <> supply_RHSRNG2(i,'UP'))) 'false ranging value (supply_RHSRNG)'; abort$(sum(j, demand_RHSRNG(j,'LO') <> demand_RHSRNG2(j,'LO') or demand_RHSRNG(j,'CUR') <> demand_RHSRNG2(j,'CUR') or demand_RHSRNG(j,'UP') <> demand_RHSRNG2(j,'UP'))) 'false ranging value (demand_RHSRNG)'; abort$(sum((i,j), x_OBJRNG(i,j,'LO') <> x_OBJRNG2(i,j,'LO') or x_OBJRNG(i,j,'CUR') <> x_OBJRNG2(i,j,'CUR') or x_OBJRNG(i,j,'UP') <> x_OBJRNG2(i,j,'UP'))) 'false ranging value (x_OBJRNG)'; abort$(z_OBJRNG('LO') <> z_OBJRNG2('LO') or z_OBJRNG('CUR') <> z_OBJRNG2('CUR') or z_OBJRNG('UP') <> z_OBJRNG2('UP')) 'false ranging value (z_OBJRNG)'; abort$(sum((i,j), x_LBRNG(i,j,'LO') <> x_LBRNG2(i,j,'LO') or x_LBRNG(i,j,'CUR') <> x_LBRNG2(i,j,'CUR') or x_LBRNG(i,j,'UP') <> x_LBRNG2(i,j,'UP'))) 'false ranging value (x_LBRNG)'; abort$(z_LBRNG('LO') <> z_LBRNG2('LO') or z_LBRNG('CUR') <> z_LBRNG2('CUR') or z_LBRNG('UP') <> z_LBRNG2('UP')) 'false ranging value (z_LBRNG)'; abort$(sum((i,j), x_UBRNG(i,j,'LO') <> x_UBRNG2(i,j,'LO') or x_UBRNG(i,j,'CUR') <> x_UBRNG2(i,j,'CUR') or x_UBRNG(i,j,'UP') <> x_UBRNG2(i,j,'UP'))) 'false ranging value (x_UBRNG)'; abort$(z_UBRNG('LO') <> z_UBRNG2('LO') or z_UBRNG('CUR') <> z_UBRNG2('CUR') or z_UBRNG('UP') <> z_UBRNG2('UP')) 'false ranging value (z_UBRNG)';