You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 

225 lines
6.9 KiB

  1. # -*- coding: utf-8 -*-
  2. import nilmdb
  3. from nilmdb.printf import *
  4. import datetime_tz
  5. from nose.tools import *
  6. from nose.tools import assert_raises
  7. import itertools
  8. from nilmdb.interval import Interval, IntervalSet, IntervalError
  9. from test_helpers import *
  10. import unittest
  11. def makeset(string):
  12. """Build an IntervalSet from a string, for testing purposes
  13. Each character is 1 second
  14. [ = interval start
  15. | = interval end + adjacent start
  16. ] = interval end
  17. anything else is ignored
  18. """
  19. iset = IntervalSet()
  20. for i, c in enumerate(string):
  21. day = i + 10000
  22. if (c == "["):
  23. start = day
  24. elif (c == "|"):
  25. iset += Interval(start, day)
  26. start = day
  27. elif (c == "]"):
  28. iset += Interval(start, day)
  29. del start
  30. return iset
  31. class TestInterval:
  32. def test_interval(self):
  33. # Test Interval class
  34. (d1, d2, d3) = [ datetime_tz.datetime_tz.smartparse(x).totimestamp()
  35. for x in [ "03/24/2012", "03/25/2012", "03/26/2012" ] ]
  36. # basic construction
  37. i = Interval(d1, d1)
  38. i = Interval(d1, d3)
  39. assert(i.start == d1)
  40. assert(i.end == d3)
  41. # assignment is allowed, but not verified
  42. i.start = d2
  43. #with assert_raises(IntervalError):
  44. # i.end = d1
  45. i.start = d1
  46. i.end = d2
  47. # end before start
  48. with assert_raises(IntervalError):
  49. i = Interval(d3, d1)
  50. # compare
  51. assert(Interval(d1, d2) == Interval(d1, d2))
  52. assert(Interval(d1, d2) < Interval(d1, d3))
  53. assert(Interval(d1, d3) > Interval(d1, d2))
  54. assert(Interval(d1, d2) < Interval(d2, d3))
  55. assert(Interval(d1, d3) < Interval(d2, d3))
  56. assert(Interval(d2, d2) > Interval(d1, d3))
  57. assert(Interval(d3, d3) == Interval(d3, d3))
  58. with assert_raises(AttributeError):
  59. x = (i == 123)
  60. # subset
  61. assert(Interval(d1, d3).subset(d1, d2) == Interval(d1, d2))
  62. with assert_raises(IntervalError):
  63. x = Interval(d2, d3).subset(d1, d2)
  64. # misc
  65. i = Interval(d1, d2)
  66. eq_(repr(i), repr(eval(repr(i))))
  67. eq_(str(i), "[1332561600.0 -> 1332648000.0]")
  68. def test_interval_intersect(self):
  69. # Test Interval intersections
  70. dates = [ 100, 200, 300, 400 ]
  71. perm = list(itertools.permutations(dates, 2))
  72. prod = list(itertools.product(perm, perm))
  73. should_intersect = {
  74. False: [4, 5, 8, 20, 48, 56, 60, 96, 97, 100],
  75. True: [0, 1, 2, 12, 13, 14, 16, 17, 24, 25, 26, 28, 29,
  76. 32, 49, 50, 52, 53, 61, 62, 64, 65, 68, 98, 101, 104]
  77. }
  78. for i,((a,b),(c,d)) in enumerate(prod):
  79. try:
  80. i1 = Interval(a, b)
  81. i2 = Interval(c, d)
  82. assert(i1.intersects(i2) == i2.intersects(i1))
  83. assert(i in should_intersect[i1.intersects(i2)])
  84. except IntervalError:
  85. assert(i not in should_intersect[True] and
  86. i not in should_intersect[False])
  87. with assert_raises(AttributeError):
  88. x = i1.intersects(1234)
  89. def test_intervalset_construct(self):
  90. # Test IntervalSet construction
  91. dates = [ 100, 200, 300, 400 ]
  92. a = Interval(dates[0], dates[1])
  93. b = Interval(dates[1], dates[2])
  94. c = Interval(dates[0], dates[2])
  95. d = Interval(dates[2], dates[3])
  96. iseta = IntervalSet(a)
  97. isetb = IntervalSet([a, b])
  98. isetc = IntervalSet([a])
  99. ne_(iseta, isetb)
  100. eq_(iseta, isetc)
  101. with assert_raises(TypeError):
  102. x = iseta != 3
  103. ne_(IntervalSet(a), IntervalSet(b))
  104. # overlap
  105. with assert_raises(IntervalError):
  106. x = IntervalSet([a, b, c])
  107. # bad types
  108. with assert_raises(AttributeError):
  109. x = IntervalSet([1, 2])
  110. iset = IntervalSet(isetb) # test iterator
  111. assert(iset == isetb)
  112. assert(len(iset) == 2)
  113. assert(len(IntervalSet()) == 0)
  114. # Test adding
  115. iset = IntervalSet(a)
  116. iset += IntervalSet(b)
  117. assert(iset == IntervalSet([a, b]))
  118. iset = IntervalSet(a)
  119. iset += b
  120. assert(iset == IntervalSet([a, b]))
  121. iset = IntervalSet(a) + IntervalSet(b)
  122. assert(iset == IntervalSet([a, b]))
  123. iset = IntervalSet(b) + a
  124. assert(iset == IntervalSet([a, b]))
  125. # A set consisting of [0-1],[1-2] should match a set consisting of [0-2]
  126. assert(IntervalSet([a,b]) == IntervalSet([c]))
  127. # Etc
  128. assert(IntervalSet([a,d]) != IntervalSet([c]))
  129. assert(IntervalSet([c]) != IntervalSet([a,d]))
  130. assert(IntervalSet([c,d]) != IntervalSet([b,d]))
  131. # misc
  132. assert(repr(iset) == repr(eval(repr(iset))))
  133. def test_intervalset_geniset(self):
  134. # Test basic iset construction
  135. assert(makeset(" [----] ") ==
  136. makeset(" [-|--] "))
  137. assert(makeset("[] [--] ") +
  138. makeset(" [] [--]") ==
  139. makeset("[|] [-----]"))
  140. assert(makeset(" [-------]") ==
  141. makeset(" [-|-----|"))
  142. def test_intervalset_intersect(self):
  143. # Test intersection (&)
  144. with assert_raises(AttributeError):
  145. x = makeset("[--]") & 1234
  146. assert(makeset("[---------]") &
  147. makeset(" [---] ") ==
  148. makeset(" [---] "))
  149. assert(makeset(" [---] ") &
  150. makeset("[---------]") ==
  151. makeset(" [---] "))
  152. assert(makeset(" [-----]") &
  153. makeset(" [-----] ") ==
  154. makeset(" [--] "))
  155. assert(makeset(" [---]") &
  156. makeset(" [--] ") ==
  157. makeset(" "))
  158. assert(makeset(" [-|---]") &
  159. makeset(" [-----|-] ") ==
  160. makeset(" [----] "))
  161. assert(makeset(" [-|-] ") &
  162. makeset(" [-|--|--] ") ==
  163. makeset(" [---] "))
  164. assert(makeset(" [----][--]") &
  165. makeset("[-] [--] []") ==
  166. makeset(" [] [-] []"))
  167. class TestIntervalSpeed:
  168. #@unittest.skip("slow")
  169. def test_interval_speed(self):
  170. import yappi
  171. import time
  172. import aplotter
  173. print
  174. yappi.start()
  175. speeds = {}
  176. for j in [ 2**x for x in range(5,20o) ]:
  177. start = time.time()
  178. iset = IntervalSet()
  179. for i in xrange(j):
  180. interval = Interval(i, i+1)
  181. iset += interval
  182. speed = int((time.time() - start) * 1000000)
  183. printf("%d: %f μs\n", j, speed)
  184. speeds[j] = speed
  185. aplotter.plot(speeds.keys(), speeds.values(), plot_slope=True)
  186. yappi.stop()
  187. #yappi.print_stats(sort_type=yappi.SORTTYPE_TTOT, limit=10)