Procházet zdrojové kódy

isAcyclic fix and direction in layer assignment

icestormikk před 1 měsícem
rodič
revize
624be1c8a7

+ 7 - 1
src/v1/graph/Graph.ts

@@ -55,7 +55,7 @@ export default class Graph<TNode extends Node, TEdge extends Edge<TNode>> {
 			}
 		}
 
-		return visitedNodesCount !== nodesCount;
+		return visitedNodesCount === nodesCount;
 	}
 
 	public getNodes() : TNode[] {
@@ -88,6 +88,8 @@ export default class Graph<TNode extends Node, TEdge extends Edge<TNode>> {
 
 		this._nodeMap.delete(nodeId);
 
+		this.buildAdjacencyList();
+
 		return this;
 	}
 
@@ -112,6 +114,8 @@ export default class Graph<TNode extends Node, TEdge extends Edge<TNode>> {
 
 		edge.subscribe(() => this.onEdgeChange(edge));
 
+		this.buildAdjacencyList();
+
 		return this;
 	}
 
@@ -121,6 +125,8 @@ export default class Graph<TNode extends Node, TEdge extends Edge<TNode>> {
 
 		this._edgeMap.delete(edgeId);
 
+		this.buildAdjacencyList();
+
 		return this;
 	}
 

+ 5 - 3
src/v1/optimizer/steps/LayerAssignmentStep.ts

@@ -34,7 +34,7 @@ export default class LayerAssignmentStep extends AlgorithmStep<SiguiyamaContext>
 		if(!edgeSubdivisions)
 			throw new LayerAssignmentStepError("Edge subdivisions information is undefined!")
 
-		if(graph.isAcyclic())
+		if(!graph.isAcyclic())
 			throw new LayerAssignmentStepError("Graph is acyclic, can not assign layers to an acyclic graph!");
 
 		const layering = this.longestPathAlgorithm(graph);
@@ -128,6 +128,8 @@ export default class LayerAssignmentStep extends AlgorithmStep<SiguiyamaContext>
 		graph.removeEdge(edgeId);
 
 		const fromLayer = layering.getLayerOf(edgeFrom)!;
+		const toLayer = layering.getLayerOf(edgeTo)!;
+		const direction = Math.sign(toLayer - fromLayer);
 		let previousNode = edgeFrom;
 
 		const segments: Edge<Node>[] = [];
@@ -137,7 +139,7 @@ export default class LayerAssignmentStep extends AlgorithmStep<SiguiyamaContext>
 			const dummy = new DummyNode(0, 0, edgeId, `dummy-${edgeId}-${i}`);
 
 			graph.addNode(dummy);
-			layering.assign(dummy, fromLayer - i);
+			layering.assign(dummy, fromLayer + direction * i);
 			dummies.push(dummy);
 
 			const segment = new Edge(previousNode, dummy, [], `${edgeId}_segment_${i}`);
@@ -159,4 +161,4 @@ export default class LayerAssignmentStep extends AlgorithmStep<SiguiyamaContext>
 
 		subdivisions.set(edgeId, { originalEdge: edge, segments, dummies });
 	}
-}
+}