summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMario Mulansky <mario.mulansky@gmx.net>2015-05-11 14:32:48 +0200
committerMario Mulansky <mario.mulansky@gmx.net>2015-05-11 14:32:48 +0200
commit017893e782d1747e1f031131077a40a48f882e86 (patch)
tree81e2f658347eb5377fbd1e8cf6ef9a7774ca0987
parent97a1a5ace20b641fef78ed7cb2338ece04e07cac (diff)
treatment of empty spike trains in isi functions
-rw-r--r--pyspike/SpikeTrain.py10
-rw-r--r--pyspike/isi_distance.py7
-rw-r--r--test/test_empty.py62
3 files changed, 77 insertions, 2 deletions
diff --git a/pyspike/SpikeTrain.py b/pyspike/SpikeTrain.py
index a02b7ab..9127b60 100644
--- a/pyspike/SpikeTrain.py
+++ b/pyspike/SpikeTrain.py
@@ -48,3 +48,13 @@ class SpikeTrain(object):
"""
return SpikeTrain(self.spikes.copy(), [self.t_start, self.t_end])
+
+ def get_spikes_non_empty(self):
+ """Returns the spikes of this spike train with auxiliary spikes in case
+ of empty spike trains.
+ """
+ if len(self.spikes) < 2:
+ return np.unique(np.insert([self.t_start, self.t_end], 1,
+ self.spikes))
+ else:
+ return self.spikes
diff --git a/pyspike/isi_distance.py b/pyspike/isi_distance.py
index 2a1ed3a..5ea555d 100644
--- a/pyspike/isi_distance.py
+++ b/pyspike/isi_distance.py
@@ -41,7 +41,8 @@ Falling back to slow python backend.")
from cython.python_backend import isi_distance_python \
as isi_profile_impl
- times, values = isi_profile_impl(spike_train1.spikes, spike_train2.spikes,
+ times, values = isi_profile_impl(spike_train1.get_spikes_non_empty(),
+ spike_train2.get_spikes_non_empty(),
spike_train1.t_start, spike_train1.t_end)
return PieceWiseConstFunc(times, values)
@@ -73,7 +74,9 @@ def isi_distance(spike_train1, spike_train2, interval=None):
try:
from cython.cython_distances import isi_distance_cython \
as isi_distance_impl
- return isi_distance_impl(spike_train1.spikes, spike_train2.spikes,
+
+ return isi_distance_impl(spike_train1.get_spikes_non_empty(),
+ spike_train2.get_spikes_non_empty(),
spike_train1.t_start, spike_train1.t_end)
except ImportError:
# Cython backend not available: fall back to profile averaging
diff --git a/test/test_empty.py b/test/test_empty.py
new file mode 100644
index 0000000..22982c7
--- /dev/null
+++ b/test/test_empty.py
@@ -0,0 +1,62 @@
+""" test_empty.py
+
+Tests the distance measure for empty spike trains
+
+Copyright 2014, Mario Mulansky <mario.mulansky@gmx.net>
+
+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, \
+ 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)
+
+
+if __name__ == "__main__":
+ test_get_non_empty()
+ test_isi_empty()