Skip to content

Commit 243a49f

Browse files
Add methods on Graph to receive incoming, outgoing and attached edges
1 parent 5721e4c commit 243a49f

File tree

3 files changed

+194
-2
lines changed

3 files changed

+194
-2
lines changed

changelog.md

+8
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,11 @@
1+
# Version 0.4.0
2+
3+
## New Features
4+
5+
- added `getAttachedEdges(vertex: V)` method on `Graph`
6+
- added `getOutgoingEdges(vertex: V)` method on `Graph`
7+
- added `getIncomingEdges(vertex: V)` method on `Graph`
8+
19
# Version 0.3.1
210

311
## Improvements

src/models/Graph/Graph.ts

+28-2
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
1-
import { Vertex, vertexCompareTo, vertexEqual } from '../Vertex/Vertex/Vertex';
2-
import { Edge, edgeEqual } from '../Edge';
1+
import { Vertex, vertexCompareTo } from '../Vertex/Vertex/Vertex';
2+
import { Edge } from '../Edge';
33
import * as cloneDeep from 'lodash.clonedeep';
44
import { AdjacencyMatrix } from '../Matrix/AdjacencyMatrix';
55
import { VertexNotFoundError } from '../../Errors';
@@ -119,6 +119,32 @@ export class Graph<V extends Vertex, E extends Edge<V>> {
119119
return this.getAdjacencyList().getAdjacentVertices(vertex);
120120
}
121121

122+
getAttachedEdges(vertex: V): E[] {
123+
return this.getListOfEdges().filter(({vertexA, vertexB}) => {
124+
return vertexA.equals(vertex) || vertexB.equals(vertex);
125+
});
126+
}
127+
128+
getOutgoingEdges(vertex: V): E[] {
129+
return this.getListOfEdges().filter(({vertexA, vertexB, isDirected}) => {
130+
if(isDirected()) {
131+
return vertexA.equals(vertex)
132+
}
133+
134+
return vertexA.equals(vertex) || vertexB.equals(vertex);
135+
});
136+
}
137+
138+
getIncomingEdges(vertex: V): E[] {
139+
return this.getListOfEdges().filter(({vertexA, vertexB, isDirected}) => {
140+
if(isDirected()) {
141+
return vertexB.equals(vertex)
142+
}
143+
144+
return vertexA.equals(vertex) || vertexB.equals(vertex);
145+
});
146+
}
147+
122148
getChildVertices(vertex: V): V[] {
123149
const allEdges = this.getListOfEdges();
124150
const allVertices = this.getListOfVertices();
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,158 @@
1+
import {Graph} from "../Graph";
2+
import {NamedVertex} from "../../Vertex/NamedVertex/NamedVertex";
3+
import {DirectedEdge, Edge, UndirectedEdge} from "../../Edge";
4+
import expectEdgeListsAreEqual from "../../../../testUtil/expectEdgeListsAreEqual";
5+
6+
let graph: Graph<NamedVertex, Edge<NamedVertex>>;
7+
8+
const a = new NamedVertex('a');
9+
const b = new NamedVertex('b');
10+
const c = new NamedVertex('c');
11+
const d = new NamedVertex('d');
12+
const e = new NamedVertex('e');
13+
const f = new NamedVertex('f');
14+
const g = new NamedVertex('g');
15+
16+
const directedEdges = [
17+
new DirectedEdge(c, a),
18+
new DirectedEdge(c, b),
19+
new DirectedEdge(d, c),
20+
new DirectedEdge(e, c),
21+
new DirectedEdge(b, d),
22+
new DirectedEdge(d, b),
23+
new DirectedEdge(g, b),
24+
new DirectedEdge(g, d),
25+
];
26+
27+
const undirectedEdges = [
28+
new UndirectedEdge(a, b),
29+
new UndirectedEdge(c, f),
30+
new UndirectedEdge(c, g),
31+
new UndirectedEdge(a, e),
32+
new UndirectedEdge(f, g),
33+
];
34+
35+
describe('Test retrieving attached, incoming and outgoing edges for a vertex', () => {
36+
beforeEach(() => {
37+
graph = new Graph();
38+
graph.addVertex(a, b, c, d, e, f, g);
39+
});
40+
41+
/*
42+
* Attached
43+
*/
44+
45+
describe('g.getAttachedEdges(v)', () => {
46+
47+
it('works with a directed graph', () => {
48+
graph.addEdge(...directedEdges);
49+
const attachedEdges = graph.getAttachedEdges(c);
50+
expectEdgeListsAreEqual(attachedEdges, [
51+
new DirectedEdge(c, a),
52+
new DirectedEdge(c, b),
53+
new DirectedEdge(d, c),
54+
new DirectedEdge(e, c),
55+
]);
56+
});
57+
58+
it('works with an undirected graph', () => {
59+
graph.addEdge(...undirectedEdges);
60+
const attachedEdges = graph.getAttachedEdges(c);
61+
62+
expectEdgeListsAreEqual(attachedEdges, [
63+
new UndirectedEdge(c, f),
64+
new UndirectedEdge(c, g),
65+
]);
66+
});
67+
68+
it('works with a mixed direction graph', () => {
69+
graph.addEdge(...directedEdges, ...undirectedEdges);
70+
const attachedEdges = graph.getAttachedEdges(c);
71+
72+
expectEdgeListsAreEqual(attachedEdges, [
73+
new DirectedEdge(c, a),
74+
new DirectedEdge(c, b),
75+
new DirectedEdge(d, c),
76+
new DirectedEdge(e, c),
77+
new UndirectedEdge(c, f),
78+
new UndirectedEdge(c, g),
79+
]);
80+
});
81+
});
82+
83+
/*
84+
* Outgoing
85+
*/
86+
87+
describe('g.getOutgoingEdges(v)', () => {
88+
89+
it('works with a directed graph', () => {
90+
graph.addEdge(...directedEdges);
91+
const attachedEdges = graph.getOutgoingEdges(c);
92+
expectEdgeListsAreEqual(attachedEdges, [
93+
new DirectedEdge(c, a),
94+
new DirectedEdge(c, b),
95+
]);
96+
});
97+
98+
it('works with an undirected graph', () => {
99+
graph.addEdge(...undirectedEdges);
100+
const attachedEdges = graph.getOutgoingEdges(c);
101+
102+
expectEdgeListsAreEqual(attachedEdges, [
103+
new UndirectedEdge(c, f),
104+
new UndirectedEdge(c, g),
105+
]);
106+
});
107+
108+
it('works with a mixed direction graph', () => {
109+
graph.addEdge(...directedEdges, ...undirectedEdges);
110+
const attachedEdges = graph.getOutgoingEdges(c);
111+
112+
expectEdgeListsAreEqual(attachedEdges, [
113+
new DirectedEdge(c, a),
114+
new DirectedEdge(c, b),
115+
new UndirectedEdge(c, f),
116+
new UndirectedEdge(c, g),
117+
]);
118+
});
119+
});
120+
121+
/*
122+
* Incoming
123+
*/
124+
125+
describe('g.getIncomingEdges(v)', () => {
126+
127+
it('works with a directed graph', () => {
128+
graph.addEdge(...directedEdges);
129+
const attachedEdges = graph.getIncomingEdges(c);
130+
expectEdgeListsAreEqual(attachedEdges, [
131+
new DirectedEdge(d, c),
132+
new DirectedEdge(e, c),
133+
]);
134+
});
135+
136+
it('works with an undirected graph', () => {
137+
graph.addEdge(...undirectedEdges);
138+
const attachedEdges = graph.getIncomingEdges(c);
139+
140+
expectEdgeListsAreEqual(attachedEdges, [
141+
new UndirectedEdge(c, f),
142+
new UndirectedEdge(c, g),
143+
]);
144+
});
145+
146+
it('works with a mixed direction graph', () => {
147+
graph.addEdge(...directedEdges, ...undirectedEdges);
148+
const attachedEdges = graph.getIncomingEdges(c);
149+
150+
expectEdgeListsAreEqual(attachedEdges, [
151+
new DirectedEdge(d, c),
152+
new DirectedEdge(e, c),
153+
new UndirectedEdge(c, f),
154+
new UndirectedEdge(c, g),
155+
]);
156+
});
157+
});
158+
});

0 commit comments

Comments
 (0)