index.ts 2.3 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253
  1. import { readFileSync, writeFileSync } from "node:fs";
  2. import BPMNError from "./v1/errors/BPMNError.js";
  3. import Edge from "./v1/graph/edge/Edge.js";
  4. import Graph from "./v1/graph/Graph.js";
  5. import Node from "./v1/graph/node/Node.js";
  6. import Deserializer from "./v1/io/deserialize/Deserializer.js";
  7. import DefaultJsonDeserializer from "./v1/io/deserialize/json/DefaultJsonDeserializer.js";
  8. import Serializer from "./v1/io/serialize/Serializer.js";
  9. import DefaultJsonSerializer from "./v1/io/serialize/json/DefaultJsonSerializer.js";
  10. import CoordinateAssignmentStep from "./v1/optimizer/steps/CoordinateAssignmentStep.js";
  11. import CycleRemoveStep from "./v1/optimizer/steps/CycleRemoveStep.js";
  12. import LayerAssignmentStep from "./v1/optimizer/steps/LayerAssignmentStep.js";
  13. import NodeOrderingStep from "./v1/optimizer/steps/NodeOrderingStep.js";
  14. import SiguiyamaAlgorithm from "./v1/optimizer/siguiyama/SiguiyamaAlgorithm.js";
  15. import { SiguiyamaContext } from "./v1/optimizer/siguiyama/SiguiyamaContext.js";
  16. import CleanupStep from "./v1/optimizer/steps/CleanupStep.js";
  17. export class BPMNOptimizer {
  18. private _optimizationAlgorithm?: SiguiyamaAlgorithm;
  19. public setOptimizationAlgorithm(algorithm: SiguiyamaAlgorithm) : this {
  20. this._optimizationAlgorithm = algorithm;
  21. return this;
  22. }
  23. public run(graph: Graph<Node, Edge<Node>>) : SiguiyamaContext {
  24. if(!this._optimizationAlgorithm)
  25. throw new BPMNError("Optimization algorithm not found, call \"setOptimizationAlgorithm\" method first!");
  26. return this._optimizationAlgorithm.run(graph);
  27. }
  28. }
  29. function getDeserializer() : Deserializer<string, Graph<Node, Edge<Node>>> {
  30. return new DefaultJsonDeserializer();
  31. }
  32. function getSerializer() : Serializer<Graph<Node, Edge<Node>>, string> {
  33. return new DefaultJsonSerializer();
  34. }
  35. const algorithm = new SiguiyamaAlgorithm()
  36. .addStep(new CycleRemoveStep())
  37. .addStep(new LayerAssignmentStep())
  38. .addStep(new NodeOrderingStep())
  39. .addStep(new CoordinateAssignmentStep(100, 50))
  40. .addStep(new CleanupStep());
  41. const optimizer = new BPMNOptimizer().setOptimizationAlgorithm(algorithm);
  42. const data = readFileSync("./data/graph.json").toString();
  43. const graph = getDeserializer().deserialize(data);
  44. const result = optimizer.run(graph);
  45. writeFileSync(`./data/graph-${Date.now()}.json`, getSerializer().serialize(result.graph));