21 public static void main(String[] args) {
27 File workingDirectory =
new File(System.getProperty(
"user.dir"),
"TransportEngine");
28 workingDirectory.mkdir();
33 String engine_url = System.getenv(
"ENGINE_URL");
34 if (engine_url ==
null) {
35 System.out.println(
"Error: environment variable ENGINE_URL not set");
38 String engine_user = System.getenv(
"ENGINE_USER");
39 if (engine_user ==
null) {
40 System.out.println(
"Error: environment variable ENGINE_USER not set");
43 String engine_password = System.getenv(
"ENGINE_PASSWORD");
44 if (engine_password ==
null) {
45 System.out.println(
"Error: environment variable ENGINE_PASSWORD not set");
48 String engine_namespace = System.getenv(
"ENGINE_NAMESPACE");
49 if (engine_namespace ==
null) {
50 System.out.println(
"Error: environment variable ENGINE_NAMESPACE not set");
63 runEngineJob(ws, engine_configuration);
66 runAndInterruptEngineJob(ws, engine_configuration);
77 System.out.println(
"Running data from string");
79 .setRunEngineConfiguration(engine_configuration)
80 .setOutput( System.out )
84 System.out.println(
"Error: " + e.
getMessage());
88 tEDataDB.
export(
"tdata.gdx");
90 Map<String, Double> expectedLevels =
new HashMap<String, Double>();
92 expectedLevels.put(
"seattle.new-york", Double.valueOf(0.0));
93 expectedLevels.put(
"seattle.chicago", Double.valueOf(300.0));
94 expectedLevels.put(
"seattle.topeka", Double.valueOf(0.0));
95 expectedLevels.put(
"san-diego.new-york", Double.valueOf(325.0));
96 expectedLevels.put(
"san-diego.chicago", Double.valueOf(0.0));
97 expectedLevels.put(
"san-diego.topeka", Double.valueOf(275.0));
103 opt.
defines(
"gdxincname",
"tdata");
106 System.out.println(
"Running using an instance of GAMSOptions that defines the data include file.");
108 .setRunEngineConfiguration( engine_configuration )
109 .setGAMSOptions( opt )
112 { put(
"inex_string",
"{\"type\": \"include\", \"files\": [\"*.gdx\"]}" ); }
117 System.out.println(
"Ran model using an instance of GAMSOptions that defines the data include file:");
119 System.out.print(
"x(" + rec.getKey(0) +
", " + rec.getKey(1) +
"):");
120 System.out.print(
", level = " + rec.getLevel());
121 System.out.println(
", marginal = " + rec.getMarginal());
122 double diff = expectedLevels.get(rec.getKey(0)+
"."+rec.getKey(1)).doubleValue() - rec.getLevel();
123 if (Math.abs(diff) > 0.01) {
124 System.out.println(
"Unexpected result, expected level: "+expectedLevels.get(rec.getKey(0)+
"."+rec.getKey(1)));
129 System.out.println(
"Error: " + e.
getMessage());
136 System.out.println(
"Running data from a string.");
138 .setRunEngineConfiguration(engine_configuration)
139 .setOutput( System.out )
143 System.out.println(
"Error: " + e.
getMessage());
155 System.out.println(
"Running model from a string with checkpoint implicit database communication.");
157 .setRunEngineConfiguration( engine_configuration )
158 .setGAMSOptions( option )
159 .setGAMSCheckpoint( cp )
160 .setDatabases(
new ArrayList<GAMSDatabase>(Arrays.asList(tEa.
OutDB())) )
161 .setOutput( System.out )
164 System.out.println(
"Ran model from a string with checkpoint implicit database communication:");
166 System.out.print(
"x(" + rec.getKey(0) +
", " + rec.getKey(1) +
"):");
167 System.out.print(
", level = " + rec.getLevel());
168 System.out.println(
", marginal = " + rec.getMarginal());
169 double diff = expectedLevels.get(rec.getKey(0)+
"."+rec.getKey(1)).doubleValue() - rec.getLevel();
170 if (Math.abs(diff) > 0.01) {
171 System.out.println(
"Unexpected result, expected level: "+expectedLevels.get(rec.getKey(0)+
"."+rec.getKey(1)));
176 System.out.println(
"Error: " + e.
getMessage());
180 List<HashMap<String, Double>> bmultExpected =
new ArrayList<HashMap<String, Double>>();
181 bmultExpected.add(
new HashMap<String, Double>() {
182 { put(
"bmult", Double.valueOf(0.9) );
183 put(
"ms", Double.valueOf(1) );
184 put(
"ss", Double.valueOf(1) );
185 put(
"obj", Double.valueOf(138.31) );
188 bmultExpected.add(
new HashMap<String, Double>() {
189 { put(
"bmult", Double.valueOf(1.2) );
190 put(
"ms", Double.valueOf(4) );
191 put(
"ss", Double.valueOf(1) );
192 put(
"obj", Double.valueOf(184.41) );
196 for (HashMap<String, Double> m : bmultExpected) {
197 String bmultmodel =
"bmult="+m.get(
"bmult")+
"; solve transport min z use lp; ms=transport.modelstat; ss=transport.solvestat;";
200 System.out.println(
"Running model from a string with bmult="+m.get(
"bmult"));
202 .setRunEngineConfiguration(engine_configuration)
203 .setOutput( System.out )
207 System.out.println(
"Ran model from a string with bumult=" + m.get(
"bmult").doubleValue() +
":");
208 System.out.println(
" Modelstatus: " + tEbmult.
OutDB().
getParameter(
"ms").getFirstRecord().getValue());
209 System.out.println(
" Solvestatus: " + tEbmult.
OutDB().
getParameter(
"ss").getFirstRecord().getValue());
210 System.out.println(
" Obj: " + tEbmult.
OutDB().
getVariable(
"z").getFirstRecord().getLevel());
211 double diff = tEbmult.
OutDB().
getParameter(
"bmult").getFirstRecord().getValue() - m.get(
"bmult").doubleValue();
212 if (Math.abs(diff) > 0.01) {
213 System.out.println(
"Unexpected result, expected bmult: "+m.get(
"bmult").doubleValue());
216 diff = tEbmult.
OutDB().
getParameter(
"ms").getFirstRecord().getValue() - m.get(
"ms").doubleValue();
217 if (Math.abs(diff) > 0.01) {
218 System.out.println(
"Unexpected result, expected ms: "+m.get(
"ms").doubleValue());
221 diff = tEbmult.
OutDB().
getParameter(
"ss").getFirstRecord().getValue() - m.get(
"ss").doubleValue();
222 if (Math.abs(diff) > 0.01) {
223 System.out.println(
"Unexpected result, expected ss: "+m.get(
"ss").doubleValue());
226 diff = tEbmult.
OutDB().
getVariable(
"z").getFirstRecord().getLevel() - m.get(
"obj").doubleValue();
227 if (Math.abs(diff) > 0.01) {
228 System.out.println(
"Unexpected result, expected obj: "+m.get(
"obj").doubleValue());
233 System.out.println(
"Error: " + e.
getMessage());
256 boolean fileCreated = logFile.createNewFile();
259 FileWriter fw =
new FileWriter(optionFile_1);
260 fw.write(
"epgap 0\n");
261 fw.write(
"interactive 1\n");
262 fw.write(
"iafile cplex.op2\n");
266 fw =
new FileWriter(optionFile_2);
267 fw.write(
"epgap 0.1\n");
270 HashSet<String> extraModelFiles =
new HashSet<String>(
271 Arrays.asList(optionFile_1.getAbsolutePath(), optionFile_2.getAbsolutePath(),
"claddat.gdx")
273 final Worker w =
new Worker(job, engine_configuration, opt, extraModelFiles,
new PrintStream(logFile));
277 if (logFile.exists() && logFile.length()==0) {
279 Thread.currentThread();
281 }
catch ( Exception e ) {
288 boolean interrupted =
false;
289 boolean terminated = (w.getState()==Thread.State.TERMINATED);
291 System.out.println(
"Sending interrupt GAMS job...");
294 System.out.println(
"Interrupted Cplex to continue with new option.");
301 }
catch (InterruptedException e) { e.printStackTrace(); }
304 boolean interrupted =
false;
306 Scanner scan =
new Scanner(logFile);
307 String searchstr =
"interrupted...";
308 while (scan.hasNext()) {
309 String line = scan.nextLine().toLowerCase().toString();
310 if (line.contains(searchstr)) {
311 System.out.println(line);
318 System.out.println(
"Expected the solver to be interrupted at least once.");
321 System.out.println(
"Interrupted successfully");
323 }
catch (FileNotFoundException e) {
325 }
catch (IOException e) {
332 static class Worker
extends Thread {
337 HashSet<String> extraModelFiles;
351 extraModelFiles = modelFiles;
358 System.out.println(
"Running GAMS Engine job...");
360 .setRunEngineConfiguration(configuration)
361 .setGAMSOptions(option)
366 }
catch(Exception e) {
376 " i canning plants / seattle, san-diego / \n" +
377 " j markets / new-york, chicago, topeka / ; \n" +
380 " a(i) capacity of plant i in cases \n" +
381 " / seattle 350 \n" +
382 " san-diego 600 / \n" +
384 " b(j) demand at market j in cases \n" +
385 " / new-york 325 \n" +
387 " topeka 275 / ; \n" +
389 "Table d(i,j) distance in thousands of miles \n" +
390 " new-york chicago topeka \n" +
391 " seattle 2.5 1.7 1.8 \n" +
392 " san-diego 2.5 1.8 1.4 ; \n" +
394 "Scalar f 'freight in dollars per case per thousand miles' / 90 / \n" +
395 " bmult 'demand multiplier' / 1 /;\n" +
399 static String model =
401 " i 'canning plants' \n"+
405 " a(i) 'capacity of plant i in cases' \n"+
406 " b(j) 'demand at market j in cases' \n"+
407 " d(i,j) 'distance in thousands of miles'; \n"+
409 "Scalar f 'freight in dollars per case per thousand miles'; \n"+
410 "Scalar bmult 'demand multiplier'; \n"+
412 "$if not set gdxincname $abort 'no include file name for data file provided'\n"+
413 "$gdxin %gdxincname% \n"+
414 "$load i j a b d f bmult \n"+
417 "$echo test > test.txt \n"+
419 "Parameter c(i,j) 'transport cost in thousands of dollars per case'; \n"+
420 " c(i,j) = f * d(i,j) / 1000 ; \n"+
423 " x(i,j) shipment quantities in cases \n"+
424 " z total transportation costs in thousands of dollars ; \n"+
426 "Positive Variable x; \n"+
429 " cost 'define objective function' \n"+
430 " supply(i) 'observe supply limit at plant i' \n"+
431 " demand(j) 'satisfy demand at market j'; \n"+
433 "cost .. z =e= sum((i,j), c(i,j)*x(i,j)) ; \n"+
435 "supply(i) .. sum(j, x(i,j)) =l= a(i) ; \n"+
437 "demand(j) .. sum(i, x(i,j)) =g= bmult*b(j) ; \n"+
439 "Model transport /all/ ; \n"+
441 "solve transport using lp minimizing z; \n"+
444 " ms 'model status' \n"+
445 " ss 'solve status'; \n"+
447 "Display x.l, x.m ; \n";