From cce93ecbb1c961ab075a4924a42543483ffffb77 Mon Sep 17 00:00:00 2001 From: Mario Mulansky Date: Tue, 20 Jan 2015 10:47:27 +0100 Subject: added spike sync matrix --- pyspike/__init__.py | 4 ++-- pyspike/distances.py | 62 ++++++++++++++++++++++++++++++++++++++++++--------- pyspike/function.py | 1 + test/test_distance.py | 20 +++++++++++------ 4 files changed, 68 insertions(+), 19 deletions(-) diff --git a/pyspike/__init__.py b/pyspike/__init__.py index 1b18569..55687e6 100644 --- a/pyspike/__init__.py +++ b/pyspike/__init__.py @@ -10,9 +10,9 @@ from function import PieceWiseConstFunc, PieceWiseLinFunc, \ DiscreteFunction, average_profile from distances import isi_profile, isi_distance, \ spike_profile, spike_distance, \ - spike_sync_profile, spike_sync_distance, \ + spike_sync_profile, spike_sync, \ isi_profile_multi, isi_distance_multi, isi_distance_matrix, \ spike_profile_multi, spike_distance_multi, spike_distance_matrix, \ - spike_sync_profile_multi + spike_sync_profile_multi, spike_sync_multi, spike_sync_matrix from spikes import add_auxiliary_spikes, load_spike_trains_from_txt, \ spike_train_from_string, merge_spike_trains, generate_poisson_spikes diff --git a/pyspike/distances.py b/pyspike/distances.py index 0f0efa9..8a14a8d 100644 --- a/pyspike/distances.py +++ b/pyspike/distances.py @@ -152,10 +152,10 @@ Falling back to slow python backend.") ############################################################ -# spike_sync_distance +# spike_sync ############################################################ -def spike_sync_distance(spikes1, spikes2): - return spike_sync_profile(spikes1, spikes2).avrg() +def spike_sync(spikes1, spikes2, interval=None): + return spike_sync_profile(spikes1, spikes2).avrg(interval) ############################################################ @@ -313,6 +313,28 @@ def spike_profile_multi(spike_trains, indices=None): return average_dist +############################################################ +# spike_distance_multi +############################################################ +def spike_distance_multi(spike_trains, indices=None, interval=None): + """ Computes the multi-variate spike distance for a set of spike trains. + That is the time average of the multi-variate spike profile: + S_{spike} = \int_0^T 2/((N(N-1)) sum_{} S_{spike}^{i, j} dt + where the sum goes over all pairs + + :param spike_trains: list of spike trains + :param indices: list of indices defining which spike trains to use, + if None all given spike trains are used (default=None) + :type indices: list or None + :param interval: averaging interval given as a pair of floats, if None + the average over the whole function is computed. + :type interval: Pair of floats or None. + :returns: The averaged spike distance S. + :rtype: double + """ + return spike_profile_multi(spike_trains, indices).avrg(interval) + + ############################################################ # spike_profile_multi ############################################################ @@ -341,11 +363,9 @@ def spike_sync_profile_multi(spike_trains, indices=None): ############################################################ # spike_distance_multi ############################################################ -def spike_distance_multi(spike_trains, indices=None, interval=None): - """ Computes the multi-variate spike distance for a set of spike trains. - That is the time average of the multi-variate spike profile: - S_{spike} = \int_0^T 2/((N(N-1)) sum_{} S_{spike}^{i, j} dt - where the sum goes over all pairs +def spike_sync_multi(spike_trains, indices=None, interval=None): + """ Computes the multi-variate spike synchronization value for a set of + spike trains. :param spike_trains: list of spike trains :param indices: list of indices defining which spike trains to use, @@ -354,10 +374,10 @@ def spike_distance_multi(spike_trains, indices=None, interval=None): :param interval: averaging interval given as a pair of floats, if None the average over the whole function is computed. :type interval: Pair of floats or None. - :returns: The averaged spike distance S. + :returns: The averaged spike synchronization value SYNC. :rtype: double """ - return spike_profile_multi(spike_trains, indices).avrg(interval) + return spike_sync_profile_multi(spike_trains, indices).avrg(interval) ############################################################ @@ -433,3 +453,25 @@ def spike_distance_matrix(spike_trains, indices=None, interval=None): """ return _generic_distance_matrix(spike_trains, spike_distance, indices, interval) + + +############################################################ +# spike_sync_matrix +############################################################ +def spike_sync_matrix(spike_trains, indices=None, interval=None): + """ Computes the time averaged spike-synchronization value of all pairs of + spike-trains. + + :param spike_trains: list of spike trains + :param indices: list of indices defining which spike trains to use, + if None all given spike trains are used (default=None) + :type indices: list or None + :param interval: averaging interval given as a pair of floats, if None + the average over the whole function is computed. + :type interval: Pair of floats or None. + :returns: 2D array with the pair wise time spike synchronization values + :math:`SYNC_{ij}` + :rtype: np.array + """ + return _generic_distance_matrix(spike_trains, spike_sync, + indices, interval) diff --git a/pyspike/function.py b/pyspike/function.py index 62b0e2c..e0dadf6 100644 --- a/pyspike/function.py +++ b/pyspike/function.py @@ -429,6 +429,7 @@ class DiscreteFunction(object): """ def get_indices(ival): + """ Retuns the indeces surrounding the given interval""" start_ind = np.searchsorted(self.x, ival[0], side='right') end_ind = np.searchsorted(self.x, ival[1], side='left') assert start_ind > 0 and end_ind < len(self.x), \ diff --git a/test/test_distance.py b/test/test_distance.py index 6bdb049..2650313 100644 --- a/test/test_distance.py +++ b/test/test_distance.py @@ -135,22 +135,22 @@ def test_spike_sync(): spikes2 = np.array([2.1]) spikes1 = spk.add_auxiliary_spikes(spikes1, 4.0) spikes2 = spk.add_auxiliary_spikes(spikes2, 4.0) - assert_almost_equal(spk.spike_sync_distance(spikes1, spikes2), + assert_almost_equal(spk.spike_sync(spikes1, spikes2), 0.5, decimal=16) spikes2 = np.array([3.1]) spikes2 = spk.add_auxiliary_spikes(spikes2, 4.0) - assert_almost_equal(spk.spike_sync_distance(spikes1, spikes2), + assert_almost_equal(spk.spike_sync(spikes1, spikes2), 0.5, decimal=16) spikes2 = np.array([1.1]) spikes2 = spk.add_auxiliary_spikes(spikes2, 4.0) - assert_almost_equal(spk.spike_sync_distance(spikes1, spikes2), + assert_almost_equal(spk.spike_sync(spikes1, spikes2), 0.5, decimal=16) spikes2 = np.array([0.9]) spikes2 = spk.add_auxiliary_spikes(spikes2, 4.0) - assert_almost_equal(spk.spike_sync_distance(spikes1, spikes2), + assert_almost_equal(spk.spike_sync(spikes1, spikes2), 0.5, decimal=16) @@ -207,11 +207,11 @@ def test_multi_spike_sync(): spikes1 = spk.add_auxiliary_spikes(spikes1, 1000) spikes2 = spk.add_auxiliary_spikes(spikes2, 1000) spikes3 = spk.add_auxiliary_spikes(spikes3, 1000) - assert_almost_equal(spk.spike_sync_distance(spikes1, spikes2), + assert_almost_equal(spk.spike_sync(spikes1, spikes2), 0.5, decimal=15) - assert_almost_equal(spk.spike_sync_distance(spikes1, spikes3), + assert_almost_equal(spk.spike_sync(spikes1, spikes3), 0.5, decimal=15) - assert_almost_equal(spk.spike_sync_distance(spikes2, spikes3), + assert_almost_equal(spk.spike_sync(spikes2, spikes3), 0.5, decimal=15) f = spk.spike_sync_profile_multi([spikes1, spikes2, spikes3]) @@ -220,6 +220,8 @@ def test_multi_spike_sync(): # (np.sum(f1.mp[1:-1])+np.sum(f2.mp[1:-1])+np.sum(f3.mp[1:-1])) expected = 0.5 assert_almost_equal(f.avrg(), expected, decimal=15) + assert_almost_equal(spk.spike_sync_multi([spikes1, spikes2, spikes3]), + expected, decimal=15) # multivariate regression test spike_trains = spk.load_spike_trains_from_txt("test/SPIKE_Sync_Test.txt", @@ -267,6 +269,10 @@ def test_spike_matrix(): check_dist_matrix(spk.spike_distance, spk.spike_distance_matrix) +def test_spike_sync_matrix(): + check_dist_matrix(spk.spike_sync, spk.spike_sync_matrix) + + def test_regression_spiky(): spike_trains = spk.load_spike_trains_from_txt("test/PySpike_testdata.txt", (0.0, 4000.0)) -- cgit v1.2.3