UNPKG

pm4js

Version:

Process Mining for Javascript

116 lines (113 loc) 4.15 kB
class FilteredDfgMaximization { static apply(freqDfg) { let vect = freqDfg.getArtificialDfg(); let activities = vect[0]; let paths = vect[1]; let activitiesKeys = Object.keys(activities); let ingoing = {}; let outgoing = {}; for (let act of activitiesKeys) { if (act != "▶") { ingoing[act] = {}; } if (act != "■") { outgoing[act] = {}; } } let pathsKeys = Object.keys(paths); for (let path0 of pathsKeys) { let path = path0.split(","); ingoing[path[1]][path[0]] = paths[path0]; outgoing[path[0]][path[1]] = paths[path0]; } let constraintMatrix = []; let constraintsVector = []; let numConstraints = pathsKeys.length + activitiesKeys.length + activitiesKeys.length; let zeroRow = []; let i = 0; while (i < numConstraints) { zeroRow.push(0); i++; } for (let pind in pathsKeys) { let constraintRow = zeroRow.slice(); constraintRow[parseInt(pind)] = -1; constraintMatrix.push(constraintRow); constraintsVector.push(-paths[pathsKeys[parseInt(pind)]]); } for (let actInd in activitiesKeys) { let act = activitiesKeys[actInd]; let constraintRow = zeroRow.slice(); for (let act2 in ingoing[act]) { let path = [act2, act]; let pind = pathsKeys.indexOf(path.toString()); constraintRow[parseInt(pind)] = 1; } constraintRow[pathsKeys.length + parseInt(actInd)] = 1; constraintsVector.push(activities[act] + 0.5); constraintMatrix.push(constraintRow); constraintRow = zeroRow.slice(); for (let act2 in ingoing[act]) { let path = [act2, act]; let pind = pathsKeys.indexOf(path.toString()); constraintRow[parseInt(pind)] = -1; } constraintRow[pathsKeys.length + parseInt(actInd)] = -1; constraintsVector.push(-activities[act] + 0.5); constraintMatrix.push(constraintRow); constraintRow = zeroRow.slice(); constraintRow[pathsKeys.length + parseInt(actInd)] = -1; constraintsVector.push(0); constraintMatrix.push(constraintRow); } for (let actInd in activitiesKeys) { let act = activitiesKeys[actInd]; let constraintRow = zeroRow.slice(); for (let act2 in outgoing[act]) { let path = [act, act2]; let pind = pathsKeys.indexOf(path.toString()); constraintRow[parseInt(pind)] = 1; } constraintRow[pathsKeys.length + activitiesKeys.length + parseInt(actInd)] = 1; constraintsVector.push(activities[act] + 0.5); constraintMatrix.push(constraintRow); constraintRow = zeroRow.slice(); for (let act2 in outgoing[act]) { let path = [act, act2]; let pind = pathsKeys.indexOf(path.toString()); constraintRow[parseInt(pind)] = -1; } constraintRow[pathsKeys.length + activitiesKeys.length + parseInt(actInd)] = -1; constraintsVector.push(-activities[act] + 0.5); constraintMatrix.push(constraintRow); constraintRow = zeroRow.slice(); constraintRow[pathsKeys.length + activitiesKeys.length + parseInt(actInd)] = -1; constraintsVector.push(0); constraintMatrix.push(constraintRow); } let objective = zeroRow.slice(); for (let actInd in activitiesKeys) { objective[pathsKeys.length + parseInt(actInd)] = 1; objective[pathsKeys.length + activitiesKeys.length + parseInt(actInd)] = 1; } var lp = numeric.solveLP(objective, constraintMatrix, constraintsVector); for (let pind in pathsKeys) { let val = Math.floor(lp.solution[pind]); if (val != paths[pathsKeys[pind]]) { paths[pathsKeys[pind]] = val; } } let ret = freqDfg.unrollArtificialDfg([activities, paths]); Pm4JS.registerObject(ret, "Maximized DFG"); return ret; } } try { module.exports = {FilteredDfgMaximization: FilteredDfgMaximization}; global.FilteredDfgMaximization = FilteredDfgMaximization; } catch (err) { // not in Node } Pm4JS.registerAlgorithm("FilteredDfgMaximization", "apply", ["FrequencyDfg"], "FrequencyDfg", "Maximize DFG capacity", "Alessandro Berti"); Pm4JS.registerAlgorithm("FilteredDfgMaximization", "apply", ["PerformanceDfg"], "PerformanceDfg", "Maximize DFG capacity", "Alessandro Berti");