blob: 206abd36316463460f2f38a9f019d21ee7d05faa [file] [log] [blame]
package joshua.adagrad;
import joshua.decoder.JoshuaConfiguration;
import joshua.util.FileUtility;
import joshua.util.StreamGobbler;
public class AdaGrad {
public static void main(String[] args) throws Exception {
JoshuaConfiguration joshuaConfiguration = new JoshuaConfiguration();
boolean external = false; // should each AdaGrad iteration be launched externally?
if (args.length == 1) {
if (args[0].equals("-h")) {
printAdaGradUsage(args.length, true);
System.exit(2);
} else {
external = false;
}
} else if (args.length == 3) {
external = true;
} else {
printAdaGradUsage(args.length, false);
System.exit(1);
}
if (!external) {
AdaGradCore myAdaGrad = new AdaGradCore(args[0], joshuaConfiguration);
myAdaGrad.run_AdaGrad(); // optimize lambda[]
myAdaGrad.finish();
} else {
int maxMem = Integer.parseInt(args[1]);
String configFileName = args[2];
String stateFileName = FileUtility.dirname(configFileName) + "/AdaGrad.temp.state";
String cp = System.getProperty("java.class.path");
boolean done = false;
int iteration = 0;
while (!done) {
++iteration;
Runtime rt = Runtime.getRuntime();
Process p =
rt.exec("java -Xmx" + maxMem + "m -cp " + cp + " joshua.adagrad.AdaGradCore " + configFileName
+ " " + stateFileName + " " + iteration);
/*
* BufferedReader br_i = new BufferedReader(new InputStreamReader(p.getInputStream()));
* BufferedReader br_e = new BufferedReader(new InputStreamReader(p.getErrorStream()));
* String dummy_line = null; while ((dummy_line = br_i.readLine()) != null) {
* System.out.println(dummy_line); } while ((dummy_line = br_e.readLine()) != null) {
* System.out.println(dummy_line); }
*/
StreamGobbler errorGobbler = new StreamGobbler(p.getErrorStream(), 1);
StreamGobbler outputGobbler = new StreamGobbler(p.getInputStream(), 1);
errorGobbler.start();
outputGobbler.start();
int status = p.waitFor();
if (status == 90) {
done = true;
} else if (status == 91) {
done = false;
} else {
System.out.println("AdaGrad exiting prematurely (AdaGradCore returned " + status + ")...");
break;
}
}
}
System.exit(0);
} // main(String[] args)
public static void printAdaGradUsage(int argsLen, boolean detailed) {
if (!detailed) {
println("Oops, you provided " + argsLen + " args!");
println("");
println("Usage:");
println(" AdaGrad -maxMem maxMemoryInMB AdaGrad_configFile");
println("");
println("Where -maxMem specifies the maximum amount of memory (in MB) AdaGrad is");
println("allowed to use when performing its calculations (no memroy is needed while");
println("the decoder is running),");
println("and the config file contains any subset of AdaGrad's 20-some parameters,");
println("one per line. Run AdaGrad -h for more details on those parameters.");
} else {
println("Usage:");
println(" AdaGrad -maxMem maxMemoryInMB AdaGrad_configFile");
println("");
println("Where -maxMem specifies the maximum amount of memory (in MB) AdaGrad is");
println("allowed to use when performing its calculations (no memroy is needed while");
println("the decoder is running),");
println("and the config file contains any subset of AdaGrad's 20-some parameters,");
println("one per line. Those parameters, and their default values, are:");
println("");
println("Relevant files:");
println(" -dir dirPrefix: working directory\n [[default: null string (i.e. they are in the current directory)]]");
println(" -s sourceFile: source sentences (foreign sentences) of the AdaGrad dataset\n [[default: null string (i.e. file name is not needed by AdaGrad)]]");
println(" -r refFile: target sentences (reference translations) of the AdaGrad dataset\n [[default: reference.txt]]");
println(" -rps refsPerSen: number of reference translations per sentence\n [[default: 1]]");
//println(" -txtNrm textNormMethod: how should text be normalized?\n (0) don't normalize text,\n or (1) \"NIST-style\", and also rejoin 're, *'s, n't, etc,\n or (2) apply 1 and also rejoin dashes between letters,\n or (3) apply 1 and also drop non-ASCII characters,\n or (4) apply 1+2+3\n [[default: 1]]");
println(" -p paramsFile: file containing parameter names, initial values, and ranges\n [[default: params.txt]]");
//println(" -docInfo documentInfoFile: file informing AdaGrad which document each\n sentence belongs to\n [[default: null string (i.e. all sentences are in one 'document')]]");
println(" -fin finalLambda: file name for final lambda[] values\n [[default: null string (i.e. no such file will be created)]]");
println("");
println("AdaGrad specs:");
println(" -m metricName metric options: name of evaluation metric and its options\n [[default: BLEU 4 closest]]");
println(" -maxIt maxAdaGradIts: maximum number of AdaGrad iterations\n [[default: 20]]");
println(" -prevIt prevAdaGradIts: maximum number of previous AdaGrad iterations to\n construct candidate sets from\n [[default: 20]]");
println(" -minIt minAdaGradIts: number of iterations before considering an early exit\n [[default: 5]]");
println(" -stopIt stopMinIts: some early stopping criterion must be satisfied in\n stopMinIts *consecutive* iterations before an early exit\n [[default: 3]]");
println(" -stopSig sigValue: early AdaGrad exit if no weight changes by more than sigValue\n [[default: -1 (i.e. this criterion is never investigated)]]");
//println(" -thrCnt threadCount: number of threads to run in parallel when optimizing\n [[default: 1]]");
println(" -save saveInter: save intermediate cfg files (1) or decoder outputs (2)\n or both (3) or neither (0)\n [[default: 3]]");
println(" -compress compressFiles: should AdaGrad compress the files it produces (1)\n or not (0)\n [[default: 0]]");
//println(" -ipi initsPerIt: number of intermediate initial points per iteration\n [[default: 20]]");
//println(" -opi oncePerIt: modify a parameter only once per iteration (1) or not (0)\n [[default: 0]]");
//println(" -rand randInit: choose initial point randomly (1) or from paramsFile (0)\n [[default: 0]]");
//println(" -seed seed: seed used to initialize random number generator\n [[default: time (i.e. value returned by System.currentTimeMillis()]]");
// println(" -ud useDisk: reliance on disk (0-2; higher value => more reliance)\n [[default: 2]]");
println("");
println("Decoder specs:");
println(" -cmd commandFile: name of file containing commands to run the decoder\n [[default: null string (i.e. decoder is a JoshuaDecoder object)]]");
println(" -passIt passIterationToDecoder: should iteration number be passed\n to command file (1) or not (0)\n [[default: 0]]");
println(" -decOut decoderOutFile: name of the output file produced by the decoder\n [[default: output.nbest]]");
println(" -decExit validExit: value returned by decoder to indicate success\n [[default: 0]]");
println(" -dcfg decConfigFile: name of decoder config file\n [[default: dec_cfg.txt]]");
println(" -N N: size of N-best list (per sentence) generated in each AdaGrad iteration\n [[default: 100]]");
println("");
println("Output specs:");
println(" -v verbosity: AdaGrad verbosity level (0-2; higher value => more verbose)\n [[default: 1]]");
println(" -decV decVerbosity: should decoder output be printed (1) or ignored (0)\n [[default: 0]]");
println("");
}
}
private static void println(Object obj) {
System.out.println(obj);
}
}