Class: IntervalList::TreeNode
- Inherits:
-
Object
- Object
- IntervalList::TreeNode
- Defined in:
- lib/intervals.rb
Instance Attribute Summary collapse
-
#max ⇒ Object
readonly
Returns the value of attribute max.
Instance Method Summary collapse
- #add(interval) ⇒ Object
- #breadth_traverse {|@node| ... } ⇒ Object
- #depth_traverse {|@node| ... } ⇒ Object
-
#initialize(intervals) ⇒ TreeNode
constructor
A new instance of TreeNode.
- #is_max? ⇒ Boolean
- #nearest(interval) ⇒ Object
- #overlap(interval) ⇒ Object
- #update_max ⇒ Object
Constructor Details
#initialize(intervals) ⇒ TreeNode
Returns a new instance of TreeNode.
150 151 152 153 154 155 156 157 158 159 160 |
# File 'lib/intervals.rb', line 150 def initialize intervals # assume they are sorted by start low, high = intervals.each_slice((intervals.size/2.0).round).to_a @node = low.pop @left = TreeNode.new low unless low.empty? @right = TreeNode.new high unless high.nil? update_max end |
Instance Attribute Details
#max ⇒ Object (readonly)
Returns the value of attribute max.
148 149 150 |
# File 'lib/intervals.rb', line 148 def max @max end |
Instance Method Details
#add(interval) ⇒ Object
162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 |
# File 'lib/intervals.rb', line 162 def add interval if interval.start < @node.start if @left @left.add interval else @left = TreeNode.new [interval] end else if @right @right.add interval else @right = TreeNode.new [interval] end end update_max end |
#breadth_traverse {|@node| ... } ⇒ Object
191 192 193 194 195 |
# File 'lib/intervals.rb', line 191 def breadth_traverse &block @left.breadth_traverse(&block) if @left yield @node @right.breadth_traverse(&block) if @right end |
#depth_traverse {|@node| ... } ⇒ Object
197 198 199 200 201 |
# File 'lib/intervals.rb', line 197 def depth_traverse &block yield @node @left.breadth_traverse(&block) if @left @right.breadth_traverse(&block) if @right end |
#is_max? ⇒ Boolean
186 187 188 |
# File 'lib/intervals.rb', line 186 def is_max? @max == @node end |
#nearest(interval) ⇒ Object
203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 |
# File 'lib/intervals.rb', line 203 def nearest interval # if there are overlaps, pick the one with the closest distance ol = overlap(interval) if !ol.empty? return ol.min do |a,b| interval.dist(a) <=> interval.dist(b) end end # there are no overlaps. Find the highest stop that is less than interval.start [ nearest_stop(interval), nearest_start(interval) ].compact.min do |a,b| interval.dist(a) <=> interval.dist(b) end end |
#overlap(interval) ⇒ Object
220 221 222 223 224 225 226 227 |
# File 'lib/intervals.rb', line 220 def overlap interval ols = [] return ols if interval.start > @max.stop ols.concat @left.overlap(interval) if @left ols.push @node if @node.overlaps? interval ols.concat @right.overlap(interval) if @right && !@node.above?(interval) ols end |
#update_max ⇒ Object
179 180 181 182 183 184 |
# File 'lib/intervals.rb', line 179 def update_max # set your max to the max of your children @max = @node @max = @left.max if @left && @left.max.stop > @max.stop @max = @right.max if @right && @right.max.stop > @max.stop end |