hhn.py
1 """!
2 
3 @brief Oscillatory Neural Network based on Hodgkin-Huxley Neuron Model
4 @details Implementation based on paper @cite article::nnet::hnn::1.
5 
6 @authors Andrei Novikov (pyclustering@yandex.ru)
7 @date 2014-2020
8 @copyright GNU Public License
9 
10 @cond GNU_PUBLIC_LICENSE
11  PyClustering is free software: you can redistribute it and/or modify
12  it under the terms of the GNU General Public License as published by
13  the Free Software Foundation, either version 3 of the License, or
14  (at your option) any later version.
15 
16  PyClustering is distributed in the hope that it will be useful,
17  but WITHOUT ANY WARRANTY; without even the implied warranty of
18  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
19  GNU General Public License for more details.
20 
21  You should have received a copy of the GNU General Public License
22  along with this program. If not, see <http://www.gnu.org/licenses/>.
23 @endcond
24 
25 """
26 
27 from scipy.integrate import odeint
28 
29 from pyclustering.core.wrapper import ccore_library
30 
31 import pyclustering.core.hhn_wrapper as wrapper
32 
33 from pyclustering.nnet import *
34 
35 from pyclustering.utils import allocate_sync_ensembles
36 
37 import numpy
38 import random
39 
41  """!
42  @brief Describes parameters of Hodgkin-Huxley Oscillatory Network.
43 
44  @see hhn_network
45 
46  """
47 
48  def __init__(self):
49  """!
50  @brief Default constructor of parameters for Hodgkin-Huxley Oscillatory Network.
51  @details Constructor initializes parameters by default non-zero values that can be
52  used for simple simulation.
53  """
54 
55 
56  self.nu = random.random() * 2.0 - 1.0
57 
58 
59  self.gNa = 120.0 * (1 + 0.02 * self.nu)
60 
61 
62  self.gK = 36.0 * (1 + 0.02 * self.nu)
63 
64 
65  self.gL = 0.3 * (1 + 0.02 * self.nu)
66 
67 
68 
69  self.vNa = 50.0
70 
71 
72  self.vK = -77.0
73 
74 
75  self.vL = -54.4
76 
77 
78  self.vRest = -65.0
79 
80 
81 
82  self.Icn1 = 5.0
83 
84 
85  self.Icn2 = 30.0
86 
87 
88 
89  self.Vsyninh = -80.0
90 
91 
92  self.Vsynexc = 0.0
93 
94 
95  self.alfa_inhibitory = 6.0
96 
97 
98  self.betta_inhibitory = 0.3
99 
100 
101 
102  self.alfa_excitatory = 40.0
103 
104 
105  self.betta_excitatory = 2.0
106 
107 
108 
109  self.w1 = 0.1
110 
111 
112  self.w2 = 9.0
113 
114 
115  self.w3 = 5.0
116 
117 
118 
119  self.deltah = 650.0
120 
121 
122  self.threshold = -10
123 
124 
125  self.eps = 0.16
126 
127 
129  """!
130  @brief Central element consist of two central neurons that are described by a little bit different dynamic than peripheral.
131 
132  @see hhn_network
133 
134  """
135 
136  def __init__(self):
137  """!
138  @brief Constructor of central element.
139 
140  """
141 
142 
144 
145 
147 
148 
150 
151 
153 
154 
155  self.pulse_generation = False
156 
157 
159 
160  def __repr__(self):
161  """!
162  @brief Returns string that represents central element.
163 
164  """
165  return "%s, %s" % (self.membrane_potential, self.pulse_generation_time)
166 
167 
169  """!
170  @brief Oscillatory Neural Network with central element based on Hodgkin-Huxley neuron model.
171  @details Interaction between oscillators is performed via central element (no connection between oscillators that
172  are called as peripheral). Peripheral oscillators receive external stimulus. Central element consist of
173  two oscillators: the first is used for synchronization some ensemble of oscillators and the second
174  controls synchronization of the first central oscillator with various ensembles.
175 
176  Usage example where oscillatory network with 6 oscillators is used for simulation. The first two oscillators
177  have the same stimulus, as well as the third and fourth oscillators and the last two. Thus three synchronous
178  ensembles are expected after simulation.
179  @code
180  from pyclustering.nnet.hhn import hhn_network, hhn_parameters
181  from pyclustering.nnet.dynamic_visualizer import dynamic_visualizer
182 
183  # Change period of time when high strength value of synaptic connection exists from CN2 to PN.
184  params = hhn_parameters()
185  params.deltah = 400
186 
187  # Create Hodgkin-Huxley oscillatory network with stimulus.
188  net = hhn_network(6, [0, 0, 25, 25, 47, 47], params)
189 
190  # Simulate network.
191  (t, dyn_peripheral, dyn_central) = net.simulate(2400, 600)
192 
193  # Visualize network's output (membrane potential of peripheral and central neurons).
194  amount_canvases = 6 + 2 # 6 peripheral oscillator + 2 central elements
195  visualizer = dynamic_visualizer(amount_canvases, x_title="Time", y_title="V", y_labels=False)
196  visualizer.append_dynamics(t, dyn_peripheral, 0, True)
197  visualizer.append_dynamics(t, dyn_central, amount_canvases - 2, True)
198  visualizer.show()
199  @endcode
200 
201  There is visualized result of simulation where three synchronous ensembles of oscillators can be observed. The
202  first and the second oscillators form the first ensemble, the third and the fourth form the second ensemble and
203  the last two oscillators form the third ensemble.
204  @image html hhn_three_ensembles.png
205 
206  """
207 
208  def __init__(self, num_osc, stimulus = None, parameters = None, type_conn = None, type_conn_represent = conn_represent.MATRIX, ccore = True):
209  """!
210  @brief Constructor of oscillatory network based on Hodgkin-Huxley neuron model.
211 
212  @param[in] num_osc (uint): Number of peripheral oscillators in the network.
213  @param[in] stimulus (list): List of stimulus for oscillators, number of stimulus should be equal to number of peripheral oscillators.
214  @param[in] parameters (hhn_parameters): Parameters of the network.
215  @param[in] type_conn (conn_type): Type of connections between oscillators in the network (ignored for this type of network).
216  @param[in] type_conn_represent (conn_represent): Internal representation of connection in the network: matrix or list.
217  @param[in] ccore (bool): If 'True' then CCORE is used (C/C++ implementation of the model).
218 
219  """
220 
221  super().__init__(num_osc, conn_type.NONE, type_conn_represent)
222 
223  if stimulus is None:
224  self._stimulus = [0.0] * num_osc
225  else:
226  self._stimulus = stimulus
227 
228  if parameters is not None:
229  self._params = parameters
230  else:
231  self._params = hhn_parameters()
232 
233  self.__ccore_hhn_pointer = None
234  self.__ccore_hhn_dynamic_pointer = None
235 
236  if (ccore is True) and ccore_library.workable():
237  self.__ccore_hhn_pointer = wrapper.hhn_create(num_osc, self._params)
238  else:
239  self._membrane_dynamic_pointer = None # final result is stored here.
240 
241  self._membrane_potential = [0.0] * self._num_osc
242  self._active_cond_sodium = [0.0] * self._num_osc
243  self._inactive_cond_sodium = [0.0] * self._num_osc
244  self._active_cond_potassium = [0.0] * self._num_osc
245  self._link_activation_time = [0.0] * self._num_osc
246  self._link_pulse_counter = [0.0] * self._num_osc
247  self._link_weight3 = [0.0] * self._num_osc
248  self._pulse_generation_time = [[] for i in range(self._num_osc)]
249  self._pulse_generation = [False] * self._num_osc
250 
251  self._noise = [random.random() * 2.0 - 1.0 for i in range(self._num_osc)]
252 
254 
255  def __del__(self):
256  """!
257  @brief Destroy dynamically allocated oscillatory network instance in case of CCORE usage.
258 
259  """
260  if self.__ccore_hhn_pointer:
261  wrapper.hhn_destroy(self.__ccore_hhn_pointer)
262 
263  def simulate(self, steps, time, solution = solve_type.RK4):
264  """!
265  @brief Performs static simulation of oscillatory network based on Hodgkin-Huxley neuron model.
266  @details Output dynamic is sensible to amount of steps of simulation and solver of differential equation.
267  Python implementation uses 'odeint' from 'scipy', CCORE uses classical RK4 and RFK45 methods,
268  therefore in case of CCORE HHN (Hodgkin-Huxley network) amount of steps should be greater than in
269  case of Python HHN.
270 
271  @param[in] steps (uint): Number steps of simulations during simulation.
272  @param[in] time (double): Time of simulation.
273  @param[in] solution (solve_type): Type of solver for differential equations.
274 
275  @return (tuple) Dynamic of oscillatory network represented by (time, peripheral neurons dynamic, central elements
276  dynamic), where types are (list, list, list).
277 
278  """
279 
280  return self.simulate_static(steps, time, solution)
281 
282  def simulate_static(self, steps, time, solution = solve_type.RK4):
283  """!
284  @brief Performs static simulation of oscillatory network based on Hodgkin-Huxley neuron model.
285  @details Output dynamic is sensible to amount of steps of simulation and solver of differential equation.
286  Python implementation uses 'odeint' from 'scipy', CCORE uses classical RK4 and RFK45 methods,
287  therefore in case of CCORE HHN (Hodgkin-Huxley network) amount of steps should be greater than in
288  case of Python HHN.
289 
290  @param[in] steps (uint): Number steps of simulations during simulation.
291  @param[in] time (double): Time of simulation.
292  @param[in] solution (solve_type): Type of solver for differential equations.
293 
294  @return (tuple) Dynamic of oscillatory network represented by (time, peripheral neurons dynamic, central elements
295  dynamic), where types are (list, list, list).
296 
297  """
298 
299  # Check solver before simulation
300  if solution == solve_type.FAST:
301  raise NameError("Solver FAST is not support due to low accuracy that leads to huge error.")
302 
303  self._membrane_dynamic_pointer = None
304 
305  if self.__ccore_hhn_pointer is not None:
306  self.__ccore_hhn_dynamic_pointer = wrapper.hhn_dynamic_create(True, False, False, False)
307  wrapper.hhn_simulate(self.__ccore_hhn_pointer, steps, time, solution, self._stimulus, self.__ccore_hhn_dynamic_pointer)
308 
309  peripheral_membrane_potential = wrapper.hhn_dynamic_get_peripheral_evolution(self.__ccore_hhn_dynamic_pointer, 0)
310  central_membrane_potential = wrapper.hhn_dynamic_get_central_evolution(self.__ccore_hhn_dynamic_pointer, 0)
311  dynamic_time = wrapper.hhn_dynamic_get_time(self.__ccore_hhn_dynamic_pointer)
312 
313  self._membrane_dynamic_pointer = peripheral_membrane_potential
314 
315  wrapper.hhn_dynamic_destroy(self.__ccore_hhn_dynamic_pointer)
316 
317  return dynamic_time, peripheral_membrane_potential, central_membrane_potential
318 
319  if solution == solve_type.RKF45:
320  raise NameError("Solver RKF45 is not support in python version.")
321 
322  dyn_peripheral = [self._membrane_potential[:]]
323  dyn_central = [[0.0, 0.0]]
324  dyn_time = [0.0]
325 
326  step = time / steps
327  int_step = step / 10.0
328 
329  for t in numpy.arange(step, time + step, step):
330  # update states of oscillators
331  (memb_peripheral, memb_central) = self._calculate_states(solution, t, step, int_step)
332 
333  # update states of oscillators
334  dyn_peripheral.append(memb_peripheral)
335  dyn_central.append(memb_central)
336  dyn_time.append(t)
337 
338  self._membrane_dynamic_pointer = dyn_peripheral
339  return dyn_time, dyn_peripheral, dyn_central
340 
341  def _calculate_states(self, solution, t, step, int_step):
342  """!
343  @brief Calculates new state of each oscillator in the network. Returns only excitatory state of oscillators.
344 
345  @param[in] solution (solve_type): Type solver of the differential equations.
346  @param[in] t (double): Current time of simulation.
347  @param[in] step (uint): Step of solution at the end of which states of oscillators should be calculated.
348  @param[in] int_step (double): Differentiation step that is used for solving differential equation.
349 
350  @return (list) New states of membrane potentials for peripheral oscillators and for cental elements as a list where
351  the last two values correspond to central element 1 and 2.
352 
353  """
354 
355  next_membrane = [0.0] * self._num_osc
356  next_active_sodium = [0.0] * self._num_osc
357  next_inactive_sodium = [0.0] * self._num_osc
358  next_active_potassium = [0.0] * self._num_osc
359 
360  # Update states of oscillators
361  for index in range(0, self._num_osc, 1):
362  result = odeint(self.hnn_state,
363  [self._membrane_potential[index], self._active_cond_sodium[index], self._inactive_cond_sodium[index], self._active_cond_potassium[index]],
364  numpy.arange(t - step, t, int_step),
365  (index, ))
366 
367  [ next_membrane[index], next_active_sodium[index], next_inactive_sodium[index], next_active_potassium[index] ] = result[len(result) - 1][0:4]
368 
369  next_cn_membrane = [0.0, 0.0]
370  next_cn_active_sodium = [0.0, 0.0]
371  next_cn_inactive_sodium = [0.0, 0.0]
372  next_cn_active_potassium = [0.0, 0.0]
373 
374  # Update states of central elements
375  for index in range(0, len(self._central_element)):
376  result = odeint(self.hnn_state,
377  [self._central_element[index].membrane_potential, self._central_element[index].active_cond_sodium, self._central_element[index].inactive_cond_sodium, self._central_element[index].active_cond_potassium],
378  numpy.arange(t - step, t, int_step),
379  (self._num_osc + index, ))
380 
381  [ next_cn_membrane[index], next_cn_active_sodium[index], next_cn_inactive_sodium[index], next_cn_active_potassium[index] ] = result[len(result) - 1][0:4]
382 
383  # Noise generation
384  self._noise = [ 1.0 + 0.01 * (random.random() * 2.0 - 1.0) for i in range(self._num_osc)]
385 
386  # Updating states of PNs
387  self.__update_peripheral_neurons(t, step, next_membrane, next_active_sodium, next_inactive_sodium, next_active_potassium)
388 
389  # Updation states of CN
390  self.__update_central_neurons(t, next_cn_membrane, next_cn_active_sodium, next_cn_inactive_sodium, next_cn_active_potassium)
391 
392  return (next_membrane, next_cn_membrane)
393 
394  def __update_peripheral_neurons(self, t, step, next_membrane, next_active_sodium, next_inactive_sodium, next_active_potassium):
395  """!
396  @brief Update peripheral neurons in line with new values of current in channels.
397 
398  @param[in] t (doubles): Current time of simulation.
399  @param[in] step (uint): Step (time duration) during simulation when states of oscillators should be calculated.
400  @param[in] next_membrane (list): New values of membrane potentials for peripheral neurons.
401  @Param[in] next_active_sodium (list): New values of activation conductances of the sodium channels for peripheral neurons.
402  @param[in] next_inactive_sodium (list): New values of inactivaton conductances of the sodium channels for peripheral neurons.
403  @param[in] next_active_potassium (list): New values of activation conductances of the potassium channel for peripheral neurons.
404 
405  """
406 
407  self._membrane_potential = next_membrane[:]
408  self._active_cond_sodium = next_active_sodium[:]
409  self._inactive_cond_sodium = next_inactive_sodium[:]
410  self._active_cond_potassium = next_active_potassium[:]
411 
412  for index in range(0, self._num_osc):
413  if self._pulse_generation[index] is False:
414  if self._membrane_potential[index] >= 0.0:
415  self._pulse_generation[index] = True
416  self._pulse_generation_time[index].append(t)
417  elif self._membrane_potential[index] < 0.0:
418  self._pulse_generation[index] = False
419 
420  # Update connection from CN2 to PN
421  if self._link_weight3[index] == 0.0:
422  if self._membrane_potential[index] > self._params.threshold:
423  self._link_pulse_counter[index] += step
424 
425  if self._link_pulse_counter[index] >= 1 / self._params.eps:
426  self._link_weight3[index] = self._params.w3
427  self._link_activation_time[index] = t
428  elif not ((self._link_activation_time[index] < t) and (t < self._link_activation_time[index] + self._params.deltah)):
429  self._link_weight3[index] = 0.0
430  self._link_pulse_counter[index] = 0.0
431 
432  def __update_central_neurons(self, t, next_cn_membrane, next_cn_active_sodium, next_cn_inactive_sodium, next_cn_active_potassium):
433  """!
434  @brief Update of central neurons in line with new values of current in channels.
435 
436  @param[in] t (doubles): Current time of simulation.
437  @param[in] next_membrane (list): New values of membrane potentials for central neurons.
438  @Param[in] next_active_sodium (list): New values of activation conductances of the sodium channels for central neurons.
439  @param[in] next_inactive_sodium (list): New values of inactivaton conductances of the sodium channels for central neurons.
440  @param[in] next_active_potassium (list): New values of activation conductances of the potassium channel for central neurons.
441 
442  """
443 
444  for index in range(0, len(self._central_element)):
445  self._central_element[index].membrane_potential = next_cn_membrane[index]
446  self._central_element[index].active_cond_sodium = next_cn_active_sodium[index]
447  self._central_element[index].inactive_cond_sodium = next_cn_inactive_sodium[index]
448  self._central_element[index].active_cond_potassium = next_cn_active_potassium[index]
449 
450  if self._central_element[index].pulse_generation is False:
451  if self._central_element[index].membrane_potential >= 0.0:
452  self._central_element[index].pulse_generation = True
453  self._central_element[index].pulse_generation_time.append(t)
454  elif self._central_element[index].membrane_potential < 0.0:
455  self._central_element[index].pulse_generation = False
456 
457  def hnn_state(self, inputs, t, argv):
458  """!
459  @brief Returns new values of excitatory and inhibitory parts of oscillator and potential of oscillator.
460 
461  @param[in] inputs (list): States of oscillator for integration [v, m, h, n] (see description below).
462  @param[in] t (double): Current time of simulation.
463  @param[in] argv (tuple): Extra arguments that are not used for integration - index of oscillator.
464 
465  @return (list) new values of oscillator [v, m, h, n], where:
466  v - membrane potantial of oscillator,
467  m - activation conductance of the sodium channel,
468  h - inactication conductance of the sodium channel,
469  n - activation conductance of the potassium channel.
470 
471  """
472 
473  index = argv
474 
475  v = inputs[0] # membrane potential (v).
476  m = inputs[1] # activation conductance of the sodium channel (m).
477  h = inputs[2] # inactivaton conductance of the sodium channel (h).
478  n = inputs[3] # activation conductance of the potassium channel (n).
479 
480  # Calculate ion current
481  # gNa * m[i]^3 * h * (v[i] - vNa) + gK * n[i]^4 * (v[i] - vK) + gL (v[i] - vL)
482  active_sodium_part = self._params.gNa * (m ** 3) * h * (v - self._params.vNa)
483  inactive_sodium_part = self._params.gK * (n ** 4) * (v - self._params.vK)
484  active_potassium_part = self._params.gL * (v - self._params.vL)
485 
486  Iion = active_sodium_part + inactive_sodium_part + active_potassium_part
487 
488  Iext = 0.0
489  Isyn = 0.0
490  if index < self._num_osc:
491  # PN - peripheral neuron - calculation of external current and synaptic current.
492  Iext = self._stimulus[index] * self._noise[index] # probably noise can be pre-defined for reducting compexity
493 
494  memory_impact1 = 0.0
495  for i in range(0, len(self._central_element[0].pulse_generation_time)):
496  memory_impact1 += self.__alfa_function(t - self._central_element[0].pulse_generation_time[i], self._params.alfa_inhibitory, self._params.betta_inhibitory);
497 
498  memory_impact2 = 0.0
499  for i in range(0, len(self._central_element[1].pulse_generation_time)):
500  memory_impact2 += self.__alfa_function(t - self._central_element[1].pulse_generation_time[i], self._params.alfa_inhibitory, self._params.betta_inhibitory);
501 
502  Isyn = self._params.w2 * (v - self._params.Vsyninh) * memory_impact1 + self._link_weight3[index] * (v - self._params.Vsyninh) * memory_impact2;
503  else:
504  # CN - central element.
505  central_index = index - self._num_osc
506  if central_index == 0:
507  Iext = self._params.Icn1 # CN1
508 
509  memory_impact = 0.0
510  for index_oscillator in range(0, self._num_osc):
511  for index_generation in range(0, len(self._pulse_generation_time[index_oscillator])):
512  memory_impact += self.__alfa_function(t - self._pulse_generation_time[index_oscillator][index_generation], self._params.alfa_excitatory, self._params.betta_excitatory);
513 
514  Isyn = self._params.w1 * (v - self._params.Vsynexc) * memory_impact
515 
516  elif central_index == 1:
517  Iext = self._params.Icn2 # CN2
518  Isyn = 0.0
519 
520  else:
521  assert 0;
522 
523  # Membrane potential
524  dv = -Iion + Iext - Isyn
525 
526  # Calculate variables
527  potential = v - self._params.vRest
528  am = (2.5 - 0.1 * potential) / (math.exp(2.5 - 0.1 * potential) - 1.0)
529  ah = 0.07 * math.exp(-potential / 20.0)
530  an = (0.1 - 0.01 * potential) / (math.exp(1.0 - 0.1 * potential) - 1.0)
531 
532  bm = 4.0 * math.exp(-potential / 18.0)
533  bh = 1.0 / (math.exp(3.0 - 0.1 * potential) + 1.0)
534  bn = 0.125 * math.exp(-potential / 80.0)
535 
536  dm = am * (1.0 - m) - bm * m
537  dh = ah * (1.0 - h) - bh * h
538  dn = an * (1.0 - n) - bn * n
539 
540  return [dv, dm, dh, dn]
541 
542  def allocate_sync_ensembles(self, tolerance = 0.1):
543  """!
544  @brief Allocates clusters in line with ensembles of synchronous oscillators where each. Synchronous ensemble corresponds to only one cluster.
545 
546  @param[in] tolerance (double): maximum error for allocation of synchronous ensemble oscillators.
547 
548  @return (list) Grours (lists) of indexes of synchronous oscillators. For example [ [index_osc1, index_osc3], [index_osc2], [index_osc4, index_osc5] ].
549 
550  """
551 
552  return allocate_sync_ensembles(self._membrane_dynamic_pointer, tolerance, 20.0, None)
553 
554  def __alfa_function(self, time, alfa, betta):
555  """!
556  @brief Calculates value of alfa-function for difference between spike generation time and current simulation time.
557 
558  @param[in] time (double): Difference between last spike generation time and current time.
559  @param[in] alfa (double): Alfa parameter for alfa-function.
560  @param[in] betta (double): Betta parameter for alfa-function.
561 
562  @return (double) Value of alfa-function.
563 
564  """
565 
566  return alfa * time * math.exp(-betta * time)
def hnn_state(self, inputs, t, argv)
Returns new values of excitatory and inhibitory parts of oscillator and potential of oscillator...
Definition: hhn.py:457
def __alfa_function(self, time, alfa, betta)
Calculates value of alfa-function for difference between spike generation time and current simulation...
Definition: hhn.py:554
Vsyninh
Synaptic reversal potential [mV] for inhibitory effects.
Definition: hhn.py:89
gK
Maximal conductivity for potassium current.
Definition: hhn.py:62
gNa
Maximal conductivity for sodium current.
Definition: hhn.py:59
def allocate_sync_ensembles(self, tolerance=0.1)
Allocates clusters in line with ensembles of synchronous oscillators where each.
Definition: hhn.py:542
membrane_potential
Membrane potential of cenral neuron (V).
Definition: hhn.py:143
Icn2
External current [mV] for central element 2.
Definition: hhn.py:85
Utils that are used by modules of pyclustering.
Definition: __init__.py:1
vNa
Reverse potential of sodium current [mV].
Definition: hhn.py:69
betta_excitatory
Betta-parameter for alfa-function for excitatory effect.
Definition: hhn.py:105
betta_inhibitory
Betta-parameter for alfa-function for inhibitory effect.
Definition: hhn.py:98
eps
Affects pulse counter.
Definition: hhn.py:125
deltah
Period of time [ms] when high strength value of synaptic connection exists from CN2 to PN...
Definition: hhn.py:119
def __update_central_neurons(self, t, next_cn_membrane, next_cn_active_sodium, next_cn_inactive_sodium, next_cn_active_potassium)
Update of central neurons in line with new values of current in channels.
Definition: hhn.py:432
def simulate(self, steps, time, solution=solve_type.RK4)
Performs static simulation of oscillatory network based on Hodgkin-Huxley neuron model.
Definition: hhn.py:263
threshold
Threshold of the membrane potential that should exceeded by oscillator to be considered as an active...
Definition: hhn.py:122
active_cond_sodium
Activation conductance of the sodium channel (m).
Definition: hhn.py:146
vL
Reverse potential of leakage current [mV].
Definition: hhn.py:75
gL
Maximal conductivity for leakage current.
Definition: hhn.py:65
pulse_generation_time
Timestamps of generated pulses.
Definition: hhn.py:158
def __init__(self)
Constructor of central element.
Definition: hhn.py:136
w3
Strength of the synaptic connection from CN2 to PN.
Definition: hhn.py:115
Central element consist of two central neurons that are described by a little bit different dynamic t...
Definition: hhn.py:128
vRest
Rest potential [mV].
Definition: hhn.py:78
Common network description that consists of information about oscillators and connection between them...
Definition: __init__.py:97
vK
Reverse potential of potassium current [mV].
Definition: hhn.py:72
inactive_cond_sodium
Inactivaton conductance of the sodium channel (h).
Definition: hhn.py:149
pulse_generation
Spike generation of central neuron.
Definition: hhn.py:155
def __repr__(self)
Returns string that represents central element.
Definition: hhn.py:160
active_cond_potassium
Activaton conductance of the sodium channel (h).
Definition: hhn.py:152
Oscillatory Neural Network with central element based on Hodgkin-Huxley neuron model.
Definition: hhn.py:168
def __init__(self)
Default constructor of parameters for Hodgkin-Huxley Oscillatory Network.
Definition: hhn.py:48
def __update_peripheral_neurons(self, t, step, next_membrane, next_active_sodium, next_inactive_sodium, next_active_potassium)
Update peripheral neurons in line with new values of current in channels.
Definition: hhn.py:394
w2
Strength of the synaptic connection from CN1 to PN.
Definition: hhn.py:112
alfa_excitatory
Alfa-parameter for alfa-function for excitatory effect.
Definition: hhn.py:102
Describes parameters of Hodgkin-Huxley Oscillatory Network.
Definition: hhn.py:40
w1
Strength of the synaptic connection from PN to CN1.
Definition: hhn.py:109
def __del__(self)
Destroy dynamically allocated oscillatory network instance in case of CCORE usage.
Definition: hhn.py:255
alfa_inhibitory
Alfa-parameter for alfa-function for inhibitory effect.
Definition: hhn.py:95
def simulate_static(self, steps, time, solution=solve_type.RK4)
Performs static simulation of oscillatory network based on Hodgkin-Huxley neuron model.
Definition: hhn.py:282
Icn1
External current [mV] for central element 1.
Definition: hhn.py:82
def _calculate_states(self, solution, t, step, int_step)
Calculates new state of each oscillator in the network.
Definition: hhn.py:341
Vsynexc
Synaptic reversal potential [mV] for exciting effects.
Definition: hhn.py:92
def __init__(self, num_osc, stimulus=None, parameters=None, type_conn=None, type_conn_represent=conn_represent.MATRIX, ccore=True)
Constructor of oscillatory network based on Hodgkin-Huxley neuron model.
Definition: hhn.py:208
Neural and oscillatory network module.
Definition: __init__.py:1