|
@@ -13,6 +13,13 @@ from nilmdb.interval import Interval, DBInterval, IntervalSet, IntervalError |
|
|
from test_helpers import * |
|
|
from test_helpers import * |
|
|
import unittest |
|
|
import unittest |
|
|
|
|
|
|
|
|
|
|
|
# set to False to skip live renders |
|
|
|
|
|
do_live_renders = False |
|
|
|
|
|
def render(iset, description = "", live = True): |
|
|
|
|
|
import renderdot |
|
|
|
|
|
r = renderdot.RBTreeRenderer(iset.tree) |
|
|
|
|
|
return r.render(description, live and do_live_renders) |
|
|
|
|
|
|
|
|
def makeset(string): |
|
|
def makeset(string): |
|
|
"""Build an IntervalSet from a string, for testing purposes |
|
|
"""Build an IntervalSet from a string, for testing purposes |
|
|
|
|
|
|
|
@@ -75,7 +82,7 @@ class TestInterval: |
|
|
x = (i == 123) |
|
|
x = (i == 123) |
|
|
|
|
|
|
|
|
# subset |
|
|
# subset |
|
|
assert(Interval(d1, d3).subset(d1, d2) == Interval(d1, d2)) |
|
|
|
|
|
|
|
|
eq_(Interval(d1, d3).subset(d1, d2), Interval(d1, d2)) |
|
|
with assert_raises(IntervalError): |
|
|
with assert_raises(IntervalError): |
|
|
x = Interval(d2, d3).subset(d1, d2) |
|
|
x = Interval(d2, d3).subset(d1, d2) |
|
|
|
|
|
|
|
@@ -172,15 +179,15 @@ class TestInterval: |
|
|
|
|
|
|
|
|
def test_intervalset_geniset(self): |
|
|
def test_intervalset_geniset(self): |
|
|
# Test basic iset construction |
|
|
# Test basic iset construction |
|
|
assert(makeset(" [----] ") == |
|
|
|
|
|
makeset(" [-|--] ")) |
|
|
|
|
|
|
|
|
eq_(makeset(" [----] "), |
|
|
|
|
|
makeset(" [-|--] ")) |
|
|
|
|
|
|
|
|
assert(makeset("[] [--] ") + |
|
|
|
|
|
makeset(" [] [--]") == |
|
|
|
|
|
makeset("[|] [-----]")) |
|
|
|
|
|
|
|
|
eq_(makeset("[] [--] ") + |
|
|
|
|
|
makeset(" [] [--]"), |
|
|
|
|
|
makeset("[|] [-----]")) |
|
|
|
|
|
|
|
|
assert(makeset(" [-------]") == |
|
|
|
|
|
makeset(" [-|-----|")) |
|
|
|
|
|
|
|
|
eq_(makeset(" [-------]"), |
|
|
|
|
|
makeset(" [-|-----|")) |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
def test_intervalset_intersect(self): |
|
|
def test_intervalset_intersect(self): |
|
@@ -188,41 +195,59 @@ class TestInterval: |
|
|
with assert_raises(TypeError): # was AttributeError |
|
|
with assert_raises(TypeError): # was AttributeError |
|
|
x = makeset("[--]") & 1234 |
|
|
x = makeset("[--]") & 1234 |
|
|
|
|
|
|
|
|
assert(makeset("[---------]") & |
|
|
|
|
|
makeset(" [---] ") == |
|
|
|
|
|
makeset(" [---] ")) |
|
|
|
|
|
|
|
|
|
|
|
assert(makeset(" [---] ") & |
|
|
|
|
|
makeset("[---------]") == |
|
|
|
|
|
makeset(" [---] ")) |
|
|
|
|
|
|
|
|
|
|
|
assert(makeset(" [-----]") & |
|
|
|
|
|
makeset(" [-----] ") == |
|
|
|
|
|
makeset(" [--] ")) |
|
|
|
|
|
|
|
|
|
|
|
assert(makeset(" [--] [--]") & |
|
|
|
|
|
makeset(" [------] ") == |
|
|
|
|
|
makeset(" [-] [-] ")) |
|
|
|
|
|
|
|
|
|
|
|
assert(makeset(" [---]") & |
|
|
|
|
|
makeset(" [--] ") == |
|
|
|
|
|
makeset(" ")) |
|
|
|
|
|
|
|
|
|
|
|
assert(makeset(" [---]") & |
|
|
|
|
|
makeset(" [----] ") == |
|
|
|
|
|
makeset(" . ")) |
|
|
|
|
|
|
|
|
|
|
|
assert(makeset(" [-|---]") & |
|
|
|
|
|
makeset(" [-----|-] ") == |
|
|
|
|
|
makeset(" [----] ")) |
|
|
|
|
|
|
|
|
|
|
|
assert(makeset(" [-|-] ") & |
|
|
|
|
|
makeset(" [-|--|--] ") == |
|
|
|
|
|
makeset(" [---] ")) |
|
|
|
|
|
|
|
|
|
|
|
assert(makeset(" [----][--]") & |
|
|
|
|
|
makeset("[-] [--] []") == |
|
|
|
|
|
makeset(" [] [-]. []")) |
|
|
|
|
|
|
|
|
# Intersection with interval |
|
|
|
|
|
eq_(makeset("[---|---][]") & |
|
|
|
|
|
list(makeset(" [------] "))[0], |
|
|
|
|
|
makeset(" [-----] ")) |
|
|
|
|
|
|
|
|
|
|
|
# Intersection with sets |
|
|
|
|
|
eq_(makeset("[---------]") & |
|
|
|
|
|
makeset(" [---] "), |
|
|
|
|
|
makeset(" [---] ")) |
|
|
|
|
|
|
|
|
|
|
|
eq_(makeset(" [---] ") & |
|
|
|
|
|
makeset("[---------]"), |
|
|
|
|
|
makeset(" [---] ")) |
|
|
|
|
|
|
|
|
|
|
|
eq_(makeset(" [-----]") & |
|
|
|
|
|
makeset(" [-----] "), |
|
|
|
|
|
makeset(" [--] ")) |
|
|
|
|
|
|
|
|
|
|
|
eq_(makeset(" [--] [--]") & |
|
|
|
|
|
makeset(" [------] "), |
|
|
|
|
|
makeset(" [-] [-] ")) |
|
|
|
|
|
|
|
|
|
|
|
eq_(makeset(" [---]") & |
|
|
|
|
|
makeset(" [--] "), |
|
|
|
|
|
makeset(" ")) |
|
|
|
|
|
|
|
|
|
|
|
eq_(makeset(" [-|---]") & |
|
|
|
|
|
makeset(" [-----|-] "), |
|
|
|
|
|
makeset(" [----] ")) |
|
|
|
|
|
|
|
|
|
|
|
eq_(makeset(" [-|-] ") & |
|
|
|
|
|
makeset(" [-|--|--] "), |
|
|
|
|
|
makeset(" [---] ")) |
|
|
|
|
|
|
|
|
|
|
|
# Border cases -- will give different results if intervals are |
|
|
|
|
|
# half open or fully closed. Right now, they are half open, |
|
|
|
|
|
# although that's a little messy since the database intervals |
|
|
|
|
|
# often contain a data point at the endpoint. |
|
|
|
|
|
half_open = True |
|
|
|
|
|
if half_open: |
|
|
|
|
|
eq_(makeset(" [---]") & |
|
|
|
|
|
makeset(" [----] "), |
|
|
|
|
|
makeset(" ")) |
|
|
|
|
|
eq_(makeset(" [----][--]") & |
|
|
|
|
|
makeset("[-] [--] []"), |
|
|
|
|
|
makeset(" [] [-] []")) |
|
|
|
|
|
else: |
|
|
|
|
|
eq_(makeset(" [---]") & |
|
|
|
|
|
makeset(" [----] "), |
|
|
|
|
|
makeset(" . ")) |
|
|
|
|
|
eq_(makeset(" [----][--]") & |
|
|
|
|
|
makeset("[-] [--] []"), |
|
|
|
|
|
makeset(" [] [-]. []")) |
|
|
|
|
|
|
|
|
class TestIntervalDB: |
|
|
class TestIntervalDB: |
|
|
def test_dbinterval(self): |
|
|
def test_dbinterval(self): |
|
@@ -270,25 +295,16 @@ class TestIntervalDB: |
|
|
class TestIntervalTree: |
|
|
class TestIntervalTree: |
|
|
|
|
|
|
|
|
def test_interval_tree(self): |
|
|
def test_interval_tree(self): |
|
|
import renderdot |
|
|
|
|
|
import random |
|
|
import random |
|
|
random.seed(1234) |
|
|
random.seed(1234) |
|
|
|
|
|
|
|
|
# make a set of 500 intervals |
|
|
|
|
|
|
|
|
# make a set of 100 intervals |
|
|
iset = IntervalSet() |
|
|
iset = IntervalSet() |
|
|
j = 500 |
|
|
|
|
|
|
|
|
j = 100 |
|
|
for i in random.sample(xrange(j),j): |
|
|
for i in random.sample(xrange(j),j): |
|
|
interval = Interval(i, i+1) |
|
|
interval = Interval(i, i+1) |
|
|
iset += interval |
|
|
iset += interval |
|
|
|
|
|
|
|
|
# Plot it |
|
|
|
|
|
r = renderdot.Renderer(lambda node: node.cleft, |
|
|
|
|
|
lambda node: node.cright, |
|
|
|
|
|
lambda node: False, |
|
|
|
|
|
lambda node: node.start, |
|
|
|
|
|
lambda node: node.end, |
|
|
|
|
|
iset.tree.emptynode()) |
|
|
|
|
|
r.render_dot_live(iset.tree.rootnode(), "Random insertion") |
|
|
|
|
|
|
|
|
render(iset, "Random Insertion") |
|
|
|
|
|
|
|
|
# remove about half of them |
|
|
# remove about half of them |
|
|
for i in random.sample(xrange(j),j): |
|
|
for i in random.sample(xrange(j),j): |
|
@@ -298,33 +314,15 @@ class TestIntervalTree: |
|
|
# try removing an interval that doesn't exist |
|
|
# try removing an interval that doesn't exist |
|
|
with assert_raises(IntervalError): |
|
|
with assert_raises(IntervalError): |
|
|
iset -= Interval(1234,5678) |
|
|
iset -= Interval(1234,5678) |
|
|
|
|
|
render(iset, "Random Insertion, deletion") |
|
|
|
|
|
|
|
|
# Plot it |
|
|
|
|
|
r = renderdot.Renderer(lambda node: node.cleft, |
|
|
|
|
|
lambda node: node.cright, |
|
|
|
|
|
lambda node: False, |
|
|
|
|
|
lambda node: node.start, |
|
|
|
|
|
lambda node: node.end, |
|
|
|
|
|
iset.tree.emptynode()) |
|
|
|
|
|
r.render_dot_live(iset.tree.rootnode(), "Random insertion, deletion") |
|
|
|
|
|
|
|
|
|
|
|
# make a set of 500 intervals, inserted in order |
|
|
|
|
|
|
|
|
# make a set of 100 intervals, inserted in order |
|
|
iset = IntervalSet() |
|
|
iset = IntervalSet() |
|
|
j = 500 |
|
|
|
|
|
|
|
|
j = 100 |
|
|
for i in xrange(j): |
|
|
for i in xrange(j): |
|
|
interval = Interval(i, i+1) |
|
|
interval = Interval(i, i+1) |
|
|
iset += interval |
|
|
iset += interval |
|
|
|
|
|
|
|
|
# Plot it |
|
|
|
|
|
r = renderdot.Renderer(lambda node: node.cleft, |
|
|
|
|
|
lambda node: node.cright, |
|
|
|
|
|
lambda node: False, |
|
|
|
|
|
lambda node: node.start, |
|
|
|
|
|
lambda node: node.end, |
|
|
|
|
|
iset.tree.emptynode()) |
|
|
|
|
|
r.render_dot_live(iset.tree.rootnode(), "In-order insertion") |
|
|
|
|
|
|
|
|
|
|
|
assert(False) |
|
|
|
|
|
|
|
|
render(iset, "In-order insertion") |
|
|
|
|
|
|
|
|
class TestIntervalSpeed: |
|
|
class TestIntervalSpeed: |
|
|
@unittest.skip("this is slow") |
|
|
@unittest.skip("this is slow") |
|
|