contrek 1.4.5 → 1.4.7

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 (46) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +6 -0
  3. data/Gemfile.lock +1 -1
  4. data/README.md +28 -9
  5. data/ext/cpp_polygon_finder/PolygonFinder/src/Tests.cpp +1 -1
  6. data/ext/cpp_polygon_finder/PolygonFinder/src/polygon/finder/FinderUtils.cpp +1 -0
  7. data/ext/cpp_polygon_finder/PolygonFinder/src/polygon/finder/Node.cpp +23 -26
  8. data/ext/cpp_polygon_finder/PolygonFinder/src/polygon/finder/Node.h +2 -2
  9. data/ext/cpp_polygon_finder/PolygonFinder/src/polygon/finder/NodeCluster.cpp +7 -4
  10. data/ext/cpp_polygon_finder/PolygonFinder/src/polygon/finder/NodeCluster.h +1 -1
  11. data/ext/cpp_polygon_finder/PolygonFinder/src/polygon/finder/Polygon.h +1 -0
  12. data/ext/cpp_polygon_finder/PolygonFinder/src/polygon/finder/PolygonFinder.cpp +24 -11
  13. data/ext/cpp_polygon_finder/PolygonFinder/src/polygon/finder/PolygonFinder.h +68 -1
  14. data/ext/cpp_polygon_finder/PolygonFinder/src/polygon/finder/concurrent/Cluster.cpp +1 -1
  15. data/ext/cpp_polygon_finder/PolygonFinder/src/polygon/finder/concurrent/Cursor.cpp +8 -2
  16. data/ext/cpp_polygon_finder/PolygonFinder/src/polygon/finder/concurrent/Finder.cpp +3 -0
  17. data/ext/cpp_polygon_finder/PolygonFinder/src/polygon/finder/concurrent/GeoJsonStreamingMerger.h +3 -5
  18. data/ext/cpp_polygon_finder/PolygonFinder/src/polygon/finder/concurrent/Merger.cpp +11 -30
  19. data/ext/cpp_polygon_finder/PolygonFinder/src/polygon/finder/concurrent/Merger.h +3 -3
  20. data/ext/cpp_polygon_finder/PolygonFinder/src/polygon/finder/concurrent/MergerValidator.cpp +104 -0
  21. data/ext/cpp_polygon_finder/PolygonFinder/src/polygon/finder/concurrent/MergerValidator.h +35 -0
  22. data/ext/cpp_polygon_finder/PolygonFinder/src/polygon/finder/concurrent/Polyline.cpp +3 -2
  23. data/ext/cpp_polygon_finder/PolygonFinder/src/polygon/finder/concurrent/Polyline.h +3 -1
  24. data/ext/cpp_polygon_finder/PolygonFinder/src/polygon/finder/concurrent/Shape.cpp +1 -0
  25. data/ext/cpp_polygon_finder/PolygonFinder/src/polygon/finder/concurrent/ShapePool.cpp +2 -2
  26. data/ext/cpp_polygon_finder/PolygonFinder/src/polygon/finder/concurrent/ShapePool.h +1 -1
  27. data/ext/cpp_polygon_finder/PolygonFinder/src/polygon/finder/concurrent/Tile.cpp +19 -21
  28. data/ext/cpp_polygon_finder/cpp_polygon_finder.cpp +11 -3
  29. data/lib/contrek/cpp/cpp_geo_json_concurrent_streaming_merger.rb +2 -2
  30. data/lib/contrek/cpp/cpp_result.rb +2 -1
  31. data/lib/contrek/finder/concurrent/cluster.rb +1 -1
  32. data/lib/contrek/finder/concurrent/cursor.rb +3 -1
  33. data/lib/contrek/finder/concurrent/finder.rb +2 -1
  34. data/lib/contrek/finder/concurrent/geo_json_streaming_merger.rb +3 -4
  35. data/lib/contrek/finder/concurrent/merger.rb +6 -25
  36. data/lib/contrek/finder/concurrent/merger_validator.rb +96 -0
  37. data/lib/contrek/finder/concurrent/polyline.rb +3 -2
  38. data/lib/contrek/finder/concurrent/shape.rb +2 -1
  39. data/lib/contrek/finder/concurrent/streaming_merger.rb +1 -1
  40. data/lib/contrek/finder/concurrent/tile.rb +9 -3
  41. data/lib/contrek/finder/node.rb +13 -23
  42. data/lib/contrek/finder/node_cluster.rb +17 -5
  43. data/lib/contrek/finder/polygon_finder.rb +29 -1
  44. data/lib/contrek/version.rb +1 -1
  45. data/lib/contrek.rb +1 -0
  46. metadata +4 -1
@@ -6,7 +6,7 @@ module Contrek
6
6
  include Listable
7
7
 
8
8
  attr_reader :min_x, :max_x, :y, :name, :tangs_sequence, :tangs_count, :data_pointer,
9
- :upper_start, :upper_end, :lower_start, :lower_end
9
+ :upper_start, :upper_end, :lower_start, :lower_end, :class_id
10
10
  attr_accessor :track, :abs_x_index, :outer_index, :inner_index, :inner_left_index, :inner_right_index
11
11
 
12
12
  T_UP = -1
@@ -27,8 +27,9 @@ module Contrek
27
27
  OUTER = 0
28
28
  INNER = 1
29
29
 
30
- def initialize(cluster, min_x, max_x, y, name, connectivity_offset = 0)
30
+ def initialize(cluster, min_x, max_x, y, name, connectivity_offset = 0, class_id = 0)
31
31
  @name = name
32
+ @class_id = class_id
32
33
  @min_x = min_x
33
34
  @max_x = max_x + 1
34
35
  @y = y
@@ -37,8 +38,6 @@ module Contrek
37
38
  @track = 0
38
39
  @abs_x_index = 0
39
40
  @data_pointer = cluster.lists.get_data_pointer
40
- @up_indexer = 0
41
- @down_indexer = 0
42
41
  @outer_index = -1
43
42
  @inner_index = -1
44
43
  @inner_left_index = -1
@@ -81,11 +80,8 @@ module Contrek
81
80
  end
82
81
 
83
82
  def my_next(last, versus, mode)
84
- last_node_index = if last.y < y
85
- last.abs_x_index + @up_indexer
86
- else
87
- @down_indexer - last.abs_x_index
88
- end
83
+ virtual_index = (last.y < y) ? -(last.abs_x_index + 1) : last.abs_x_index
84
+ last_node_index = @tangs_sequence.index(virtual_index)
89
85
 
90
86
  case mode
91
87
  when :outer
@@ -117,13 +113,8 @@ module Contrek
117
113
  end
118
114
 
119
115
  def coords_entering_to(enter_to, enter_mode, tracking)
120
- enter_to_index = if enter_to.y < y
121
- enter_to.abs_x_index + @up_indexer
122
- else
123
- @down_indexer - enter_to.abs_x_index
124
- end
116
+ tg_index = (enter_to.y < y) ? -(enter_to.abs_x_index + 1) : enter_to.abs_x_index
125
117
 
126
- tg_index = @tangs_sequence[enter_to_index]
127
118
  if tg_index < 0
128
119
  node_up = @cluster.vert_nodes[y + T_UP][-(tg_index + 1)]
129
120
  if enter_mode == :a
@@ -166,20 +157,19 @@ module Contrek
166
157
 
167
158
  def precalc_tangs_sequences(cluster:)
168
159
  @tangs_sequence = []
169
- @up_indexer = -cluster.vert_nodes[@y + T_UP][@upper_start].abs_x_index if @upper_end >= 0
170
160
  if @upper_end >= 0
171
161
  (@upper_start..@upper_end).each do |upper_pos|
172
- @tangs_sequence << -(upper_pos + 1)
162
+ if cluster.vert_nodes[@y + T_UP][upper_pos].class_id == class_id
163
+ @tangs_sequence << -(upper_pos + 1)
164
+ end
173
165
  end
174
166
  end
175
- if @lower_end >= 0
176
- lower_size = (@lower_end >= 0) ? (@lower_end - @lower_start + 1) : 0
177
- upper_size = (@upper_end >= 0) ? (@upper_end - @upper_start + 1) : 0
178
- @down_indexer = (cluster.vert_nodes[@y + T_DOWN][@lower_start].abs_x_index + lower_size + upper_size - 1)
179
- end
167
+
180
168
  if @lower_end >= 0
181
169
  @lower_end.downto(@lower_start).each do |lower_pos|
182
- @tangs_sequence << lower_pos
170
+ if cluster.vert_nodes[@y + T_DOWN][lower_pos].class_id == class_id
171
+ @tangs_sequence << lower_pos
172
+ end
183
173
  end
184
174
  end
185
175
  @tangs_count = tangs_sequence.size
@@ -57,6 +57,8 @@ module Contrek
57
57
  versus = @options[:versus]
58
58
  inner_v = VERSUS_INVERTER[versus]
59
59
  index_order = 0
60
+ multiclass = @options[:multiclass]
61
+
60
62
  while @root_nodes.size > 0
61
63
  root_node = @root_nodes.shift
62
64
 
@@ -110,7 +112,12 @@ module Contrek
110
112
  draw_sequence(bitmap, "X") unless bitmap.nil?
111
113
 
112
114
  if @sequence_coords.any?
113
- @polygons << {outer: @sequence_coords, inner: [], bounds: (bounds.to_h if @options[:bounds])}.compact
115
+ @polygons << {
116
+ outer: @sequence_coords,
117
+ inner: [],
118
+ bounds: (bounds.to_h if @options[:bounds]),
119
+ class: (root_node.class_id if multiclass)
120
+ }.compact
114
121
  @sequences << @plot_sequence
115
122
 
116
123
  @count = 0
@@ -332,6 +339,7 @@ module Contrek
332
339
  end
333
340
 
334
341
  def add_node(node, offset)
342
+ multiclass = options[:multiclass]
335
343
  @nodes += 1
336
344
  node.abs_x_index = @vert_nodes[node.y].size
337
345
 
@@ -348,15 +356,19 @@ module Contrek
348
356
  up_node = up_nodes[index]
349
357
  if ((up_node.max_x - 1) + offset) >= node.min_x
350
358
  if (up_node.min_x - offset) <= (node.max_x - 1)
351
- node.add_intersection(up_node, index)
352
- up_node.add_intersection(node, node.abs_x_index)
359
+ unless multiclass && node.class_id != up_node.class_id
360
+ node.add_intersection(up_node, index)
361
+ up_node.add_intersection(node, node.abs_x_index)
362
+ end
353
363
  end
354
364
  return if (index += 1) == up_nodes_count
355
365
  loop do
356
366
  up_node = up_nodes[index]
357
367
  if (up_node.min_x - offset) <= (node.max_x - 1)
358
- node.add_intersection(up_node, index)
359
- up_node.add_intersection(node, node.abs_x_index)
368
+ unless multiclass && node.class_id != up_node.class_id
369
+ node.add_intersection(up_node, index)
370
+ up_node.add_intersection(node, node.abs_x_index)
371
+ end
360
372
  else
361
373
  return
362
374
  end
@@ -21,7 +21,7 @@ module Contrek
21
21
 
22
22
  # 1 finds matching blocks
23
23
  @reports[:scan] = Benchmark.measure do
24
- scan
24
+ @options[:multiclass] ? multiclass_scan : scan
25
25
  end
26
26
 
27
27
  # 2 builds relational spatially tree map
@@ -129,6 +129,34 @@ module Contrek
129
129
  end
130
130
  end
131
131
 
132
+ def multiclass_scan
133
+ offset = (@node_cluster.options[:connectivity] == 8) ? 1 : 0
134
+ current_color = nil
135
+ min_x = start_x
136
+ current_y = nil
137
+ last_x = end_x - 1
138
+
139
+ @source_bitmap.scan(start_x: start_x, end_x: end_x, end_y: @processing_height) do |x, y, color|
140
+ if current_y != y || (current_color && color != current_color)
141
+ unless current_color.nil?
142
+ Contrek::Finder::Node.new(@node_cluster, min_x, ((current_y == y) ? x - 1 : last_x), current_y, current_color, offset, current_color.ord)
143
+ end
144
+ min_x = x if current_y == y
145
+ end
146
+
147
+ if current_y != y
148
+ current_y = y
149
+ min_x = x
150
+ end
151
+
152
+ current_color = color
153
+ if x == last_x && current_color
154
+ Contrek::Finder::Node.new(@node_cluster, min_x, last_x, current_y, current_color, offset, current_color.ord)
155
+ current_color = nil
156
+ end
157
+ end
158
+ end
159
+
132
160
  def format_benchmarks
133
161
  r = {}
134
162
  total = 0
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module Contrek
4
- VERSION = "1.4.5"
4
+ VERSION = "1.4.7"
5
5
  end
data/lib/contrek.rb CHANGED
@@ -45,6 +45,7 @@ require "contrek/finder/concurrent/polyline"
45
45
  require "contrek/finder/concurrent/cluster"
46
46
  require "contrek/finder/concurrent/finder"
47
47
  require "contrek/finder/concurrent/merger"
48
+ require "contrek/finder/concurrent/merger_validator"
48
49
  require "contrek/finder/concurrent/horizontal_merger"
49
50
  require "contrek/finder/concurrent/vertical_merger"
50
51
  require "contrek/finder/concurrent/streaming_merger"
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: contrek
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.4.5
4
+ version: 1.4.7
5
5
  platform: ruby
6
6
  authors:
7
7
  - Emanuele Cesaroni
@@ -215,6 +215,8 @@ files:
215
215
  - ext/cpp_polygon_finder/PolygonFinder/src/polygon/finder/concurrent/InnerPolyline.h
216
216
  - ext/cpp_polygon_finder/PolygonFinder/src/polygon/finder/concurrent/Merger.cpp
217
217
  - ext/cpp_polygon_finder/PolygonFinder/src/polygon/finder/concurrent/Merger.h
218
+ - ext/cpp_polygon_finder/PolygonFinder/src/polygon/finder/concurrent/MergerValidator.cpp
219
+ - ext/cpp_polygon_finder/PolygonFinder/src/polygon/finder/concurrent/MergerValidator.h
218
220
  - ext/cpp_polygon_finder/PolygonFinder/src/polygon/finder/concurrent/Part.cpp
219
221
  - ext/cpp_polygon_finder/PolygonFinder/src/polygon/finder/concurrent/Part.h
220
222
  - ext/cpp_polygon_finder/PolygonFinder/src/polygon/finder/concurrent/PartPool.cpp
@@ -305,6 +307,7 @@ files:
305
307
  - lib/contrek/finder/concurrent/inner_polyline.rb
306
308
  - lib/contrek/finder/concurrent/listable.rb
307
309
  - lib/contrek/finder/concurrent/merger.rb
310
+ - lib/contrek/finder/concurrent/merger_validator.rb
308
311
  - lib/contrek/finder/concurrent/part.rb
309
312
  - lib/contrek/finder/concurrent/partitionable.rb
310
313
  - lib/contrek/finder/concurrent/polyline.rb