pm4js
Version:
Process Mining for Javascript
66 lines (63 loc) • 2.12 kB
JavaScript
class DfgPlayout {
static apply(freqDfg, numDesideredTraces=1000, activityKey="concept:name", timestampKey="time:timestamp") {
let vect = freqDfg.getArtificialDfg();
let outgoing = {};
for (let act in vect[0]) {
outgoing[act] = {};
}
for (let edge0 in vect[1]) {
let edge = edge0.split(",");
outgoing[edge[0]][edge[1]] = -Math.log(vect[1][edge0] / (0.0 + vect[0][edge[0]]));
}
let comparator = function(a,b) {
return a[1] < b[1];
};
let queue = new PriorityQueue(comparator);
let start = [["▶"], 0];
queue.push(start);
let count = 0;
let minTimestamp = 10000000;
let eventLog = new EventLog();
while (true) {
if (count >= numDesideredTraces) {
break;
}
let el = queue.pop();
let activities = el[0];
let lastActivity = activities[activities.length-1];
if (lastActivity == "■") {
let prob = Math.exp(-el[1]);
let trace = new Trace();
trace.attributes["@@prob"] = new Attribute(prob);
trace.attributes["concept:name"] = new Attribute(""+count);
eventLog.traces.push(trace);
let i = 1;
while (i < activities.length - 1) {
let newEve = new Event();
trace.events.push(newEve);
newEve.attributes[activityKey] = new Attribute(activities[i]);
newEve.attributes[timestampKey] = new Attribute(new Date((minTimestamp + count)*1000));
i++;
}
count++;
}
for (let act in outgoing[lastActivity]) {
let newActivities = activities.slice();
newActivities.push(act);
queue.push([newActivities, el[1] + outgoing[lastActivity][act]]);
}
}
Pm4JS.registerObject(eventLog, "Simulated Event log (from DFG)");
return eventLog;
}
}
try {
module.exports = {DfgPlayout: DfgPlayout};
global.DfgPlayout = DfgPlayout;
}
catch (err) {
// not in Node
//console.log(err);
}
Pm4JS.registerAlgorithm("DfgPlayout", "apply", ["FrequencyDfg"], "EventLog", "Perform Playout on a DFG", "Alessandro Berti");
Pm4JS.registerAlgorithm("DfgPlayout", "apply", ["PerformanceDfg"], "EventLog", "Perform Playout on a DFG", "Alessandro Berti");