Set i /1*4/; SOS1 Variable x1(i); SOS2 Variable x2(i); Variable z; Equation e1,e2; e1.. z =e= sum(i, ord(i)*x1(i)); e2.. z =e= sum(i, ord(i)*x2(i)); Model m1 /e1/, m2 /e2/; option optCR=0; x1.up(i) = 2; solve m1 max z us %MTYPE%; if {(m1.solvestat = %solveStat.capabilityProblems%), abort$(m1.modelstat <> %modelStat.noSolutionReturned%) 'bad modelstat'; abort.NoError 'Cannot handle SOS variables'; } abort$(abs(z.l-8)>1e-6) 'wrong objective value'; x1.lo('3') = 1; solve m1 max z us %MTYPE%; abort$(abs(z.l-6)>1e-6) 'wrong objective value'; x1.lo('1') = 1; solve m1 max z us %MTYPE%; abort$(m1.modelstat<>%modelStat.integerInfeasible% and m1.modelstat<>%modelStat.infeasibleNoSolution% and m1.modelstat<>%modelStat.infeasible%) 'wrong model status'; option clear=x1; x1.lo(i) = -inf; x1.up(i) = 0; solve m1 max z us %MTYPE%; abort$(abs(z.l)>1e-6) 'wrong objective value'; x1.up('3') = -1; solve m1 max z us %MTYPE%; abort$(abs(z.l+3)>1e-6) 'wrong objective value'; x1.up('1') = -1; solve m1 max z us %MTYPE%; abort$(m1.modelstat<>%modelStat.integerInfeasible% and m1.modelstat<>%modelStat.infeasibleNoSolution% and m1.modelstat<>%modelStat.infeasible%) 'wrong model status'; x2.up(i) = 2; solve m2 max z us %MTYPE%; abort$(abs(z.l-14)>1e-6) 'wrong objective value'; x2.lo('2') = 1; solve m2 max z us %MTYPE%; abort$(abs(z.l-10)>1e-6) 'wrong objective value'; x2.lo('4') = 1; solve m2 max z us %MTYPE%; abort$(m2.modelstat<>%modelStat.integerInfeasible% and m2.modelstat<>%modelStat.infeasibleNoSolution% and m2.modelstat<>%modelStat.infeasible%) 'wrong model status'; option clear=x2; x2.lo(i) = -inf; x2.up(i) = 0; solve m2 max z us %MTYPE%; abort$(abs(z.l)>1e-6) 'wrong objective value'; x2.up('3') = -1; solve m2 max z us %MTYPE%; abort$(abs(z.l+3)>1e-6) 'wrong objective value'; x2.up('1') = -1; solve m2 max z us %MTYPE%; abort$(m2.modelstat<>%modelStat.integerInfeasible% and m2.modelstat<>%modelStat.infeasibleNoSolution% and m2.modelstat<>%modelStat.infeasible%) 'wrong model status';