package edu.stanford.nlp.optimization;
//import edu.stanford.nlp.util.StreamGobbler;
import edu.stanford.nlp.util.SystemUtils;
import java.io.*;
import java.util.regex.Pattern;
/**
* Runs a cmdline to evaluate a dataset (assumes cmd takes input from stdin)
*
* @author Angel Chang
*/
public abstract class CmdEvaluator implements Evaluator {
private static final Pattern cmdSplitPattern = Pattern.compile("\\s+");
protected boolean saveOutput = false;
private String outString;
private String errString;
protected String description;
public abstract void setValues(double[] x);
public abstract String[] getCmd();
public abstract void outputToCmd(OutputStream outputStream);
protected static String[] getCmd(String cmdStr)
{
if (cmdStr == null) return null;
return cmdSplitPattern.split(cmdStr);
}
public String getOutput() {
return outString;
}
public String getError() {
return errString;
}
public String toString() {
return description;
}
public void evaluateCmd(String[] cmd) {
try {
SystemUtils.ProcessOutputStream outputStream;
StringWriter outSw = null;
StringWriter errSw = null;
if (saveOutput) {
outSw = new StringWriter();
errSw = new StringWriter();
outputStream = new SystemUtils.ProcessOutputStream(cmd, outSw, errSw);
} else {
outputStream = new SystemUtils.ProcessOutputStream(cmd, new PrintWriter(System.err));
}
outputToCmd(outputStream);
outputStream.close();
if (saveOutput) {
outString = outSw.toString();
errString = errSw.toString();
}
} catch (IOException ex) {
throw new RuntimeException(ex);
}
}
public double evaluate(double[] x) {
setValues(x);
evaluateCmd(getCmd());
return 0;
}
}