use of com.sri.ai.praise.sgsolver.cli.PRAiSE in project aic-praise by aic-sri-international.
the class SGSolverEvaluator method prCallSGSolverCLI.
//
// PRIVATE
private SGSolverCallResult prCallSGSolverCLI(String model, String evidenceQuery) throws Exception {
String tempPagedModelContainer = PagedModelContainer.toInternalContainerRepresentation(ModelLanguage.HOGMv1, Arrays.asList(new Pair<String, List<String>>(model, Arrays.asList(evidenceQuery))));
File tempInput = File.createTempFile("sgsolver", PagedModelContainer.DEFAULT_CONTAINER_FILE_EXTENSION, getConfiguration().getWorkingDirectory());
Files.write(tempInput.toPath(), tempPagedModelContainer.getBytes());
//
File tempSTDERR = File.createTempFile("sgsolver", ".stderr", getConfiguration().getWorkingDirectory());
File tempSTDOUT = File.createTempFile("sgsolver", ".stdout", getConfiguration().getWorkingDirectory());
ProcessBuilder processBuilder = new ProcessBuilder();
processBuilder.directory(getConfiguration().getWorkingDirectory());
// TODO - add option to PRAiSE to indicate a timeout.
processBuilder.command("java", "-classpath", System.getProperty("java.class.path"), "-Xms" + getConfiguration().getTotalMemoryLimitInMegabytesPerSolveAttempt() + "M", "-Xmx" + getConfiguration().getTotalMemoryLimitInMegabytesPerSolveAttempt() + "M", PRAiSE.class.getName(), tempInput.getAbsolutePath());
processBuilder.redirectError(ProcessBuilder.Redirect.to(tempSTDERR));
processBuilder.redirectOutput(ProcessBuilder.Redirect.to(tempSTDOUT));
long sgSolverStart = System.currentTimeMillis();
Process sgSolverProcess = processBuilder.start();
if (!sgSolverProcess.waitFor(getConfiguration().getTotalCPURuntimeLimitSecondsPerSolveAttempt() + 5, TimeUnit.SECONDS)) {
// waiting time elapsed
sgSolverProcess.destroyForcibly();
}
long sgSolverEnd = System.currentTimeMillis();
List<String> sgsolverOutputs = Files.readAllLines(tempSTDOUT.toPath(), StandardCharsets.UTF_8);
tempInput.delete();
//
tempSTDOUT.delete();
tempSTDERR.delete();
SGSolverCallResult result = new SGSolverCallResult();
result.sgSolverProcessTookMS = sgSolverEnd - sgSolverStart;
result.resultExpression = sgsolverOutputs.stream().filter(line -> line.startsWith(PRAiSE.RESULT_PREFIX)).findFirst().orElse(null);
if (result.resultExpression != null) {
result.resultExpression = result.resultExpression.substring(PRAiSE.RESULT_PREFIX.length());
} else {
throw new Error("Error launching java process for SGSolver:\n" + sgsolverOutputs);
}
return result;
}
Aggregations