print("Classifying...");
importlog = "Artificial - Loan Process.xes";
importmodel = "inductive_mined_net.pnml";
exportlog = "transition_result.xes";
//---------------------------------------------------
print("");
// Use the name of the plugin (in lowercase) to open a log
print(" ");
org.deckfour.xes.model.XLog log = open_xes_log_file(importlog);
print(" ");
logname = org.deckfour.xes.extension.std.XConceptExtension.instance().extractName(log);
print(" " + logname + "");
print(" " + log.size() + "");
events = 0;
for (trace : log) {
events += trace.size();
}
print(" " + events + "");
print(" " + log.getClassifiers().size() + "");
print("");
print(" Classifirers:");
for ( claasifier : log.getClassifiers()) {
print(" "+claasifier);
}
print("");
print(" ");
res = import_petri_net_from_pnml_file(importmodel);
print(" ");
model = res[0];
marking = res[1];
print(" " + model.getLabel() + "");
print(" ");
for (transition : model.getTransitions()) {
print(" " + transition.getAttributeMap().get(org.processmining.models.graphbased.AttributeMap.LABEL) + "");
}
print(" ");
for (place : model.getPlaces()) {
print(" " + place.getAttributeMap().get(org.processmining.models.graphbased.AttributeMap.LABEL) + "");
}
print(" " + marking + "");
print("");
//---------------------------------------------------
print("");
print(" ");
// get th eintiial and final marking (assume there is a single final marking).
anet = pack_petri_net(model);
net = anet.getNet();
initialMarking = anet.getInitialMarking();
finalMarking = anet.getFinalMarkings().iterator().next();
// Initialize the replayer
eventClassifier = log.getClassifiers().isEmpty() ? new org.deckfour.xes.classification.XEventNameClassifier() : log.getClassifiers().get(0);
logs = org.processmining.log.models.impl.EventLogArrayFactory.createEventLogArray();
dummyClass = new org.deckfour.xes.classification.XEventClass("DUMMY", 99999);
mapping = nl.tue.alignment.test.BasicCodeSnippet.constructMappingBasedOnLabelEquality(net, log, dummyClass, eventClassifier);
print("eventClassifier:"+eventClassifier);
summary = org.deckfour.xes.info.XLogInfoFactory.createLogInfo(log, eventClassifier);
classes = summary.getEventClasses();
// Setting the correct costs
costModelMove = new HashMap();
costSyncMove = new HashMap();
costLogMove = new HashMap();
for (transition : net.getTransitions()) {
costSyncMove.put(transition, 0);
costModelMove.put(transition, transition.isInvisible() ? 0 : 2);
}
for (clss : summary.getEventClasses().getClasses()) {
print("class :"+ clss);
costLogMove.put(clss, 5);
}
costLogMove.put(dummyClass, 5);
nThreads = 6;
costUpperBound = 0;
//too low! timeoutMilliseconds = 10 * 1000;
timeoutMilliseconds = 600 * 1000;
//too high! timeoutMilliseconds = Integer.MAX_VALUE;
maximumNumberOfStates = Integer.MAX_VALUE;
parameters = new nl.tue.alignment.ReplayerParameters.AStar(true, true, true, nThreads, true,
nl.tue.alignment.algorithms.ReplayAlgorithm.Debug.NONE,
timeoutMilliseconds, maximumNumberOfStates, costUpperBound, false);
parameters = new nl.tue.alignment.ReplayerParameters.IncrementalAStar(true, nThreads, false,
nl.tue.alignment.algorithms.ReplayAlgorithm.Debug.NONE, timeoutMilliseconds,
maximumNumberOfStates, costUpperBound, false, 20);
replayer = new nl.tue.alignment.Replayer(parameters, net, initialMarking, finalMarking, classes, costModelMove,
costLogMove, costSyncMove, mapping, false);
preProcessTimeNanoseconds = 0L;
// Starting the replayer
service = java.util.concurrent.Executors.newFixedThreadPool(parameters.nThreads);
futures = new java.util.concurrent.Future[log.size()];
eventWithErrors = new int[0];
//TraceReplayTask for each Trace i log
for (i = 0; i < log.size(); i++) {
task = new nl.tue.alignment.TraceReplayTask(replayer, parameters, log.get(i), i, timeoutMilliseconds,
parameters.maximumNumberOfStates, preProcessTimeNanoseconds, eventWithErrors);
futures[i] = service.submit(task);
}
service.shutdown();
print(" ");
print("");
//---------------------------------------------------
print("");
pos = 0;
neg = 0;
unr = 0;
//Collection pnReplayResultList = new java.util.TreeSet();
java.util.Set pnReplayResultList = new java.util.HashSet();
for (i = 0; i < log.size(); i++) {
isPos = false;
try {
result = futures[i].get();
// print("\nfuture task :"+futures[i]+" trace replay task :"+result);
if (result.getResult() == nl.tue.alignment.TraceReplayTask.TraceReplayResult.SUCCESS) {
replayResult = result.getSuccesfulResult();
pnReplayResultList.add(replayResult);
// print("replay result:"+replayResult + " getInfo:"+replayResult.getInfo());
exitCode = replayResult.getInfo().get(nl.tue.alignment.Replayer.TRACEEXITCODE).intValue();
if ((exitCode & nl.tue.alignment.Utils.OPTIMALALIGNMENT) == nl.tue.alignment.Utils.OPTIMALALIGNMENT) {
isPos = true;
pos++;
} else if ((exitCode & nl.tue.alignment.Utils.COSTLIMITREACHED) == nl.tue.alignment.Utils.COSTLIMITREACHED) {
neg++;
} else if ((exitCode & nl.tue.alignment.Utils.FINALMARKINGUNREACHABLE) == nl.tue.alignment.Utils.FINALMARKINGUNREACHABLE) {
neg++;
} else {
print("Trace '" + log.get(i).getAttributes().get("concept:name") + "': exit code " + exitCode);
unr++;
}
} else {
unr++;
}
} catch (Exception e) {
throw new RuntimeException("Error while executing replayer in ExecutorService. Interrupted maybe?", e);
}
log.get(i).getAttributes().put("pdc:costs", org.deckfour.xes.factory.XFactoryRegistry.instance().currentDefault().createAttributeBoolean("pdc:isPos", isPos, null));
}
print(" " + pos + "");
print(" " + neg + "");
print(" " + unr + "");
print("");
//---------------------------------------------------
print("");
exportfile = new java.io.File(exportlog);
print(" ");
org.processmining.plugins.log.exporting.ExportLogXes.export(log, exportfile);
print(" ");
print(" " + exportfile.length() + "");
print("");
//----------------------
org.processmining.framework.plugin.GlobalContext globalContext = new org.processmining.contexts.cli.CLIContext();
org.processmining.framework.plugin.PluginContext pluginContext = new org.processmining.contexts.cli.CLIPluginContext(globalContext ,"Plugin Context");
org.processmining.plugins.petrinet.manifestreplayer.algorithms.IPNManifestReplayAlgorithm algorithm = new org.processmining.plugins.petrinet.manifestreplayer.algorithms.PNManifestReplayerILPAlgorithm();
initMarking = initialMarking ;
org.processmining.models.semantics.petrinet.Marking[] finalMarkings = new org.processmining.models.semantics.petrinet.Marking[finalMarking.size()];
finalMarkings[0] = finalMarking;
//Error - Can't find constructor: PNManifestReplayerParameter - not sure about how to populate the parameters
pnmParameter = new org.processmining.plugins.petrinet.manifestreplayer.PNManifestReplayerParameter(null,null, mapping, maximumNumberOfStates, initMarking, finalMarkings);
manifestReplayer = new org.processmining.plugins.petrinet.manifestreplayer.PNManifestReplayer();
manifest = manifestReplayer.replayLogParameter(pluginContext, model, log, algorithm, pnmParameter);
//----------------------
//Error - these 2 plugin invocation fails with - Command not found
//manifest = from_petri_net_and_event_log_given_algorithm_and_parameters(pluginContext, net, log, algorithm, pnmParameter);
//context = new org.processmining.contexts.uitopia.UIContext();
//pluginContext = context.getMainPluginContext();
// manifest = replay_a_log_on_petri_net_for_performance_conformance_analysis(pluginContext, model, log, algorithm, pnmParameter );
//component = performance_projection_to_model(manifest);
//----------------------
//Error - The below code throws CancellationException
//org.processmining.plugins.petrinet.replayresult.PNRepResult alignment = new org.processmining.plugins.petrinet.replayresult.PNRepResultImpl(pnReplayResultList);
//performance_matrix = time_between_transition_analysis(alignment);
//print("component:"+performance_matrix);
//----------------------