Remove trailing spaces
git-svn-id: https://bucket.mit.edu/svn/nilm/nilmdb@10824 ddd99763-3ecb-0310-9145-efcb8ce7c51f
This commit is contained in:
parent
47245df9bd
commit
565d0e98a9
|
@ -1,3 +1,4 @@
|
|||
# cython: profile=True
|
||||
# This is from bx-python 554:07aca5a9f6fc (BSD licensed), modified to
|
||||
# store interval ranges as doubles rather than 32-bit integers.
|
||||
|
||||
|
@ -63,9 +64,9 @@ cdef float nlog = -1.0 / log(0.5)
|
|||
cdef class IntervalNode:
|
||||
"""
|
||||
A single node of an `IntervalTree`.
|
||||
|
||||
|
||||
NOTE: Unless you really know what you are doing, you probably should us
|
||||
`IntervalTree` rather than using this directly.
|
||||
`IntervalTree` rather than using this directly.
|
||||
"""
|
||||
cdef float priority
|
||||
cdef public object interval
|
||||
|
@ -82,7 +83,7 @@ cdef class IntervalNode:
|
|||
property root_node:
|
||||
def __get__(self):
|
||||
return self.croot if self.croot is not EmptyNode else None
|
||||
|
||||
|
||||
def __repr__(self):
|
||||
return "IntervalNode(%g, %g)" % (self.start, self.end)
|
||||
|
||||
|
@ -101,7 +102,7 @@ cdef class IntervalNode:
|
|||
self.cleft = EmptyNode
|
||||
self.cright = EmptyNode
|
||||
self.croot = EmptyNode
|
||||
|
||||
|
||||
cpdef IntervalNode insert(IntervalNode self, double start, double end, object interval):
|
||||
"""
|
||||
Insert a new IntervalNode into the tree of which this node is
|
||||
|
@ -114,7 +115,7 @@ cdef class IntervalNode:
|
|||
cdef double decision_endpoint = start
|
||||
if start == self.start:
|
||||
decision_endpoint = end
|
||||
|
||||
|
||||
if decision_endpoint > self.start:
|
||||
# insert to cright tree
|
||||
if self.cright is not EmptyNode:
|
||||
|
@ -133,7 +134,7 @@ cdef class IntervalNode:
|
|||
# rebalance tree
|
||||
if self.priority < self.cleft.priority:
|
||||
croot = self.rotate_right()
|
||||
|
||||
|
||||
croot.set_ends()
|
||||
self.cleft.croot = croot
|
||||
self.cright.croot = croot
|
||||
|
@ -154,7 +155,7 @@ cdef class IntervalNode:
|
|||
return croot
|
||||
|
||||
cdef inline void set_ends(IntervalNode self):
|
||||
if self.cright is not EmptyNode and self.cleft is not EmptyNode:
|
||||
if self.cright is not EmptyNode and self.cleft is not EmptyNode:
|
||||
self.maxend = dmax3(self.end, self.cright.maxend, self.cleft.maxend)
|
||||
self.minend = dmin3(self.end, self.cright.minend, self.cleft.minend)
|
||||
self.minstart = dmin3(self.start, self.cright.minstart, self.cleft.minstart)
|
||||
|
@ -166,7 +167,7 @@ cdef class IntervalNode:
|
|||
self.maxend = dmax2(self.end, self.cleft.maxend)
|
||||
self.minend = dmin2(self.end, self.cleft.minend)
|
||||
self.minstart = dmin2(self.start, self.cleft.minstart)
|
||||
|
||||
|
||||
|
||||
def intersect( self, double start, double end, sort=True ):
|
||||
"""
|
||||
|
@ -180,7 +181,7 @@ cdef class IntervalNode:
|
|||
return results
|
||||
|
||||
find = intersect
|
||||
|
||||
|
||||
cdef void _intersect( IntervalNode self, double start, double end, list results):
|
||||
# Left subtree
|
||||
if self.cleft is not EmptyNode and self.cleft.maxend > start:
|
||||
|
@ -191,7 +192,7 @@ cdef class IntervalNode:
|
|||
# Right subtree
|
||||
if self.cright is not EmptyNode and self.start < end:
|
||||
self.cright._intersect( start, end, results )
|
||||
|
||||
|
||||
|
||||
cdef void _seek_left(IntervalNode self, double position, list results, int n, double max_dist):
|
||||
# we know we can bail in these 2 cases.
|
||||
|
@ -213,7 +214,7 @@ cdef class IntervalNode:
|
|||
self.cleft._seek_left(position, results, n, max_dist)
|
||||
|
||||
|
||||
|
||||
|
||||
cdef void _seek_right(IntervalNode self, double position, list results, int n, double max_dist):
|
||||
# we know we can bail in these 2 cases.
|
||||
if self.maxend < position: return
|
||||
|
@ -223,7 +224,7 @@ cdef class IntervalNode:
|
|||
|
||||
# the ordering of these 3 blocks makes it so the results are
|
||||
# ordered nearest to farest from the query position
|
||||
if self.cleft is not EmptyNode:
|
||||
if self.cleft is not EmptyNode:
|
||||
self.cleft._seek_right(position, results, n, max_dist)
|
||||
|
||||
if -1 < self.start - position < max_dist:
|
||||
|
@ -232,7 +233,7 @@ cdef class IntervalNode:
|
|||
if self.cright is not EmptyNode:
|
||||
self.cright._seek_right(position, results, n, max_dist)
|
||||
|
||||
|
||||
|
||||
cpdef left(self, position, int n=1, double max_dist=2500):
|
||||
"""
|
||||
find n features with a start > than `position`
|
||||
|
@ -330,49 +331,49 @@ cdef class Interval:
|
|||
|
||||
cdef class IntervalTree:
|
||||
"""
|
||||
Data structure for performing window intersect queries on a set of
|
||||
Data structure for performing window intersect queries on a set of
|
||||
of possibly overlapping 1d intervals.
|
||||
|
||||
|
||||
Usage
|
||||
=====
|
||||
|
||||
|
||||
Create an empty IntervalTree
|
||||
|
||||
|
||||
>>> from bx.intervals.intersection import Interval, IntervalTree
|
||||
>>> intersecter = IntervalTree()
|
||||
|
||||
|
||||
An interval is a start and end position and a value (possibly None).
|
||||
You can add any object as an interval:
|
||||
|
||||
|
||||
>>> intersecter.insert( 0, 10, "food" )
|
||||
>>> intersecter.insert( 3, 7, dict(foo='bar') )
|
||||
|
||||
|
||||
>>> intersecter.find( 2, 5 )
|
||||
['food', {'foo': 'bar'}]
|
||||
|
||||
|
||||
If the object has start and end attributes (like the Interval class) there
|
||||
is are some shortcuts:
|
||||
|
||||
|
||||
>>> intersecter = IntervalTree()
|
||||
>>> intersecter.insert_interval( Interval( 0, 10 ) )
|
||||
>>> intersecter.insert_interval( Interval( 3, 7 ) )
|
||||
>>> intersecter.insert_interval( Interval( 3, 40 ) )
|
||||
>>> intersecter.insert_interval( Interval( 13, 50 ) )
|
||||
|
||||
|
||||
>>> intersecter.find( 30, 50 )
|
||||
[Interval(3, 40), Interval(13, 50)]
|
||||
>>> intersecter.find( 100, 200 )
|
||||
[]
|
||||
|
||||
|
||||
Before/after for intervals
|
||||
|
||||
|
||||
>>> intersecter.before_interval( Interval( 10, 20 ) )
|
||||
[Interval(3, 7)]
|
||||
>>> intersecter.before_interval( Interval( 5, 20 ) )
|
||||
[]
|
||||
|
||||
|
||||
Upstream/downstream
|
||||
|
||||
|
||||
>>> intersecter.upstream_of_interval(Interval(11, 12))
|
||||
[Interval(0, 10)]
|
||||
>>> intersecter.upstream_of_interval(Interval(11, 12, strand="-"))
|
||||
|
@ -381,16 +382,16 @@ cdef class IntervalTree:
|
|||
>>> intersecter.upstream_of_interval(Interval(1, 2, strand="-"), num_intervals=3)
|
||||
[Interval(3, 7), Interval(3, 40), Interval(13, 50)]
|
||||
|
||||
|
||||
|
||||
"""
|
||||
|
||||
|
||||
cdef IntervalNode root
|
||||
|
||||
|
||||
def __cinit__( self ):
|
||||
root = None
|
||||
|
||||
|
||||
# ---- Position based interfaces -----------------------------------------
|
||||
|
||||
|
||||
def insert( self, double start, double end, object value=None ):
|
||||
"""
|
||||
Insert the interval [start,end) associated with value `value`.
|
||||
|
@ -399,7 +400,7 @@ cdef class IntervalTree:
|
|||
self.root = IntervalNode( start, end, value )
|
||||
else:
|
||||
self.root = self.root.insert( start, end, value )
|
||||
|
||||
|
||||
add = insert
|
||||
|
||||
|
||||
|
@ -410,7 +411,7 @@ cdef class IntervalTree:
|
|||
if self.root is None:
|
||||
return []
|
||||
return self.root.find( start, end )
|
||||
|
||||
|
||||
def before( self, position, num_intervals=1, max_dist=2500 ):
|
||||
"""
|
||||
Find `num_intervals` intervals that lie before `position` and are no
|
||||
|
@ -481,7 +482,7 @@ cdef class IntervalTree:
|
|||
return self.root.left( interval.start, num_intervals, max_dist )
|
||||
else:
|
||||
return self.root.right( interval.end, num_intervals, max_dist )
|
||||
|
||||
|
||||
def traverse(self):
|
||||
"""
|
||||
iterator that traverses the tree
|
||||
|
|
Loading…
Reference in New Issue
Block a user