pddl-workspace
Version:
89 lines • 3.19 kB
JavaScript
;
/* --------------------------------------------------------------------------------------------
* Copyright (c) Jan Dolejsi. All rights reserved.
* Licensed under the MIT License. See License.txt in the project root for license information.
* ------------------------------------------------------------------------------------------ */
Object.defineProperty(exports, "__esModule", { value: true });
exports.DirectionalGraph = void 0;
/**
* Simple directional graph.
*/
class DirectionalGraph {
/**
* Constructor, optionally copy-constructor.
* @param verticesAndEdges optional list of vertex-edges tuples - use as a copy constructor to re-hydrate from de-serialized object
*/
constructor(verticesAndEdges) {
// vertices and edges stemming from them
this.verticesAndEdges = [];
if (verticesAndEdges) {
this.verticesAndEdges = verticesAndEdges;
}
}
static fromGraph(graph) {
return new DirectionalGraph(graph.verticesAndEdges);
}
/**
* Get all vertices.
*/
getVertices() {
return this.verticesAndEdges.map(tuple => tuple[0]);
}
/**
* Get all edges.
*/
getEdges() {
const edges = [];
this.verticesAndEdges.forEach(vertexEdges => {
const fromVertex = vertexEdges[0];
const connectedVertices = vertexEdges[1];
connectedVertices.forEach(toVertex => edges.push([fromVertex, toVertex]));
});
return edges;
}
addEdge(from, to) {
const fromVertex = this.verticesAndEdges.find(vertex => vertex[0] === from);
if (fromVertex) {
const edgesAlreadyInserted = fromVertex[1];
if (to && !edgesAlreadyInserted.includes(to)) {
edgesAlreadyInserted.push(to);
}
}
else {
const edges = to ? [to] : [];
this.verticesAndEdges.push([from, edges]);
}
if (to) {
this.addEdge(to, undefined);
}
return this;
}
getVerticesWithEdgesFrom(vertex) {
const verticesFound = this.verticesAndEdges.find(t => t[0] === vertex);
return verticesFound ? verticesFound[1] : undefined;
}
getVerticesWithEdgesTo(vertex) {
return this.verticesAndEdges
.filter(t => t[1].includes(vertex))
.map(t => t[0]);
}
getSubtreePointingTo(vertex) {
const vertices = this.getVerticesWithEdgesTo(vertex);
const verticesSubTree = vertices
.map(childVertex => this.getSubtreePointingTo(childVertex))
.reduce((x, y) => x.concat(y), []);
return vertices.concat(verticesSubTree);
}
getSubtreePointingFrom(vertex) {
const vertices = this.getVerticesWithEdgesFrom(vertex);
if (!vertices) {
return [];
}
const verticesSubTree = vertices
.map(childVertex => this.getSubtreePointingFrom(childVertex))
.reduce((x, y) => x.concat(y), []);
return vertices.concat(verticesSubTree);
}
}
exports.DirectionalGraph = DirectionalGraph;
//# sourceMappingURL=DirectionalGraph.js.map