summaryrefslogtreecommitdiff
path: root/test
diff options
context:
space:
mode:
Diffstat (limited to 'test')
-rw-r--r--test/test_distance.py14
-rw-r--r--test/test_empty.py147
-rw-r--r--test/test_function.py37
3 files changed, 194 insertions, 4 deletions
diff --git a/test/test_distance.py b/test/test_distance.py
index 19da35f..e45ac16 100644
--- a/test/test_distance.py
+++ b/test/test_distance.py
@@ -196,7 +196,7 @@ def test_spike_sync():
0.4, decimal=16)
-def check_multi_profile(profile_func, profile_func_multi):
+def check_multi_profile(profile_func, profile_func_multi, dist_func_multi):
# generate spike trains:
t1 = SpikeTrain([0.2, 0.4, 0.6, 0.7], 1.0)
t2 = SpikeTrain([0.3, 0.45, 0.8, 0.9, 0.95], 1.0)
@@ -213,10 +213,14 @@ def check_multi_profile(profile_func, profile_func_multi):
f_multi = profile_func_multi(spike_trains, [0, 1])
assert f_multi.almost_equal(f12, decimal=14)
+ d = dist_func_multi(spike_trains, [0, 1])
+ assert_equal(f_multi.avrg(), d)
f_multi1 = profile_func_multi(spike_trains, [1, 2, 3])
f_multi2 = profile_func_multi(spike_trains[1:])
assert f_multi1.almost_equal(f_multi2, decimal=14)
+ d = dist_func_multi(spike_trains, [1, 2, 3])
+ assert_almost_equal(f_multi1.avrg(), d, decimal=14)
f = copy(f12)
f.add(f13)
@@ -224,6 +228,8 @@ def check_multi_profile(profile_func, profile_func_multi):
f.mul_scalar(1.0/3)
f_multi = profile_func_multi(spike_trains, [0, 1, 2])
assert f_multi.almost_equal(f, decimal=14)
+ d = dist_func_multi(spike_trains, [0, 1, 2])
+ assert_almost_equal(f_multi.avrg(), d, decimal=14)
f.mul_scalar(3) # revert above normalization
f.add(f14)
@@ -235,11 +241,13 @@ def check_multi_profile(profile_func, profile_func_multi):
def test_multi_isi():
- check_multi_profile(spk.isi_profile, spk.isi_profile_multi)
+ check_multi_profile(spk.isi_profile, spk.isi_profile_multi,
+ spk.isi_distance_multi)
def test_multi_spike():
- check_multi_profile(spk.spike_profile, spk.spike_profile_multi)
+ check_multi_profile(spk.spike_profile, spk.spike_profile_multi,
+ spk.spike_distance_multi)
def test_multi_spike_sync():
diff --git a/test/test_empty.py b/test/test_empty.py
new file mode 100644
index 0000000..48be25d
--- /dev/null
+++ b/test/test_empty.py
@@ -0,0 +1,147 @@
+""" test_empty.py
+
+Tests the distance measure for empty spike trains
+
+Copyright 2015, Mario Mulansky <mario.mulansky@gmx.net>
+
+Distributed under the BSD License
+
+"""
+
+from __future__ import print_function
+import numpy as np
+from numpy.testing import assert_equal, assert_almost_equal, \
+ assert_array_equal, assert_array_almost_equal
+
+import pyspike as spk
+from pyspike import SpikeTrain
+
+
+def test_get_non_empty():
+ st = SpikeTrain([], edges=(0.0, 1.0))
+ spikes = st.get_spikes_non_empty()
+ assert_array_equal(spikes, [0.0, 1.0])
+
+ st = SpikeTrain([0.5, ], edges=(0.0, 1.0))
+ spikes = st.get_spikes_non_empty()
+ assert_array_equal(spikes, [0.0, 0.5, 1.0])
+
+
+def test_isi_empty():
+ st1 = SpikeTrain([], edges=(0.0, 1.0))
+ st2 = SpikeTrain([], edges=(0.0, 1.0))
+ d = spk.isi_distance(st1, st2)
+ assert_equal(d, 0.0)
+ prof = spk.isi_profile(st1, st2)
+ assert_equal(d, prof.avrg())
+ assert_array_equal(prof.x, [0.0, 1.0])
+ assert_array_equal(prof.y, [0.0, ])
+
+ st1 = SpikeTrain([], edges=(0.0, 1.0))
+ st2 = SpikeTrain([0.4, ], edges=(0.0, 1.0))
+ d = spk.isi_distance(st1, st2)
+ assert_equal(d, 0.6*0.4+0.4*0.6)
+ prof = spk.isi_profile(st1, st2)
+ assert_equal(d, prof.avrg())
+ assert_array_equal(prof.x, [0.0, 0.4, 1.0])
+ assert_array_equal(prof.y, [0.6, 0.4])
+
+ st1 = SpikeTrain([0.6, ], edges=(0.0, 1.0))
+ st2 = SpikeTrain([0.4, ], edges=(0.0, 1.0))
+ d = spk.isi_distance(st1, st2)
+ assert_almost_equal(d, 0.2/0.6*0.4 + 0.0 + 0.2/0.6*0.4, decimal=15)
+ prof = spk.isi_profile(st1, st2)
+ assert_equal(d, prof.avrg())
+ assert_array_almost_equal(prof.x, [0.0, 0.4, 0.6, 1.0], decimal=15)
+ assert_array_almost_equal(prof.y, [0.2/0.6, 0.0, 0.2/0.6], decimal=15)
+
+
+def test_spike_empty():
+ st1 = SpikeTrain([], edges=(0.0, 1.0))
+ st2 = SpikeTrain([], edges=(0.0, 1.0))
+ d = spk.spike_distance(st1, st2)
+ assert_equal(d, 0.0)
+ prof = spk.spike_profile(st1, st2)
+ assert_equal(d, prof.avrg())
+ assert_array_equal(prof.x, [0.0, 1.0])
+ assert_array_equal(prof.y1, [0.0, ])
+ assert_array_equal(prof.y2, [0.0, ])
+
+ st1 = SpikeTrain([], edges=(0.0, 1.0))
+ st2 = SpikeTrain([0.4, ], edges=(0.0, 1.0))
+ d = spk.spike_distance(st1, st2)
+ assert_almost_equal(d, 0.4*0.4*1.0/(0.4+1.0)**2 + 0.6*0.4*1.0/(0.6+1.0)**2,
+ decimal=15)
+ prof = spk.spike_profile(st1, st2)
+ assert_equal(d, prof.avrg())
+ assert_array_equal(prof.x, [0.0, 0.4, 1.0])
+ assert_array_almost_equal(prof.y1, [0.0, 2*0.4*1.0/(0.6+1.0)**2],
+ decimal=15)
+ assert_array_almost_equal(prof.y2, [2*0.4*1.0/(0.4+1.0)**2, 0.0],
+ decimal=15)
+
+ st1 = SpikeTrain([0.6, ], edges=(0.0, 1.0))
+ st2 = SpikeTrain([0.4, ], edges=(0.0, 1.0))
+ d = spk.spike_distance(st1, st2)
+ s1 = np.array([0.0, 0.4*0.2/0.6, 0.2, 0.0])
+ s2 = np.array([0.0, 0.2, 0.2*0.4/0.6, 0.0])
+ isi1 = np.array([0.6, 0.6, 0.4])
+ isi2 = np.array([0.4, 0.6, 0.6])
+ expected_y1 = (s1[:-1]*isi2+s2[:-1]*isi1) / (0.5*(isi1+isi2)**2)
+ expected_y2 = (s1[1:]*isi2+s2[1:]*isi1) / (0.5*(isi1+isi2)**2)
+ expected_times = np.array([0.0, 0.4, 0.6, 1.0])
+ expected_spike_val = sum((expected_times[1:] - expected_times[:-1]) *
+ (expected_y1+expected_y2)/2)
+ expected_spike_val /= (expected_times[-1]-expected_times[0])
+
+ assert_almost_equal(d, expected_spike_val, decimal=15)
+ prof = spk.spike_profile(st1, st2)
+ assert_equal(d, prof.avrg())
+ assert_array_almost_equal(prof.x, [0.0, 0.4, 0.6, 1.0], decimal=15)
+ assert_array_almost_equal(prof.y1, expected_y1, decimal=15)
+ assert_array_almost_equal(prof.y2, expected_y2, decimal=15)
+
+
+def test_spike_sync_empty():
+ st1 = SpikeTrain([], edges=(0.0, 1.0))
+ st2 = SpikeTrain([], edges=(0.0, 1.0))
+ d = spk.spike_sync(st1, st2)
+ assert_equal(d, 1.0)
+ prof = spk.spike_sync_profile(st1, st2)
+ assert_equal(d, prof.avrg())
+ assert_array_equal(prof.x, [0.0, 1.0])
+ assert_array_equal(prof.y, [1.0, 1.0])
+
+ st1 = SpikeTrain([], edges=(0.0, 1.0))
+ st2 = SpikeTrain([0.4, ], edges=(0.0, 1.0))
+ d = spk.spike_sync(st1, st2)
+ assert_equal(d, 0.0)
+ prof = spk.spike_sync_profile(st1, st2)
+ assert_equal(d, prof.avrg())
+ assert_array_equal(prof.x, [0.0, 0.4, 1.0])
+ assert_array_equal(prof.y, [0.0, 0.0, 0.0])
+
+ st1 = SpikeTrain([0.6, ], edges=(0.0, 1.0))
+ st2 = SpikeTrain([0.4, ], edges=(0.0, 1.0))
+ d = spk.spike_sync(st1, st2)
+ assert_almost_equal(d, 1.0, decimal=15)
+ prof = spk.spike_sync_profile(st1, st2)
+ assert_equal(d, prof.avrg())
+ assert_array_almost_equal(prof.x, [0.0, 0.4, 0.6, 1.0], decimal=15)
+ assert_array_almost_equal(prof.y, [1.0, 1.0, 1.0, 1.0], decimal=15)
+
+ st1 = SpikeTrain([0.2, ], edges=(0.0, 1.0))
+ st2 = SpikeTrain([0.8, ], edges=(0.0, 1.0))
+ d = spk.spike_sync(st1, st2)
+ assert_almost_equal(d, 0.0, decimal=15)
+ prof = spk.spike_sync_profile(st1, st2)
+ assert_equal(d, prof.avrg())
+ assert_array_almost_equal(prof.x, [0.0, 0.2, 0.8, 1.0], decimal=15)
+ assert_array_almost_equal(prof.y, [0.0, 0.0, 0.0, 0.0], decimal=15)
+
+
+if __name__ == "__main__":
+ test_get_non_empty()
+ test_isi_empty()
+ test_spike_empty()
+ test_spike_sync_empty()
diff --git a/test/test_function.py b/test/test_function.py
index d81b03a..92d378d 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_almost_equal, assert_array_almost_equal
+from numpy.testing import assert_equal, assert_almost_equal, \
+ assert_array_equal, assert_array_almost_equal
import pyspike as spk
@@ -20,6 +21,20 @@ def test_pwc():
x = [0.0, 1.0, 2.0, 2.5, 4.0]
y = [1.0, -0.5, 1.5, 0.75]
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_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])
+
xp, yp = f.get_plottable_data()
xp_expected = [0.0, 1.0, 1.0, 2.0, 2.0, 2.5, 2.5, 4.0]
@@ -38,11 +53,17 @@ def test_pwc():
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])
assert_almost_equal(a, (-0.5*1.0+0.5*1.5+1.5*0.75)/3.0, decimal=16)
+ a = f.avrg([0.0, 2.2])
+ assert_almost_equal(a, (1.0*1.0-0.5*1.0+0.2*1.5)/2.2, decimal=15)
# averaging over multiple intervals
a = f.avrg([(0.5, 1.5), (1.5, 3.5)])
assert_almost_equal(a, (0.5-0.5+0.5*1.5+1.0*0.75)/3.0, decimal=16)
+ # averaging over multiple intervals
+ a = f.avrg([(0.5, 1.5), (2.2, 3.5)])
+ assert_almost_equal(a, (0.5*1.0-0.5*0.5+0.3*1.5+1.0*0.75)/2.3, decimal=15)
+
def test_pwc_add():
# some random data
@@ -105,6 +126,20 @@ def test_pwl():
y1 = [1.0, -0.5, 1.5, 0.75]
y2 = [1.5, -0.4, 1.5, 0.25]
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_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])
+
xp, yp = f.get_plottable_data()
xp_expected = [0.0, 1.0, 1.0, 2.0, 2.0, 2.5, 2.5, 4.0]