38 lines
1.3 KiB
Python
38 lines
1.3 KiB
Python
|
|
|
|
class LIFModel:
|
|
# all times in milliseconds
|
|
def __init__(self, mem_res, mem_tau, v_base, v_zero, input_current, threshold, input_offset=0, step_size=0.01):
|
|
self.mem_res = mem_res
|
|
# self.membrane_capacitance = mem_cap
|
|
self.mem_tau = mem_tau # membrane time constant tau = mem_cap*mem_res
|
|
self.v_base = v_base
|
|
self.v_zero = v_zero
|
|
self.threshold = threshold
|
|
|
|
self.step_size = step_size
|
|
self.input_current = input_current
|
|
self.input_offset = input_offset
|
|
|
|
def calculate_response(self):
|
|
output_voltage = [self.v_zero]
|
|
spikes = []
|
|
|
|
for idx in range(1, len(self.input_current)):
|
|
v_next = self.__calculate_next_step__(output_voltage[idx-1], self.input_current[idx-1])
|
|
if v_next > self.threshold:
|
|
v_next = self.v_base
|
|
spikes.append(True)
|
|
else:
|
|
spikes.append(False)
|
|
output_voltage.append(v_next)
|
|
|
|
return output_voltage, spikes
|
|
|
|
def set_input_current(self, input_current, offset=0):
|
|
self.input_current = input_current
|
|
self.input_offset = offset
|
|
|
|
def __calculate_next_step__(self, current_v, input_i):
|
|
return current_v + (self.step_size * (self.v_base - current_v + self.mem_res * input_i)) / self.mem_tau
|