summaryrefslogtreecommitdiff
path: root/test/test_function.py
diff options
context:
space:
mode:
Diffstat (limited to 'test/test_function.py')
-rw-r--r--test/test_function.py96
1 files changed, 79 insertions, 17 deletions
diff --git a/test/test_function.py b/test/test_function.py
index 92d378d..ba10ae7 100644
--- a/test/test_function.py
+++ b/test/test_function.py
@@ -10,7 +10,8 @@ Distributed under the BSD License
from __future__ import print_function
import numpy as np
from copy import copy
-from numpy.testing import assert_equal, assert_almost_equal, \
+from nose.tools import raises
+from numpy.testing import assert_allclose, assert_almost_equal, \
assert_array_equal, assert_array_almost_equal
import pyspike as spk
@@ -23,14 +24,14 @@ def test_pwc():
f = spk.PieceWiseConstFunc(x, y)
# function values
- assert_equal(f(0.0), 1.0)
- assert_equal(f(0.5), 1.0)
- assert_equal(f(1.0), 0.25)
- assert_equal(f(2.0), 0.5)
- assert_equal(f(2.25), 1.5)
- assert_equal(f(2.5), 2.25/2)
- assert_equal(f(3.5), 0.75)
- assert_equal(f(4.0), 0.75)
+ assert_allclose(f(0.0), 1.0)
+ assert_allclose(f(0.5), 1.0)
+ assert_allclose(f(1.0), 0.25)
+ assert_allclose(f(2.0), 0.5)
+ assert_allclose(f(2.25), 1.5)
+ assert_allclose(f(2.5), 2.25/2)
+ assert_allclose(f(3.5), 0.75)
+ assert_allclose(f(4.0), 0.75)
assert_array_equal(f([0.0, 0.5, 1.0, 2.0, 2.25, 2.5, 3.5, 4.0]),
[1.0, 1.0, 0.25, 0.5, 1.5, 2.25/2, 0.75, 0.75])
@@ -49,6 +50,8 @@ def test_pwc():
assert_almost_equal(a, (0.5-0.5+0.5*1.5+1.0*0.75)/3.0, decimal=16)
a = f.avrg([1.5, 3.5])
assert_almost_equal(a, (-0.5*0.5+0.5*1.5+1.0*0.75)/2.0, decimal=16)
+ a = f.avrg([1.0, 2.0])
+ assert_almost_equal(a, (1.0*-0.5)/1.0, decimal=16)
a = f.avrg([1.0, 3.5])
assert_almost_equal(a, (-0.5*1.0+0.5*1.5+1.0*0.75)/2.5, decimal=16)
a = f.avrg([1.0, 4.0])
@@ -120,6 +123,53 @@ def test_pwc_avrg():
assert_array_almost_equal(f1.x, x_expected, decimal=16)
assert_array_almost_equal(f1.y, y_expected, decimal=16)
+def test_pwc_integral():
+ # some random data
+ x = [0.0, 1.0, 2.0, 2.5, 4.0]
+ y = [1.0, -0.5, 1.5, 0.75]
+ f1 = spk.PieceWiseConstFunc(x, y)
+
+ # test full interval
+ full = 1.0*1.0 + 1.0*-0.5 + 0.5*1.5 + 1.5*0.75;
+ assert_allclose(f1.integral(), full)
+ assert_allclose(f1.integral((np.min(x),np.max(x))), full)
+ # test part interval, spanning an edge
+ assert_allclose(f1.integral((0.5,1.5)), 0.5*1.0 + 0.5*-0.5)
+ # test part interval, just over two edges
+ assert_almost_equal(f1.integral((1.0-1e-16,2+1e-16)), 1.0*-0.5, decimal=14)
+ # test part interval, between two edges
+ assert_allclose(f1.integral((1.0,2.0)), 1.0*-0.5)
+ assert_allclose(f1.integral((1.2,1.7)), (1.7-1.2)*-0.5)
+ # test part interval, start to before and after edge
+ assert_allclose(f1.integral((0.0,0.7)), 0.7*1.0)
+ assert_allclose(f1.integral((0.0,1.1)), 1.0*1.0+0.1*-0.5)
+ # test part interval, before and after edge till end
+ assert_allclose(f1.integral((2.6,4.0)), (4.0-2.6)*0.75)
+ assert_allclose(f1.integral((2.4,4.0)), (2.5-2.4)*1.5+(4-2.5)*0.75)
+
+@raises(ValueError)
+def test_pwc_integral_bad_bounds_inv():
+ # some random data
+ x = [0.0, 1.0, 2.0, 2.5, 4.0]
+ y = [1.0, -0.5, 1.5, 0.75]
+ f1 = spk.PieceWiseConstFunc(x, y)
+ f1.integral((3,2))
+
+@raises(ValueError)
+def test_pwc_integral_bad_bounds_oob_1():
+ # some random data
+ x = [0.0, 1.0, 2.0, 2.5, 4.0]
+ y = [1.0, -0.5, 1.5, 0.75]
+ f1 = spk.PieceWiseConstFunc(x, y)
+ f1.integral((1,6))
+
+@raises(ValueError)
+def test_pwc_integral_bad_bounds_oob_2():
+ # some random data
+ x = [0.0, 1.0, 2.0, 2.5, 4.0]
+ y = [1.0, -0.5, 1.5, 0.75]
+ f1 = spk.PieceWiseConstFunc(x, y)
+ f1.integral((-1,3))
def test_pwl():
x = [0.0, 1.0, 2.0, 2.5, 4.0]
@@ -128,14 +178,14 @@ def test_pwl():
f = spk.PieceWiseLinFunc(x, y1, y2)
# function values
- assert_equal(f(0.0), 1.0)
- assert_equal(f(0.5), 1.25)
- assert_equal(f(1.0), 0.5)
- assert_equal(f(2.0), 1.1/2)
- assert_equal(f(2.25), 1.5)
- assert_equal(f(2.5), 2.25/2)
- assert_equal(f(3.5), 0.75-0.5*1.0/1.5)
- assert_equal(f(4.0), 0.25)
+ assert_allclose(f(0.0), 1.0)
+ assert_allclose(f(0.5), 1.25)
+ assert_allclose(f(1.0), 0.5)
+ assert_allclose(f(2.0), 1.1/2)
+ assert_allclose(f(2.25), 1.5)
+ assert_allclose(f(2.5), 2.25/2)
+ assert_allclose(f(3.5), 0.75-0.5*1.0/1.5)
+ assert_allclose(f(4.0), 0.25)
assert_array_equal(f([0.0, 0.5, 1.0, 2.0, 2.25, 2.5, 3.5, 4.0]),
[1.0, 1.25, 0.5, 0.55, 1.5, 2.25/2, 0.75-0.5/1.5, 0.25])
@@ -162,6 +212,18 @@ def test_pwl():
a = f.avrg([1.0, 4.0])
assert_almost_equal(a, (-0.45 + 0.75 + 1.5*0.5) / 3.0, decimal=16)
+ # interval between support points
+ a = f.avrg([1.1, 1.5])
+ assert_almost_equal(a, (-0.5+0.1*0.1 - 0.45) * 0.5, decimal=14)
+
+ # starting at a support point
+ a = f.avrg([1.0, 1.5])
+ assert_almost_equal(a, (-0.5 - 0.45) * 0.5, decimal=14)
+
+ # start and end at support point
+ a = f.avrg([1.0, 2.0])
+ assert_almost_equal(a, (-0.5 - 0.4) * 0.5, decimal=14)
+
# averaging over multiple intervals
a = f.avrg([(0.5, 1.5), (1.5, 2.5)])
assert_almost_equal(a, (1.375*0.5 - 0.45 + 0.75)/2.0, decimal=16)