$title 'Test solution quality with solvelink=%solveLink.asyncGrid%/%solveLink.aSyncThreads%' (LP12,SEQ=252) $onText This test is a modified version of lp01. In this model, we use m.solvelink = %solveLink.asyncGrid% so we can test the solution returned in this case. N.B.: An alternate way to test this is to use m.solvelink = %solveLink.asyncSimulate% which uses handles and their associated calls (e.g. handlestatus, execute_loadhandle) internally without requiring any changes to the model. There should be at least one explicit test of m.solvelink = %solveLink.asyncGrid% though. Tests include: a) correct model attributes b) correct levels and marginals on rows and cols Update for GAMS 24.6: Do not test %solveLink.asyncGrid% only but also %solveLink.aSyncThreads%. Contributor: Steve Dirkse $offText $if not set MTYPE $set MTYPE lp $if not set solvedasmcp $set solvedasmcp 0 $if not set SKIPUNBND $set SKIPUNBND 0 scalar skipUnBnd / %SKIPUNBND% /; variable obj; equations defobje defobjl defobjg; defobje.. obj =e= 1; defobjl.. obj =l= 1; defobjg.. obj =g= 1; model lp01e /defobje/ lp01l /defobjl/ lp01g /defobjg/; option limcol=0,limrow=0,bratio=1; scalar tol / 1e-6 /; set sl SolveLink settings to be tested / %solveLink.asyncGrid% %solveLink.aSyncThreads% /; loop(sl, lp01e.solvelink = sl.val; lp01l.solvelink = sl.val; lp01g.solvelink = sl.val; solve lp01e max obj us %MTYPE%; abort$readyCollect(lp01e.handle,100) 'lp01e not ready'; abort$(not handleCollect(lp01e.handle)) 'Trouble collecting lp01e'; display$handleDelete(lp01e.handle) 'Trouble deleting handle for lp01e'; abort$(lp01e.solvestat <> %solveStat.normalCompletion% or lp01e.modelstat <> %modelStat.optimal%) 'wrong status codes',lp01e.solvestat,lp01e.modelstat; abort$(lp01e.numnopt <> 0) ' NONOPT flags set'; abort$(lp01e.numinfes <> 0) 'INFEASIBLE flags set'; abort$(abs(lp01e.objval - 1) > tol) 'bad m.objval'; abort$(abs(defobje.l - 1) > tol) 'bad equation level'; abort$(abs(defobje.m - 1) > tol) 'bad equation marginal'; abort$(abs(obj.l - 1) > tol) 'bad variable level'; abort$(abs(obj.m - 0) > tol) 'bad variable marginal'; solve lp01l max obj us %MTYPE%; abort$readyCollect(lp01l.handle,100) 'lp01l not ready'; abort$(not handleCollect(lp01l.handle)) 'Trouble collecting lp01l'; display$handleDelete(lp01l.handle) 'Trouble deleting handle for lp01l'; abort$(lp01l.solvestat <> %solveStat.normalCompletion% or lp01l.modelstat <> %modelStat.optimal%) 'wrong status codes'; abort$(lp01l.numnopt <> 0) ' NONOPT flags set'; abort$(lp01l.numinfes <> 0) 'INFEASIBLE flags set'; abort$(abs(lp01l.objval - 1) > tol) 'bad m.objval'; abort$(abs(defobjl.l - 1) > tol) 'bad equation level'; abort$(abs(defobjl.m - 1) > tol) 'bad equation marginal'; abort$(abs(obj.l - 1) > tol) 'bad variable level'; abort$(abs(obj.m - 0) > tol) 'bad variable marginal'; if {not skipUnBnd, solve lp01g max obj us %MTYPE%; abort$readyCollect(lp01g.handle,100) 'lp01g not ready'; abort$(not handleCollect(lp01g.handle)) 'Trouble collecting lp01g'; display$handleDelete(lp01g.handle) 'Trouble deleting handle for lp01g'; abort$(lp01g.solvestat <> %solveStat.normalCompletion% or ( (lp01g.modelstat <> %modelStat.unbounded%) and (lp01g.modelstat <> %modelStat.unboundedNoSolution%) and ((lp01g.modelstat <> %modelStat.infeasible%) or (%solvedasmcp% = 0)))) 'wrong status codes'; } solve lp01e min obj us %MTYPE%; abort$readyCollect(lp01e.handle,100) 'lp01e not ready'; abort$(not handleCollect(lp01e.handle)) 'Trouble collecting lp01e'; display$handleDelete(lp01e.handle) 'Trouble deleting handle for lp01e'; abort$(lp01e.solvestat <> %solveStat.normalCompletion% or lp01e.modelstat <> %modelStat.optimal%) 'wrong status codes'; abort$(lp01e.numnopt <> 0) ' NONOPT flags set'; abort$(lp01e.numinfes <> 0) 'INFEASIBLE flags set'; abort$(abs(lp01e.objval - 1) > tol) 'bad m.objval'; abort$(abs(defobje.l - 1) > tol) 'bad equation level'; abort$(abs(defobje.m - 1) > tol) 'bad equation marginal'; abort$(abs(obj.l - 1) > tol) 'bad variable level'; abort$(abs(obj.m - 0) > tol) 'bad variable marginal'; if {not skipUnBnd, solve lp01l min obj us %MTYPE%; abort$readyCollect(lp01l.handle,100) 'lp01l not ready'; abort$(not handleCollect(lp01l.handle)) 'Trouble collecting lp01l'; display$handleDelete(lp01l.handle) 'Trouble deleting handle for lp01l'; abort$(lp01l.solvestat <> %solveStat.normalCompletion% or ( (lp01l.modelstat <> %modelStat.unbounded%) and (lp01l.modelstat <> %modelStat.unboundedNoSolution%) and ((lp01l.modelstat <> %modelStat.infeasible%) or (%solvedasmcp% = 0)))) 'wrong status codes'; } solve lp01g min obj us %MTYPE%; abort$readyCollect(lp01g.handle,100) 'lp01g not ready'; abort$(not handleCollect(lp01g.handle)) 'Trouble collecting lp01g'; display$handleDelete(lp01g.handle) 'Trouble deleting handle for lp01g'; abort$(lp01g.solvestat <> %solveStat.normalCompletion% or lp01g.modelstat <> %modelStat.optimal%) 'wrong status codes'; abort$(lp01g.numnopt <> 0) ' NONOPT flags set'; abort$(lp01g.numinfes <> 0) 'INFEASIBLE flags set'; abort$(abs(lp01g.objval - 1) > tol) 'bad m.objval'; abort$(abs(defobjg.l - 1) > tol) 'bad equation level'; abort$(abs(defobjg.m - 1) > tol) 'bad equation marginal'; abort$(abs(obj.l - 1) > tol) 'bad variable level'; abort$(abs(obj.m - 0) > tol) 'bad variable marginal'; ); obj.lo = -1000; obj.up = 1000; loop(sl, lp01e.solvelink = sl.val; lp01l.solvelink = sl.val; lp01g.solvelink = sl.val; solve lp01e max obj us %MTYPE%; abort$readyCollect(lp01e.handle,100) 'lp01e not ready'; abort$(not handleCollect(lp01e.handle)) 'Trouble collecting lp01e'; display$handleDelete(lp01e.handle) 'Trouble deleting handle for lp01e'; abort$(lp01e.solvestat <> %solveStat.normalCompletion% or lp01e.modelstat <> %modelStat.optimal%) 'wrong status codes'; abort$(lp01e.numnopt <> 0) ' NONOPT flags set'; abort$(lp01e.numinfes <> 0) 'INFEASIBLE flags set'; abort$(abs(lp01e.objval - 1) > tol) 'bad m.objval'; abort$(abs(defobje.l - 1) > tol) 'bad equation level'; abort$(abs(defobje.m - 1) > tol) 'bad equation marginal'; abort$(abs(obj.l - 1) > tol) 'bad variable level'; abort$(abs(obj.m - 0) > tol) 'bad variable marginal'; solve lp01l max obj us %MTYPE%; abort$readyCollect(lp01l.handle,100) 'lp01l not ready'; abort$(not handleCollect(lp01l.handle)) 'Trouble collecting lp01l'; display$handleDelete(lp01l.handle) 'Trouble deleting handle for lp01l'; abort$(lp01l.solvestat <> %solveStat.normalCompletion% or lp01l.modelstat <> %modelStat.optimal%) 'wrong status codes'; abort$(lp01l.numnopt <> 0) ' NONOPT flags set'; abort$(lp01l.numinfes <> 0) 'INFEASIBLE flags set'; abort$(abs(lp01l.objval - 1) > tol) 'bad m.objval'; abort$(abs(defobjl.l - 1) > tol) 'bad equation level'; abort$(abs(defobjl.m - 1) > tol) 'bad equation marginal'; abort$(abs(obj.l - 1) > tol) 'bad variable level'; abort$(abs(obj.m - 0) > tol) 'bad variable marginal'; solve lp01g max obj us %MTYPE%; abort$readyCollect(lp01g.handle,100) 'lp01g not ready'; abort$(not handleCollect(lp01g.handle)) 'Trouble collecting lp01g'; display$handleDelete(lp01g.handle) 'Trouble deleting handle for lp01g'; abort$(lp01g.solvestat <> %solveStat.normalCompletion% or lp01g.modelstat <> %modelStat.optimal%) 'wrong status codes'; abort$(lp01g.numnopt <> 0) ' NONOPT flags set'; abort$(lp01g.numinfes <> 0) 'INFEASIBLE flags set'; abort$(abs(lp01g.objval - 1000) > tol) 'bad m.objval'; abort$(abs(defobjg.l - 1000) > tol) 'bad equation level'; abort$(abs(defobjg.m - 0) > tol) 'bad equation marginal'; abort$(abs(obj.l - 1000) > tol) 'bad variable level'; abort$(abs(obj.m - 1) > tol) 'bad variable marginal'; solve lp01e min obj us %MTYPE%; abort$readyCollect(lp01e.handle,100) 'lp01e not ready'; abort$(not handleCollect(lp01e.handle)) 'Trouble collecting lp01e'; display$handleDelete(lp01e.handle) 'Trouble deleting handle for lp01e'; abort$(lp01e.solvestat <> %solveStat.normalCompletion% or lp01e.modelstat <> %modelStat.optimal%) 'wrong status codes'; abort$(lp01e.numnopt <> 0) ' NONOPT flags set'; abort$(lp01e.numinfes <> 0) 'INFEASIBLE flags set'; abort$(abs(lp01e.objval - 1) > tol) 'bad m.objval'; abort$(abs(defobje.l - 1) > tol) 'bad equation level'; abort$(abs(defobje.m - 1) > tol) 'bad equation marginal'; abort$(abs(obj.l - 1) > tol) 'bad variable level'; abort$(abs(obj.m - 0) > tol) 'bad variable marginal'; solve lp01l min obj us %MTYPE%; abort$readyCollect(lp01l.handle,100) 'lp01l not ready'; abort$(not handleCollect(lp01l.handle)) 'Trouble collecting lp01l'; display$handleDelete(lp01l.handle) 'Trouble deleting handle for lp01l'; abort$(lp01l.solvestat <> %solveStat.normalCompletion% or lp01l.modelstat <> %modelStat.optimal%) 'wrong status codes'; abort$(lp01l.numnopt <> 0) ' NONOPT flags set'; abort$(lp01l.numinfes <> 0) 'INFEASIBLE flags set'; abort$(abs(lp01l.objval + 1000) > tol) 'bad m.objval'; abort$(abs(defobjl.l + 1000) > tol) 'bad equation level'; abort$(abs(defobjl.m - 0) > tol) 'bad equation marginal'; abort$(abs(obj.l + 1000) > tol) 'bad variable level'; abort$(abs(obj.m - 1) > tol) 'bad variable marginal'; solve lp01g min obj us %MTYPE%; abort$readyCollect(lp01g.handle,100) 'lp01g not ready'; abort$(not handleCollect(lp01g.handle)) 'Trouble collecting lp01g'; display$handleDelete(lp01g.handle) 'Trouble deleting handle for lp01g'; abort$(lp01g.solvestat <> %solveStat.normalCompletion% or lp01g.modelstat <> %modelStat.optimal%) 'wrong status codes'; abort$(lp01g.numnopt <> 0) ' NONOPT flags set'; abort$(lp01g.numinfes <> 0) 'INFEASIBLE flags set'; abort$(abs(lp01g.objval - 1) > tol) 'bad m.objval'; abort$(abs(defobjg.l - 1) > tol) 'bad equation level'; abort$(abs(defobjg.m - 1) > tol) 'bad equation marginal'; abort$(abs(obj.l - 1) > tol) 'bad variable level'; abort$(abs(obj.m - 0) > tol) 'bad variable marginal'; );