mirror of
https://github.com/boostorg/histogram.git
synced 2025-05-09 23:04:07 +00:00
505 lines
18 KiB
Python
Executable File
505 lines
18 KiB
Python
Executable File
#!/usr/bin/env python
|
|
import unittest
|
|
from math import pi
|
|
from histogram import histogram, regular_axis, polar_axis, \
|
|
variable_axis, category_axis, integer_axis
|
|
import cPickle
|
|
import StringIO
|
|
try: import numpy # optional, for tests that need numpy
|
|
except ImportError: pass
|
|
|
|
class test_regular_axis(unittest.TestCase):
|
|
|
|
def test_init(self):
|
|
regular_axis(1, 1.0, 2.0)
|
|
regular_axis(1, 1.0, 2.0, label="ra")
|
|
regular_axis(1, 1.0, 2.0, uoflow=False)
|
|
regular_axis(1, 1.0, 2.0, label="ra", uoflow=False)
|
|
with self.assertRaises(TypeError):
|
|
regular_axis()
|
|
with self.assertRaises(TypeError):
|
|
regular_axis(1)
|
|
with self.assertRaises(TypeError):
|
|
regular_axis(1, 1.0)
|
|
with self.assertRaises(RuntimeError):
|
|
regular_axis(0, 1.0, 2.0)
|
|
with self.assertRaises(TypeError):
|
|
regular_axis("1", 1.0, 2.0)
|
|
with self.assertRaises(StandardError):
|
|
regular_axis(-1, 1.0, 2.0)
|
|
with self.assertRaises(RuntimeError):
|
|
regular_axis(1, 2.0, 1.0)
|
|
with self.assertRaises(TypeError):
|
|
regular_axis(1, 1.0, 2.0, label=0)
|
|
with self.assertRaises(TypeError):
|
|
regular_axis(1, 1.0, 2.0, label="ra", uoflow="True")
|
|
with self.assertRaises(TypeError):
|
|
regular_axis(1, 1.0, 2.0, bad_keyword="ra")
|
|
a = regular_axis(4, 1.0, 2.0)
|
|
self.assertEqual(a, regular_axis(4, 1.0, 2.0))
|
|
self.assertNotEqual(a, regular_axis(3, 1.0, 2.0))
|
|
self.assertNotEqual(a, regular_axis(4, 1.1, 2.0))
|
|
self.assertNotEqual(a, regular_axis(4, 1.0, 2.1))
|
|
|
|
def test_len(self):
|
|
a = regular_axis(4, 1.0, 2.0)
|
|
self.assertEqual(len(a), 5)
|
|
|
|
def test_repr(self):
|
|
for s in ("regular_axis(4, 1.1, 2.2)",
|
|
"regular_axis(4, 1.1, 2.2, label='ra')",
|
|
"regular_axis(4, 1.1, 2.2, uoflow=False)",
|
|
"regular_axis(4, 1.1, 2.2, label='ra', uoflow=False)"):
|
|
self.assertEqual(str(eval(s)), s)
|
|
|
|
def test_getitem(self):
|
|
v = [1.0, 1.25, 1.5, 1.75, 2.0]
|
|
a = regular_axis(4, 1.0, 2.0)
|
|
for i in xrange(5):
|
|
self.assertEqual(a[i], v[i])
|
|
|
|
def test_iter(self):
|
|
v = [1.0, 1.25, 1.5, 1.75, 2.0]
|
|
a = regular_axis(4, 1.0, 2.0)
|
|
self.assertEqual([x for x in a], v)
|
|
|
|
def test_index(self):
|
|
a = regular_axis(4, 1.0, 2.0)
|
|
self.assertEqual(a.index(-1), -1)
|
|
self.assertEqual(a.index(0.99), -1)
|
|
self.assertEqual(a.index(1.0), 0)
|
|
self.assertEqual(a.index(1.1), 0)
|
|
self.assertEqual(a.index(1.249), 0)
|
|
self.assertEqual(a.index(1.250), 1)
|
|
self.assertEqual(a.index(1.499), 1)
|
|
self.assertEqual(a.index(1.500), 2)
|
|
self.assertEqual(a.index(1.749), 2)
|
|
self.assertEqual(a.index(1.750), 3)
|
|
self.assertEqual(a.index(1.999), 3)
|
|
self.assertEqual(a.index(2.000), 4)
|
|
self.assertEqual(a.index(2.1), 4)
|
|
self.assertEqual(a.index(20), 4)
|
|
|
|
class test_polar_axis(unittest.TestCase):
|
|
|
|
def test_init(self):
|
|
polar_axis(1)
|
|
polar_axis(4, 1.0)
|
|
polar_axis(4, 1.0, label="pa")
|
|
with self.assertRaises(TypeError):
|
|
polar_axis()
|
|
with self.assertRaises(StandardError):
|
|
polar_axis(-1)
|
|
with self.assertRaises(TypeError):
|
|
polar_axis(4, 1.0, uoflow=True)
|
|
with self.assertRaises(TypeError):
|
|
polar_axis(1, 1.0, 2.0)
|
|
with self.assertRaises(TypeError):
|
|
polar_axis(1, 1.0, label=1)
|
|
with self.assertRaises(TypeError):
|
|
polar_axis("1")
|
|
a = polar_axis(4, 1.0)
|
|
self.assertEqual(a, polar_axis(4, 1.0))
|
|
self.assertNotEqual(a, polar_axis(2, 1.0))
|
|
self.assertNotEqual(a, polar_axis(4, 0.0))
|
|
|
|
def test_len(self):
|
|
self.assertEqual(len(polar_axis(4)), 5)
|
|
self.assertEqual(len(polar_axis(4, 1.0)), 5)
|
|
|
|
def test_repr(self):
|
|
for s in ("polar_axis(4)",
|
|
"polar_axis(4, 1)",
|
|
"polar_axis(4, 1, label='x')",
|
|
"polar_axis(4, label='x')"):
|
|
self.assertEqual(str(eval(s)), s)
|
|
|
|
def test_getitem(self):
|
|
v = [1.0, 1.0 + 0.5 * pi, 1.0 + pi, 1.0 + 1.5 *pi, 1.0 + 2.0 * pi]
|
|
a = polar_axis(4, 1.0)
|
|
for i in xrange(5):
|
|
self.assertEqual(a[i], v[i])
|
|
|
|
def test_iter(self):
|
|
a = polar_axis(4, 1.0)
|
|
v = [1.0, 1.0 + 0.5 * pi, 1.0 + pi, 1.0 + 1.5 *pi, 1.0 + 2.0 * pi]
|
|
self.assertEqual([x for x in a], v)
|
|
|
|
def test_index(self):
|
|
a = polar_axis(4, 1.0)
|
|
d = 0.5 * pi
|
|
self.assertEqual(a.index(0.99 - 4*d), 3)
|
|
self.assertEqual(a.index(0.99 - 3*d), 0)
|
|
self.assertEqual(a.index(0.99 - 2*d), 1)
|
|
self.assertEqual(a.index(0.99 - d), 2)
|
|
self.assertEqual(a.index(0.99), 3)
|
|
self.assertEqual(a.index(1.0), 0)
|
|
self.assertEqual(a.index(1.01), 0)
|
|
self.assertEqual(a.index(0.99 + d), 0)
|
|
self.assertEqual(a.index(1.0 + d), 1)
|
|
self.assertEqual(a.index(1.0 + 2*d), 2)
|
|
self.assertEqual(a.index(1.0 + 3*d), 3)
|
|
self.assertEqual(a.index(1.0 + 4*d), 0)
|
|
self.assertEqual(a.index(1.0 + 5*d), 1)
|
|
|
|
class test_variable_axis(unittest.TestCase):
|
|
|
|
def test_init(self):
|
|
variable_axis(0, 1)
|
|
variable_axis(1, -1)
|
|
variable_axis(0, 1, 2, 3, 4)
|
|
variable_axis(0, 1, label="va")
|
|
variable_axis(0, 1, uoflow=True)
|
|
variable_axis(0, 1, label="va", uoflow=True)
|
|
with self.assertRaises(TypeError):
|
|
variable_axis()
|
|
with self.assertRaises(RuntimeError):
|
|
variable_axis(1.0)
|
|
with self.assertRaises(TypeError):
|
|
variable_axis("1", 2)
|
|
with self.assertRaises(TypeError):
|
|
regular_axis(1, 1.0, 2.0, bad_keyword="ra")
|
|
a = variable_axis(-0.1, 0.2, 0.3)
|
|
self.assertEqual(a, variable_axis(-0.1, 0.2, 0.3))
|
|
self.assertNotEqual(a, variable_axis(0, 0.2, 0.3))
|
|
self.assertNotEqual(a, variable_axis(-0.1, 0.1, 0.3))
|
|
self.assertNotEqual(a, variable_axis(-0.1, 0.1))
|
|
|
|
def test_len(self):
|
|
self.assertEqual(len(variable_axis(-0.1, 0.2, 0.3)), 3)
|
|
|
|
def test_repr(self):
|
|
for s in ("variable_axis(-0.1, 0.2)",
|
|
"variable_axis(-0.1, 0.2, 0.3)",
|
|
"variable_axis(-0.1, 0.2, 0.3, label='va')",
|
|
"variable_axis(-0.1, 0.2, 0.3, uoflow=False)",
|
|
"variable_axis(-0.1, 0.2, 0.3, label='va', uoflow=False)"):
|
|
self.assertEqual(str(eval(s)), s)
|
|
|
|
def test_getitem(self):
|
|
v = [-0.1, 0.2, 0.3]
|
|
a = variable_axis(*v)
|
|
for i in xrange(3):
|
|
self.assertEqual(a[i], v[i])
|
|
|
|
def test_iter(self):
|
|
v = [-0.1, 0.2, 0.3]
|
|
a = variable_axis(*v)
|
|
self.assertEqual([x for x in a], v)
|
|
|
|
def test_index(self):
|
|
a = variable_axis(-0.1, 0.2, 0.3)
|
|
self.assertEqual(a.index(-10.0), -1)
|
|
self.assertEqual(a.index(-0.11), -1)
|
|
self.assertEqual(a.index(-0.1), 0)
|
|
self.assertEqual(a.index(0.0), 0)
|
|
self.assertEqual(a.index(0.19), 0)
|
|
self.assertEqual(a.index(0.2), 1)
|
|
self.assertEqual(a.index(0.21), 1)
|
|
self.assertEqual(a.index(0.29), 1)
|
|
self.assertEqual(a.index(0.3), 2)
|
|
self.assertEqual(a.index(0.31), 2)
|
|
self.assertEqual(a.index(10), 2)
|
|
|
|
class test_category_axis(unittest.TestCase):
|
|
|
|
def test_init(self):
|
|
category_axis("A", "B", "C")
|
|
category_axis("A;B;C")
|
|
with self.assertRaises(TypeError):
|
|
category_axis()
|
|
with self.assertRaises(TypeError):
|
|
category_axis(1)
|
|
with self.assertRaises(TypeError):
|
|
category_axis("1", 2)
|
|
with self.assertRaises(TypeError):
|
|
category_axis("A", "B", "C", label="ca")
|
|
with self.assertRaises(TypeError):
|
|
category_axis("A", "B", "C", uoflow=True)
|
|
self.assertEqual(category_axis("A", "B", "C"),
|
|
category_axis("A", "B", "C"))
|
|
self.assertEqual(category_axis("A", "B", "C"),
|
|
category_axis("A;B;C"))
|
|
self.assertEqual(category_axis(";"), category_axis("", ""))
|
|
self.assertEqual(category_axis("abc;d"), category_axis("abc", "d"))
|
|
self.assertEqual(category_axis("a;bcd"), category_axis("a", "bcd"))
|
|
self.assertNotEqual(category_axis("A;B"), category_axis("A;C"))
|
|
|
|
def test_len(self):
|
|
a = category_axis("A", "B", "C")
|
|
self.assertEqual(len(a), 3)
|
|
a = category_axis("A;B;C")
|
|
self.assertEqual(len(a), 3)
|
|
|
|
def test_repr(self):
|
|
for s in ("category_axis('A')",
|
|
"category_axis('A', 'B')",
|
|
"category_axis('A', 'B', 'C')"):
|
|
self.assertEqual(str(eval(s)), s)
|
|
|
|
def test_getitem(self):
|
|
c = "A", "B", "C"
|
|
a = category_axis(*c)
|
|
for i in xrange(3):
|
|
self.assertEqual(a[i], c[i])
|
|
|
|
def test_iter(self):
|
|
c = ["A", "B", "C"]
|
|
self.assertEqual([x for x in category_axis(*c)], c)
|
|
|
|
class test_integer_axis(unittest.TestCase):
|
|
|
|
def test_init(self):
|
|
integer_axis(-1, 2)
|
|
with self.assertRaises(TypeError):
|
|
integer_axis()
|
|
with self.assertRaises(TypeError):
|
|
integer_axis(1)
|
|
with self.assertRaises(TypeError):
|
|
integer_axis("1", 2)
|
|
with self.assertRaises(RuntimeError):
|
|
integer_axis(2, -1)
|
|
with self.assertRaises(TypeError):
|
|
integer_axis(1, 2, 3)
|
|
self.assertEqual(integer_axis(-1, 2), integer_axis(-1, 2))
|
|
self.assertNotEqual(integer_axis(-1, 2), integer_axis(-1, 2, label="ia"))
|
|
self.assertNotEqual(integer_axis(-1, 2), integer_axis(-1, 2, uoflow=True))
|
|
|
|
def test_len(self):
|
|
self.assertEqual(len(integer_axis(-1, 2)), 4)
|
|
|
|
def test_repr(self):
|
|
for s in ("integer_axis(-1, 1)",
|
|
"integer_axis(-1, 1, label='ia')",
|
|
"integer_axis(-1, 1, uoflow=False)",
|
|
"integer_axis(-1, 1, label='ia', uoflow=False)"):
|
|
self.assertEqual(str(eval(s)), s)
|
|
|
|
def test_label(self):
|
|
self.assertEqual(integer_axis(-1, 2, label="ia").label, "ia")
|
|
|
|
def test_getitem(self):
|
|
v = [-1, 0, 1, 2]
|
|
a = integer_axis(-1, 2)
|
|
for i in xrange(4):
|
|
self.assertEqual(a[i], v[i])
|
|
|
|
def test_iter(self):
|
|
v = [x for x in integer_axis(-1, 2)]
|
|
self.assertEqual(v, [-1, 0, 1, 2])
|
|
|
|
def test_index(self):
|
|
a = integer_axis(-1, 2)
|
|
self.assertEqual(a.index(-3), -1)
|
|
self.assertEqual(a.index(-2), -1)
|
|
self.assertEqual(a.index(-1), 0)
|
|
self.assertEqual(a.index(0), 1)
|
|
self.assertEqual(a.index(1), 2)
|
|
self.assertEqual(a.index(2), 3)
|
|
self.assertEqual(a.index(3), 4)
|
|
self.assertEqual(a.index(4), 4)
|
|
|
|
class histogram_test(unittest.TestCase):
|
|
|
|
def test_init(self):
|
|
histogram(integer_axis(-1, 1))
|
|
with self.assertRaises(TypeError):
|
|
histogram(1)
|
|
with self.assertRaises(TypeError):
|
|
histogram("bla")
|
|
with self.assertRaises(TypeError):
|
|
histogram([])
|
|
with self.assertRaises(TypeError):
|
|
histogram(regular_axis)
|
|
with self.assertRaises(TypeError):
|
|
histogram(regular_axis())
|
|
with self.assertRaises(TypeError):
|
|
histogram([integer_axis(-1, 1)])
|
|
with self.assertRaises(TypeError):
|
|
histogram(integer_axis(-1, 1), unknown_keyword="nh")
|
|
|
|
h = histogram(integer_axis(-1, 1))
|
|
self.assertEqual(h.dim, 1)
|
|
self.assertEqual(h.axis(0), integer_axis(-1, 1))
|
|
self.assertEqual(h.shape(0), 5)
|
|
self.assertEqual(h.depth, 1)
|
|
self.assertEqual(histogram(integer_axis(-1, 1, uoflow=False)).shape(0), 3)
|
|
self.assertNotEqual(h, histogram(regular_axis(1, -1, 1)))
|
|
self.assertNotEqual(h, histogram(integer_axis(-1, 2)))
|
|
self.assertNotEqual(h, histogram(integer_axis(-1, 1, label="ia")))
|
|
self.assertNotEqual(h, histogram(integer_axis(-1, 1, uoflow=True)))
|
|
|
|
def test_fill_1d(self):
|
|
h0 = histogram(integer_axis(-1, 1, uoflow=False))
|
|
h1 = histogram(integer_axis(-1, 1, uoflow=True))
|
|
for h in (h0, h1):
|
|
with self.assertRaises(StandardError):
|
|
h.fill()
|
|
with self.assertRaises(StandardError):
|
|
h.fill(1, 2)
|
|
h.fill(-10)
|
|
h.fill(-1)
|
|
h.fill(-1)
|
|
h.fill(0)
|
|
h.fill(1)
|
|
h.fill(1)
|
|
h.fill(1)
|
|
h.fill(10)
|
|
self.assertEqual(h0.sum, 6)
|
|
self.assertEqual(h0.depth, 1)
|
|
self.assertEqual(h0.shape(0), 3)
|
|
self.assertEqual(h1.sum, 8)
|
|
self.assertEqual(h1.depth, 1)
|
|
self.assertEqual(h1.shape(0), 5)
|
|
|
|
for h in (h0, h1):
|
|
self.assertEqual(h[0], 2)
|
|
self.assertEqual(h[1], 1)
|
|
self.assertEqual(h[2], 3)
|
|
with self.assertRaises(TypeError):
|
|
h[0, 1]
|
|
|
|
self.assertEqual(h1[-1], 1)
|
|
self.assertEqual(h1[3], 1)
|
|
|
|
def test_growth(self):
|
|
h = histogram(integer_axis(-1, 1))
|
|
h.fill(-1)
|
|
h.fill(1)
|
|
h.fill(1)
|
|
for i in xrange(255):
|
|
h.fill(0)
|
|
self.assertEqual(h.depth, 1)
|
|
h.fill(0)
|
|
self.assertEqual(h.depth, 2)
|
|
for i in xrange(1000-256):
|
|
h.fill(0)
|
|
self.assertEqual(h[-1], 0)
|
|
self.assertEqual(h[0], 1)
|
|
self.assertEqual(h[1], 1000)
|
|
self.assertEqual(h[2], 2)
|
|
self.assertEqual(h[3], 0)
|
|
|
|
def test_fill_2d(self):
|
|
for uoflow in (False, True):
|
|
h = histogram(integer_axis(-1, 1, uoflow=uoflow),
|
|
regular_axis(4, -2, 2, uoflow=uoflow))
|
|
h.fill(-1, -2)
|
|
h.fill(-1, -1)
|
|
h.fill(0, 0)
|
|
h.fill(0, 1)
|
|
h.fill(1, 0)
|
|
h.fill(3, -1)
|
|
h.fill(0, -3)
|
|
with self.assertRaises(StandardError):
|
|
h.fill(1)
|
|
with self.assertRaises(StandardError):
|
|
h.fill(1, 2, 3)
|
|
|
|
m = [[1, 1, 0, 0, 0, 0],
|
|
[0, 0, 1, 1, 0, 1],
|
|
[0, 0, 1, 0, 0, 0],
|
|
[0, 1, 0, 0, 0, 0],
|
|
[0, 0, 0, 0, 0, 0]]
|
|
for i in xrange(h.axis(0).bins + 2*uoflow):
|
|
for j in xrange(h.axis(1).bins + 2*uoflow):
|
|
self.assertEqual(h[i, j], m[i][j])
|
|
|
|
def test_add_2d(self):
|
|
for uoflow in (False, True):
|
|
h = histogram(integer_axis(-1, 1, uoflow=uoflow),
|
|
regular_axis(4, -2, 2, uoflow=uoflow))
|
|
h.fill(-1, -2)
|
|
h.fill(-1, -1)
|
|
h.fill(0, 0)
|
|
h.fill(0, 1)
|
|
h.fill(1, 0)
|
|
h.fill(3, -1)
|
|
h.fill(0, -3)
|
|
|
|
m = [[1, 1, 0, 0, 0, 0],
|
|
[0, 0, 1, 1, 0, 1],
|
|
[0, 0, 1, 0, 0, 0],
|
|
[0, 1, 0, 0, 0, 0],
|
|
[0, 0, 0, 0, 0, 0]]
|
|
|
|
h2 = h + h
|
|
h += h
|
|
self.assertEqual(h, h2)
|
|
|
|
for i in xrange(h.axis(0).bins + 2*uoflow):
|
|
for j in xrange(h.axis(1).bins + 2*uoflow):
|
|
self.assertEqual(h[i, j], 2 * m[i][j])
|
|
|
|
def test_pickle(self):
|
|
a = histogram(category_axis('A', 'B', 'C'),
|
|
integer_axis(0, 3, label='ia'),
|
|
regular_axis(4, 0.0, 4.0, uoflow=False),
|
|
variable_axis(0.0, 1.0, 2.0))
|
|
for i in xrange(a.axis(0).bins):
|
|
a.fill(i, 0, 0, 0)
|
|
for j in xrange(a.axis(1).bins):
|
|
a.fill(i, j, 0, 0)
|
|
for k in xrange(a.axis(2).bins):
|
|
a.fill(i, j, k, 0)
|
|
for l in xrange(a.axis(3).bins):
|
|
a.fill(i, j, k, l)
|
|
|
|
io = StringIO.StringIO()
|
|
cPickle.dump(a, io)
|
|
io.seek(0)
|
|
b = cPickle.load(io)
|
|
self.assertNotEqual(id(a), id(b))
|
|
self.assertEqual(a.dim, b.dim)
|
|
self.assertEqual(a.axis(0), b.axis(0))
|
|
self.assertEqual(a.axis(1), b.axis(1))
|
|
self.assertEqual(a.axis(2), b.axis(2))
|
|
self.assertEqual(a.axis(3), b.axis(3))
|
|
self.assertEqual(a.sum, b.sum)
|
|
self.assertEqual(a, b)
|
|
|
|
@unittest.skipUnless("numpy" in globals(), "requires numpy")
|
|
def test_numpy_conversion(self):
|
|
a = histogram(integer_axis(0, 2, uoflow=False))
|
|
for i in xrange(100):
|
|
a.fill(1)
|
|
b = numpy.array(a) # a copy
|
|
v = numpy.asarray(a) # a view
|
|
self.assertEqual(b.dtype, numpy.uint8)
|
|
self.assertTrue(numpy.all(b == numpy.array((0, 100, 0))))
|
|
for i in xrange(100):
|
|
a.fill(1)
|
|
self.assertTrue(numpy.all(b == numpy.array((0, 100, 0))))
|
|
self.assertTrue(numpy.all(v == numpy.array((0, 200, 0))))
|
|
for i in xrange(100):
|
|
a.fill(1)
|
|
b = numpy.array(a)
|
|
self.assertEqual(b.dtype, numpy.uint16)
|
|
self.assertTrue(numpy.all(b == numpy.array((0, 300, 0))))
|
|
# view does not follow underlying switch in word size
|
|
self.assertFalse(numpy.all(v == b))
|
|
|
|
@unittest.skipUnless("numpy" in globals(), "requires numpy")
|
|
def test_fill_with_numpy_array(self):
|
|
a = histogram(integer_axis(0, 2, uoflow=False))
|
|
a.fill(numpy.array([-1, 0, 1, 2, 1, 4]))
|
|
self.assertEqual(a[0], 1)
|
|
self.assertEqual(a[1], 2)
|
|
self.assertEqual(a[2], 1)
|
|
a = histogram(integer_axis(0, 1, uoflow=False),
|
|
regular_axis(2, 0, 2, uoflow=False))
|
|
a.fill(numpy.array([[-1., -1.], [0., 1.], [1., 0.1]]))
|
|
self.assertEqual(a[0, 0], 0)
|
|
self.assertEqual(a[0, 1], 1)
|
|
self.assertEqual(a[1, 0], 1)
|
|
self.assertEqual(a[1, 1], 0)
|
|
a = histogram(integer_axis(0, 2, uoflow=False))
|
|
a.fill([0, 0, 1, 2])
|
|
a.fill((1, 0, 2, 2))
|
|
self.assertEqual(a[0], 3)
|
|
self.assertEqual(a[1], 2)
|
|
self.assertEqual(a[2], 3)
|
|
|
|
if __name__ == "__main__":
|
|
unittest.main()
|