|
|
@@ -24,94 +24,94 @@ export default class NodeOrderingStep extends AlgorithmStep<SiguiyamaContext> {
|
|
|
if(!layering)
|
|
|
throw new NodeOrderingStepError("Layering of graph was not found!");
|
|
|
|
|
|
- this.barycenter(graph, layering);
|
|
|
+ // this.barycenter(graph, layering);
|
|
|
}
|
|
|
|
|
|
- private barycenter(graph: Graph<Node, Edge<Node>>, layering: Layering<Node, Edge<Node>>) : void {
|
|
|
- let crossingsCount = Infinity;
|
|
|
-
|
|
|
- for(let i = 0; i < this._iterationsCount; i++) {
|
|
|
- this.sweepDown(graph, layering);
|
|
|
- this.sweepUp(graph, layering);
|
|
|
-
|
|
|
- const currentCrossingsCount = this.countTotalCrossings(graph, layering);
|
|
|
-
|
|
|
- if(currentCrossingsCount > crossingsCount)
|
|
|
- break;
|
|
|
-
|
|
|
- crossingsCount = currentCrossingsCount;
|
|
|
- }
|
|
|
- }
|
|
|
-
|
|
|
- private sweepDown(graph: Graph<Node, Edge<Node>>, layering: Layering<Node, Edge<Node>>) : void {
|
|
|
- const layers = layering.getLayers();
|
|
|
-
|
|
|
- for(let i = 0; i < layers.length; i++) {
|
|
|
- const currLayer = layers[i]!;
|
|
|
- currLayer.nodes = this.applyBarycenter(graph, layering, currLayer.nodes, "down");
|
|
|
- }
|
|
|
- }
|
|
|
-
|
|
|
- private sweepUp(graph: Graph<Node, Edge<Node>>, layering: Layering<Node, Edge<Node>>) : void {
|
|
|
- const layers = layering.getLayers();
|
|
|
-
|
|
|
- for(let i = layers.length - 1; i > 0; i--) {
|
|
|
- const currLayer = layers[i]!;
|
|
|
- currLayer.nodes = this.applyBarycenter(graph, layering, currLayer.nodes, "up");
|
|
|
- }
|
|
|
- }
|
|
|
-
|
|
|
- private applyBarycenter(graph: Graph<Node, Edge<Node>>, layering: Layering<Node, Edge<Node>>, nodeIds: Node[], direction: "up" | "down") : Node[] {
|
|
|
- const barycenterValues = nodeIds.map((node) => {
|
|
|
- const neighbors = direction === "down" ? graph.getNodeInputs(node) : graph.getNodeOutputs(node);
|
|
|
- if(neighbors.length === 0) {
|
|
|
- const currentPosition = layering.getPositionOf(node);
|
|
|
- return { node, value: currentPosition ?? Infinity };
|
|
|
- }
|
|
|
-
|
|
|
- const posistionSum = neighbors.reduce((sum, neighbor) => {
|
|
|
- const position = layering.getPositionOf(neighbor);
|
|
|
- return sum + (position ?? 0);
|
|
|
- }, 0);
|
|
|
-
|
|
|
- return { node, value: posistionSum / neighbors.length };
|
|
|
- });
|
|
|
-
|
|
|
- return barycenterValues.sort((a, b) => a.value - b.value).map((entry) => entry.node);
|
|
|
- }
|
|
|
-
|
|
|
- private countTotalCrossings(graph: Graph<Node, Edge<Node>>, layering: Layering<Node, Edge<Node>>) : number {
|
|
|
- const layers = layering.getLayers();
|
|
|
-
|
|
|
- let totalCrossings = 0;
|
|
|
-
|
|
|
- for(let i = 0; i < layers.length - 1; i++)
|
|
|
- totalCrossings += this.countCrossingsBetweenLayers(graph, layering, i, i + 1);
|
|
|
-
|
|
|
- return totalCrossings;
|
|
|
- }
|
|
|
-
|
|
|
- private countCrossingsBetweenLayers(graph: Graph<Node, Edge<Node>>, layering: Layering<Node, Edge<Node>>, upperLayerIndex: number, lowerLayerIndex: number) : number {
|
|
|
- const edges = graph.getEdges().filter((edge) => {
|
|
|
- const fromLayer = layering.getLayerOf(edge.getFrom());
|
|
|
- const toLayer = layering.getLayerOf(edge.getTo());
|
|
|
- return fromLayer === upperLayerIndex && toLayer === lowerLayerIndex;
|
|
|
- });
|
|
|
-
|
|
|
- let crossings = 0;
|
|
|
-
|
|
|
- for(let i = 0; i < edges.length; i++) {
|
|
|
- for(let j = i + 1; j < edges.length; j++) {
|
|
|
- const posU = layering.getPositionOf(edges[i]!.getFrom()) ?? 0;
|
|
|
- const posV = layering.getPositionOf(edges[i]!.getTo()) ?? 0;
|
|
|
- const posS = layering.getPositionOf(edges[j]!.getFrom()) ?? 0;
|
|
|
- const posT = layering.getPositionOf(edges[j]!.getTo()) ?? 0;
|
|
|
-
|
|
|
- if((posU < posS && posV > posT) || (posU > posS && posV < posT))
|
|
|
- crossings++;
|
|
|
- }
|
|
|
- }
|
|
|
-
|
|
|
- return crossings;
|
|
|
- }
|
|
|
+ // private barycenter(graph: Graph<Node, Edge<Node>>, layering: Layering<Node, Edge<Node>>) : void {
|
|
|
+ // let crossingsCount = Infinity;
|
|
|
+ //
|
|
|
+ // for(let i = 0; i < this._iterationsCount; i++) {
|
|
|
+ // this.sweepDown(graph, layering);
|
|
|
+ // this.sweepUp(graph, layering);
|
|
|
+ //
|
|
|
+ // const currentCrossingsCount = this.countTotalCrossings(graph, layering);
|
|
|
+ //
|
|
|
+ // if(currentCrossingsCount > crossingsCount)
|
|
|
+ // break;
|
|
|
+ //
|
|
|
+ // crossingsCount = currentCrossingsCount;
|
|
|
+ // }
|
|
|
+ // }
|
|
|
+ //
|
|
|
+ // private sweepDown(graph: Graph<Node, Edge<Node>>, layering: Layering<Node, Edge<Node>>) : void {
|
|
|
+ // const layers = layering.getLayers();
|
|
|
+ //
|
|
|
+ // for(let i = 0; i < layers.length; i++) {
|
|
|
+ // const currLayer = layers[i]!;
|
|
|
+ // currLayer.nodes = this.applyBarycenter(graph, layering, currLayer.nodes, "down");
|
|
|
+ // }
|
|
|
+ // }
|
|
|
+ //
|
|
|
+ // private sweepUp(graph: Graph<Node, Edge<Node>>, layering: Layering<Node, Edge<Node>>) : void {
|
|
|
+ // const layers = layering.getLayers();
|
|
|
+ //
|
|
|
+ // for(let i = layers.length - 1; i > 0; i--) {
|
|
|
+ // const currLayer = layers[i]!;
|
|
|
+ // currLayer.nodes = this.applyBarycenter(graph, layering, currLayer.nodes, "up");
|
|
|
+ // }
|
|
|
+ // }
|
|
|
+ //
|
|
|
+ // private applyBarycenter(graph: Graph<Node, Edge<Node>>, layering: Layering<Node, Edge<Node>>, nodeIds: Node[], direction: "up" | "down") : Node[] {
|
|
|
+ // const barycenterValues = nodeIds.map((node) => {
|
|
|
+ // const neighbors = direction === "down" ? graph.getNodeInputs(node) : graph.getNodeOutputs(node);
|
|
|
+ // if(neighbors.length === 0) {
|
|
|
+ // const currentPosition = layering.getPositionOf(node);
|
|
|
+ // return { node, value: currentPosition ?? Infinity };
|
|
|
+ // }
|
|
|
+ //
|
|
|
+ // const posistionSum = neighbors.reduce((sum, neighbor) => {
|
|
|
+ // const position = layering.getPositionOf(neighbor);
|
|
|
+ // return sum + (position ?? 0);
|
|
|
+ // }, 0);
|
|
|
+ //
|
|
|
+ // return { node, value: posistionSum / neighbors.length };
|
|
|
+ // });
|
|
|
+ //
|
|
|
+ // return barycenterValues.sort((a, b) => a.value - b.value).map((entry) => entry.node);
|
|
|
+ // }
|
|
|
+ //
|
|
|
+ // private countTotalCrossings(graph: Graph<Node, Edge<Node>>, layering: Layering<Node, Edge<Node>>) : number {
|
|
|
+ // const layers = layering.getLayers();
|
|
|
+ //
|
|
|
+ // let totalCrossings = 0;
|
|
|
+ //
|
|
|
+ // for(let i = 0; i < layers.length - 1; i++)
|
|
|
+ // totalCrossings += this.countCrossingsBetweenLayers(graph, layering, i, i + 1);
|
|
|
+ //
|
|
|
+ // return totalCrossings;
|
|
|
+ // }
|
|
|
+ //
|
|
|
+ // private countCrossingsBetweenLayers(graph: Graph<Node, Edge<Node>>, layering: Layering<Node, Edge<Node>>, upperLayerIndex: number, lowerLayerIndex: number) : number {
|
|
|
+ // const edges = graph.getEdges().filter((edge) => {
|
|
|
+ // const fromLayer = layering.getLayerOf(edge.getFrom());
|
|
|
+ // const toLayer = layering.getLayerOf(edge.getTo());
|
|
|
+ // return fromLayer === upperLayerIndex && toLayer === lowerLayerIndex;
|
|
|
+ // });
|
|
|
+ //
|
|
|
+ // let crossings = 0;
|
|
|
+ //
|
|
|
+ // for(let i = 0; i < edges.length; i++) {
|
|
|
+ // for(let j = i + 1; j < edges.length; j++) {
|
|
|
+ // const posU = layering.getPositionOf(edges[i]!.getFrom()) ?? 0;
|
|
|
+ // const posV = layering.getPositionOf(edges[i]!.getTo()) ?? 0;
|
|
|
+ // const posS = layering.getPositionOf(edges[j]!.getFrom()) ?? 0;
|
|
|
+ // const posT = layering.getPositionOf(edges[j]!.getTo()) ?? 0;
|
|
|
+ //
|
|
|
+ // if((posU < posS && posV > posT) || (posU > posS && posV < posT))
|
|
|
+ // crossings++;
|
|
|
+ // }
|
|
|
+ // }
|
|
|
+ //
|
|
|
+ // return crossings;
|
|
|
+ // }
|
|
|
}
|