contrek 1.2.8 → 1.3.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 (115) hide show
  1. checksums.yaml +4 -4
  2. data/.gitignore +2 -1
  3. data/.rubocop.yml +11 -0
  4. data/CHANGELOG.md +7 -1
  5. data/Gemfile +2 -0
  6. data/Gemfile.lock +1 -1
  7. data/README.md +1 -1
  8. data/Rakefile +2 -0
  9. data/contrek.gemspec +2 -0
  10. data/ext/cpp_polygon_finder/PolygonFinder/CMakeLists.txt +2 -4
  11. data/ext/cpp_polygon_finder/PolygonFinder/src/Tests.cpp +118 -19
  12. data/ext/cpp_polygon_finder/PolygonFinder/src/Tests.h +1 -0
  13. data/ext/cpp_polygon_finder/PolygonFinder/src/polygon/finder/Node.cpp +5 -7
  14. data/ext/cpp_polygon_finder/PolygonFinder/src/polygon/finder/Node.h +4 -1
  15. data/ext/cpp_polygon_finder/PolygonFinder/src/polygon/finder/NodeCluster.cpp +14 -15
  16. data/ext/cpp_polygon_finder/PolygonFinder/src/polygon/finder/NodeCluster.h +2 -4
  17. data/ext/cpp_polygon_finder/PolygonFinder/src/polygon/finder/Polygon.h +2 -2
  18. data/ext/cpp_polygon_finder/PolygonFinder/src/polygon/finder/PolygonFinder.cpp +13 -13
  19. data/ext/cpp_polygon_finder/PolygonFinder/src/polygon/finder/PolygonFinder.h +79 -354
  20. data/ext/cpp_polygon_finder/PolygonFinder/src/polygon/finder/concurrent/Cluster.cpp +6 -6
  21. data/ext/cpp_polygon_finder/PolygonFinder/src/polygon/finder/concurrent/Cluster.h +3 -2
  22. data/ext/cpp_polygon_finder/PolygonFinder/src/polygon/finder/concurrent/Cursor.cpp +8 -8
  23. data/ext/cpp_polygon_finder/PolygonFinder/src/polygon/finder/concurrent/EndPoint.h +4 -4
  24. data/ext/cpp_polygon_finder/PolygonFinder/src/polygon/finder/concurrent/Finder.h +3 -1
  25. data/ext/cpp_polygon_finder/PolygonFinder/src/polygon/finder/concurrent/InnerPolyline.cpp +6 -6
  26. data/ext/cpp_polygon_finder/PolygonFinder/src/polygon/finder/concurrent/InnerPolyline.h +3 -3
  27. data/ext/cpp_polygon_finder/PolygonFinder/src/polygon/finder/concurrent/Merger.cpp +4 -3
  28. data/ext/cpp_polygon_finder/PolygonFinder/src/polygon/finder/concurrent/Part.cpp +29 -9
  29. data/ext/cpp_polygon_finder/PolygonFinder/src/polygon/finder/concurrent/Part.h +3 -1
  30. data/ext/cpp_polygon_finder/PolygonFinder/src/polygon/finder/concurrent/Partitionable.cpp +45 -30
  31. data/ext/cpp_polygon_finder/PolygonFinder/src/polygon/finder/concurrent/Polyline.cpp +18 -19
  32. data/ext/cpp_polygon_finder/PolygonFinder/src/polygon/finder/concurrent/Polyline.h +6 -5
  33. data/ext/cpp_polygon_finder/PolygonFinder/src/polygon/finder/concurrent/Position.cpp +2 -2
  34. data/ext/cpp_polygon_finder/PolygonFinder/src/polygon/finder/concurrent/Position.h +1 -1
  35. data/ext/cpp_polygon_finder/PolygonFinder/src/polygon/finder/concurrent/Queueable.h +4 -4
  36. data/ext/cpp_polygon_finder/PolygonFinder/src/polygon/finder/concurrent/Sequence.cpp +7 -7
  37. data/ext/cpp_polygon_finder/PolygonFinder/src/polygon/finder/concurrent/Sequence.h +2 -2
  38. data/ext/cpp_polygon_finder/PolygonFinder/src/polygon/finder/concurrent/Shape.cpp +8 -2
  39. data/ext/cpp_polygon_finder/PolygonFinder/src/polygon/finder/concurrent/Shape.h +4 -1
  40. data/ext/cpp_polygon_finder/PolygonFinder/src/polygon/finder/concurrent/ShapePool.cpp +19 -5
  41. data/ext/cpp_polygon_finder/PolygonFinder/src/polygon/finder/concurrent/ShapePool.h +6 -2
  42. data/ext/cpp_polygon_finder/PolygonFinder/src/polygon/finder/concurrent/StreamingMerger.cpp +117 -0
  43. data/ext/cpp_polygon_finder/PolygonFinder/src/polygon/finder/concurrent/StreamingMerger.h +41 -0
  44. data/ext/cpp_polygon_finder/PolygonFinder/src/polygon/finder/concurrent/Tile.cpp +9 -0
  45. data/ext/cpp_polygon_finder/PolygonFinder/src/polygon/finder/concurrent/Tile.h +1 -0
  46. data/ext/cpp_polygon_finder/PolygonFinder/src/polygon/finder/concurrent/VerticalMerger.cpp +4 -13
  47. data/ext/cpp_polygon_finder/PolygonFinder/src/polygon/finder/concurrent/VerticalMerger.h +1 -0
  48. data/ext/cpp_polygon_finder/PolygonFinder/src/polygon/reducers/LinearReducer.cpp +8 -8
  49. data/ext/cpp_polygon_finder/PolygonFinder/src/polygon/reducers/LinearReducer.h +2 -2
  50. data/ext/cpp_polygon_finder/PolygonFinder/src/polygon/reducers/Reducer.cpp +1 -1
  51. data/ext/cpp_polygon_finder/PolygonFinder/src/polygon/reducers/Reducer.h +2 -2
  52. data/ext/cpp_polygon_finder/PolygonFinder/src/polygon/reducers/UniqReducer.cpp +3 -3
  53. data/ext/cpp_polygon_finder/PolygonFinder/src/polygon/reducers/UniqReducer.h +1 -1
  54. data/ext/cpp_polygon_finder/PolygonFinder/src/polygon/reducers/VisvalingamReducer.cpp +3 -3
  55. data/ext/cpp_polygon_finder/PolygonFinder/src/polygon/reducers/VisvalingamReducer.h +10 -10
  56. data/ext/cpp_polygon_finder/cpp_polygon_finder.cpp +66 -16
  57. data/ext/cpp_polygon_finder/extconf.rb +2 -0
  58. data/lib/contrek/bitmaps/bitmap.rb +2 -0
  59. data/lib/contrek/bitmaps/chunky_bitmap.rb +13 -0
  60. data/lib/contrek/bitmaps/painting.rb +2 -0
  61. data/lib/contrek/bitmaps/png_bitmap.rb +2 -0
  62. data/lib/contrek/bitmaps/raw_bitmap.rb +2 -0
  63. data/lib/contrek/bitmaps/rgb_color.rb +2 -0
  64. data/lib/contrek/bitmaps/rgb_cpp_color.rb +2 -0
  65. data/lib/contrek/bitmaps/sample_generator.rb +2 -0
  66. data/lib/contrek/cpp/cpp_concurrent_finder.rb +2 -0
  67. data/lib/contrek/cpp/cpp_concurrent_horizontal_merger.rb +2 -0
  68. data/lib/contrek/cpp/cpp_concurrent_merger.rb +2 -0
  69. data/lib/contrek/cpp/cpp_concurrent_streaming_merger.rb +11 -0
  70. data/lib/contrek/cpp/cpp_concurrent_vertical_merger.rb +2 -0
  71. data/lib/contrek/cpp/cpp_result.rb +2 -0
  72. data/lib/contrek/cpp/cpp_tempfile.rb +28 -0
  73. data/lib/contrek/finder/bounds.rb +2 -0
  74. data/lib/contrek/finder/concurrent/clipped_polygon_finder.rb +2 -0
  75. data/lib/contrek/finder/concurrent/cluster.rb +3 -1
  76. data/lib/contrek/finder/concurrent/cursor.rb +2 -0
  77. data/lib/contrek/finder/concurrent/end_point.rb +2 -0
  78. data/lib/contrek/finder/concurrent/fake_cluster.rb +2 -0
  79. data/lib/contrek/finder/concurrent/finder.rb +6 -0
  80. data/lib/contrek/finder/concurrent/horizontal_merger.rb +2 -0
  81. data/lib/contrek/finder/concurrent/hub.rb +2 -0
  82. data/lib/contrek/finder/concurrent/inner_polyline.rb +2 -0
  83. data/lib/contrek/finder/concurrent/listable.rb +2 -0
  84. data/lib/contrek/finder/concurrent/merger.rb +4 -0
  85. data/lib/contrek/finder/concurrent/part.rb +13 -0
  86. data/lib/contrek/finder/concurrent/partitionable.rb +33 -17
  87. data/lib/contrek/finder/concurrent/polyline.rb +2 -0
  88. data/lib/contrek/finder/concurrent/poolable.rb +2 -0
  89. data/lib/contrek/finder/concurrent/position.rb +2 -0
  90. data/lib/contrek/finder/concurrent/queueable.rb +2 -0
  91. data/lib/contrek/finder/concurrent/sequence.rb +2 -0
  92. data/lib/contrek/finder/concurrent/shape.rb +2 -0
  93. data/lib/contrek/finder/concurrent/streaming_merger.rb +89 -0
  94. data/lib/contrek/finder/concurrent/tile.rb +2 -0
  95. data/lib/contrek/finder/concurrent/vertical_merger.rb +8 -2
  96. data/lib/contrek/finder/list.rb +2 -0
  97. data/lib/contrek/finder/list_entry.rb +2 -0
  98. data/lib/contrek/finder/listable.rb +2 -0
  99. data/lib/contrek/finder/lists.rb +2 -0
  100. data/lib/contrek/finder/node.rb +2 -0
  101. data/lib/contrek/finder/node_cluster.rb +3 -1
  102. data/lib/contrek/finder/polygon_finder.rb +4 -1
  103. data/lib/contrek/finder/result.rb +2 -0
  104. data/lib/contrek/map/mercator_projection.rb +2 -0
  105. data/lib/contrek/matchers/matcher.rb +2 -0
  106. data/lib/contrek/matchers/matcher_hsb.rb +2 -0
  107. data/lib/contrek/matchers/value_not_matcher.rb +2 -0
  108. data/lib/contrek/reducers/linear_reducer.rb +2 -0
  109. data/lib/contrek/reducers/reducer.rb +2 -0
  110. data/lib/contrek/reducers/uniq_reducer.rb +2 -0
  111. data/lib/contrek/reducers/visvalingam_reducer.rb +2 -0
  112. data/lib/contrek/shared/result.rb +2 -0
  113. data/lib/contrek/version.rb +3 -1
  114. data/lib/contrek.rb +5 -0
  115. metadata +11 -5
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  module Contrek
2
4
  module Cpp
3
5
  class CPPConcurrentMerger < CPPMerger
@@ -0,0 +1,11 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Contrek
4
+ module Cpp
5
+ class CPPConcurrentStreamingMerger < CPPStreamingMerger
6
+ def self.new(stream_to:, total_width:, total_height:, number_of_threads: 0, options: nil)
7
+ super(number_of_threads, options, stream_to, total_width, total_height)
8
+ end
9
+ end
10
+ end
11
+ end
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  module Contrek
2
4
  module Cpp
3
5
  class CPPConcurrentVerticalMerger < CPPVerticalMerger
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  module Contrek
2
4
  module Cpp
3
5
  class CPPResult
@@ -0,0 +1,28 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Contrek
4
+ module Cpp
5
+ class CPPTempfile < CPPOfstream
6
+ def self.new(name)
7
+ require "tempfile"
8
+ tempfile = Tempfile.new(name)
9
+ instance = super(tempfile.path)
10
+ instance.instance_variable_set(:@tempfile, tempfile)
11
+ instance
12
+ end
13
+
14
+ def path
15
+ @tempfile.path
16
+ end
17
+
18
+ def close
19
+ super
20
+ @tempfile.close
21
+ end
22
+
23
+ def unlink
24
+ @tempfile.unlink
25
+ end
26
+ end
27
+ end
28
+ end
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  Bounds = Struct.new(:min_x, :max_x, :min_y, :max_y) do
2
4
  def self.empty
3
5
  new(Float::INFINITY, -Float::INFINITY, Float::INFINITY, -Float::INFINITY)
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  module Contrek
2
4
  module Concurrent
3
5
  class ClippedPolygonFinder < Finder::PolygonFinder
@@ -1,7 +1,9 @@
1
+ # frozen_string_literal: true
2
+
1
3
  module Contrek
2
4
  module Concurrent
3
5
  class Cluster
4
- attr_reader :tiles, :hub
6
+ attr_reader :tiles, :hub, :finder
5
7
 
6
8
  def initialize(finder:, height:, start_x:, end_x:)
7
9
  @finder = finder
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  module Contrek
2
4
  module Concurrent
3
5
  class Cursor
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  module Contrek
2
4
  module Concurrent
3
5
  class EndPoint
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  module Contrek
2
4
  module Concurrent
3
5
  class FakeCluster < Finder::NodeCluster
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  module Contrek
2
4
  module Concurrent
3
5
  class Finder
@@ -97,6 +99,10 @@ module Contrek
97
99
  Contrek::Finder::Result.new(raw_polygons, metadata)
98
100
  end
99
101
 
102
+ def transpose?
103
+ false
104
+ end
105
+
100
106
  private
101
107
 
102
108
  def process_tiles!(bitmap, height:)
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  module Contrek
2
4
  module Concurrent
3
5
  class HorizontalMerger < Merger
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  module Contrek
2
4
  module Concurrent
3
5
  class Hub
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  module Contrek
2
4
  module Concurrent
3
5
  class InnerPolyline
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  module Contrek
2
4
  module Concurrent
3
5
  module Listable
@@ -1,6 +1,9 @@
1
+ # frozen_string_literal: true
2
+
1
3
  module Contrek
2
4
  module Concurrent
3
5
  class Merger < Finder
6
+ attr_reader :tiles
4
7
  prepend Poolable
5
8
 
6
9
  def initialize(options: {})
@@ -13,6 +16,7 @@ module Contrek
13
16
 
14
17
  def add_tile(result)
15
18
  @height ||= result.metadata[:height]
19
+ @options[:versus] ||= result.metadata[:versus]
16
20
  end_x = @current_x + result.metadata[:width]
17
21
 
18
22
  tile = Tile.new(
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  module Contrek
2
4
  module Concurrent
3
5
  class Part
@@ -78,6 +80,17 @@ module Contrek
78
80
  end
79
81
  end
80
82
 
83
+ def within?(other)
84
+ self_min, self_max = [head.payload[:y], tail.payload[:y]].minmax
85
+ other_min, other_max = [other.head.payload[:y], other.tail.payload[:y]].minmax
86
+ self_min >= other_min && self_max <= other_max
87
+ end
88
+
89
+ def same_length?(other)
90
+ (head.payload[:y] - tail.payload[:y]).abs ==
91
+ (other.head.payload[:y] - other.tail.payload[:y]).abs
92
+ end
93
+
81
94
  def continuum_to?(other)
82
95
  return [] if size <= 2 && inverts && other.size <= 2 && other.inverts
83
96
  return [] if other.head.nil?
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  module Contrek
2
4
  module Concurrent
3
5
  module Partitionable
@@ -56,26 +58,40 @@ module Contrek
56
58
  # meaning that all its points are repeated in another, longer sequence,
57
59
  # then the shorter one is converted to EXCLUSIVE and marked as transmuted
58
60
  def trasmute_parts!
59
- insides = @parts.select { |p| p.is?(Part::SEAM) }
60
- return if insides.size < 2
61
+ transpose = tile.cluster.finder.transpose?
61
62
 
62
- insides.each do |inside|
63
- (insides - [inside]).each do |inside_compare|
63
+ @parts.each do |inside|
64
+ next unless inside.is?(Part::SEAM)
65
+ @parts.each do |inside_compare|
66
+ next if inside == inside_compare
64
67
  next unless inside_compare.is?(Part::SEAM)
65
68
 
66
- count = 0
67
- inside.each do |position|
68
- inclusion = position.end_point.queues.include?(inside_compare)
69
- count += 1 if inclusion
70
- end
71
- if count == inside.size && count < inside_compare.size
72
- inside.type = Part::EXCLUSIVE
73
- inside.trasmuted = true
74
- break
75
- end
76
- if count == inside.size && count == inside_compare.size &&
77
- inside.next.nil? && inside_compare.prev.nil?
78
- inside.mirror = true
69
+ if transpose
70
+ if inside.within?(inside_compare)
71
+ if !inside.same_length?(inside_compare)
72
+ inside.type = Part::EXCLUSIVE
73
+ inside.trasmuted = true
74
+ inside.head.end_point.queues.delete(inside)
75
+ inside.tail.end_point.queues.delete(inside)
76
+ break
77
+ end
78
+ end
79
+ else
80
+ count = 0
81
+ inside.each do |position|
82
+ inclusion = position.end_point.queues.include?(inside_compare)
83
+ count += 1 if inclusion
84
+ end
85
+ if count == inside.size
86
+ if count < inside_compare.size
87
+ inside.type = Part::EXCLUSIVE
88
+ inside.trasmuted = true
89
+ break
90
+ end
91
+ if count == inside_compare.size && inside.next.nil? && inside_compare.prev.nil?
92
+ inside.mirror = true
93
+ end
94
+ end
79
95
  end
80
96
  end
81
97
  end
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  module Contrek
2
4
  module Concurrent
3
5
  class Polyline
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  require "concurrent-ruby"
2
4
 
3
5
  module Contrek
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  module Contrek
2
4
  module Concurrent
3
5
  class Position
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  module Contrek
2
4
  module Concurrent
3
5
  module Queueable
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  module Contrek
2
4
  module Concurrent
3
5
  class Sequence
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  module Contrek
2
4
  module Concurrent
3
5
  class Shape
@@ -0,0 +1,89 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Contrek
4
+ module Concurrent
5
+ class StreamingMerger < VerticalMerger
6
+ def initialize(stream_to:, total_width:, total_height:, options: {})
7
+ @stream = stream_to
8
+ @total_width = total_width
9
+ @total_height = total_height
10
+ @moved = 0
11
+ super(options: options)
12
+ end
13
+
14
+ def add_tile(result, flush = false)
15
+ super(result)
16
+
17
+ if @tiles.size == 2
18
+ process_tiles!(nil, height: @height)
19
+ @tiles << @whole_tile
20
+ stream_polygons!(@whole_tile, flush)
21
+ end
22
+ end
23
+
24
+ def process_info
25
+ result = super
26
+ result.metadata[:groups] = @moved
27
+ result
28
+ end
29
+
30
+ private
31
+
32
+ def stream_polygons!(tile, flush = false)
33
+ ensure_header
34
+
35
+ tile.shapes.select! do |shape|
36
+ bounds = shape.outer_polyline.get_bounds
37
+ if flush || bounds[:max_x] < tile.end_x - 1
38
+ @moved += 1
39
+ stream_raw_polygon(shape)
40
+ false
41
+ else
42
+ true
43
+ end
44
+ end
45
+
46
+ ensure_footer if flush
47
+ end
48
+
49
+ def stream_raw_polygon(shape)
50
+ outer_pts = shape.outer_polyline.raw.map { |p| "#{p[:y]},#{p[:x]}" }.join(" ")
51
+ @stream.write(svg_outer_polygon(outer_pts))
52
+ shape.inner_polylines.map(&:raw).each do |sequence|
53
+ inner_pts = sequence.map { |p| "#{p[:y]},#{p[:x]}" }.join(" ")
54
+ @stream.write(svg_inner_polygon(inner_pts))
55
+ end
56
+ end
57
+
58
+ def ensure_header
59
+ if @stream.pos == 0
60
+ @stream.write(svg_header)
61
+ end
62
+ end
63
+
64
+ def ensure_footer
65
+ @stream.write(svg_footer)
66
+ end
67
+
68
+ def svg_footer
69
+ "</svg>"
70
+ end
71
+
72
+ def svg_header
73
+ "<svg xmlns=\"http://www.w3.org/2000/svg\" width=\"#{@total_width}\" height=\"#{@total_height}\"><style>#{svg_css}</style>"
74
+ end
75
+
76
+ def svg_outer_polygon(outer_pts)
77
+ "<polygon points=\"#{outer_pts}\" class=\"out\"/>"
78
+ end
79
+
80
+ def svg_inner_polygon(inner_pts)
81
+ "<polygon points=\"#{inner_pts}\" class=\"in\"/>"
82
+ end
83
+
84
+ def svg_css
85
+ ".out{fill:none;stroke:red;stroke-width:1;}.in{fill:none;stroke:green;stroke-width:1;}.out:hover{stroke:yellow;}"
86
+ end
87
+ end
88
+ end
89
+ end
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  module Contrek
2
4
  module Concurrent
3
5
  class Tile
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  module Contrek
2
4
  module Concurrent
3
5
  class VerticalMerger < Merger
@@ -10,8 +12,12 @@ module Contrek
10
12
  super
11
13
  end
12
14
 
13
- def process_info
14
- transpose(super)
15
+ def process_info(flush: false)
16
+ transpose(super())
17
+ end
18
+
19
+ def transpose?
20
+ true
15
21
  end
16
22
 
17
23
  private
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  module Contrek
2
4
  module Finder
3
5
  class List
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  module Contrek
2
4
  module Finder
3
5
  class ListEntry
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  module Contrek
2
4
  module Finder
3
5
  module Listable
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  module Contrek
2
4
  module Finder
3
5
  class Lists
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  module Contrek
2
4
  module Finder
3
5
  class Node
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  module Contrek
2
4
  module Finder
3
5
  class NodeCluster
@@ -286,7 +288,7 @@ module Contrek
286
288
  @root_nodes << node
287
289
 
288
290
  if node.y > 0
289
- # all nodes untle up_node.max_x >= node.min_x
291
+ # all nodes until up_node.max_x >= node.min_x
290
292
  up_nodes = @vert_nodes[node.y - 1]
291
293
  up_nodes_count = up_nodes.size
292
294
  if up_nodes_count > 0
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  require "benchmark"
2
4
 
3
5
  module Contrek
@@ -49,7 +51,8 @@ module Contrek
49
51
  benchmarks: format_benchmarks,
50
52
  width: @source_bitmap.w,
51
53
  height: @source_bitmap.h,
52
- treemap: (@node_cluster.treemap if @options.has_key?(:treemap))
54
+ treemap: (@node_cluster.treemap if @options.has_key?(:treemap)),
55
+ versus: @options[:versus]
53
56
  }
54
57
  Result.new(@node_cluster.polygons, metadata)
55
58
  end
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  module Contrek
2
4
  module Finder
3
5
  Result = Struct.new(:polygons, :metadata) do
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  module Map
2
4
  class MercatorProjection
3
5
  MERCATOR_RANGE = 256
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  module Contrek
2
4
  module Matchers
3
5
  class Matcher
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  module Contrek
2
4
  module Matchers
3
5
  class MatcherHsb < Matcher
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  module Contrek
2
4
  module Matchers
3
5
  class ValueNotMatcher < Matcher
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  module Contrek
2
4
  module Reducers
3
5
  class LinearReducer < Reducer
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  module Contrek
2
4
  module Reducers
3
5
  class Reducer
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  module Contrek
2
4
  module Reducers
3
5
  class UniqReducer < Reducer
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  # https://bost.ocks.org/mike/simplify/
2
4
  # https://github.com/metteo/jts/blob/master/jts-core/src/main/java/com/vividsolutions/jts/simplify/VWLineSimplifier.java
3
5
 
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  module Contrek
2
4
  module Shared
3
5
  module Result
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  module Contrek
2
- VERSION = "1.2.8"
4
+ VERSION = "1.3.0"
3
5
  end
data/lib/contrek.rb CHANGED
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  require "contrek/version"
2
4
  require "contrek/bitmaps/painting"
3
5
  require "contrek/bitmaps/bitmap"
@@ -37,6 +39,7 @@ require "contrek/finder/concurrent/finder"
37
39
  require "contrek/finder/concurrent/merger"
38
40
  require "contrek/finder/concurrent/horizontal_merger"
39
41
  require "contrek/finder/concurrent/vertical_merger"
42
+ require "contrek/finder/concurrent/streaming_merger"
40
43
  require "contrek/finder/concurrent/cursor"
41
44
  require "contrek/map/mercator_projection"
42
45
  require "contrek/matchers/matcher"
@@ -51,6 +54,8 @@ require "contrek/cpp/cpp_concurrent_finder"
51
54
  require "contrek/cpp/cpp_concurrent_merger"
52
55
  require "contrek/cpp/cpp_concurrent_horizontal_merger"
53
56
  require "contrek/cpp/cpp_concurrent_vertical_merger"
57
+ require "contrek/cpp/cpp_concurrent_streaming_merger"
58
+ require "contrek/cpp/cpp_tempfile"
54
59
  require "contrek/cpp/cpp_result"
55
60
 
56
61
  module Contrek
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: contrek
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.2.8
4
+ version: 1.3.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Emanuele Cesaroni
8
- autorequire:
8
+ autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2026-06-06 00:00:00.000000000 Z
11
+ date: 2026-06-17 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: rspec
@@ -132,6 +132,7 @@ extra_rdoc_files: []
132
132
  files:
133
133
  - ".gitignore"
134
134
  - ".rspec"
135
+ - ".rubocop.yml"
135
136
  - CHANGELOG.md
136
137
  - Gemfile
137
138
  - Gemfile.lock
@@ -215,6 +216,8 @@ files:
215
216
  - ext/cpp_polygon_finder/PolygonFinder/src/polygon/finder/concurrent/Shape.h
216
217
  - ext/cpp_polygon_finder/PolygonFinder/src/polygon/finder/concurrent/ShapePool.cpp
217
218
  - ext/cpp_polygon_finder/PolygonFinder/src/polygon/finder/concurrent/ShapePool.h
219
+ - ext/cpp_polygon_finder/PolygonFinder/src/polygon/finder/concurrent/StreamingMerger.cpp
220
+ - ext/cpp_polygon_finder/PolygonFinder/src/polygon/finder/concurrent/StreamingMerger.h
218
221
  - ext/cpp_polygon_finder/PolygonFinder/src/polygon/finder/concurrent/Tile.cpp
219
222
  - ext/cpp_polygon_finder/PolygonFinder/src/polygon/finder/concurrent/Tile.h
220
223
  - ext/cpp_polygon_finder/PolygonFinder/src/polygon/finder/concurrent/VerticalMerger.cpp
@@ -251,8 +254,10 @@ files:
251
254
  - lib/contrek/cpp/cpp_concurrent_finder.rb
252
255
  - lib/contrek/cpp/cpp_concurrent_horizontal_merger.rb
253
256
  - lib/contrek/cpp/cpp_concurrent_merger.rb
257
+ - lib/contrek/cpp/cpp_concurrent_streaming_merger.rb
254
258
  - lib/contrek/cpp/cpp_concurrent_vertical_merger.rb
255
259
  - lib/contrek/cpp/cpp_result.rb
260
+ - lib/contrek/cpp/cpp_tempfile.rb
256
261
  - lib/contrek/finder/bounds.rb
257
262
  - lib/contrek/finder/concurrent/clipped_polygon_finder.rb
258
263
  - lib/contrek/finder/concurrent/cluster.rb
@@ -273,6 +278,7 @@ files:
273
278
  - lib/contrek/finder/concurrent/queueable.rb
274
279
  - lib/contrek/finder/concurrent/sequence.rb
275
280
  - lib/contrek/finder/concurrent/shape.rb
281
+ - lib/contrek/finder/concurrent/streaming_merger.rb
276
282
  - lib/contrek/finder/concurrent/tile.rb
277
283
  - lib/contrek/finder/concurrent/vertical_merger.rb
278
284
  - lib/contrek/finder/list.rb
@@ -301,7 +307,7 @@ metadata:
301
307
  homepage_uri: https://github.com/runout77/contrek
302
308
  documentation_uri: https://github.com/runout77/contrek#readme
303
309
  changelog_uri: https://github.com/runout77/contrek/blob/main/CHANGELOG.md
304
- post_install_message:
310
+ post_install_message:
305
311
  rdoc_options: []
306
312
  require_paths:
307
313
  - lib
@@ -317,7 +323,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
317
323
  version: '0'
318
324
  requirements: []
319
325
  rubygems_version: 3.5.22
320
- signing_key:
326
+ signing_key:
321
327
  specification_version: 4
322
328
  summary: Fast PNG contour tracing and shape detection for Ruby
323
329
  test_files: []