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.
- checksums.yaml +4 -4
- data/CHANGELOG.md +6 -0
- data/Gemfile.lock +1 -1
- data/README.md +28 -9
- data/ext/cpp_polygon_finder/PolygonFinder/src/Tests.cpp +1 -1
- data/ext/cpp_polygon_finder/PolygonFinder/src/polygon/finder/FinderUtils.cpp +1 -0
- data/ext/cpp_polygon_finder/PolygonFinder/src/polygon/finder/Node.cpp +23 -26
- data/ext/cpp_polygon_finder/PolygonFinder/src/polygon/finder/Node.h +2 -2
- data/ext/cpp_polygon_finder/PolygonFinder/src/polygon/finder/NodeCluster.cpp +7 -4
- data/ext/cpp_polygon_finder/PolygonFinder/src/polygon/finder/NodeCluster.h +1 -1
- data/ext/cpp_polygon_finder/PolygonFinder/src/polygon/finder/Polygon.h +1 -0
- data/ext/cpp_polygon_finder/PolygonFinder/src/polygon/finder/PolygonFinder.cpp +24 -11
- data/ext/cpp_polygon_finder/PolygonFinder/src/polygon/finder/PolygonFinder.h +68 -1
- data/ext/cpp_polygon_finder/PolygonFinder/src/polygon/finder/concurrent/Cluster.cpp +1 -1
- data/ext/cpp_polygon_finder/PolygonFinder/src/polygon/finder/concurrent/Cursor.cpp +8 -2
- data/ext/cpp_polygon_finder/PolygonFinder/src/polygon/finder/concurrent/Finder.cpp +3 -0
- data/ext/cpp_polygon_finder/PolygonFinder/src/polygon/finder/concurrent/GeoJsonStreamingMerger.h +3 -5
- data/ext/cpp_polygon_finder/PolygonFinder/src/polygon/finder/concurrent/Merger.cpp +11 -30
- data/ext/cpp_polygon_finder/PolygonFinder/src/polygon/finder/concurrent/Merger.h +3 -3
- data/ext/cpp_polygon_finder/PolygonFinder/src/polygon/finder/concurrent/MergerValidator.cpp +104 -0
- data/ext/cpp_polygon_finder/PolygonFinder/src/polygon/finder/concurrent/MergerValidator.h +35 -0
- data/ext/cpp_polygon_finder/PolygonFinder/src/polygon/finder/concurrent/Polyline.cpp +3 -2
- data/ext/cpp_polygon_finder/PolygonFinder/src/polygon/finder/concurrent/Polyline.h +3 -1
- data/ext/cpp_polygon_finder/PolygonFinder/src/polygon/finder/concurrent/Shape.cpp +1 -0
- data/ext/cpp_polygon_finder/PolygonFinder/src/polygon/finder/concurrent/ShapePool.cpp +2 -2
- data/ext/cpp_polygon_finder/PolygonFinder/src/polygon/finder/concurrent/ShapePool.h +1 -1
- data/ext/cpp_polygon_finder/PolygonFinder/src/polygon/finder/concurrent/Tile.cpp +19 -21
- data/ext/cpp_polygon_finder/cpp_polygon_finder.cpp +11 -3
- data/lib/contrek/cpp/cpp_geo_json_concurrent_streaming_merger.rb +2 -2
- data/lib/contrek/cpp/cpp_result.rb +2 -1
- data/lib/contrek/finder/concurrent/cluster.rb +1 -1
- data/lib/contrek/finder/concurrent/cursor.rb +3 -1
- data/lib/contrek/finder/concurrent/finder.rb +2 -1
- data/lib/contrek/finder/concurrent/geo_json_streaming_merger.rb +3 -4
- data/lib/contrek/finder/concurrent/merger.rb +6 -25
- data/lib/contrek/finder/concurrent/merger_validator.rb +96 -0
- data/lib/contrek/finder/concurrent/polyline.rb +3 -2
- data/lib/contrek/finder/concurrent/shape.rb +2 -1
- data/lib/contrek/finder/concurrent/streaming_merger.rb +1 -1
- data/lib/contrek/finder/concurrent/tile.rb +9 -3
- data/lib/contrek/finder/node.rb +13 -23
- data/lib/contrek/finder/node_cluster.rb +17 -5
- data/lib/contrek/finder/polygon_finder.rb +29 -1
- data/lib/contrek/version.rb +1 -1
- data/lib/contrek.rb +1 -0
- metadata +4 -1
data/lib/contrek/finder/node.rb
CHANGED
|
@@ -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
|
-
|
|
85
|
-
|
|
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
|
-
|
|
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
|
-
@
|
|
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
|
-
|
|
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
|
-
@
|
|
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 << {
|
|
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.
|
|
352
|
-
|
|
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.
|
|
359
|
-
|
|
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
|
data/lib/contrek/version.rb
CHANGED
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.
|
|
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
|