summaryrefslogtreecommitdiff
path: root/pyspike/python_backend.py
diff options
context:
space:
mode:
Diffstat (limited to 'pyspike/python_backend.py')
-rw-r--r--pyspike/python_backend.py135
1 files changed, 64 insertions, 71 deletions
diff --git a/pyspike/python_backend.py b/pyspike/python_backend.py
index 154d250..bbbd572 100644
--- a/pyspike/python_backend.py
+++ b/pyspike/python_backend.py
@@ -248,52 +248,69 @@ def cumulative_sync_python(spikes1, spikes2):
def coincidence_python(spikes1, spikes2):
def get_tau(spikes1, spikes2, i, j):
- return 0.5*min([spikes1[i]-spikes1[i-1], spikes1[i+1]-spikes1[i],
- spikes2[j]-spikes2[j-1], spikes2[j+1]-spikes2[j]])
+ m = 1E100 # some huge number
+ if i < len(spikes1)-2:
+ m = min(m, spikes1[i+1]-spikes1[i])
+ if j < len(spikes2)-2:
+ m = min(m, spikes2[j+1]-spikes2[j])
+ if i > 1:
+ m = min(m, spikes1[i]-spikes1[i-1])
+ if j > 1:
+ m = min(m, spikes2[j]-spikes2[j-1])
+ return 0.5*m
N1 = len(spikes1)
N2 = len(spikes2)
i = 0
j = 0
n = 0
- st = np.zeros(N1 + N2 - 2)
- c = np.zeros(N1 + N2 - 3)
- c[0] = 0
- st[0] = 0
- while n < N1 + N2:
+ st = np.zeros(N1 + N2 - 2) # spike times
+ c = np.zeros(N1 + N2 - 2) # coincidences
+ mp = np.ones(N1 + N2 - 2) # multiplicity
+ while n < N1 + N2 - 2:
if spikes1[i+1] < spikes2[j+1]:
i += 1
n += 1
tau = get_tau(spikes1, spikes2, i, j)
st[n] = spikes1[i]
- if spikes1[i]-spikes2[j] > tau:
- c[n] = 0
- else:
+ if j > 0 and spikes1[i]-spikes2[j] < tau:
+ # coincidence between the current spike and the previous spike
+ # both get marked with 1
c[n] = 1
+ c[n-1] = 1
elif spikes1[i+1] > spikes2[j+1]:
j += 1
n += 1
tau = get_tau(spikes1, spikes2, i, j)
st[n] = spikes2[j]
- if spikes2[j]-spikes1[i] > tau:
- c[n] = 0
- else:
+ if i > 0 and spikes2[j]-spikes1[i] < tau:
+ # coincidence between the current spike and the previous spike
+ # both get marked with 1
c[n] = 1
+ c[n-1] = 1
else: # spikes1[i+1] = spikes2[j+1]
+ # advance in both spike trains
j += 1
i += 1
if i == N1-1 or j == N2-1:
break
n += 1
+ # add only one event, but with coincidence 2 and multiplicity 2
st[n] = spikes1[i]
- c[n] = 0
- n += 1
- st[n] = spikes1[i]
- c[n] = 1
- #c[0] = c[2]
+ c[n] = 2
+ mp[n] = 2
+
+ st = st[:n+2]
+ c = c[:n+2]
+ mp = mp[:n+2]
+
st[0] = spikes1[0]
st[-1] = spikes1[-1]
+ c[0] = c[1]
+ c[-1] = c[-2]
+ mp[0] = mp[1]
+ mp[-1] = mp[-2]
- return st, c
+ return st, c, mp
############################################################
@@ -341,83 +358,59 @@ def add_piece_wise_const_python(x1, y1, x2, y2):
############################################################
-# add_interval_sequence_python
+# add_multiple_value_sequence_python
############################################################
-def add_interval_sequence_python(x1, y1, x2, y2):
- yscale1 = np.empty_like(y1)
- index2 = 1
- # s1 = (len(y1)+len(y2)-2.0) / (len(y1)-1.0)
- # s2 = (len(y1)+len(y2)-2.0) / (len(y2)-1.0)
- s1 = 1.0
- s2 = 1.0
- for i in xrange(len(y1)):
- c = 1
- while index2 < len(x2)-1 and x2[index2] < x1[i+1]:
- index2 += 1
- c += 1
- if index2 < len(x2)-1 and x2[index2] == x1[i+1]:
- index2 += 1
- # c += 1
- yscale1[i] = s1/c
-
- yscale2 = np.empty_like(y2)
- index1 = 1
- for i in xrange(len(y2)):
- c = 1
- while index1 < len(x1)-1 and x1[index1] < x2[i+1]:
- index1 += 1
- c += 1
- if index1 < len(x1)-1 and x1[index1] == x2[i+1]:
- index1 += 1
- # c += 1
- yscale2[i] = s2/c
+def add_multiple_value_sequence_python(x1, y1, mp1, x2, y2, mp2):
x_new = np.empty(len(x1) + len(x2))
- y_new = np.empty(len(x_new)-1)
+ y_new = np.empty_like(x_new)
+ mp_new = np.empty_like(x_new)
x_new[0] = x1[0]
index1 = 0
index2 = 0
index = 0
- additional_intervals = 0
while (index1+1 < len(y1)) and (index2+1 < len(y2)):
- y_new[index] = y1[index1]*yscale1[index1] + y2[index2]*yscale2[index2]
- index += 1
- # print(index1+1, x1[index1+1], y1[index1+1], x_new[index])
if x1[index1+1] < x2[index2+1]:
index1 += 1
+ index += 1
x_new[index] = x1[index1]
+ y_new[index] = y1[index1]
+ mp_new[index] = mp1[index1]
elif x1[index1+1] > x2[index2+1]:
index2 += 1
+ index += 1
x_new[index] = x2[index2]
+ y_new[index] = y2[index2]
+ mp_new[index] = mp2[index2]
else: # x1[index1+1] == x2[index2+1]
- # y_new[index] = y1[index1]*yscale1[index1] + \
- # y2[index2]*yscale2[index2]
index1 += 1
- # x_new[index] = x1[index1]
index2 += 1
- # index += 1
+ index += 1
x_new[index] = x1[index1]
- additional_intervals += 1
- y_new[index] = y1[index1]*yscale1[index1] + y2[index2]*yscale2[index2]
+ y_new[index] = y1[index1] + y2[index2]
+ mp_new[index] = mp1[index1] + mp2[index2]
# one array reached the end -> copy the contents of the other to the end
if index1+1 < len(y1):
x_new[index+1:index+1+len(x1)-index1-1] = x1[index1+1:]
- y_new[index+1:index+1+len(y1)-index1-1] = \
- y1[index1+1:]*yscale1[index1+1:] + y2[-1]*yscale2[-1]
- index += len(x1)-index1-2
+ y_new[index+1:index+1+len(x1)-index1-1] = y1[index1+1:]
+ mp_new[index+1:index+1+len(x1)-index1-1] = mp1[index1+1:]
+ index += len(x1)-index1-1
elif index2+1 < len(y2):
x_new[index+1:index+1+len(x2)-index2-1] = x2[index2+1:]
- y_new[index+1:index+1+len(y2)-index2-1] = \
- y2[index2+1:]*yscale2[index2+1:] + y1[-1]*yscale1[-1]
- index += len(x2)-index2-2
- else: # both arrays reached the end simultaneously
- # only the last x-value missing
- x_new[index+1] = x1[-1]
+ y_new[index+1:index+1+len(x2)-index2-1] = y2[index2+1:]
+ mp_new[index+1:index+1+len(x2)-index2-1] = mp2[index2+1:]
+ index += len(x2)-index2-1
+ # else: # both arrays reached the end simultaneously
+ # x_new[index+1] = x1[-1]
+ # y_new[index+1] = y1[-1] + y2[-1]
+ # mp_new[index+1] = mp1[-1] + mp2[-1]
+
+ y_new[0] = y_new[1]
+ mp_new[0] = mp_new[1]
+
# the last value is again the end of the interval
- # x_new[index+1] = x1[-1]
# only use the data that was actually filled
-
- return x_new[:index+2], y_new[:index+1], additional_intervals
+ return x_new[:index+1], y_new[:index+1], mp_new[:index+1]
############################################################