|
@@ -1,21 +1,47 @@
|
|
|
-import { readFileSync } from "node:fs";
|
|
|
|
|
-import DZWFDeserializer from "./v1/io/deserialize/dzwf/DZWFDeserializer.js";
|
|
|
|
|
|
|
+import { readFileSync, writeFileSync } from "node:fs";
|
|
|
|
|
+import BPMNError from "./v1/errors/BPMNError.js";
|
|
|
|
|
+import Edge from "./v1/graph/Edge.js";
|
|
|
|
|
+import Graph from "./v1/graph/Graph.js";
|
|
|
|
|
+import Node from "./v1/graph/Node.js";
|
|
|
|
|
+import Deserializer from "./v1/io/deserialize/Deserializer.js";
|
|
|
|
|
+import DefaultJsonDeserializer from "./v1/io/deserialize/json/DefaultJsonDeserializer.js";
|
|
|
|
|
+import Serializer from "./v1/io/serialize/Serializer.js";
|
|
|
|
|
+import DefaultJsonSerializer from "./v1/io/serialize/json/DefaultJsonSerializer.js";
|
|
|
|
|
+import CoordinateAssignmentStep from "./v1/optimizer/siguiyama/CoordinateAssignmentStep.js";
|
|
|
import CycleRemoveStep from "./v1/optimizer/siguiyama/CycleRemoveStep.js";
|
|
import CycleRemoveStep from "./v1/optimizer/siguiyama/CycleRemoveStep.js";
|
|
|
import LayerAssignmentStep from "./v1/optimizer/siguiyama/LayerAssignmentStep.js";
|
|
import LayerAssignmentStep from "./v1/optimizer/siguiyama/LayerAssignmentStep.js";
|
|
|
-import SiguiyamaAlgorithm from "./v1/optimizer/siguiyama/SiguiyamaAlgorithm.js";
|
|
|
|
|
import NodeOrderingStep from "./v1/optimizer/siguiyama/NodeOrderingStep.js";
|
|
import NodeOrderingStep from "./v1/optimizer/siguiyama/NodeOrderingStep.js";
|
|
|
-import CoordinateAssignmentStep from "./v1/optimizer/siguiyama/CoordinateAssignmentStep.js";
|
|
|
|
|
-import DZWFJsonSerializer from "./v1/io/serialize/dzwf/JointJsonSerializer.js";
|
|
|
|
|
|
|
+import SiguiyamaAlgorithm from "./v1/optimizer/siguiyama/SiguiyamaAlgorithm.js";
|
|
|
|
|
+import { SiguiyamaContext } from "./v1/optimizer/siguiyama/SiguiyamaContext.js";
|
|
|
|
|
+
|
|
|
|
|
+class BPMNOptimizer {
|
|
|
|
|
+ private _optimizationAlgorithm?: SiguiyamaAlgorithm;
|
|
|
|
|
+
|
|
|
|
|
+ public setOptimizationAlgorithm(algorithm: SiguiyamaAlgorithm) : this {
|
|
|
|
|
+ this._optimizationAlgorithm = algorithm;
|
|
|
|
|
+ return this;
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+ public run(graph: Graph<Node, Edge<Node>>) : SiguiyamaContext {
|
|
|
|
|
+ if(!this._optimizationAlgorithm)
|
|
|
|
|
+ throw new BPMNError("Optimization algorithm not found, call \"setOptimizationAlgorithm\" method first!");
|
|
|
|
|
+ return this._optimizationAlgorithm.run(graph);
|
|
|
|
|
+ }
|
|
|
|
|
+}
|
|
|
|
|
+
|
|
|
|
|
+function getDeserializer() : Deserializer<string, Graph<Node, Edge<Node>>> {
|
|
|
|
|
+ return new DefaultJsonDeserializer();
|
|
|
|
|
+}
|
|
|
|
|
+
|
|
|
|
|
+function getSerializer() : Serializer<Graph<Node, Edge<Node>>, string> {
|
|
|
|
|
+ return new DefaultJsonSerializer();
|
|
|
|
|
+}
|
|
|
|
|
|
|
|
-const deserializer = new DZWFDeserializer();
|
|
|
|
|
-const { graph, dzwfData } = deserializer.deserialize(String(readFileSync("./data/bpmn.json")));
|
|
|
|
|
-const optimizer = new SiguiyamaAlgorithm()
|
|
|
|
|
- .addStep(new CycleRemoveStep())
|
|
|
|
|
- .addStep(new LayerAssignmentStep())
|
|
|
|
|
- .addStep(new NodeOrderingStep(20))
|
|
|
|
|
- .addStep(new CoordinateAssignmentStep());
|
|
|
|
|
|
|
+const algorithm = new SiguiyamaAlgorithm().addStep(new CycleRemoveStep()).addStep(new LayerAssignmentStep()).addStep(new NodeOrderingStep()).addStep(new CoordinateAssignmentStep());
|
|
|
|
|
+const optimizer = new BPMNOptimizer().setOptimizationAlgorithm(algorithm);
|
|
|
|
|
|
|
|
-optimizer.run(graph);
|
|
|
|
|
|
|
+const data = readFileSync("./data/graph.json").toString();
|
|
|
|
|
+const graph = getDeserializer().deserialize(data);
|
|
|
|
|
+const result = optimizer.run(graph);
|
|
|
|
|
|
|
|
-const serializer = new DZWFJsonSerializer(dzwfData);
|
|
|
|
|
-serializer.serialize(graph);
|
|
|
|
|
|
|
+writeFileSync(`./data/graph-${Date.now()}.json`, getSerializer().serialize(result.graph));
|