2 Commits 9ab7af0ae6 ... 00c32fa2e5

Tác giả SHA1 Thông báo Ngày
  Pavel Zhigalov 00c32fa2e5 NEW: layer assignment step v0 2 tuần trước cách đây
  Pavel Zhigalov 9ab7af0ae6 NEW: layer assignment step v0 2 tuần trước cách đây

+ 1 - 3
src/index.ts

@@ -3,11 +3,9 @@ import JointJsonDeserializer from "./v1/io/deserialize/json/JointJsonDeserialize
 import CycleRemoveStep from "./v1/optimizer/siguiyama/CycleRemoveStep.js";
 import LayerAssignmentStep from "./v1/optimizer/siguiyama/LayerAssignmentStep.js";
 import SiguiyamaAlgorithm from "./v1/optimizer/siguiyama/SiguiyamaAlgorithm.js";
-import DefaultGraphService from "./v1/services/DefaultGraphService.js";
 
 const deserializer = new JointJsonDeserializer();
 const graph = deserializer.deserialize(String(readFileSync("./data/graph.json")));
-const graphService = new DefaultGraphService();
-const optimizer = new SiguiyamaAlgorithm().addStep(new CycleRemoveStep(graphService)).addStep(new LayerAssignmentStep(graphService));
+const optimizer = new SiguiyamaAlgorithm().addStep(new CycleRemoveStep()).addStep(new LayerAssignmentStep());
 
 optimizer.run(graph);

+ 8 - 0
src/v1/graph/Graph.ts

@@ -219,6 +219,14 @@ export default class Graph<TNode extends Node, TEdge extends Edge<TNode>> {
 		return outputs;
 	}
 
+	public isSourceNode(nodeId: TNode["id"]) : boolean {
+		return this.getNodeInputs(nodeId).length === 0;
+	}
+
+	public isSinkNode(nodeId: TNode["id"]) : boolean {
+		return this.getNodeOutputs(nodeId).length === 0;
+	}
+
 	private invalidateCache(): void {
 		this._cache = {};
 	}

+ 4 - 11
src/v1/optimizer/siguiyama/CycleRemoveStep.ts

@@ -2,7 +2,6 @@ import CycleRemoveStepError from "../../errors/optimizer/CycleRemoveStepError.js
 import Edge from "../../graph/Edge.js";
 import Graph from "../../graph/Graph.js";
 import Node from "../../graph/Node.js";
-import GraphService from "../../services/GraphService.js";
 import AlgorithmStep from "../AlgorithmStep.js";
 import { SiguiyamaContext } from "./SiguiyamaContext.js";
 
@@ -10,12 +9,6 @@ import { SiguiyamaContext } from "./SiguiyamaContext.js";
  * Greedy Cycle Removal Algoirthm
  */
 export default class CycleRemoveStep implements AlgorithmStep<SiguiyamaContext> {
-	private readonly _graphService: GraphService;
-
-	public constructor(graphService: GraphService) {
-		this._graphService = graphService;
-	}
-
 	run(context: SiguiyamaContext): void {
 		const { graph } = context;
 		if(!graph)
@@ -34,13 +27,13 @@ export default class CycleRemoveStep implements AlgorithmStep<SiguiyamaContext>
 		const feedbackSet: NonNullable<SiguiyamaContext["feedbackSet"]> = [];
 
 		for(const node of nodes) {
-			const isSource = this._graphService.isSourceNode(graph, node.id);
+			const isSource = graph.isSourceNode(node.id);
 			if(isSource) {
 				l.push(node);
 				continue;
 			}
 
-			const isSink = this._graphService.isSinkNode(graph, node.id);
+			const isSink = graph.isSinkNode(node.id);
 			if(isSink) {
 				r.unshift(node);
 				continue;
@@ -74,8 +67,8 @@ export default class CycleRemoveStep implements AlgorithmStep<SiguiyamaContext>
 	}
 
 	private calculateScore(graph: Graph<Node, Edge<Node>>, node: Node) : number {
-		const outDegree = this._graphService.getNodeOutDegree(graph, node.id);
-		const inDegree = this._graphService.getNodeInDegree(graph, node.id);
+		const outDegree = graph.getNodeOutputs(node.id).length;
+		const inDegree = graph.getNodeInputs(node.id).length;
 
 		return outDegree - inDegree;
 	}

+ 0 - 8
src/v1/optimizer/siguiyama/LayerAssignmentStep.ts

@@ -3,18 +3,10 @@ import Edge from "../../graph/Edge.js";
 import Graph from "../../graph/Graph.js";
 import Layering from "../../graph/layering/Layering.js";
 import Node from "../../graph/Node.js";
-import GraphService from "../../services/GraphService.js";
 import AlgorithmStep from "../AlgorithmStep.js";
 import { SiguiyamaContext } from "./SiguiyamaContext.js";
 
-// TODO
 export default class LayerAssignmentStep implements AlgorithmStep<SiguiyamaContext> {
-	private readonly _graphService: GraphService;
-
-	public constructor(graphService: GraphService) {
-		this._graphService = graphService;
-	}
-	
 	run(context: SiguiyamaContext): void {
 		const { graph, feedbackSet } = context;
 

+ 0 - 30
src/v1/services/DefaultGraphService.ts

@@ -1,30 +0,0 @@
-import Edge from "../graph/Edge.js";
-import Graph from "../graph/Graph.js";
-import Node from "../graph/Node.js";
-import GraphService from "./GraphService.js";
-
-export default class DefaultGraphService implements GraphService<Node, Edge<Node>, Graph<Node, Edge<Node>>> {
-	getNodeInputs(graph: Graph<Node, Edge<Node>>, nodeId: string): Node[] {
-		return graph.getNodeInputs(nodeId);
-	}
-
-	getNodeInDegree(graph: Graph<Node, Edge<Node>>, nodeId: string): number {
-		return this.getNodeInputs(graph, nodeId).length;
-	}
-
-	getNodeOutputs(graph: Graph<Node, Edge<Node>>, nodeId: string): Node[] {
-		return graph.getNodeOutputs(nodeId);
-	}
-
-	getNodeOutDegree(graph: Graph<Node, Edge<Node>>, nodeId: string): number {
-		return this.getNodeOutputs(graph, nodeId).length;
-	}
-
-	isSourceNode(graph: Graph<Node, Edge<Node>>, nodeId: string): boolean {
-		return this.getNodeInputs(graph, nodeId).length === 0;
-	}
-
-	isSinkNode(graph: Graph<Node, Edge<Node>>, nodeId: string): boolean {
-		return this.getNodeOutputs(graph, nodeId).length === 0;
-	}
-}

+ 0 - 12
src/v1/services/GraphService.ts

@@ -1,12 +0,0 @@
-import Edge from "../graph/Edge.js";
-import Graph from "../graph/Graph.js";
-import Node from "../graph/Node.js";
-
-export default interface GraphService<TNode extends Node = Node, TEdge extends Edge<TNode> = Edge<TNode>, TGraph extends Graph<TNode, TEdge> = Graph<TNode, TEdge>> {
-	getNodeInputs(graph: TGraph, nodeId: TNode["id"]) : TNode[];
-	getNodeInDegree(graph: TGraph, nodeId: TNode["id"]) : number;
-	getNodeOutputs(graph: TGraph, nodeId: TNode["id"]) : TNode[];
-	getNodeOutDegree(graph: TGraph, nodeId: TNode["id"]) : number;
-	isSourceNode(graph: TGraph, nodeId: TNode["id"]) : boolean;
-	isSinkNode(graph: TGraph, nodeId: TNode["id"]) : boolean;
-}