@@ -11,26 +11,24 @@ public extension Graph
11
11
*/
12
12
func makeMinimumEquivalentGraph( ) -> Graph < NodeID , NodeValue >
13
13
{
14
- var indirectReachabilities = Set < Edge > ( )
14
+ var nonEssentialEdges = Set < Edge > ( )
15
15
var consideredAncestorsHash = [ Node: Nodes] ( )
16
16
17
17
for sourceNode in sources
18
18
{
19
19
// TODO: keep track of visited nodes within each traversal from a source and ignore already visited nodes so we can't get hung up in cycles
20
20
21
- let reachabilities = findIndirectReachabilities ( around: sourceNode,
22
- reachedAncestors: [ ] ,
23
- consideredAncestorsHash: & consideredAncestorsHash)
24
-
25
- indirectReachabilities += reachabilities
21
+ nonEssentialEdges += findNonEssentialEdges ( around: sourceNode,
22
+ reachedAncestors: [ ] ,
23
+ consideredAncestorsHash: & consideredAncestorsHash)
26
24
}
27
25
28
- return copy ( excludedEdges: indirectReachabilities )
26
+ return copy ( excludedEdges: nonEssentialEdges )
29
27
}
30
28
31
- private func findIndirectReachabilities ( around node: Node ,
32
- reachedAncestors: Nodes ,
33
- consideredAncestorsHash: inout [ Node : Nodes ] ) -> Set < Edge >
29
+ private func findNonEssentialEdges ( around node: Node ,
30
+ reachedAncestors: Nodes ,
31
+ consideredAncestorsHash: inout [ Node : Nodes ] ) -> Set < Edge >
34
32
{
35
33
let consideredAncestors = consideredAncestorsHash [ node, default: Nodes ( ) ]
36
34
let ancestorsToConsider = reachedAncestors - consideredAncestors
@@ -43,7 +41,7 @@ public extension Graph
43
41
44
42
consideredAncestorsHash [ node, default: Set < Node > ( ) ] += ancestorsToConsider
45
43
46
- var indirectReachabilities = Set < Edge > ( )
44
+ var nonEssentialEdges = Set < Edge > ( )
47
45
48
46
// base case: add edges from all reached ancestors to all reachable neighbours of node
49
47
@@ -53,19 +51,22 @@ public extension Graph
53
51
{
54
52
for ancestor in ancestorsToConsider
55
53
{
56
- indirectReachabilities += Edge ( from: ancestor, to: descendant)
54
+ if let nonEssentialEdge = edge ( from: ancestor, to: descendant)
55
+ {
56
+ nonEssentialEdges += nonEssentialEdge
57
+ }
57
58
}
58
59
}
59
60
60
61
// recursive calls on descendants
61
62
62
63
for descendant in descendants
63
64
{
64
- indirectReachabilities += findIndirectReachabilities ( around: descendant,
65
- reachedAncestors: ancestorsToConsider + node,
66
- consideredAncestorsHash: & consideredAncestorsHash)
65
+ nonEssentialEdges += findNonEssentialEdges ( around: descendant,
66
+ reachedAncestors: ancestorsToConsider + node,
67
+ consideredAncestorsHash: & consideredAncestorsHash)
67
68
}
68
69
69
- return indirectReachabilities
70
+ return nonEssentialEdges
70
71
}
71
72
}
0 commit comments