/*
* $Id$
*/
package edu.jas.application;
import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.StringReader;
import java.io.IOException;
import java.io.FileInputStream;
import java.io.InputStreamReader;
import java.io.Reader;
import java.io.BufferedReader;
import java.nio.charset.Charset;
import java.util.List;
import java.util.Arrays;
import org.apache.log4j.BasicConfigurator;
import edu.jas.gb.SolvableGroebnerBase;
import edu.jas.gb.SolvableGroebnerBaseAbstract;
import edu.jas.gb.SolvableGroebnerBaseParallel;
import edu.jas.gb.SolvableGroebnerBaseSeq;
import edu.jas.gb.SolvableGroebnerBaseSeqPairParallel;
import edu.jas.gb.SolvableReduction;
import edu.jas.gb.SolvableReductionPar;
import edu.jas.gb.SolvableReductionSeq;
import edu.jas.kern.ComputerThreads;
import edu.jas.poly.GenPolynomialTokenizer;
import edu.jas.poly.GenSolvablePolynomial;
import edu.jas.poly.GenSolvablePolynomialRing;
import edu.jas.poly.PolynomialList;
import edu.jas.util.CatReader;
/**
* Simple setup to run a solvable GB example.
Usage: RunSGB
* [seq|par|par+] [irr|left|right|two] <file> #procs
* @author Heinz Kredel
*/
public class RunSGB {
/**
* Check result GB if it is a GB.
*/
static boolean doCheck = false;
/**
* Enable logging.
*/
static boolean doLog = true;
/**
* main method to be called from commandline
Usage: RunSGB
* [seq|seq+|par|par+] [irr|left|right|two] <file> #procs
*/
@SuppressWarnings("unchecked")
public static void main(String[] args) {
String[] allkinds = new String[] { "seq", "seq+",
"par", "par+",
//"dist", "dist+", ,
//"disthyb", "disthyb+",
//"cli"
}; // must be last
String[] allmeth = new String[] { "irr", "left", "right", "two" };
String usage = "Usage: RunGB [ "
+ join(allkinds, " | ")
//+ "[port] ] "
+ " ] ["
+ join(allmeth, " | ")
+ "] "
+ "#threads "
//+ "#procs/#threadsPerNode "
//+ "[machinefile] ";
+ "[check] [nolog]";
if (args.length < 3) {
System.out.println("args: " + Arrays.toString(args));
System.out.println(usage);
return;
}
boolean plusextra = false;
String kind = args[0];
boolean sup = false;
int k = -1;
for (int i = 0; i < args.length; i++) {
int j = indexOf(allkinds, args[i]);
if (j < 0) {
continue;
}
sup = true;
k = i;
kind = args[k];
break;
}
if (!sup) {
System.out.println("args(sup): " + Arrays.toString(args));
System.out.println(usage);
return;
}
if (kind.indexOf("+") >= 0) {
plusextra = true;
}
System.out.println("kind: " + kind + ", k = " + k);
String action = args[k + 1];
sup = false;
int j = indexOf(allmeth, action);
if (j < 0) {
System.out.println(usage);
return;
}
String filename = args[k + 2];
int threads = 0;
if (kind.startsWith("par")) {
if (args.length < 4) {
System.out.println("args(par): " + Arrays.toString(args));
System.out.println(usage);
return;
}
String tup = args[k + 3];
String t = tup;
try {
threads = Integer.parseInt(t);
} catch (NumberFormatException e) {
e.printStackTrace();
System.out.println("args(threads): " + Arrays.toString(args));
System.out.println(usage);
return;
}
if (threads < 1) {
threads = 1;
}
}
j = indexOf(args, "check");
if (j >= 0) {
doCheck = true;
}
j = indexOf(args, "nolog");
if (j >= 0) {
doLog = false;
}
Reader problem = RunGB.getReader(filename);
if (problem == null) {
System.out.println("args(file): " + filename);
System.out.println("args(file): examples.jar(" + filename + ")");
System.out.println("args(file): " + Arrays.toString(args));
System.out.println(usage);
return;
}
RingFactoryTokenizer rftok = new RingFactoryTokenizer(problem);
GenSolvablePolynomialRing spfac = null;
try {
spfac = rftok.nextSolvablePolynomialRing();
rftok = null;
} catch (IOException e) {
e.printStackTrace();
return;
}
Reader polyreader = new CatReader(new StringReader("("),problem); // ( has gone
//Reader polyreader = problem;
GenPolynomialTokenizer tok = new GenPolynomialTokenizer(spfac,polyreader);
PolynomialList S = null;
try {
S = new PolynomialList(spfac,tok.nextSolvablePolynomialList());
} catch (IOException e) {
e.printStackTrace();
return;
}
System.out.println("S =\n" + S);
if (doLog) {
BasicConfigurator.configure();
}
if (kind.startsWith("seq")) {
runSequential(S, action, plusextra);
} else if (kind.startsWith("par")) {
runParallel(S, threads, action, plusextra);
}
ComputerThreads.terminate();
}
/**
* run Sequential.
* @param S polynomial list.
* @param action what to to.
*/
@SuppressWarnings("unchecked")
static void runSequential(PolynomialList S, String action, boolean plusextra) {
List L = S.list;
List G = null;
long t;
SolvableReduction sred = new SolvableReductionSeq();
SolvableGroebnerBase sbb = null;
if (plusextra) {
//sbb = new SolvableGroebnerBaseSeqPlusextra();
//System.out.println("SolvableGroebnerBaseSeqPlusextra not implemented using SolvableGroebnerBaseSeq");
sbb = new SolvableGroebnerBaseSeq();
} else {
sbb = new SolvableGroebnerBaseSeq();
}
t = System.currentTimeMillis();
System.out.println("\nSolvable GB [" + action + "] sequential ...");
if (action.equals("irr")) {
G = sred.leftIrreducibleSet(L);
}
if (action.equals("left")) {
G = sbb.leftGB(L);
}
if (action.equals("right")) {
G = sbb.rightGB(L);
}
if (action.equals("two")) {
G = sbb.twosidedGB(L);
}
if (G == null) {
System.out.println("unknown action = " + action + "\n");
return;
}
S = new PolynomialList(S.ring, G);
System.out.println("G =\n" + S);
System.out.println("G.size() = " + G.size());
t = System.currentTimeMillis() - t;
if (plusextra) {
System.out.print("seq+, ");
} else {
System.out.print("seq, ");
}
System.out.println("time = " + t + " milliseconds");
checkGB(S);
System.out.println("");
}
/**
* run Parallel.
* @param S polynomial list.
* @param action what to to.
*/
@SuppressWarnings("unchecked")
static void runParallel(PolynomialList S, int threads, String action, boolean plusextra) {
List L = S.list;
List G = null;
long t;
SolvableReduction sred = new SolvableReductionPar();
SolvableGroebnerBaseParallel sbb = null;
SolvableGroebnerBaseSeqPairParallel sbbs = null;
if (plusextra) {
sbbs = new SolvableGroebnerBaseSeqPairParallel(threads);
} else {
sbb = new SolvableGroebnerBaseParallel(threads);
}
t = System.currentTimeMillis();
System.out.println("\nSolvable GB [" + action + "] parallel " + threads + " threads ...");
if (action.equals("irr")) {
G = sred.leftIrreducibleSet(L);
}
if (action.equals("left")) {
if (plusextra) {
G = sbbs.leftGB(L);
} else {
G = sbb.leftGB(L);
}
}
if (action.equals("right")) {
if (plusextra) {
G = sbbs.rightGB(L);
} else {
G = sbb.rightGB(L);
}
}
if (action.equals("two")) {
if (plusextra) {
G = sbbs.twosidedGB(L);
} else {
G = sbb.twosidedGB(L);
}
}
if (G == null) {
System.out.println("unknown action = " + action + "\n");
return;
}
if (G.size() > 0) {
S = new PolynomialList(G.get(0).ring, G);
} else {
S = new PolynomialList(S.ring, G);
}
System.out.println("G =\n" + S);
System.out.println("G.size() = " + G.size());
t = System.currentTimeMillis() - t;
if (plusextra) {
System.out.print("p+ ");
} else {
System.out.print("p ");
}
System.out.println("= " + threads + ", time = " + t + " milliseconds");
checkGB(S);
System.out.println("");
if (plusextra) {
sbbs.terminate();
} else {
sbb.terminate();
}
}
@SuppressWarnings("unchecked")
static void checkGB(PolynomialList S) {
if (!doCheck) {
return;
}
SolvableGroebnerBaseAbstract sbb = new SolvableGroebnerBaseSeq();
long t = System.currentTimeMillis();
boolean chk = sbb.isLeftGB(S.list,false);
t = System.currentTimeMillis() - t;
System.out.println("check isGB = " + chk + " in " + t + " milliseconds");
}
static int indexOf(String[] args, String s) {
for (int i = 0; i < args.length; i++) {
if (s.equals(args[i])) {
return i;
}
}
return -1;
}
static String join(String[] args, String d) {
StringBuffer sb = new StringBuffer();
for (int i = 0; i < args.length; i++) {
if (i > 0) {
sb.append(d);
}
sb.append(args[i]);
}
return sb.toString();
}
}
Ads help maintain this website.