graph_matching 0.0.2 → 0.1.0

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.
Files changed (34) hide show
  1. checksums.yaml +4 -4
  2. data/.rubocop.yml +35 -0
  3. data/.rubocop_todo.yml +29 -256
  4. data/CHANGELOG.md +8 -2
  5. data/Rakefile +3 -3
  6. data/benchmark/mcm_bipartite/complete_bigraphs/benchmark.rb +1 -1
  7. data/benchmark/mcm_general/complete_graphs/benchmark.rb +1 -1
  8. data/benchmark/mwm_bipartite/complete_bigraphs/benchmark.rb +1 -1
  9. data/benchmark/mwm_bipartite/misc/calc_d2/benchmark.rb +1 -5
  10. data/benchmark/mwm_general/complete_graphs/benchmark.rb +2 -2
  11. data/benchmark/mwm_general/incomplete_graphs/benchmark.rb +6 -7
  12. data/graph_matching.gemspec +7 -11
  13. data/lib/graph_matching/algorithm/mcm_bipartite.rb +9 -8
  14. data/lib/graph_matching/algorithm/mcm_general.rb +2 -2
  15. data/lib/graph_matching/algorithm/mwm_bipartite.rb +25 -25
  16. data/lib/graph_matching/algorithm/mwm_general.rb +121 -117
  17. data/lib/graph_matching/algorithm/mwmg_delta_assertions.rb +47 -50
  18. data/lib/graph_matching/assertion.rb +4 -4
  19. data/lib/graph_matching/core_ext/set.rb +1 -1
  20. data/lib/graph_matching/graph/bigraph.rb +1 -1
  21. data/lib/graph_matching/graph/graph.rb +1 -1
  22. data/lib/graph_matching/graph/weighted.rb +11 -8
  23. data/lib/graph_matching/integer_vertexes.rb +2 -2
  24. data/lib/graph_matching/version.rb +1 -1
  25. data/lib/graph_matching/visualize.rb +5 -5
  26. data/profile/mwm_general/profile.rb +1 -1
  27. data/spec/graph_matching/algorithm/mcm_bipartite_spec.rb +1 -1
  28. data/spec/graph_matching/algorithm/mcm_general_spec.rb +1 -1
  29. data/spec/graph_matching/algorithm/mwm_bipartite_spec.rb +1 -1
  30. data/spec/graph_matching/algorithm/mwm_general_spec.rb +44 -41
  31. data/spec/graph_matching/graph/graph_spec.rb +4 -4
  32. data/spec/graph_matching/integer_vertexes_spec.rb +2 -2
  33. data/spec/spec_helper.rb +2 -2
  34. metadata +17 -17
@@ -19,27 +19,25 @@ module GraphMatching
19
19
  # > Check optimized delta2 against a trivial computation.
20
20
  # > (Van Rantwijk, mwmatching.py, line 580)
21
21
  def check_delta2
22
- (0 ... @nvertex).each do |v|
23
- if @label[@in_blossom[v]] == MWMGeneral::LBL_FREE
24
- bd = nil
25
- bk = nil
26
- @neighb_end[v].each do |p|
27
- k = p / 2 # Note: floor division
28
- w = @endpoint[p]
29
- if @label[@in_blossom[w]] == MWMGeneral::LBL_S
30
- d = slack(k)
31
- if bk.nil? || d < bd
32
- bk = k
33
- bd = d
34
- end
35
- end
36
- end
37
- option1 = bk.nil? && @best_edge[v].nil?
38
- option2 = !@best_edge[v].nil? && bd == slack(@best_edge[v])
39
- unless option1 || option2
40
- fail "Assertion failed: Free vertex #{v}"
22
+ (0...@nvertex).each do |v|
23
+ next unless @label[@in_blossom[v]] == MWMGeneral::LBL_FREE
24
+ bd = nil
25
+ bk = nil
26
+ @neighb_end[v].each do |p|
27
+ k = p / 2 # Note: floor division
28
+ w = @endpoint[p]
29
+ next unless @label[@in_blossom[w]] == MWMGeneral::LBL_S
30
+ d = slack(k)
31
+ if bk.nil? || d < bd
32
+ bk = k
33
+ bd = d
41
34
  end
42
35
  end
36
+ option1 = bk.nil? && @best_edge[v].nil?
37
+ option2 = !@best_edge[v].nil? && bd == slack(@best_edge[v])
38
+ unless option1 || option2
39
+ raise "Assertion failed: Free vertex #{v}"
40
+ end
43
41
  end
44
42
  end
45
43
 
@@ -50,43 +48,42 @@ module GraphMatching
50
48
  bd = nil
51
49
  tbk = nil
52
50
  tbd = nil
53
- (0 ... 2 * @nvertex).each do |b|
54
- if @blossom_parent[b].nil? && @label[b] == MWMGeneral::LBL_S
55
- blossom_leaves(b).each do |v|
56
- @neighb_end[v].each do |p|
57
- k = p / 2 # Note: floor division
58
- w = @endpoint[p]
59
- if @in_blossom[w] != b &&
60
- @label[@in_blossom[w]] == MWMGeneral::LBL_S
61
- d = slack(k)
62
- if bk.nil? || d < bd
63
- bk = k
64
- bd = d
65
- end
66
- end
67
- end
68
- end
69
- unless @best_edge[b].nil?
70
- i, j = @edges[@best_edge[b]].to_a
71
- unless @in_blossom[i] == b || @in_blossom[j] == b
72
- fail 'Assertion failed'
73
- end
74
- unless @in_blossom[i] != b || @in_blossom[j] != b
75
- fail 'Assertion failed'
76
- end
77
- unless @label[@in_blossom[i]] == MWMGeneral::LBL_S &&
78
- @label[@in_blossom[j]] == MWMGeneral::LBL_S
79
- fail 'Assertion failed'
51
+ (0...2 * @nvertex).each do |b|
52
+ next unless @blossom_parent[b].nil? && @label[b] == MWMGeneral::LBL_S
53
+ blossom_leaves(b).each do |v|
54
+ @neighb_end[v].each do |p|
55
+ k = p / 2 # Note: floor division
56
+ w = @endpoint[p]
57
+ unless @in_blossom[w] != b &&
58
+ @label[@in_blossom[w]] == MWMGeneral::LBL_S
59
+ next
80
60
  end
81
- if tbk.nil? || slack(@best_edge[b]) < tbd
82
- tbk = @best_edge[b]
83
- tbd = slack(@best_edge[b])
61
+ d = slack(k)
62
+ if bk.nil? || d < bd
63
+ bk = k
64
+ bd = d
84
65
  end
85
66
  end
86
67
  end
68
+ next if @best_edge[b].nil?
69
+ i, j = @edges[@best_edge[b]].to_a
70
+ unless @in_blossom[i] == b || @in_blossom[j] == b
71
+ raise 'Assertion failed'
72
+ end
73
+ unless @in_blossom[i] != b || @in_blossom[j] != b
74
+ raise 'Assertion failed'
75
+ end
76
+ unless @label[@in_blossom[i]] == MWMGeneral::LBL_S &&
77
+ @label[@in_blossom[j]] == MWMGeneral::LBL_S
78
+ raise 'Assertion failed'
79
+ end
80
+ if tbk.nil? || slack(@best_edge[b]) < tbd
81
+ tbk = @best_edge[b]
82
+ tbd = slack(@best_edge[b])
83
+ end
87
84
  end
88
85
  unless bd == tbd
89
- fail 'Assertion failed'
86
+ raise 'Assertion failed'
90
87
  end
91
88
  end
92
89
  end
@@ -14,27 +14,27 @@ module GraphMatching
14
14
 
15
15
  def eq(other)
16
16
  unless obj == other
17
- fail "Expected #{other}, got #{obj}"
17
+ raise "Expected #{other}, got #{obj}"
18
18
  end
19
19
  end
20
20
 
21
21
  def gte(other)
22
22
  unless obj >= other
23
- fail "Expected #{obj} to be >= #{other}"
23
+ raise "Expected #{obj} to be >= #{other}"
24
24
  end
25
25
  end
26
26
 
27
27
  # rubocop:disable Style/PredicateName
28
28
  def is_a(klass)
29
29
  unless obj.is_a?(klass)
30
- fail TypeError, "Expected #{klass}, got #{obj.class}"
30
+ raise TypeError, "Expected #{klass}, got #{obj.class}"
31
31
  end
32
32
  end
33
33
  # rubocop:enable Style/PredicateName
34
34
 
35
35
  def not_nil
36
36
  if obj.nil?
37
- fail "Unexpected nil"
37
+ raise 'Unexpected nil'
38
38
  end
39
39
  end
40
40
  end
@@ -16,7 +16,7 @@ unless Set.instance_methods.include?(:intersect?)
16
16
  # http://www.ruby-doc.org/stdlib-2.2.0/libdoc/set/rdoc/Set.html#method-i-intersect-3F
17
17
  def intersect?(set)
18
18
  unless set.is_a?(Set)
19
- fail ArgumentError, "value must be a set"
19
+ raise ArgumentError, 'value must be a set'
20
20
  end
21
21
  if size < set.size
22
22
  any? { |o| set.include?(o) }
@@ -28,7 +28,7 @@ module GraphMatching
28
28
  [Set.new, Set.new]
29
29
  else
30
30
  arrays = bipartite_sets
31
- fail NotBipartite if arrays.nil?
31
+ raise NotBipartite if arrays.nil?
32
32
  [Set.new(arrays[0]), Set.new(arrays[1])]
33
33
  end
34
34
  end
@@ -56,7 +56,7 @@ module GraphMatching
56
56
 
57
57
  def vertexes_must_be_integers
58
58
  return if vertices.none? { |v| !v.is_a?(Integer) }
59
- fail ArgumentError, 'All vertexes must be integers'
59
+ raise ArgumentError, 'All vertexes must be integers'
60
60
  end
61
61
  end
62
62
  end
@@ -44,7 +44,9 @@ module GraphMatching
44
44
  g = super(*weightless_edges.flatten)
45
45
  g.init_weights
46
46
  args.each do |edge|
47
- i, j, weight = edge[0] - 1, edge[1] - 1, edge[2]
47
+ i = edge[0] - 1
48
+ j = edge[1] - 1
49
+ weight = edge[2]
48
50
  g.weight[i][j] = weight
49
51
  g.weight[j][i] = weight
50
52
  end
@@ -56,7 +58,7 @@ module GraphMatching
56
58
  # (The first two represent the edge, the third, the weight)
57
59
  def assert_weighted_edges(ary)
58
60
  return if ary.is_a?(Array) && ary.all?(&method(:weighted_edge?))
59
- fail 'Invalid array of weighted edges'
61
+ raise 'Invalid array of weighted edges'
60
62
  end
61
63
 
62
64
  # `weighted_edge?` returns true if `e` is an array whose
@@ -83,8 +85,8 @@ module GraphMatching
83
85
  # clarity outweighs performance.
84
86
  def w(edge)
85
87
  i, j = edge
86
- fail ArgumentError, "Invalid edge: #{edge}" if i.nil? || j.nil?
87
- fail "Edge not found: #{edge}" unless has_edge?(*edge)
88
+ raise ArgumentError, "Invalid edge: #{edge}" if i.nil? || j.nil?
89
+ raise "Edge not found: #{edge}" unless has_edge?(*edge)
88
90
  init_weights if @weight.nil?
89
91
  @weight[i - 1][j - 1]
90
92
  end
@@ -94,14 +96,15 @@ module GraphMatching
94
96
  # graph with `.[]` is not convenient.
95
97
  def set_w(edge, weight)
96
98
  if edge[0].nil? || edge[1].nil?
97
- fail ArgumentError, "Invalid edge: #{edge}"
99
+ raise ArgumentError, "Invalid edge: #{edge}"
98
100
  end
99
101
  unless weight.is_a?(Integer)
100
- fail TypeError, "Edge weight must be integer"
102
+ raise TypeError, 'Edge weight must be integer'
101
103
  end
102
104
  init_weights if @weight.nil?
103
- i, j = edge[0] - 1, edge[1] - 1
104
- fail "Edge not found: #{edge}" unless has_edge?(*edge)
105
+ i = edge[0] - 1
106
+ j = edge[1] - 1
107
+ raise "Edge not found: #{edge}" unless has_edge?(*edge)
105
108
  @weight[i] ||= []
106
109
  @weight[j] ||= []
107
110
  @weight[i][j] = weight
@@ -10,7 +10,7 @@ module GraphMatching
10
10
  # original vertexes.
11
11
  #
12
12
  def self.to_integers(graph)
13
- fail ArgumentError unless graph.is_a?(RGL::MutableGraph)
13
+ raise ArgumentError unless graph.is_a?(RGL::MutableGraph)
14
14
  legend = {}
15
15
  reverse_legend = {}
16
16
  new_graph = graph.class.new
@@ -23,7 +23,7 @@ module GraphMatching
23
23
  target = reverse_legend[edge.target]
24
24
  new_graph.add_edge(source, target)
25
25
  end
26
- return new_graph, legend
26
+ [new_graph, legend]
27
27
  end
28
28
  end
29
29
  end
@@ -2,7 +2,7 @@
2
2
 
3
3
  # no-doc
4
4
  module GraphMatching
5
- VERSION = "0.0.2"
5
+ VERSION = '0.1.0'.freeze
6
6
 
7
7
  def self.gem_version
8
8
  ::Gem::Version.new(VERSION)
@@ -6,8 +6,8 @@ require 'rgl/rdot'
6
6
  module GraphMatching
7
7
  # Renders `GraphMatching::Graph` objects using `graphviz`.
8
8
  class Visualize
9
- TMP_DIR = '/tmp/graph_matching'
10
- USR_BIN_ENV = '/usr/bin/env'
9
+ TMP_DIR = '/tmp/graph_matching'.freeze
10
+ USR_BIN_ENV = '/usr/bin/env'.freeze
11
11
 
12
12
  attr_reader :graph
13
13
 
@@ -34,8 +34,8 @@ module GraphMatching
34
34
 
35
35
  def check_that_dot_is_installed
36
36
  return if dot_installed?
37
- $stderr.puts "Executable not found: dot"
38
- $stderr.puts "Please install graphviz"
37
+ $stderr.puts 'Executable not found: dot'
38
+ $stderr.puts 'Please install graphviz'
39
39
  exit(1)
40
40
  end
41
41
 
@@ -85,7 +85,7 @@ module GraphMatching
85
85
  def write_png(abs_path)
86
86
  _so, se, st = Open3.capture3("dot -T png > #{abs_path}", stdin_data: dot)
87
87
  return if st.success?
88
- $stderr.puts "Failed to generate .png"
88
+ $stderr.puts 'Failed to generate .png'
89
89
  $stderr.puts se
90
90
  exit(1)
91
91
  end
@@ -7,7 +7,7 @@ require 'ruby-prof'
7
7
 
8
8
  def complete_graph(n)
9
9
  g = GraphMatching::Graph::WeightedGraph.new
10
- n_edges = (1 .. n - 1).reduce(:+)
10
+ n_edges = (1..n - 1).reduce(:+)
11
11
  0.upto(n - 2) do |i|
12
12
  (i + 1).upto(n - 1) do |j|
13
13
  g.add_edge(i, j)
@@ -7,7 +7,7 @@ RSpec.describe GraphMatching::Algorithm::MCMBipartite do
7
7
 
8
8
  describe '.new' do
9
9
  it 'requires a Bigraph' do
10
- expect { described_class.new("banana") }.to raise_error(TypeError)
10
+ expect { described_class.new('banana') }.to raise_error(TypeError)
11
11
  end
12
12
  end
13
13
 
@@ -8,7 +8,7 @@ RSpec.describe GraphMatching::Algorithm::MCMGeneral do
8
8
 
9
9
  describe '.new' do
10
10
  it 'requires a Graph' do
11
- expect { described_class.new("banana") }.to raise_error(TypeError)
11
+ expect { described_class.new('banana') }.to raise_error(TypeError)
12
12
  end
13
13
  end
14
14
 
@@ -7,7 +7,7 @@ RSpec.describe GraphMatching::Algorithm::MWMBipartite do
7
7
 
8
8
  describe '.new' do
9
9
  it 'requires a WeightedBigraph' do
10
- expect { described_class.new("banana") }.to raise_error(TypeError)
10
+ expect { described_class.new('banana') }.to raise_error(TypeError)
11
11
  end
12
12
  end
13
13
 
@@ -7,7 +7,7 @@ RSpec.describe GraphMatching::Algorithm::MWMGeneral do
7
7
 
8
8
  describe '.new' do
9
9
  it 'requires a WeightedGraph' do
10
- expect { described_class.new("banana") }.to raise_error(TypeError)
10
+ expect { described_class.new('banana') }.to raise_error(TypeError)
11
11
  end
12
12
  end
13
13
 
@@ -22,14 +22,17 @@ RSpec.describe GraphMatching::Algorithm::MWMGeneral do
22
22
  [3, 4, 0]
23
23
  ]
24
24
  a = described_class.new(g)
25
- a.instance_variable_set(:@blossom_children, [
26
- nil,
27
- nil,
28
- nil,
29
- nil,
30
- nil,
31
- [2, 3, 4]
32
- ])
25
+ a.instance_variable_set(
26
+ :@blossom_children,
27
+ [
28
+ nil,
29
+ nil,
30
+ nil,
31
+ nil,
32
+ nil,
33
+ [2, 3, 4]
34
+ ]
35
+ )
33
36
  expect(a.send(:blossom_leaves, 0)).to eq([0])
34
37
  expect(a.send(:blossom_leaves, 4)).to eq([4])
35
38
  expect(a.send(:blossom_leaves, 5)).to eq([2, 3, 4])
@@ -104,14 +107,14 @@ RSpec.describe GraphMatching::Algorithm::MWMGeneral do
104
107
  end
105
108
  end
106
109
 
107
- it "passes Van Rantwijk test 12" do
110
+ it 'passes Van Rantwijk test 12' do
108
111
  g = graph_class[[1, 2, 10], [2, 3, 11]]
109
112
  m = described_class.new(g).match(false)
110
113
  expect(m).to match_edges [[2, 3]]
111
114
  expect(m.weight(g)).to eq(11)
112
115
  end
113
116
 
114
- it "passes Van Rantwijk test 13" do
117
+ it 'passes Van Rantwijk test 13' do
115
118
  g = graph_class[
116
119
  [1, 2, 5],
117
120
  [2, 3, 11],
@@ -122,7 +125,7 @@ RSpec.describe GraphMatching::Algorithm::MWMGeneral do
122
125
  expect(m.weight(g)).to eq(11)
123
126
  end
124
127
 
125
- it "passes Van Rantwijk test 14: max. cardinality" do
128
+ it 'passes Van Rantwijk test 14: max. cardinality' do
126
129
  g = graph_class[
127
130
  [1, 2, 5],
128
131
  [2, 3, 11],
@@ -133,7 +136,7 @@ RSpec.describe GraphMatching::Algorithm::MWMGeneral do
133
136
  expect(m.weight(g)).to eq(10)
134
137
  end
135
138
 
136
- it "passes Van Rantwijk test 15: floating-point weights" do
139
+ it 'passes Van Rantwijk test 15: floating-point weights' do
137
140
  g = graph_class[
138
141
  [1, 2, Math::PI],
139
142
  [2, 3, Math.exp(1)],
@@ -145,7 +148,7 @@ RSpec.describe GraphMatching::Algorithm::MWMGeneral do
145
148
  expect(m.weight(g)).to be_within(0.00001).of(Math.sqrt(2.0) + Math.exp(1))
146
149
  end
147
150
 
148
- it "passes Van Rantwijk test 16: negative weights" do
151
+ it 'passes Van Rantwijk test 16: negative weights' do
149
152
  g = graph_class[
150
153
  [1, 2, 2],
151
154
  [1, 3, -2],
@@ -161,8 +164,8 @@ RSpec.describe GraphMatching::Algorithm::MWMGeneral do
161
164
  expect(m.weight(g)).to eq(-3)
162
165
  end
163
166
 
164
- context "Van Rantwijk test 20: Uses S-blossom for augmentation" do
165
- it "passes test 20-A" do
167
+ context 'Van Rantwijk test 20: Uses S-blossom for augmentation' do
168
+ it 'passes test 20-A' do
166
169
  g = graph_class[
167
170
  [1, 2, 8],
168
171
  [1, 3, 9],
@@ -174,7 +177,7 @@ RSpec.describe GraphMatching::Algorithm::MWMGeneral do
174
177
  expect(m.weight(g)).to eq(15)
175
178
  end
176
179
 
177
- it "passes test 20-B" do
180
+ it 'passes test 20-B' do
178
181
  g = graph_class[
179
182
  [1, 2, 8],
180
183
  [1, 3, 9],
@@ -190,8 +193,8 @@ RSpec.describe GraphMatching::Algorithm::MWMGeneral do
190
193
  end
191
194
 
192
195
  # Van Rantwijk test 21
193
- context "create S-blossom, relabel as T-blossom, use for augmentation" do
194
- it "passes test 21-A" do
196
+ context 'create S-blossom, relabel as T-blossom, use for augmentation' do
197
+ it 'passes test 21-A' do
195
198
  g = graph_class[
196
199
  [1, 2, 9],
197
200
  [1, 3, 8],
@@ -204,7 +207,7 @@ RSpec.describe GraphMatching::Algorithm::MWMGeneral do
204
207
  expect(m).to match_edges [[1, 6], [2, 3], [4, 5]]
205
208
  end
206
209
 
207
- it "passes test 21-B" do
210
+ it 'passes test 21-B' do
208
211
  g = graph_class[
209
212
  [1, 2, 9],
210
213
  [1, 3, 8],
@@ -217,7 +220,7 @@ RSpec.describe GraphMatching::Algorithm::MWMGeneral do
217
220
  expect(m).to match_edges [[1, 6], [2, 3], [4, 5]]
218
221
  end
219
222
 
220
- it "passes test 21-C" do
223
+ it 'passes test 21-C' do
221
224
  g = graph_class[
222
225
  [1, 2, 9],
223
226
  [1, 3, 8],
@@ -231,8 +234,8 @@ RSpec.describe GraphMatching::Algorithm::MWMGeneral do
231
234
  end
232
235
  end
233
236
 
234
- context "Van Rantwijk test 22" do
235
- it "creates nested S-blossom, uses for augmentation" do
237
+ context 'Van Rantwijk test 22' do
238
+ it 'creates nested S-blossom, uses for augmentation' do
236
239
  g = graph_class[
237
240
  [1, 2, 9],
238
241
  [1, 3, 9],
@@ -247,8 +250,8 @@ RSpec.describe GraphMatching::Algorithm::MWMGeneral do
247
250
  end
248
251
  end
249
252
 
250
- context "Van Rantwijk test 23" do
251
- it "create S-blossom, relabel as S, include in nested S-blossom" do
253
+ context 'Van Rantwijk test 23' do
254
+ it 'create S-blossom, relabel as S, include in nested S-blossom' do
252
255
  g = graph_class[
253
256
  [1, 2, 10],
254
257
  [1, 7, 10],
@@ -265,8 +268,8 @@ RSpec.describe GraphMatching::Algorithm::MWMGeneral do
265
268
  end
266
269
  end
267
270
 
268
- context "Van Rantwijk test 24" do
269
- it "create nested S-blossom, augment, expand recursively" do
271
+ context 'Van Rantwijk test 24' do
272
+ it 'create nested S-blossom, augment, expand recursively' do
270
273
  g = graph_class[
271
274
  [1, 2, 8],
272
275
  [1, 3, 8],
@@ -284,8 +287,8 @@ RSpec.describe GraphMatching::Algorithm::MWMGeneral do
284
287
  end
285
288
  end
286
289
 
287
- context "Van Rantwijk test 25" do
288
- it "create S-blossom, relabel as T, expand" do
290
+ context 'Van Rantwijk test 25' do
291
+ it 'create S-blossom, relabel as T, expand' do
289
292
  g = graph_class[
290
293
  [1, 2, 23],
291
294
  [1, 5, 22],
@@ -301,8 +304,8 @@ RSpec.describe GraphMatching::Algorithm::MWMGeneral do
301
304
  end
302
305
  end
303
306
 
304
- context "Van Rantwijk test 26" do
305
- it "create nested S-blossom, relabel as T, expand" do
307
+ context 'Van Rantwijk test 26' do
308
+ it 'create nested S-blossom, relabel as T, expand' do
306
309
  g = graph_class[
307
310
  [1, 2, 19],
308
311
  [1, 3, 20],
@@ -319,8 +322,8 @@ RSpec.describe GraphMatching::Algorithm::MWMGeneral do
319
322
  end
320
323
  end
321
324
 
322
- context "Van Rantwijk test 30" do
323
- it "create blossom, relabel as T in more than one way, expand, augment" do
325
+ context 'Van Rantwijk test 30' do
326
+ it 'create blossom, relabel as T in more than one way, expand, augment' do
324
327
  g = graph_class[
325
328
  [1, 2, 45],
326
329
  [1, 5, 45],
@@ -338,8 +341,8 @@ RSpec.describe GraphMatching::Algorithm::MWMGeneral do
338
341
  end
339
342
  end
340
343
 
341
- context "Van Rantwijk test 31" do
342
- it "similar to test 30, but slightly different" do
344
+ context 'Van Rantwijk test 31' do
345
+ it 'similar to test 30, but slightly different' do
343
346
  g = graph_class[
344
347
  [1, 2, 45],
345
348
  [1, 5, 45],
@@ -357,10 +360,10 @@ RSpec.describe GraphMatching::Algorithm::MWMGeneral do
357
360
  end
358
361
  end
359
362
 
360
- context "Van Rantwijk test 32" do
363
+ context 'Van Rantwijk test 32' do
361
364
  # create blossom, relabel as T, expand such that a new
362
365
  # least-slack S-to-free edge is produced, augment
363
- it "see comment" do
366
+ it 'see comment' do
364
367
  g = graph_class[
365
368
  [1, 2, 45],
366
369
  [1, 5, 45],
@@ -378,11 +381,11 @@ RSpec.describe GraphMatching::Algorithm::MWMGeneral do
378
381
  end
379
382
  end
380
383
 
381
- context "Van Rantwijk test 33" do
384
+ context 'Van Rantwijk test 33' do
382
385
  # create nested blossom, relabel as T in more than one way,
383
386
  # expand outer blossom such that inner blossom ends up on
384
387
  # an augmenting path
385
- it "see comment" do
388
+ it 'see comment' do
386
389
  g = graph_class[
387
390
  [1, 2, 45],
388
391
  [1, 7, 45],
@@ -410,8 +413,8 @@ RSpec.describe GraphMatching::Algorithm::MWMGeneral do
410
413
  end
411
414
  end
412
415
 
413
- context "Van Rantwijk test 34: nest, relabel, expand" do
414
- it "create nested S-blossom, relabel as S, expand recursively" do
416
+ context 'Van Rantwijk test 34: nest, relabel, expand' do
417
+ it 'create nested S-blossom, relabel as S, expand recursively' do
415
418
  g = graph_class[
416
419
  [1, 2, 40],
417
420
  [1, 3, 40],