001 /*
002 * $Id: RunGB.java 3655 2011-06-02 18:20:54Z kredel $
003 */
004
005 package edu.jas.application;
006
007
008 import java.io.FileNotFoundException;
009 import java.io.FileReader;
010 import java.io.StringReader;
011 import java.io.IOException;
012 import java.io.Reader;
013 import java.util.List;
014
015 import org.apache.log4j.BasicConfigurator;
016
017 import edu.jas.kern.ComputerThreads;
018 import edu.jas.poly.GenPolynomialRing;
019 import edu.jas.poly.GenPolynomialTokenizer;
020 import edu.jas.poly.PolynomialList;
021 import edu.jas.util.ExecutableServer;
022 import edu.jas.gb.GBDist;
023 import edu.jas.gb.GBDistHybrid;
024 import edu.jas.gb.GroebnerBaseAbstract;
025 import edu.jas.gb.GroebnerBaseParallel;
026 import edu.jas.gb.GroebnerBaseSeq;
027 import edu.jas.gb.OrderedSyzPairlist;
028 import edu.jas.gb.ReductionPar;
029 import edu.jas.gb.ReductionSeq;
030 import edu.jas.gbufd.GBFactory;
031 import edu.jas.util.CatReader;
032
033
034 /**
035 * Simple setup to run a GB example. <br />
036 * Usage: RunGB [seq(+)|par(+)|dist(1)(+)|disthyb|cli] <file>
037 * #procs/#threadsPerNode [machinefile]
038 * @author Heinz Kredel
039 */
040
041 public class RunGB {
042
043
044 /**
045 * Check result GB if it is a GB.
046 */
047 static boolean doCheck = true; //false;
048
049
050 /**
051 * main method to be called from commandline <br />
052 * Usage: RunGB [seq|par(+)|dist(1)(+)|disthyb|cli] <file>
053 * #procs/#threadsPerNode [machinefile]
054 */
055
056 public static void main(java.lang.String[] args) {
057
058 BasicConfigurator.configure();
059
060 String usage = "Usage: RunGB "
061 + "[ seq | seq+ | par | par+ | dist | dist1 | dist+ | dist1+ | disthyb1 | cli [port] ] "
062 + "<file> " + "#procs/#threadsPerNode " + "[machinefile] <check>";
063 if (args.length < 1) {
064 System.out.println(usage);
065 return;
066 }
067
068 boolean pairseq = false;
069 String kind = args[0];
070 String[] allkinds = new String[] { "seq", "seq+", "par", "par+", "dist", "dist1", "dist+", "dist1+",
071 "disthyb1", "cli" };
072 boolean sup = false;
073 for (int i = 0; i < allkinds.length; i++) {
074 if (kind.equals(allkinds[i])) {
075 sup = true;
076 if (kind.indexOf("+") >= 0) {
077 pairseq = true;
078 }
079 }
080 }
081 if (!sup) {
082 System.out.println(usage);
083 return;
084 }
085
086 boolean once = false;
087 final int GB_SERVER_PORT = 7114;
088 //inal int EX_CLIENT_PORT = GB_SERVER_PORT + 1000;
089 int port = GB_SERVER_PORT;
090
091 if (kind.equals("cli")) {
092 if (args.length >= 2) {
093 try {
094 port = Integer.parseInt(args[1]);
095 } catch (NumberFormatException e) {
096 e.printStackTrace();
097 System.out.println(usage);
098 return;
099 }
100 }
101 runClient(port);
102 return;
103 }
104
105 String filename = null;
106 if (!kind.equals("cli")) {
107 if (args.length < 2) {
108 System.out.println(usage);
109 return;
110 }
111 filename = args[1];
112 }
113
114 for ( int i = 0; i < args.length; i++ ) {
115 if ( args[i].equals("check") ) {
116 doCheck = true;
117 }
118 }
119
120 int threads = 0;
121 int threadsPerNode = 1;
122 if (kind.startsWith("par") || kind.startsWith("dist")) {
123 if (args.length < 3) {
124 System.out.println(usage);
125 return;
126 }
127 String tup = args[2];
128 String t = tup;
129 int i = tup.indexOf("/");
130 if (i >= 0) {
131 t = tup.substring(0, i).trim();
132 tup = tup.substring(i + 1).trim();
133 try {
134 threadsPerNode = Integer.parseInt(tup);
135 } catch (NumberFormatException e) {
136 e.printStackTrace();
137 System.out.println(usage);
138 return;
139 }
140 }
141 try {
142 threads = Integer.parseInt(t);
143 } catch (NumberFormatException e) {
144 e.printStackTrace();
145 System.out.println(usage);
146 return;
147 }
148 }
149
150 String mfile = null;
151 if (kind.startsWith("dist")) {
152 if (args.length >= 4) {
153 mfile = args[3];
154 } else {
155 mfile = "machines";
156 }
157 }
158
159 Reader problem = null;
160 try {
161 problem = new FileReader(filename);
162 } catch (FileNotFoundException e) {
163 e.printStackTrace();
164 System.out.println(usage);
165 return;
166 }
167
168 RingFactoryTokenizer rftok = new RingFactoryTokenizer(problem);
169 GenPolynomialRing pfac = null;
170 try {
171 pfac = rftok.nextPolynomialRing();
172 rftok = null;
173 } catch (IOException e) {
174 e.printStackTrace();
175 return;
176 }
177 Reader polyreader = new CatReader(new StringReader("("),problem); // ( has gone
178 GenPolynomialTokenizer tok = new GenPolynomialTokenizer(pfac,polyreader);
179 PolynomialList S = null;
180 try {
181 S = new PolynomialList(pfac,tok.nextPolynomialList());
182 } catch (IOException e) {
183 e.printStackTrace();
184 return;
185 }
186 System.out.println("S =\n" + S);
187
188 if (kind.startsWith("seq")) {
189 runSequential(S, pairseq);
190 }
191 if (kind.startsWith("par")) {
192 runParallel(S, threads, pairseq);
193 }
194 if (kind.startsWith("dist1")) {
195 runMasterOnce(S, threads, mfile, port, pairseq);
196 } else if (kind.startsWith("disthyb1")) {
197 runMasterOnceHyb(S, threads, threadsPerNode, mfile, port, pairseq);
198 } else if (kind.startsWith("dist")) {
199 runMaster(S, threads, mfile, port, pairseq);
200 }
201 ComputerThreads.terminate();
202 //System.exit(0);
203 }
204
205
206 @SuppressWarnings("unchecked")
207 static void runMaster(PolynomialList S, int threads, String mfile, int port, boolean pairseq) {
208 List L = S.list;
209 List G = null;
210 long t, t1;
211
212 t = System.currentTimeMillis();
213 System.out.println("\nGroebner base distributed (" + threads + ", " + mfile + ", " + port + ") ...");
214 GBDist gbd = null;
215 GBDist gbds = null;
216 if (pairseq) {
217 //gbds = new GBDistSP(threads,mfile, port);
218 gbds = new GBDist(threads, new OrderedSyzPairlist(), mfile, port);
219 } else {
220 gbd = new GBDist(threads, mfile, port);
221 }
222 t1 = System.currentTimeMillis();
223 if (pairseq) {
224 G = gbds.execute(L);
225 } else {
226 G = gbd.execute(L);
227 }
228 t1 = System.currentTimeMillis() - t1;
229 if (pairseq) {
230 gbds.terminate(false);
231 } else {
232 gbd.terminate(false);
233 }
234 S = new PolynomialList(S.ring, G);
235 System.out.println("G =\n" + S);
236 System.out.println("G.size() = " + G.size());
237 t = System.currentTimeMillis() - t;
238 if (pairseq) {
239 System.out.print("d+ ");
240 } else {
241 System.out.print("d ");
242 }
243 System.out.println("= " + threads + ", time = " + t + " milliseconds, " + (t - t1) + " start-up");
244 checkGB(S);
245 System.out.println("");
246 }
247
248
249 @SuppressWarnings("unchecked")
250 static void runMasterOnce(PolynomialList S, int threads, String mfile, int port, boolean pairseq) {
251 List L = S.list;
252 List G = null;
253 long t, t1;
254
255 t = System.currentTimeMillis();
256 System.out.println("\nGroebner base distributed[once] (" + threads + ", " + mfile + ", " + port + ") ...");
257 GBDist gbd = null;
258 GBDist gbds = null;
259 if (pairseq) {
260 //gbds = new GBDistSP(threads, mfile, port);
261 gbds = new GBDist(threads, new OrderedSyzPairlist(), mfile, port);
262 } else {
263 gbd = new GBDist(threads, mfile, port);
264 }
265 t1 = System.currentTimeMillis();
266 if (pairseq) {
267 G = gbds.execute(L);
268 } else {
269 G = gbd.execute(L);
270 }
271 t1 = System.currentTimeMillis() - t1;
272 if (pairseq) {
273 gbds.terminate(true);
274 } else {
275 gbd.terminate(true);
276 }
277 S = new PolynomialList(S.ring, G);
278 System.out.println("G =\n" + S);
279 System.out.println("G.size() = " + G.size());
280 t = System.currentTimeMillis() - t;
281 if (pairseq) {
282 System.out.print("d+ ");
283 } else {
284 System.out.print("d ");
285 }
286 System.out.println("= " + threads + ", time = " + t + " milliseconds, " + (t - t1) + " start-up");
287 checkGB(S);
288 System.out.println("");
289 }
290
291
292 @SuppressWarnings("unchecked")
293 static void runMasterOnceHyb(PolynomialList S, int threads, int threadsPerNode, String mfile, int port,
294 boolean pairseq) {
295 List L = S.list;
296 List G = null;
297 long t, t1;
298
299 t = System.currentTimeMillis();
300 System.out.println("\nGroebner base distributed hybrid[once] (" + threads + "/" + threadsPerNode + ", " + mfile + ", " + port + ") ...");
301 GBDistHybrid gbd = null;
302 GBDistHybrid gbds = null;
303 if (pairseq) {
304 //System.out.println("... not implemented.");
305 //return;
306 // gbds = new GBDistSP(threads, mfile, port);
307 gbds = new GBDistHybrid(threads, threadsPerNode, new OrderedSyzPairlist(), mfile, port);
308 } else {
309 gbd = new GBDistHybrid(threads, threadsPerNode, mfile, port);
310 }
311 t1 = System.currentTimeMillis();
312 if (pairseq) {
313 G = gbds.execute( L );
314 } else {
315 G = gbd.execute(L);
316 }
317 t1 = System.currentTimeMillis() - t1;
318 if (pairseq) {
319 //gbds.terminate(true);
320 } else {
321 //gbd.terminate(true);
322 gbd.terminate(false); // plus eventually killed by script
323 }
324 t = System.currentTimeMillis() - t;
325 S = new PolynomialList(S.ring, G);
326 System.out.println("G =\n" + S);
327 System.out.println("G.size() = " + G.size());
328 if (pairseq) {
329 System.out.print("d+ ");
330 } else {
331 System.out.print("d ");
332 }
333 System.out.println("= " + threads + ", ppn = " + threadsPerNode + ", time = " + t + " milliseconds, " + (t - t1) + " start-up");
334 checkGB(S);
335 System.out.println("");
336 }
337
338
339 static void runClient(int port) {
340 System.out.println("\nGroebner base distributed client (" + port + ") ...");
341
342 ExecutableServer es = new ExecutableServer(port);
343 es.init();
344 }
345
346
347 @SuppressWarnings("unchecked")
348 static void runParallel(PolynomialList S, int threads, boolean pairseq) {
349 List L = S.list;
350 List G;
351 long t;
352 GroebnerBaseAbstract bb = null;
353 GroebnerBaseAbstract bbs = null;
354 if (pairseq) {
355 //bbs = new GroebnerBaseSeqPairParallel(threads);
356 bbs = new GroebnerBaseParallel(threads,new ReductionPar(),new OrderedSyzPairlist());
357 } else {
358 bb = new GroebnerBaseParallel(threads);
359 }
360 t = System.currentTimeMillis();
361 System.out.println("\nGroebner base parallel (" + threads + ") ...");
362
363 if (pairseq) {
364 G = bbs.GB(L);
365 } else {
366 G = bb.GB(L);
367 }
368 t = System.currentTimeMillis() - t;
369 S = new PolynomialList(S.ring, G);
370 System.out.println("G =\n" + S);
371 System.out.println("G.size() = " + G.size());
372
373 if (pairseq) {
374 System.out.print("p+ ");
375 } else {
376 System.out.print("p ");
377 }
378 System.out.println("= " + threads + ", time = " + t + " milliseconds");
379 if (pairseq) {
380 bbs.terminate();
381 } else {
382 bb.terminate();
383 }
384 checkGB(S);
385 System.out.println("");
386 }
387
388
389 @SuppressWarnings("unchecked")
390 static void runSequential(PolynomialList S, boolean pairseq) {
391 List L = S.list;
392 List G;
393 long t;
394 GroebnerBaseAbstract bb = null;
395 if (pairseq) {
396 //bb = new GroebnerBaseSeqPairSeq();
397 bb = new GroebnerBaseSeq(new ReductionSeq(),new OrderedSyzPairlist());
398 } else {
399 bb = new GroebnerBaseSeq();
400 }
401 t = System.currentTimeMillis();
402 System.out.println("\nGroebner base sequential ...");
403 G = bb.GB(L);
404 t = System.currentTimeMillis() - t;
405 S = new PolynomialList(S.ring, G);
406 System.out.println("G =\n" + S);
407 System.out.println("G.size() = " + G.size());
408 if (pairseq) {
409 System.out.print("seq+, ");
410 } else {
411 System.out.print("seq, ");
412 }
413 System.out.println("time = " + t + " milliseconds");
414 checkGB(S);
415 System.out.println("");
416 }
417
418
419 static void checkGB(PolynomialList S) {
420 if ( !doCheck ) {
421 return;
422 }
423 GroebnerBaseAbstract bb = GBFactory.getImplementation(S.ring.coFac);
424 long t = System.currentTimeMillis();
425 boolean chk = bb.isGB(S.list);
426 t = System.currentTimeMillis() - t;
427 System.out.println("check isGB = " + chk + " in " + t + " milliseconds");
428 }
429
430 }