$title Execute asynchronously several GAMS Jobs and collect the fastest (ASYNCJOBS,SEQ=403) $onText This program shows how to run several GAMS jobs asynchronously. Moreover, when a job finishes successfully, the other jobs are killed, if they are still running. For the demonstration we retrieve model library example DICE and run it with GUROBI using four different setting for the meta option mipfocus. Contributor: Toni Lastusilta, 2014 Keywords: GAMS language features $offText $call gamslib -q dice $ifE errorLevel<>0 $abort 'problems retrieving dice' $echo "abort$(xdice.modelStat <> 1 or xdice.solveStat <> 1) 'model not solved to optimality';" >> dice.gms $echo mipFocus 0 > gurobi.opt $echo mipFocus 1 > gurobi.op2 $echo mipFocus 2 > gurobi.op3 $echo mipFocus 3 > gurobi.op4 * Initialization Set s 'scenario: option file number' / 1*4 / modelhdr / system.GUSSModelAttributes /; Singleton Set finished(s) 'fastest successfully finished job'; Parameter jh(s) 'PID number from JobHandle'; * Run several GAMS jobs asynchronously loop(s, put_utility 'exec.async' / 'gams dice lo=2 mip=gurobi optcr=0 optfile=' s.tl:0 ' lf=' s.tl:0 '.log o=' s.tl:0 '.lst gdx=' s.tl:0; jh(s) = JobHandle; ); * Check job status until one job is successfully finished or no job is left or some total time limit (20secs) is exceeded option strictSingleton = 0; finished(s) = no; Scalar lastTimeDisplay / 0 /; while(card(finished) = 0 and card(jh) > 0 and timeElapsed < 20, loop(s$jh(s), if(JobStatus(jh(s)) = 2, finished(s) = errorLevel = 0; jh(s) = 0; ); ); if(timeElapsed - lastTimeDisplay > 0.2$sleep(0.01), put_utility 'log' / 'Elasped ' timeElapsed:4:2 ' secs. Jobs running: ' card(jh):0:0; lastTimeDisplay = timeElapsed; ); ); * Kill remaining job display 'remaining jobs to be killed', jh; loop(s$jh(s), display$JobKill(jh(s)) 'Killing job';); abort$(card(finished) = 0) 'No job returned successfully'; display 'winning job is', finished; * if you want to extract some result from the winning job use the GDX file put_utility 'gdxin' / finished.tl:0 '.gdx'; Variable objval / l 0 /; execute_load objval = wnx; display objval.l;