package IFM;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileWriter;
import java.io.IOException;
import java.util.Scanner;
import org.apache.commons.exec.CommandLine;
import org.apache.commons.exec.DefaultExecuteResultHandler;
import org.apache.commons.exec.DefaultExecutor;
import org.apache.commons.exec.ExecuteException;
import org.apache.commons.exec.ExecuteWatchdog;
import org.apache.commons.exec.Executor;
public class AlchemyEngine implements AlchemyEngineInterface {
private String observationsFile;
private String learnedWeightsFile;
private String resultsFile;
private String path;
public AlchemyEngine(String observationsFile, String learnedWeightsFile,
String resultsFile, String path) {
this.observationsFile = observationsFile;
this.learnedWeightsFile = learnedWeightsFile;
this.resultsFile = resultsFile;
this.path = path;
}
public String infer(String observations) throws Exception {
// writes observations to a file
// executes alchemy infer, which outputs results to a file
// reads result from a file and returns as a string
writeObservationsToFile(observations);
runAlchemyForInference("Notification");
String result = readResultsFromFile();
return result;
}
private String readResultsFromFile() throws FileNotFoundException {
FileInputStream result = new FileInputStream(resultsFile);
StringBuilder fileContent = new StringBuilder();
Scanner reader = new Scanner(result);
while (reader.hasNextLine()) {
String line = reader.nextLine();
fileContent.append(line);
fileContent.append("\n");
}
return fileContent.toString();
}
private void writeObservationsToFile(String observations)
throws IOException {
FileWriter fstream = new FileWriter(observationsFile);
fstream.write(observations);
fstream.close();
}
public void runAlchemyForInference(String Query) throws Exception {
CommandLine cmdLine = new CommandLine(path + "infer");
cmdLine.addArgument("-i");
cmdLine.addArgument(learnedWeightsFile); // "src/alchemy/learnedpatterns.mln"
cmdLine.addArgument("-e");
cmdLine.addArgument(observationsFile);
cmdLine.addArgument("-r");
cmdLine.addArgument(resultsFile); // "src/alchemy/alert.results"
cmdLine.addArgument("-q");
cmdLine.addArgument(Query); // "alert"
cmdLine.addArgument("-maxSteps");
cmdLine.addArgument("1000");
try {
DefaultExecuteResultHandler resultHandler = new DefaultExecuteResultHandler();
ExecuteWatchdog watchdog = new ExecuteWatchdog(60 * 1000);
Executor executor = new DefaultExecutor();
executor.setExitValue(1);
executor.setWatchdog(watchdog);
executor.execute(cmdLine, resultHandler);
resultHandler.waitFor();
} catch (ExecuteException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
public static void learn(String path, String factsForLearningFile,
String rulesDefinitionFile, String learnedWeightsFile)
throws Exception {
CommandLine cmdLine = new CommandLine(path + "/learnwts");
cmdLine.addArgument("-i");
cmdLine.addArgument(factsForLearningFile);
cmdLine.addArgument("-o");
cmdLine.addArgument(rulesDefinitionFile);
cmdLine.addArgument("-t");
cmdLine.addArgument(learnedWeightsFile);
cmdLine.addArgument("-g -multipleDatabases");
DefaultExecuteResultHandler resultHandler = new DefaultExecuteResultHandler();
ExecuteWatchdog watchdog = new ExecuteWatchdog(60 * 1000);
Executor executor = new DefaultExecutor();
executor.setExitValue(1);
executor.setWatchdog(watchdog);
executor.execute(cmdLine, resultHandler);
resultHandler.waitFor();
}
}