Skip to content

Commit 4e672f8

Browse files
author
Chris Pilcher
authored
Merge pull request kodecocodes#150 from mdab121/GraphOutEdges
Graph: Out Edges from vertex
2 parents 056795e + 0ecf394 commit 4e672f8

File tree

4 files changed

+126
-7
lines changed

4 files changed

+126
-7
lines changed

Graph/Graph/AdjacencyListGraph.swift

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -26,11 +26,11 @@ public class AdjacencyListGraph<T where T: Equatable, T: Hashable>: AbstractGrap
2626

2727
private var adjacencyList: [EdgeList<T>] = []
2828

29-
public override init() {
29+
public required init() {
3030
super.init()
3131
}
3232

33-
public override init(fromGraph graph: AbstractGraph<T>) {
33+
public required init(fromGraph graph: AbstractGraph<T>) {
3434
super.init(fromGraph: graph)
3535
}
3636

@@ -107,6 +107,10 @@ public class AdjacencyListGraph<T where T: Equatable, T: Hashable>: AbstractGrap
107107
return nil
108108
}
109109

110+
public override func edgesFrom(sourceVertex: Vertex<T>) -> [Edge<T>] {
111+
return adjacencyList[sourceVertex.index].edges ?? []
112+
}
113+
110114
public override var description: String {
111115
get {
112116
var rows = [String]()

Graph/Graph/AdjacencyMatrixGraph.swift

Lines changed: 13 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -14,11 +14,11 @@ public class AdjacencyMatrixGraph<T where T: Equatable, T: Hashable>: AbstractGr
1414
private var adjacencyMatrix: [[Double?]] = []
1515
private var _vertices: [Vertex<T>] = []
1616

17-
public override init() {
17+
public required init() {
1818
super.init()
1919
}
2020

21-
public override init(fromGraph graph: AbstractGraph<T>) {
21+
public required init(fromGraph graph: AbstractGraph<T>) {
2222
super.init(fromGraph: graph)
2323
}
2424

@@ -84,6 +84,17 @@ public class AdjacencyMatrixGraph<T where T: Equatable, T: Hashable>: AbstractGr
8484
return adjacencyMatrix[sourceVertex.index][destinationVertex.index]
8585
}
8686

87+
public override func edgesFrom(sourceVertex: Vertex<T>) -> [Edge<T>] {
88+
var outEdges = [Edge<T>]()
89+
let fromIndex = sourceVertex.index
90+
for column in 0..<adjacencyMatrix.count {
91+
if let weight = adjacencyMatrix[fromIndex][column] {
92+
outEdges.append(Edge(from: sourceVertex, to: vertices[column], weight: weight))
93+
}
94+
}
95+
return outEdges
96+
}
97+
8798
public override var description: String {
8899
get {
89100
var grid = [String]()

Graph/Graph/Graph.swift

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -9,9 +9,9 @@ import Foundation
99

1010
public class AbstractGraph<T where T: Equatable, T: Hashable>: CustomStringConvertible {
1111

12-
public init() {}
12+
public required init() {}
1313

14-
public init(fromGraph graph: AbstractGraph<T>) {
14+
public required init(fromGraph graph: AbstractGraph<T>) {
1515
for edge in graph.edges {
1616
let from = createVertex(edge.from.data)
1717
let to = createVertex(edge.to.data)
@@ -56,4 +56,7 @@ public class AbstractGraph<T where T: Equatable, T: Hashable>: CustomStringConve
5656
fatalError("abstract function called")
5757
}
5858

59+
public func edgesFrom(sourceVertex: Vertex<T>) -> [Edge<T>] {
60+
fatalError("abstract function called")
61+
}
5962
}

Graph/GraphTests/GraphTests.swift

Lines changed: 102 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -53,5 +53,106 @@ class GraphTests: XCTestCase {
5353
XCTAssertEqual(graph.vertices.count, 1, "Graph should only contain one vertex after trying to create two vertices with identical data")
5454
}
5555
}
56-
56+
57+
func testEdgesFromReturnsCorrectEdgeInSingleEdgeDirecedGraphWithType(graphType: AbstractGraph<Int>.Type) {
58+
let graph = graphType.init()
59+
60+
let a = graph.createVertex(1)
61+
let b = graph.createVertex(2)
62+
63+
graph.addDirectedEdge(a, to: b, withWeight: 1.0)
64+
65+
let edgesFromA = graph.edgesFrom(a)
66+
let edgesFromB = graph.edgesFrom(b)
67+
68+
XCTAssertEqual(edgesFromA.count, 1)
69+
XCTAssertEqual(edgesFromB.count, 0)
70+
71+
XCTAssertEqual(edgesFromA.first?.to, b)
72+
}
73+
74+
func testEdgesFromReturnsCorrectEdgeInSingleEdgeUndirectedGraphWithType(graphType: AbstractGraph<Int>.Type) {
75+
let graph = graphType.init()
76+
77+
let a = graph.createVertex(1)
78+
let b = graph.createVertex(2)
79+
80+
graph.addUndirectedEdge((a, b), withWeight: 1.0)
81+
82+
let edgesFromA = graph.edgesFrom(a)
83+
let edgesFromB = graph.edgesFrom(b)
84+
85+
XCTAssertEqual(edgesFromA.count, 1)
86+
XCTAssertEqual(edgesFromB.count, 1)
87+
88+
XCTAssertEqual(edgesFromA.first?.to, b)
89+
XCTAssertEqual(edgesFromB.first?.to, a)
90+
}
91+
92+
func testEdgesFromReturnsNoEdgesInNoEdgeGraphWithType(graphType: AbstractGraph<Int>.Type) {
93+
let graph = graphType.init()
94+
95+
let a = graph.createVertex(1)
96+
let b = graph.createVertex(2)
97+
98+
XCTAssertEqual(graph.edgesFrom(a).count, 0)
99+
XCTAssertEqual(graph.edgesFrom(b).count, 0)
100+
}
101+
102+
func testEdgesFromReturnsCorrectEdgesInBiggerGraphInDirectedGraphWithType(graphType: AbstractGraph<Int>.Type) {
103+
let graph = graphType.init()
104+
let verticesCount = 100
105+
var vertices: [Vertex<Int>] = []
106+
107+
for i in 0..<verticesCount {
108+
vertices.append(graph.createVertex(i))
109+
}
110+
111+
for i in 0..<verticesCount {
112+
for j in i+1..<verticesCount {
113+
graph.addDirectedEdge(vertices[i], to: vertices[j], withWeight: 1)
114+
}
115+
}
116+
117+
for i in 0..<verticesCount {
118+
let outEdges = graph.edgesFrom(vertices[i])
119+
let toVertices = outEdges.map {return $0.to}
120+
XCTAssertEqual(outEdges.count, verticesCount - i - 1)
121+
for j in i+1..<verticesCount {
122+
XCTAssertTrue(toVertices.contains(vertices[j]))
123+
}
124+
}
125+
}
126+
127+
func testEdgesFromReturnsCorrectEdgeInSingleEdgeDirecedMatrixGraph() {
128+
testEdgesFromReturnsCorrectEdgeInSingleEdgeDirecedGraphWithType(AdjacencyMatrixGraph<Int>)
129+
}
130+
131+
func testEdgesFromReturnsCorrectEdgeInSingleEdgeUndirectedMatrixGraph() {
132+
testEdgesFromReturnsCorrectEdgeInSingleEdgeUndirectedGraphWithType(AdjacencyMatrixGraph<Int>)
133+
}
134+
135+
func testEdgesFromReturnsNoInNoEdgeMatrixGraph() {
136+
testEdgesFromReturnsNoEdgesInNoEdgeGraphWithType(AdjacencyMatrixGraph<Int>)
137+
}
138+
139+
func testEdgesFromReturnsCorrectEdgesInBiggerGraphInDirectedMatrixGraph() {
140+
testEdgesFromReturnsCorrectEdgesInBiggerGraphInDirectedGraphWithType(AdjacencyMatrixGraph<Int>)
141+
}
142+
143+
func testEdgesFromReturnsCorrectEdgeInSingleEdgeDirecedListGraph() {
144+
testEdgesFromReturnsCorrectEdgeInSingleEdgeDirecedGraphWithType(AdjacencyListGraph<Int>)
145+
}
146+
147+
func testEdgesFromReturnsCorrectEdgeInSingleEdgeUndirectedListGraph() {
148+
testEdgesFromReturnsCorrectEdgeInSingleEdgeUndirectedGraphWithType(AdjacencyListGraph<Int>)
149+
}
150+
151+
func testEdgesFromReturnsNoInNoEdgeListGraph() {
152+
testEdgesFromReturnsNoEdgesInNoEdgeGraphWithType(AdjacencyListGraph<Int>)
153+
}
154+
155+
func testEdgesFromReturnsCorrectEdgesInBiggerGraphInDirectedListGraph() {
156+
testEdgesFromReturnsCorrectEdgesInBiggerGraphInDirectedGraphWithType(AdjacencyListGraph<Int>)
157+
}
57158
}

0 commit comments

Comments
 (0)