From 619fdef014c44a89a7ecef9078905ee44e373b84 Mon Sep 17 00:00:00 2001 From: Mario Mulansky Date: Fri, 18 Dec 2015 14:37:45 +0100 Subject: bugfix for edge correction fixed bug within new edge correction (auxiliary spike was ignored in some cases) added regression test with 10000 random spike train sets --- .../regression_random_results_cSPIKY.mat | Bin 0 -> 149130 bytes test/test_regression/regression_random_spikes.mat | Bin 0 -> 16241579 bytes .../test_regression_random_spikes.py | 113 +++++++++++++++++++++ 3 files changed, 113 insertions(+) create mode 100644 test/test_regression/regression_random_results_cSPIKY.mat create mode 100644 test/test_regression/regression_random_spikes.mat create mode 100644 test/test_regression/test_regression_random_spikes.py (limited to 'test/test_regression') diff --git a/test/test_regression/regression_random_results_cSPIKY.mat b/test/test_regression/regression_random_results_cSPIKY.mat new file mode 100644 index 0000000..47c9b50 Binary files /dev/null and b/test/test_regression/regression_random_results_cSPIKY.mat differ diff --git a/test/test_regression/regression_random_spikes.mat b/test/test_regression/regression_random_spikes.mat new file mode 100644 index 0000000..e5ebeb1 Binary files /dev/null and b/test/test_regression/regression_random_spikes.mat differ diff --git a/test/test_regression/test_regression_random_spikes.py b/test/test_regression/test_regression_random_spikes.py new file mode 100644 index 0000000..757bab2 --- /dev/null +++ b/test/test_regression/test_regression_random_spikes.py @@ -0,0 +1,113 @@ +""" regression benchmark + +Copyright 2015, Mario Mulansky + +Distributed under the BSD License +""" +import numpy as np +from scipy.io import loadmat +import pyspike as spk + +from numpy.testing import assert_almost_equal + +spk.disable_backend_warning = True + + +def test_regression_random(): + + spike_file = "test/test_regression/regression_random_spikes.mat" + spikes_name = "spikes" + result_name = "Distances" + result_file = "test/test_regression/regression_random_results_cSPIKY.mat" + + spike_train_sets = loadmat(spike_file)[spikes_name][0] + results_cSPIKY = loadmat(result_file)[result_name] + + for i, spike_train_data in enumerate(spike_train_sets): + spike_trains = [] + for spikes in spike_train_data[0]: + spike_trains.append(spk.SpikeTrain(spikes.flatten(), 100.0)) + + isi = spk.isi_distance_multi(spike_trains) + spike = spk.spike_distance_multi(spike_trains) + # spike_sync = spk.spike_sync_multi(spike_trains) + + assert_almost_equal(isi, results_cSPIKY[i][0], decimal=14, + err_msg="Index: %d, ISI" % i) + assert_almost_equal(spike, results_cSPIKY[i][1], decimal=14, + err_msg="Index: %d, SPIKE" % i) + + +def check_regression_dataset(spike_file="benchmark.mat", + spikes_name="spikes", + result_file="results_cSPIKY.mat", + result_name="Distances"): + """ Debuging function """ + np.set_printoptions(precision=15) + + spike_train_sets = loadmat(spike_file)[spikes_name][0] + + results_cSPIKY = loadmat(result_file)[result_name] + + err_max = 0.0 + err_max_ind = -1 + err_count = 0 + + for i, spike_train_data in enumerate(spike_train_sets): + spike_trains = [] + for spikes in spike_train_data[0]: + spike_trains.append(spk.SpikeTrain(spikes.flatten(), 100.0)) + + isi = spk.isi_distance_multi(spike_trains) + spike = spk.spike_distance_multi(spike_trains) + # spike_sync = spk.spike_sync_multi(spike_trains) + + if abs(isi - results_cSPIKY[i][0]) > 1E-14: + print "Error in ISI:", i, isi, results_cSPIKY[i][0] + print "Spike trains:" + for st in spike_trains: + print st.spikes + + err = abs(spike - results_cSPIKY[i][1]) + if err > 1E-14: + err_count += 1 + if err > err_max: + err_max = err + err_max_ind = i + + print "Total Errors:", err_count + + if err_max_ind > -1: + print "Max SPIKE distance error:", err_max, "at index:", err_max_ind + spike_train_data = spike_train_sets[err_max_ind] + for spikes in spike_train_data[0]: + print spikes.flatten() + + +def check_single_spike_train_set(index): + """ Debuging function """ + np.set_printoptions(precision=15) + + spike_train_sets = loadmat("benchmark.mat")['spikes'][0] + + results_cSPIKY = loadmat("results_cSPIKY.mat")['Distances'] + + spike_train_data = spike_train_sets[index] + + spike_trains = [] + for spikes in spike_train_data[0]: + print "Spikes:", spikes.flatten() + spike_trains.append(spk.SpikeTrain(spikes.flatten(), 100.0)) + + print spk.spike_distance_multi(spike_trains) + + print results_cSPIKY[index][1] + + print spike_trains[1].spikes + + +if __name__ == "__main__": + + test_regression_random() + # check_regression_dataset() + # check_single_spike_train_set(7633) -- cgit v1.2.3 From 94c5fd007d33a38f3c9d1121749cb6ffb162394c Mon Sep 17 00:00:00 2001 From: Mario Mulansky Date: Sat, 19 Dec 2015 13:05:23 +0100 Subject: python3 print function in new regression test --- .../test_regression_random_spikes.py | 30 +++++++++++++--------- 1 file changed, 18 insertions(+), 12 deletions(-) (limited to 'test/test_regression') diff --git a/test/test_regression/test_regression_random_spikes.py b/test/test_regression/test_regression_random_spikes.py index 757bab2..dfd5488 100644 --- a/test/test_regression/test_regression_random_spikes.py +++ b/test/test_regression/test_regression_random_spikes.py @@ -4,6 +4,8 @@ Copyright 2015, Mario Mulansky Distributed under the BSD License """ +from __future__ import print_function + import numpy as np from scipy.io import loadmat import pyspike as spk @@ -63,10 +65,10 @@ def check_regression_dataset(spike_file="benchmark.mat", # spike_sync = spk.spike_sync_multi(spike_trains) if abs(isi - results_cSPIKY[i][0]) > 1E-14: - print "Error in ISI:", i, isi, results_cSPIKY[i][0] - print "Spike trains:" + print("Error in ISI:", i, isi, results_cSPIKY[i][0]) + print("Spike trains:") for st in spike_trains: - print st.spikes + print(st.spikes) err = abs(spike - results_cSPIKY[i][1]) if err > 1E-14: @@ -75,35 +77,39 @@ def check_regression_dataset(spike_file="benchmark.mat", err_max = err err_max_ind = i - print "Total Errors:", err_count + print("Total Errors:", err_count) if err_max_ind > -1: - print "Max SPIKE distance error:", err_max, "at index:", err_max_ind + print("Max SPIKE distance error:", err_max, "at index:", err_max_ind) spike_train_data = spike_train_sets[err_max_ind] for spikes in spike_train_data[0]: - print spikes.flatten() + print(spikes.flatten()) def check_single_spike_train_set(index): """ Debuging function """ np.set_printoptions(precision=15) + spike_file = "regression_random_spikes.mat" + spikes_name = "spikes" + result_name = "Distances" + result_file = "regression_random_results_cSPIKY.mat" - spike_train_sets = loadmat("benchmark.mat")['spikes'][0] + spike_train_sets = loadmat(spike_file)[spikes_name][0] - results_cSPIKY = loadmat("results_cSPIKY.mat")['Distances'] + results_cSPIKY = loadmat(result_file)[result_name] spike_train_data = spike_train_sets[index] spike_trains = [] for spikes in spike_train_data[0]: - print "Spikes:", spikes.flatten() + print("Spikes:", spikes.flatten()) spike_trains.append(spk.SpikeTrain(spikes.flatten(), 100.0)) - print spk.spike_distance_multi(spike_trains) + print(spk.spike_distance_multi(spike_trains)) - print results_cSPIKY[index][1] + print(results_cSPIKY[index][1]) - print spike_trains[1].spikes + print(spike_trains[1].spikes) if __name__ == "__main__": -- cgit v1.2.3 From 47b9288d94db62a1e133bd1801522b2ede3dcdb7 Mon Sep 17 00:00:00 2001 From: Mario Mulansky Date: Tue, 22 Dec 2015 18:18:39 +0100 Subject: moved extensive random spike test to test/numeric --- test/numeric/regression_random_results_cSPIKY.mat | Bin 0 -> 149104 bytes test/numeric/regression_random_spikes.mat | Bin 0 -> 16241579 bytes test/numeric/test_regression_random_spikes.py | 119 +++++++++++++++++++++ .../regression_random_results_cSPIKY.mat | Bin 149130 -> 0 bytes test/test_regression/regression_random_spikes.mat | Bin 16241579 -> 0 bytes .../test_regression_random_spikes.py | 119 --------------------- 6 files changed, 119 insertions(+), 119 deletions(-) create mode 100644 test/numeric/regression_random_results_cSPIKY.mat create mode 100644 test/numeric/regression_random_spikes.mat create mode 100644 test/numeric/test_regression_random_spikes.py delete mode 100644 test/test_regression/regression_random_results_cSPIKY.mat delete mode 100644 test/test_regression/regression_random_spikes.mat delete mode 100644 test/test_regression/test_regression_random_spikes.py (limited to 'test/test_regression') diff --git a/test/numeric/regression_random_results_cSPIKY.mat b/test/numeric/regression_random_results_cSPIKY.mat new file mode 100644 index 0000000..26f29ff Binary files /dev/null and b/test/numeric/regression_random_results_cSPIKY.mat differ diff --git a/test/numeric/regression_random_spikes.mat b/test/numeric/regression_random_spikes.mat new file mode 100644 index 0000000..e5ebeb1 Binary files /dev/null and b/test/numeric/regression_random_spikes.mat differ diff --git a/test/numeric/test_regression_random_spikes.py b/test/numeric/test_regression_random_spikes.py new file mode 100644 index 0000000..1441de1 --- /dev/null +++ b/test/numeric/test_regression_random_spikes.py @@ -0,0 +1,119 @@ +""" regression benchmark + +Copyright 2015, Mario Mulansky + +Distributed under the BSD License +""" +from __future__ import print_function + +import numpy as np +from scipy.io import loadmat +import pyspike as spk + +from numpy.testing import assert_almost_equal + +spk.disable_backend_warning = True + + +def test_regression_random(): + + spike_file = "test/numeric/regression_random_spikes.mat" + spikes_name = "spikes" + result_name = "Distances" + result_file = "test/numeric/regression_random_results_cSPIKY.mat" + + spike_train_sets = loadmat(spike_file)[spikes_name][0] + results_cSPIKY = loadmat(result_file)[result_name] + + for i, spike_train_data in enumerate(spike_train_sets): + spike_trains = [] + for spikes in spike_train_data[0]: + spike_trains.append(spk.SpikeTrain(spikes.flatten(), 100.0)) + + isi = spk.isi_distance_multi(spike_trains) + spike = spk.spike_distance_multi(spike_trains) + # spike_sync = spk.spike_sync_multi(spike_trains) + + assert_almost_equal(isi, results_cSPIKY[i][0], decimal=14, + err_msg="Index: %d, ISI" % i) + assert_almost_equal(spike, results_cSPIKY[i][1], decimal=14, + err_msg="Index: %d, SPIKE" % i) + + +def check_regression_dataset(spike_file="benchmark.mat", + spikes_name="spikes", + result_file="results_cSPIKY.mat", + result_name="Distances"): + """ Debuging function """ + np.set_printoptions(precision=15) + + spike_train_sets = loadmat(spike_file)[spikes_name][0] + + results_cSPIKY = loadmat(result_file)[result_name] + + err_max = 0.0 + err_max_ind = -1 + err_count = 0 + + for i, spike_train_data in enumerate(spike_train_sets): + spike_trains = [] + for spikes in spike_train_data[0]: + spike_trains.append(spk.SpikeTrain(spikes.flatten(), 100.0)) + + isi = spk.isi_distance_multi(spike_trains) + spike = spk.spike_distance_multi(spike_trains) + # spike_sync = spk.spike_sync_multi(spike_trains) + + if abs(isi - results_cSPIKY[i][0]) > 1E-14: + print("Error in ISI:", i, isi, results_cSPIKY[i][0]) + print("Spike trains:") + for st in spike_trains: + print(st.spikes) + + err = abs(spike - results_cSPIKY[i][1]) + if err > 1E-14: + err_count += 1 + if err > err_max: + err_max = err + err_max_ind = i + + print("Total Errors:", err_count) + + if err_max_ind > -1: + print("Max SPIKE distance error:", err_max, "at index:", err_max_ind) + spike_train_data = spike_train_sets[err_max_ind] + for spikes in spike_train_data[0]: + print(spikes.flatten()) + + +def check_single_spike_train_set(index): + """ Debuging function """ + np.set_printoptions(precision=15) + spike_file = "regression_random_spikes.mat" + spikes_name = "spikes" + result_name = "Distances" + result_file = "regression_random_results_cSPIKY.mat" + + spike_train_sets = loadmat(spike_file)[spikes_name][0] + + results_cSPIKY = loadmat(result_file)[result_name] + + spike_train_data = spike_train_sets[index] + + spike_trains = [] + for spikes in spike_train_data[0]: + print("Spikes:", spikes.flatten()) + spike_trains.append(spk.SpikeTrain(spikes.flatten(), 100.0)) + + print(spk.spike_distance_multi(spike_trains)) + + print(results_cSPIKY[index][1]) + + print(spike_trains[1].spikes) + + +if __name__ == "__main__": + + test_regression_random() + # check_regression_dataset() + # check_single_spike_train_set(7633) diff --git a/test/test_regression/regression_random_results_cSPIKY.mat b/test/test_regression/regression_random_results_cSPIKY.mat deleted file mode 100644 index 47c9b50..0000000 Binary files a/test/test_regression/regression_random_results_cSPIKY.mat and /dev/null differ diff --git a/test/test_regression/regression_random_spikes.mat b/test/test_regression/regression_random_spikes.mat deleted file mode 100644 index e5ebeb1..0000000 Binary files a/test/test_regression/regression_random_spikes.mat and /dev/null differ diff --git a/test/test_regression/test_regression_random_spikes.py b/test/test_regression/test_regression_random_spikes.py deleted file mode 100644 index dfd5488..0000000 --- a/test/test_regression/test_regression_random_spikes.py +++ /dev/null @@ -1,119 +0,0 @@ -""" regression benchmark - -Copyright 2015, Mario Mulansky - -Distributed under the BSD License -""" -from __future__ import print_function - -import numpy as np -from scipy.io import loadmat -import pyspike as spk - -from numpy.testing import assert_almost_equal - -spk.disable_backend_warning = True - - -def test_regression_random(): - - spike_file = "test/test_regression/regression_random_spikes.mat" - spikes_name = "spikes" - result_name = "Distances" - result_file = "test/test_regression/regression_random_results_cSPIKY.mat" - - spike_train_sets = loadmat(spike_file)[spikes_name][0] - results_cSPIKY = loadmat(result_file)[result_name] - - for i, spike_train_data in enumerate(spike_train_sets): - spike_trains = [] - for spikes in spike_train_data[0]: - spike_trains.append(spk.SpikeTrain(spikes.flatten(), 100.0)) - - isi = spk.isi_distance_multi(spike_trains) - spike = spk.spike_distance_multi(spike_trains) - # spike_sync = spk.spike_sync_multi(spike_trains) - - assert_almost_equal(isi, results_cSPIKY[i][0], decimal=14, - err_msg="Index: %d, ISI" % i) - assert_almost_equal(spike, results_cSPIKY[i][1], decimal=14, - err_msg="Index: %d, SPIKE" % i) - - -def check_regression_dataset(spike_file="benchmark.mat", - spikes_name="spikes", - result_file="results_cSPIKY.mat", - result_name="Distances"): - """ Debuging function """ - np.set_printoptions(precision=15) - - spike_train_sets = loadmat(spike_file)[spikes_name][0] - - results_cSPIKY = loadmat(result_file)[result_name] - - err_max = 0.0 - err_max_ind = -1 - err_count = 0 - - for i, spike_train_data in enumerate(spike_train_sets): - spike_trains = [] - for spikes in spike_train_data[0]: - spike_trains.append(spk.SpikeTrain(spikes.flatten(), 100.0)) - - isi = spk.isi_distance_multi(spike_trains) - spike = spk.spike_distance_multi(spike_trains) - # spike_sync = spk.spike_sync_multi(spike_trains) - - if abs(isi - results_cSPIKY[i][0]) > 1E-14: - print("Error in ISI:", i, isi, results_cSPIKY[i][0]) - print("Spike trains:") - for st in spike_trains: - print(st.spikes) - - err = abs(spike - results_cSPIKY[i][1]) - if err > 1E-14: - err_count += 1 - if err > err_max: - err_max = err - err_max_ind = i - - print("Total Errors:", err_count) - - if err_max_ind > -1: - print("Max SPIKE distance error:", err_max, "at index:", err_max_ind) - spike_train_data = spike_train_sets[err_max_ind] - for spikes in spike_train_data[0]: - print(spikes.flatten()) - - -def check_single_spike_train_set(index): - """ Debuging function """ - np.set_printoptions(precision=15) - spike_file = "regression_random_spikes.mat" - spikes_name = "spikes" - result_name = "Distances" - result_file = "regression_random_results_cSPIKY.mat" - - spike_train_sets = loadmat(spike_file)[spikes_name][0] - - results_cSPIKY = loadmat(result_file)[result_name] - - spike_train_data = spike_train_sets[index] - - spike_trains = [] - for spikes in spike_train_data[0]: - print("Spikes:", spikes.flatten()) - spike_trains.append(spk.SpikeTrain(spikes.flatten(), 100.0)) - - print(spk.spike_distance_multi(spike_trains)) - - print(results_cSPIKY[index][1]) - - print(spike_trains[1].spikes) - - -if __name__ == "__main__": - - test_regression_random() - # check_regression_dataset() - # check_single_spike_train_set(7633) -- cgit v1.2.3 From ea3709e2f4367cb539acc26ec8e05b686d6bf836 Mon Sep 17 00:00:00 2001 From: Mario Mulansky Date: Sun, 31 Jan 2016 16:40:47 +0100 Subject: generic interface for spike distance/profile spike_profile and spike_distance now have a generic interface that allows to compute bi-variate and multi-variate results with the same function. --- pyspike/isi_distance.py | 17 +++- pyspike/spike_distance.py | 124 +++++++++++++++++++++-------- test/test_generic_interfaces.py | 31 +++++++- test/test_regression/test_regression_15.py | 1 + 4 files changed, 138 insertions(+), 35 deletions(-) (limited to 'test/test_regression') diff --git a/pyspike/isi_distance.py b/pyspike/isi_distance.py index a85028f..122e11d 100644 --- a/pyspike/isi_distance.py +++ b/pyspike/isi_distance.py @@ -14,7 +14,7 @@ from pyspike.generic import _generic_profile_multi, _generic_distance_multi, \ # isi_profile ############################################################ def isi_profile(*args, **kwargs): - """ Computes the isi-distance profile :math:`I(t)` of the two given + """ Computes the isi-distance profile :math:`I(t)` of the given spike trains. Returns the profile as a PieceWiseConstFunc object. The ISI-values are defined positive :math:`I(t)>=0`. @@ -22,8 +22,9 @@ def isi_profile(*args, **kwargs): isi_profile(st1, st2) # returns the bi-variate profile isi_profile(st1, st2, st3) # multi-variate profile of 3 spike trains + spike_trains = [st1, st2, st3, st4] # list of spike trains - isi_profile(spike_trains) # return the profile the list of spike trains + isi_profile(spike_trains) # profile of the list of spike trains isi_profile(spike_trains, indices=[0, 1]) # use only the spike trains # given by the indices @@ -108,13 +109,23 @@ def isi_profile_multi(spike_trains, indices=None): # isi_distance ############################################################ def isi_distance(*args, **kwargs): - # spike_trains, spike_train2, interval=None): """ Computes the ISI-distance :math:`D_I` of the given spike trains. The isi-distance is the integral over the isi distance profile :math:`I(t)`: .. math:: D_I = \\int_{T_0}^{T_1} I(t) dt. + + Valid call structures:: + + isi_distance(st1, st2) # returns the bi-variate distance + isi_distance(st1, st2, st3) # multi-variate distance of 3 spike trains + + spike_trains = [st1, st2, st3, st4] # list of spike trains + isi_distance(spike_trains) # distance of the list of spike trains + isi_distance(spike_trains, indices=[0, 1]) # use only the spike trains + # given by the indices + :returns: The isi-distance :math:`D_I`. :rtype: double """ diff --git a/pyspike/spike_distance.py b/pyspike/spike_distance.py index e418283..7acb959 100644 --- a/pyspike/spike_distance.py +++ b/pyspike/spike_distance.py @@ -13,7 +13,36 @@ from pyspike.generic import _generic_profile_multi, _generic_distance_multi, \ ############################################################ # spike_profile ############################################################ -def spike_profile(spike_train1, spike_train2): +def spike_profile(*args, **kwargs): + """ Computes the spike-distance profile :math:`S(t)` of the given + spike trains. Returns the profile as a PieceWiseConstLin object. The + SPIKE-values are defined positive :math:`S(t)>=0`. + + Valid call structures:: + + spike_profile(st1, st2) # returns the bi-variate profile + spike_profile(st1, st2, st3) # multi-variate profile of 3 spike trains + + spike_trains = [st1, st2, st3, st4] # list of spike trains + spike_profile(spike_trains) # profile of the list of spike trains + spike_profile(spike_trains, indices=[0, 1]) # use only the spike trains + # given by the indices + + :returns: The spike-distance profile :math:`S(t)` + :rtype: :class:`.PieceWiseConstLin` + """ + if len(args) == 1: + return spike_profile_multi(args[0], **kwargs) + elif len(args) == 2: + return spike_profile_bi(args[0], args[1]) + else: + return spike_profile_multi(args) + + +############################################################ +# spike_profile_bi +############################################################ +def spike_profile_bi(spike_train1, spike_train2): """ Computes the spike-distance profile :math:`S(t)` of the two given spike trains. Returns the profile as a PieceWiseLinFunc object. The SPIKE-values are defined positive :math:`S(t)>=0`. @@ -53,10 +82,68 @@ Falling back to slow python backend.") return PieceWiseLinFunc(times, y_starts, y_ends) +############################################################ +# spike_profile_multi +############################################################ +def spike_profile_multi(spike_trains, indices=None): + """ Computes the multi-variate spike distance profile for a set of spike + trains. That is the average spike-distance of all pairs of spike-trains: + + .. math:: = \\frac{2}{N(N-1)} \\sum_{} S^{i, j}`, + + where the sum goes over all pairs + + :param spike_trains: list of :class:`.SpikeTrain` + :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 + :returns: The averaged spike profile :math:`(t)` + :rtype: :class:`.PieceWiseLinFunc` + + """ + average_dist, M = _generic_profile_multi(spike_trains, spike_profile_bi, + indices) + average_dist.mul_scalar(1.0/M) # normalize + return average_dist + + ############################################################ # spike_distance ############################################################ -def spike_distance(spike_train1, spike_train2, interval=None): +def spike_distance(*args, **kwargs): + """ Computes the SPIKE-distance :math:`D_S` of the given spike trains. The + spike-distance is the integral over the spike distance profile + :math:`D(t)`: + + .. math:: D_S = \\int_{T_0}^{T_1} S(t) dt. + + + Valid call structures:: + + spike_distance(st1, st2) # returns the bi-variate distance + spike_distance(st1, st2, st3) # multi-variate distance of 3 spike trains + + spike_trains = [st1, st2, st3, st4] # list of spike trains + spike_distance(spike_trains) # distance of the list of spike trains + spike_distance(spike_trains, indices=[0, 1]) # use only the spike trains + # given by the indices + + :returns: The spike-distance :math:`D_S`. + :rtype: double + """ + + if len(args) == 1: + return spike_distance_multi(args[0], **kwargs) + elif len(args) == 2: + return spike_distance_bi(args[0], args[1], **kwargs) + else: + return spike_distance_multi(args, **kwargs) + + +############################################################ +# spike_distance_bi +############################################################ +def spike_distance_bi(spike_train1, spike_train2, interval=None): """ Computes the spike-distance :math:`D_S` of the given spike trains. The spike-distance is the integral over the spike distance profile :math:`S(t)`: @@ -86,35 +173,10 @@ def spike_distance(spike_train1, spike_train2, interval=None): spike_train1.t_end) except ImportError: # Cython backend not available: fall back to average profile - return spike_profile(spike_train1, spike_train2).avrg(interval) + return spike_profile_bi(spike_train1, spike_train2).avrg(interval) else: # some specific interval is provided: compute the whole profile - return spike_profile(spike_train1, spike_train2).avrg(interval) - - -############################################################ -# spike_profile_multi -############################################################ -def spike_profile_multi(spike_trains, indices=None): - """ Computes the multi-variate spike distance profile for a set of spike - trains. That is the average spike-distance of all pairs of spike-trains: - - .. math:: = \\frac{2}{N(N-1)} \\sum_{} S^{i, j}`, - - where the sum goes over all pairs - - :param spike_trains: list of :class:`.SpikeTrain` - :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 - :returns: The averaged spike profile :math:`(t)` - :rtype: :class:`.PieceWiseLinFunc` - - """ - average_dist, M = _generic_profile_multi(spike_trains, spike_profile, - indices) - average_dist.mul_scalar(1.0/M) # normalize - return average_dist + return spike_profile_bi(spike_train1, spike_train2).avrg(interval) ############################################################ @@ -139,7 +201,7 @@ def spike_distance_multi(spike_trains, indices=None, interval=None): :returns: The averaged multi-variate spike distance :math:`D_S`. :rtype: double """ - return _generic_distance_multi(spike_trains, spike_distance, indices, + return _generic_distance_multi(spike_trains, spike_distance_bi, indices, interval) @@ -160,5 +222,5 @@ def spike_distance_matrix(spike_trains, indices=None, interval=None): :math:`D_S^{ij}` :rtype: np.array """ - return _generic_distance_matrix(spike_trains, spike_distance, + return _generic_distance_matrix(spike_trains, spike_distance_bi, indices, interval) diff --git a/test/test_generic_interfaces.py b/test/test_generic_interfaces.py index caa9ee4..ee87be4 100644 --- a/test/test_generic_interfaces.py +++ b/test/test_generic_interfaces.py @@ -23,7 +23,12 @@ class dist_from_prof: self.prof_func = prof_func def __call__(self, *args, **kwargs): - return self.prof_func(*args, **kwargs).avrg() + if "interval" in kwargs: + # forward interval arg into avrg function + interval = kwargs.pop("interval") + return self.prof_func(*args, **kwargs).avrg(interval=interval) + else: + return self.prof_func(*args, **kwargs).avrg() def check_func(dist_func): @@ -50,6 +55,22 @@ def check_func(dist_func): isi123_ = dist_func(spike_trains, indices=[0, 1, 2]) assert_equal(isi123, isi123_) + # run the same test with an additional interval parameter + + isi12 = dist_func(t1, t2, interval=[0.0, 0.5]) + isi12_ = dist_func([t1, t2], interval=[0.0, 0.5]) + assert_equal(isi12, isi12_) + + isi12_ = dist_func(spike_trains, indices=[0, 1], interval=[0.0, 0.5]) + assert_equal(isi12, isi12_) + + isi123 = dist_func(t1, t2, t3, interval=[0.0, 0.5]) + isi123_ = dist_func([t1, t2, t3], interval=[0.0, 0.5]) + assert_equal(isi123, isi123_) + + isi123_ = dist_func(spike_trains, indices=[0, 1, 2], interval=[0.0, 0.5]) + assert_equal(isi123, isi123_) + def test_isi_profile(): check_func(dist_from_prof(spk.isi_profile)) @@ -59,6 +80,14 @@ def test_isi_distance(): check_func(spk.isi_distance) +def test_spike_profile(): + check_func(dist_from_prof(spk.spike_profile)) + + +def test_spike_distance(): + check_func(spk.spike_distance) + + if __name__ == "__main__": test_isi_profile() test_isi_distance() diff --git a/test/test_regression/test_regression_15.py b/test/test_regression/test_regression_15.py index dcacae2..54adf23 100644 --- a/test/test_regression/test_regression_15.py +++ b/test/test_regression/test_regression_15.py @@ -20,6 +20,7 @@ import os TEST_PATH = os.path.dirname(os.path.realpath(__file__)) TEST_DATA = os.path.join(TEST_PATH, "..", "SPIKE_Sync_Test.txt") + def test_regression_15_isi(): # load spike trains spike_trains = spk.load_spike_trains_from_txt(TEST_DATA, edges=[0, 4000]) -- cgit v1.2.3