summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMario Mulansky <mario.mulansky@gmx.net>2014-10-16 15:15:13 +0200
committerMario Mulansky <mario.mulansky@gmx.net>2014-10-16 15:15:13 +0200
commitbbb424f75e3063f823a880bced3de1b2063c408a (patch)
tree326f1e0aaa9fd7b613da2e39abf0a9296b4d9ce7
parent5970a9cfdbecc1af232b7ffe485bdc057591a2b8 (diff)
added fall-back to python when cython is missing
-rw-r--r--pyspike/distances.py30
-rw-r--r--pyspike/function.py33
-rw-r--r--pyspike/python_backend.py11
3 files changed, 50 insertions, 24 deletions
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]
############################################################