graphunk 0.5.1 → 0.5.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 9ff0347b661119632199445c609f01d8fd07d9fc
4
- data.tar.gz: 935c3b73afa756a87f2da992bbd42d82d547af75
3
+ metadata.gz: 4679baf01a1d4c718afdf767d902cc84a707721e
4
+ data.tar.gz: 0321ab012c5fba8ae85d33c37e6f9e58e9aac334
5
5
  SHA512:
6
- metadata.gz: b955f831aa123e020487a7ae68d31d0f7907788f570f051994c4542365cff75b60c72fa114dfc839381e9409325de61ef49a52c8bdde44dd83f20b2b963722ae
7
- data.tar.gz: b750d42d89a06b7acb63126ed98d00e27d71a618608acc502c036657e177305a883ce15a017426ade67863a8a18214f48267deb3f7753f8c2e83942d8c70f77a
6
+ metadata.gz: a918a86dad048a85b9300ab14f781ed8b313fcd433348ea7660eeecfaf40c40700681196c9316d0a2b295004e8042adb82b6d78e36204d2bafa102feeca47eab
7
+ data.tar.gz: 05bd5782911aeb7c4159dc6cb1d21eddb70944a86081dedf6c254245bf23cae8204f33dc82123dda3aefd50ea2d1a63395f34120759afa5b3ba32528f77fd126
@@ -105,5 +105,28 @@ module Graphunk
105
105
  def topological_sort
106
106
  dfs.sort_by { |vertex, times| times[:finish] }.map(&:first).reverse
107
107
  end
108
+
109
+ def transitive?
110
+ transitive = true
111
+ vertices.each do |vertex|
112
+ reachable_by_two_edges(vertex).each do |reachable|
113
+ transitive = false unless neighbors_of_vertex(vertex).include?(reachable)
114
+ end
115
+ end
116
+ transitive
117
+ end
118
+
119
+ private
120
+
121
+ def reachable_by_two_edges(start)
122
+ reachable_by_two = []
123
+ reachable_by_one = neighbors_of_vertex(start)
124
+ reachable_by_one.each do |v|
125
+ neighbors_of_vertex(v).each do |u|
126
+ reachable_by_two << u
127
+ end
128
+ end
129
+ reachable_by_two
130
+ end
108
131
  end
109
132
  end
@@ -20,6 +20,22 @@ module Graphunk
20
20
  end
21
21
  end
22
22
 
23
+ def degree(vertex)
24
+ neighbors_of_vertex(vertex).count
25
+ end
26
+
27
+ def adjacent_edges?(first_edge, second_edge)
28
+ adjacent_edges(first_edge).include? second_edge
29
+ end
30
+
31
+ def adjacent_edges(v, u)
32
+ if edge_exists?(v, u)
33
+ edges.select { |edge| edge.include?(v) || edge.include?(u) } - [[v,u]]
34
+ else
35
+ raise ArgumentError, "That edge does not exist in the graph"
36
+ end
37
+ end
38
+
23
39
  def lexicographic_bfs
24
40
  sets = [vertices]
25
41
  output_vertices = []
@@ -63,7 +79,7 @@ module Graphunk
63
79
  def chordal?
64
80
  chordal = true
65
81
  (lexicographic_ordering = lexicographic_bfs.reverse).each_with_index do |v, i|
66
- successors_of_v = lexicographic_ordering[i, lexicographic_ordering.size]
82
+ successors_of_v = lexicographic_ordering[i..-1]
67
83
  unless clique?([v] | (neighbors_of_vertex(v) & successors_of_v))
68
84
  chordal = false
69
85
  break
@@ -116,5 +132,66 @@ module Graphunk
116
132
 
117
133
  true
118
134
  end
135
+
136
+ def comparability?
137
+ assign_orientation
138
+ end
139
+
140
+ def transitive_orientation
141
+ assign_orientation(true)
142
+ end
143
+
144
+ private
145
+
146
+ def assign_orientation(return_graph = false)
147
+ transitive_orientation = Graphunk::DirectedGraph.new
148
+ transitive_orientation.add_vertices(*vertices)
149
+
150
+ unconsidered_edges = edges
151
+
152
+ transitive = true
153
+
154
+ until unconsidered_edges.empty?
155
+ considered_edge = unconsidered_edges.first
156
+ unconsidered_edges.delete(considered_edge)
157
+
158
+ transitive_orientation.add_edge(considered_edge.first, considered_edge.last)
159
+
160
+ explore = lambda do |edge|
161
+ if unconsidered_edges.include? edge
162
+ adjacent_edges(edge.first, edge.last).each do |adjacent_edge|
163
+ next if unconsidered_edges.include? adjacent_edge
164
+
165
+ shared_vertex = adjacent_edge.select { |vertex| edge.include? vertex }.first
166
+ unshared_edge_vertex = edge.reject { |vertex| adjacent_edge.include? vertex }.first
167
+ unshared_adjacent_edge_vertex = adjacent_edge.reject { |vertex| edge.include? vertex }.first
168
+
169
+ unless edge_exists?(unshared_edge_vertex, unshared_adjacent_edge_vertex)
170
+ if transitive_orientation.edge_exists?(shared_vertex, unshared_adjacent_edge_vertex)
171
+ transitive = false if transitive_orientation.edge_exists?(unshared_edge_vertex, shared_vertex)
172
+ transitive_orientation.add_edge(shared_vertex, unshared_edge_vertex) unless transitive_orientation.edge_exists?(shared_vertex, unshared_edge_vertex)
173
+ unconsidered_edges.delete(order_vertices(shared_vertex, unshared_edge_vertex))
174
+ else
175
+ transitive = false if transitive_orientation.edge_exists?(shared_vertex, unshared_edge_vertex)
176
+ transitive_orientation.add_edge(unshared_edge_vertex, shared_vertex) unless transitive_orientation.edge_exists?(unshared_edge_vertex, shared_vertex)
177
+ unconsidered_edges.delete(order_vertices(shared_vertex, unshared_edge_vertex))
178
+ end
179
+
180
+ adjacent_edges(edge.first, edge.last).each { |neighbor| explore.call neighbor }
181
+ end
182
+ end
183
+ end
184
+ end
185
+
186
+ adjacent_edges(considered_edge.first, considered_edge.last).each { |neighbor_edge| explore.call neighbor_edge }
187
+ end
188
+
189
+ if transitive && return_graph
190
+ transitive_orientation
191
+ else
192
+ transitive
193
+ end
194
+ end
195
+
119
196
  end
120
197
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: graphunk
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.5.1
4
+ version: 0.5.2
5
5
  platform: ruby
6
6
  authors:
7
7
  - Evan Hemsley
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2014-03-16 00:00:00.000000000 Z
11
+ date: 2014-04-02 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: rspec