From bbb424f75e3063f823a880bced3de1b2063c408a Mon Sep 17 00:00:00 2001 From: Mario Mulansky Date: Thu, 16 Oct 2014 15:15:13 +0200 Subject: added fall-back to python when cython is missing --- pyspike/distances.py | 30 ++++++++++++++++++++++-------- pyspike/function.py | 33 ++++++++++++++++++++++++--------- pyspike/python_backend.py | 11 ++++------- 3 files changed, 50 insertions(+), 24 deletions(-) (limited to 'pyspike') diff --git a/pyspike/distances.py b/pyspike/distances.py index 7d7044b..3e97b77 100644 --- a/pyspike/distances.py +++ b/pyspike/distances.py @@ -33,10 +33,17 @@ def isi_profile(spikes1, spikes2): assert spikes1[-1] == spikes2[-1], \ "Given spike trains seems not to have auxiliary spikes!" - # cython implementation - from cython_distance import isi_distance_cython - - times, values = isi_distance_cython(spikes1, spikes2) + # load cython implementation + try: + from cython_distance import isi_distance_cython as isi_distance_impl + except ImportError: + print("Warning: isi_distance_cython not found. Make sure that PySpike \ +is installed by running\n 'python setup.py build_ext --inplace'!\n \ +Falling back to slow python backend.") + # use python backend + from python_backend import isi_distance_python as isi_distance_impl + + times, values = isi_distance_impl(spikes1, spikes2) return PieceWiseConstFunc(times, values) @@ -76,10 +83,17 @@ def spike_profile(spikes1, spikes2): "Given spike trains seems not to have auxiliary spikes!" # cython implementation - from cython_distance import spike_distance_cython - - times, y_starts, y_ends = spike_distance_cython(spikes1, spikes2) - + try: + from cython_distance import spike_distance_cython \ + as spike_distance_impl + except ImportError: + print("Warning: spike_distance_cython not found. Make sure that \ +PySpike is installed by running\n 'python setup.py build_ext --inplace'!\n \ +Falling back to slow python backend.") + # use python backend + from python_backend import spike_distance_python as spike_distance_impl + + times, y_starts, y_ends = spike_distance_impl(spikes1, spikes2) return PieceWiseLinFunc(times, y_starts, y_ends) diff --git a/pyspike/function.py b/pyspike/function.py index 46fdea2..b161034 100644 --- a/pyspike/function.py +++ b/pyspike/function.py @@ -83,14 +83,19 @@ class PieceWiseConstFunc: assert self.x[0] == f.x[0], "The functions have different intervals" assert self.x[-1] == f.x[-1], "The functions have different intervals" - # python implementation - # from python_backend import add_piece_wise_const_python - # self.x, self.y = add_piece_wise_const_python(self.x, self.y, - # f.x, f.y) - # cython version - from cython_add import add_piece_wise_const_cython - self.x, self.y = add_piece_wise_const_cython(self.x, self.y, f.x, f.y) + try: + from cython_add import add_piece_wise_const_cython as \ + add_piece_wise_const_impl + except ImportError: + print("Warning: add_piece_wise_const_cython not found. Make sure \ +that PySpike is installed by running\n 'python setup.py build_ext --inplace'! \ +\n Falling back to slow python backend.") + # use python backend + from python_backend import add_piece_wise_const_python as \ + add_piece_wise_const_impl + + self.x, self.y = add_piece_wise_const_impl(self.x, self.y, f.x, f.y) def mul_scalar(self, fac): """ Multiplies the function with a scalar value @@ -188,8 +193,18 @@ class PieceWiseLinFunc: # self.x, self.y1, self.y2, f.x, f.y1, f.y2) # cython version - from cython_add import add_piece_wise_lin_cython - self.x, self.y1, self.y2 = add_piece_wise_lin_cython( + try: + from cython_add import add_piece_wise_lin_cython as \ + add_piece_wise_lin_impl + except ImportError: + print("Warning: add_piece_wise_lin_cython not found. Make sure \ +that PySpike is installed by running\n 'python setup.py build_ext --inplace'! \ +\n Falling back to slow python backend.") + # use python backend + from python_backend import add_piece_wise_lin_python as \ + add_piece_wise_lin_impl + + self.x, self.y1, self.y2 = add_piece_wise_lin_impl( self.x, self.y1, self.y2, f.x, f.y1, f.y2) def mul_scalar(self, fac): diff --git a/pyspike/python_backend.py b/pyspike/python_backend.py index a1f5ea2..874c689 100644 --- a/pyspike/python_backend.py +++ b/pyspike/python_backend.py @@ -11,8 +11,6 @@ Distributed under the BSD License import numpy as np -from pyspike import PieceWiseConstFunc, PieceWiseLinFunc - ############################################################ # isi_distance_python @@ -32,7 +30,7 @@ def isi_distance_python(s1, s2): # add the distance of the first events # isi_values[0] = nu1[0]/nu2[0] - 1.0 if nu1[0] <= nu2[0] \ # else 1.0 - nu2[0]/nu1[0] - isi_values[0] = (nu1[0] - nu2[0]) / max(nu1[0], nu2[0]) + isi_values[0] = abs(nu1[0] - nu2[0]) / max(nu1[0], nu2[0]) index1 = 0 index2 = 0 index = 1 @@ -56,14 +54,14 @@ def isi_distance_python(s1, s2): break spike_events[index] = s1[index1] # compute the corresponding isi-distance - isi_values[index] = (nu1[index1] - nu2[index2]) / \ + isi_values[index] = abs(nu1[index1] - nu2[index2]) / \ max(nu1[index1], nu2[index2]) index += 1 # the last event is the interval end spike_events[index] = s1[-1] # use only the data added above # could be less than original length due to equal spike times - return PieceWiseConstFunc(spike_events[:index + 1], isi_values[:index]) + return spike_events[:index + 1], isi_values[:index] ############################################################ @@ -187,8 +185,7 @@ def spike_distance_python(spikes1, spikes2): y_ends[index-1] = (s1*isi2 + s2*isi1) / ((isi1+isi2)**2/2) # use only the data added above # could be less than original length due to equal spike times - return PieceWiseLinFunc(spike_events[:index+1], - y_starts[:index], y_ends[:index]) + return spike_events[:index+1], y_starts[:index], y_ends[:index] ############################################################ -- cgit v1.2.3