/* This file is part of the Joshua Machine Translation System.
*
* Joshua is free software; you can redistribute it and/or modify
* it under the terms of the GNU Lesser General Public License as
* published by the Free Software Foundation; either version 2.1
* of the License, or (at your option) any later version.
*
* This library is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public
* License along with this library; if not, write to the Free
* Software Foundation, Inc., 59 Temple Place, Suite 330, Boston,
* MA 02111-1307 USA
*/
package joshua.zmert;
import java.io.*;
public class ZMERT
{
public static void main(String[] args) throws Exception
{
boolean external = false; // should each MERT iteration be launched externally?
if (args.length == 1) {
if (args[0].equals("-h")) { printZMERTUsage(args.length,true); System.exit(2); }
else { external = false; }
} else if (args.length == 3) { external = true; }
else { printZMERTUsage(args.length,false); System.exit(1); }
if (!external) {
MertCore myMert = new MertCore(args[0]);
myMert.run_MERT(); // optimize lambda[]!!!
myMert.finish();
} else {
int maxMem = Integer.parseInt(args[1]);
String configFileName = args[2];
String stateFileName = "ZMERT.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.zmert.MertCore " + 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); }
int status = p.waitFor();
if (status == 90) { done = true; }
else if (status == 91) { done = false; }
else { System.out.println("Z-MERT exiting prematurely (MertCore returned " + status + ")..."); break; }
}
}
System.exit(0);
} // main(String[] args)
public static void printZMERTUsage(int argsLen, boolean detailed)
{
if (!detailed) {
println("Oops, you provided " + argsLen + " args!");
println("");
println("Usage:");
println(" ZMERT -maxMem maxMemoryInMB MERT_configFile");
println("");
println("Where -maxMem specifies the maximum amount of memory (in MB) Z-MERT 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 Z-MERT's 20-some parameters,");
println("one per line. Run ZMERT -h for more details on those parameters.");
} else {
println("Usage:");
println(" ZMERT -maxMem maxMemoryInMB MERT_configFile");
println("");
println("Where -maxMem specifies the maximum amount of memory (in MB) Z-MERT 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 Z-MERT'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 MERT dataset\n [[default: null string (i.e. file name is not needed by MERT)]]");
println(" -r refFile: target sentences (reference translations) of the MERT 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 Z-MERT 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("MERT specs:");
println(" -m metricName metric options: name of evaluation metric and its options\n [[default: BLEU 4 closest]]");
println(" -maxIt maxMERTIts: maximum number of MERT iterations\n [[default: 20]]");
println(" -prevIt prevMERTIts: maximum number of previous MERT iterations to\n construct candidate sets from\n [[default: 20]]");
println(" -minIt minMERTIts: 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 MERT 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 Z-MERT 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 MERT iteration\n [[default: 100]]");
println("");
println("Output specs:");
println(" -v verbosity: Z-MERT 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); }
}