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-2019
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 
143  self.membrane_potential = 0.0;
144 
145 
146  self.active_cond_sodium = 0.0;
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_deactivation_time = [0.0] * self._num_osc;
248  self._link_weight3 = [0.0] * self._num_osc;
249  self._pulse_generation_time = [ [] for i in range(self._num_osc) ];
250  self._pulse_generation = [False] * self._num_osc;
251 
252  self._noise = [random.random() * 2.0 - 1.0 for i in range(self._num_osc)];
253 
255 
256 
257  def __del__(self):
258  """!
259  @brief Destroy dynamically allocated oscillatory network instance in case of CCORE usage.
260 
261  """
262  if self.__ccore_hhn_pointer:
263  wrapper.hhn_destroy(self.__ccore_hhn_pointer)
264 
265 
266  def simulate(self, steps, time, solution = solve_type.RK4):
267  """!
268  @brief Performs static simulation of oscillatory network based on Hodgkin-Huxley neuron model.
269  @details Output dynamic is sensible to amount of steps of simulation and solver of differential equation.
270  Python implementation uses 'odeint' from 'scipy', CCORE uses classical RK4 and RFK45 methods,
271  therefore in case of CCORE HHN (Hodgkin-Huxley network) amount of steps should be greater than in
272  case of Python HHN.
273 
274  @param[in] steps (uint): Number steps of simulations during simulation.
275  @param[in] time (double): Time of simulation.
276  @param[in] solution (solve_type): Type of solver for differential equations.
277 
278  @return (tuple) Dynamic of oscillatory network represented by (time, peripheral neurons dynamic, central elements
279  dynamic), where types are (list, list, list).
280 
281  """
282 
283  return self.simulate_static(steps, time, solution)
284 
285 
286  def simulate_static(self, steps, time, solution = solve_type.RK4):
287  """!
288  @brief Performs static simulation of oscillatory network based on Hodgkin-Huxley neuron model.
289  @details Output dynamic is sensible to amount of steps of simulation and solver of differential equation.
290  Python implementation uses 'odeint' from 'scipy', CCORE uses classical RK4 and RFK45 methods,
291  therefore in case of CCORE HHN (Hodgkin-Huxley network) amount of steps should be greater than in
292  case of Python HHN.
293 
294  @param[in] steps (uint): Number steps of simulations during simulation.
295  @param[in] time (double): Time of simulation.
296  @param[in] solution (solve_type): Type of solver for differential equations.
297 
298  @return (tuple) Dynamic of oscillatory network represented by (time, peripheral neurons dynamic, central elements
299  dynamic), where types are (list, list, list).
300 
301  """
302 
303  # Check solver before simulation
304  if (solution == solve_type.FAST):
305  raise NameError("Solver FAST is not support due to low accuracy that leads to huge error.");
306 
307  self._membrane_dynamic_pointer = None;
308 
309  if (self.__ccore_hhn_pointer is not None):
310  self.__ccore_hhn_dynamic_pointer = wrapper.hhn_dynamic_create(True, False, False, False);
311  wrapper.hhn_simulate(self.__ccore_hhn_pointer, steps, time, solution, self._stimulus, self.__ccore_hhn_dynamic_pointer);
312 
313  peripheral_membrane_potential = wrapper.hhn_dynamic_get_peripheral_evolution(self.__ccore_hhn_dynamic_pointer, 0);
314  central_membrane_potential = wrapper.hhn_dynamic_get_central_evolution(self.__ccore_hhn_dynamic_pointer, 0);
315  dynamic_time = wrapper.hhn_dynamic_get_time(self.__ccore_hhn_dynamic_pointer);
316 
317  self._membrane_dynamic_pointer = peripheral_membrane_potential;
318 
319  wrapper.hhn_dynamic_destroy(self.__ccore_hhn_dynamic_pointer);
320 
321  return (dynamic_time, peripheral_membrane_potential, central_membrane_potential);
322 
323  if (solution == solve_type.RKF45):
324  raise NameError("Solver RKF45 is not support in python version.");
325 
326  dyn_peripheral = [ self._membrane_potential[:] ];
327  dyn_central = [ [0.0, 0.0] ];
328  dyn_time = [ 0.0 ];
329 
330  step = time / steps;
331  int_step = step / 10.0;
332 
333  for t in numpy.arange(step, time + step, step):
334  # update states of oscillators
335  (memb_peripheral, memb_central) = self._calculate_states(solution, t, step, int_step);
336 
337  # update states of oscillators
338  dyn_peripheral.append(memb_peripheral);
339  dyn_central.append(memb_central);
340  dyn_time.append(t);
341 
342  self._membrane_dynamic_pointer = dyn_peripheral;
343  return (dyn_time, dyn_peripheral, dyn_central);
344 
345 
346  def _calculate_states(self, solution, t, step, int_step):
347  """!
348  @brief Caclculates new state of each oscillator in the network. Returns only excitatory state of oscillators.
349 
350  @param[in] solution (solve_type): Type solver of the differential equations.
351  @param[in] t (double): Current time of simulation.
352  @param[in] step (uint): Step of solution at the end of which states of oscillators should be calculated.
353  @param[in] int_step (double): Differentiation step that is used for solving differential equation.
354 
355  @return (list) New states of membrance potentials for peripheral oscillators and for cental elements as a list where
356  the last two values correspond to central element 1 and 2.
357 
358  """
359 
360  next_membrane = [0.0] * self._num_osc;
361  next_active_sodium = [0.0] * self._num_osc;
362  next_inactive_sodium = [0.0] * self._num_osc;
363  next_active_potassium = [0.0] * self._num_osc;
364 
365  # Update states of oscillators
366  for index in range (0, self._num_osc, 1):
367  result = odeint(self.hnn_state,
368  [ self._membrane_potential[index], self._active_cond_sodium[index], self._inactive_cond_sodium[index], self._active_cond_potassium[index] ],
369  numpy.arange(t - step, t, int_step),
370  (index , ));
371 
372  [ next_membrane[index], next_active_sodium[index], next_inactive_sodium[index], next_active_potassium[index] ] = result[len(result) - 1][0:4];
373 
374  next_cn_membrane = [0.0, 0.0];
375  next_cn_active_sodium = [0.0, 0.0];
376  next_cn_inactive_sodium = [0.0, 0.0];
377  next_cn_active_potassium = [0.0, 0.0];
378 
379  # Update states of central elements
380  for index in range(0, len(self._central_element)):
381  result = odeint(self.hnn_state,
382  [ 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 ],
383  numpy.arange(t - step, t, int_step),
384  (self._num_osc + index , ));
385 
386  [ 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];
387 
388  # Noise generation
389  self._noise = [ 1.0 + 0.01 * (random.random() * 2.0 - 1.0) for i in range(self._num_osc)];
390 
391  # Updating states of PNs
392  self.__update_peripheral_neurons(t, step, next_membrane, next_active_sodium, next_inactive_sodium, next_active_potassium);
393 
394  # Updation states of CN
395  self.__update_central_neurons(t, next_cn_membrane, next_cn_active_sodium, next_cn_inactive_sodium, next_cn_active_potassium);
396 
397  return (next_membrane, next_cn_membrane);
398 
399 
400  def __update_peripheral_neurons(self, t, step, next_membrane, next_active_sodium, next_inactive_sodium, next_active_potassium):
401  """!
402  @brief Update peripheral neurons in line with new values of current in channels.
403 
404  @param[in] t (doubles): Current time of simulation.
405  @param[in] step (uint): Step (time duration) during simulation when states of oscillators should be calculated.
406  @param[in] next_membrane (list): New values of membrane potentials for peripheral neurons.
407  @Param[in] next_active_sodium (list): New values of activation conductances of the sodium channels for peripheral neurons.
408  @param[in] next_inactive_sodium (list): New values of inactivaton conductances of the sodium channels for peripheral neurons.
409  @param[in] next_active_potassium (list): New values of activation conductances of the potassium channel for peripheral neurons.
410 
411  """
412 
413  self._membrane_potential = next_membrane[:];
414  self._active_cond_sodium = next_active_sodium[:];
415  self._inactive_cond_sodium = next_inactive_sodium[:];
416  self._active_cond_potassium = next_active_potassium[:];
417 
418  for index in range(0, self._num_osc):
419  if (self._pulse_generation[index] is False):
420  if (self._membrane_potential[index] >= 0.0):
421  self._pulse_generation[index] = True;
422  self._pulse_generation_time[index].append(t);
423  elif (self._membrane_potential[index] < 0.0):
424  self._pulse_generation[index] = False;
425 
426  # Update connection from CN2 to PN
427  if (self._link_weight3[index] == 0.0):
428  if (self._membrane_potential[index] > self._params.threshold):
429  self._link_pulse_counter[index] += step;
430 
431  if (self._link_pulse_counter[index] >= 1 / self._params.eps):
432  self._link_weight3[index] = self._params.w3;
433  self._link_activation_time[index] = t;
434  elif ( not ((self._link_activation_time[index] < t) and (t < self._link_activation_time[index] + self._params.deltah)) ):
435  self._link_weight3[index] = 0.0;
436  self._link_pulse_counter[index] = 0.0;
437 
438 
439  def __update_central_neurons(self, t, next_cn_membrane, next_cn_active_sodium, next_cn_inactive_sodium, next_cn_active_potassium):
440  """!
441  @brief Update of central neurons in line with new values of current in channels.
442 
443  @param[in] t (doubles): Current time of simulation.
444  @param[in] next_membrane (list): New values of membrane potentials for central neurons.
445  @Param[in] next_active_sodium (list): New values of activation conductances of the sodium channels for central neurons.
446  @param[in] next_inactive_sodium (list): New values of inactivaton conductances of the sodium channels for central neurons.
447  @param[in] next_active_potassium (list): New values of activation conductances of the potassium channel for central neurons.
448 
449  """
450 
451  for index in range(0, len(self._central_element)):
452  self._central_element[index].membrane_potential = next_cn_membrane[index];
453  self._central_element[index].active_cond_sodium = next_cn_active_sodium[index];
454  self._central_element[index].inactive_cond_sodium = next_cn_inactive_sodium[index];
455  self._central_element[index].active_cond_potassium = next_cn_active_potassium[index];
456 
457  if (self._central_element[index].pulse_generation is False):
458  if (self._central_element[index].membrane_potential >= 0.0):
459  self._central_element[index].pulse_generation = True;
460  self._central_element[index].pulse_generation_time.append(t);
461  elif (self._central_element[index].membrane_potential < 0.0):
462  self._central_element[index].pulse_generation = False;
463 
464 
465  def hnn_state(self, inputs, t, argv):
466  """!
467  @brief Returns new values of excitatory and inhibitory parts of oscillator and potential of oscillator.
468 
469  @param[in] inputs (list): States of oscillator for integration [v, m, h, n] (see description below).
470  @param[in] t (double): Current time of simulation.
471  @param[in] argv (tuple): Extra arguments that are not used for integration - index of oscillator.
472 
473  @return (list) new values of oscillator [v, m, h, n], where:
474  v - membrane potantial of oscillator,
475  m - activation conductance of the sodium channel,
476  h - inactication conductance of the sodium channel,
477  n - activation conductance of the potassium channel.
478 
479  """
480 
481  index = argv;
482 
483  v = inputs[0]; # membrane potential (v).
484  m = inputs[1]; # activation conductance of the sodium channel (m).
485  h = inputs[2]; # inactivaton conductance of the sodium channel (h).
486  n = inputs[3]; # activation conductance of the potassium channel (n).
487 
488  # Calculate ion current
489  # gNa * m[i]^3 * h * (v[i] - vNa) + gK * n[i]^4 * (v[i] - vK) + gL (v[i] - vL)
490  active_sodium_part = self._params.gNa * (m ** 3) * h * (v - self._params.vNa);
491  inactive_sodium_part = self._params.gK * (n ** 4) * (v - self._params.vK);
492  active_potassium_part = self._params.gL * (v - self._params.vL);
493 
494  Iion = active_sodium_part + inactive_sodium_part + active_potassium_part;
495 
496  Iext = 0.0;
497  Isyn = 0.0;
498  if (index < self._num_osc):
499  # PN - peripheral neuron - calculation of external current and synaptic current.
500  Iext = self._stimulus[index] * self._noise[index]; # probably noise can be pre-defined for reducting compexity
501 
502  memory_impact1 = 0.0;
503  for i in range(0, len(self._central_element[0].pulse_generation_time)):
504  memory_impact1 += self.__alfa_function(t - self._central_element[0].pulse_generation_time[i], self._params.alfa_inhibitory, self._params.betta_inhibitory);
505 
506  memory_impact2 = 0.0;
507  for i in range(0, len(self._central_element[1].pulse_generation_time)):
508  memory_impact2 += self.__alfa_function(t - self._central_element[1].pulse_generation_time[i], self._params.alfa_inhibitory, self._params.betta_inhibitory);
509 
510  Isyn = self._params.w2 * (v - self._params.Vsyninh) * memory_impact1 + self._link_weight3[index] * (v - self._params.Vsyninh) * memory_impact2;
511  else:
512  # CN - central element.
513  central_index = index - self._num_osc;
514  if (central_index == 0):
515  Iext = self._params.Icn1; # CN1
516 
517  memory_impact = 0.0;
518  for index_oscillator in range(0, self._num_osc):
519  for index_generation in range(0, len(self._pulse_generation_time[index_oscillator])):
520  memory_impact += self.__alfa_function(t - self._pulse_generation_time[index_oscillator][index_generation], self._params.alfa_excitatory, self._params.betta_excitatory);
521 
522  Isyn = self._params.w1 * (v - self._params.Vsynexc) * memory_impact;
523 
524  elif (central_index == 1):
525  Iext = self._params.Icn2; # CN2
526  Isyn = 0.0;
527 
528  else:
529  assert 0;
530 
531 
532  # Membrane potential
533  dv = -Iion + Iext - Isyn;
534 
535  # Calculate variables
536  potential = v - self._params.vRest;
537  am = (2.5 - 0.1 * potential) / (math.exp(2.5 - 0.1 * potential) - 1.0);
538  ah = 0.07 * math.exp(-potential / 20.0);
539  an = (0.1 - 0.01 * potential) / (math.exp(1.0 - 0.1 * potential) - 1.0);
540 
541  bm = 4.0 * math.exp(-potential / 18.0);
542  bh = 1.0 / (math.exp(3.0 - 0.1 * potential) + 1.0);
543  bn = 0.125 * math.exp(-potential / 80.0);
544 
545  dm = am * (1.0 - m) - bm * m;
546  dh = ah * (1.0 - h) - bh * h;
547  dn = an * (1.0 - n) - bn * n;
548 
549  return [dv, dm, dh, dn];
550 
551 
552  def allocate_sync_ensembles(self, tolerance = 0.1):
553  """!
554  @brief Allocates clusters in line with ensembles of synchronous oscillators where each. Synchronous ensemble corresponds to only one cluster.
555 
556  @param[in] tolerance (double): maximum error for allocation of synchronous ensemble oscillators.
557 
558  @return (list) Grours (lists) of indexes of synchronous oscillators. For example [ [index_osc1, index_osc3], [index_osc2], [index_osc4, index_osc5] ].
559 
560  """
561 
562  return allocate_sync_ensembles(self._membrane_dynamic_pointer, tolerance, 20.0, None);
563 
564 
565  def __alfa_function(self, time, alfa, betta):
566  """!
567  @brief Calculates value of alfa-function for difference between spike generation time and current simulation time.
568 
569  @param[in] time (double): Difference between last spike generation time and current time.
570  @param[in] alfa (double): Alfa parameter for alfa-function.
571  @param[in] betta (double): Betta parameter for alfa-function.
572 
573  @return (double) Value of alfa-function.
574 
575  """
576 
577  return alfa * time * math.exp(-betta * time);
578 
def hnn_state(self, inputs, t, argv)
Returns new values of excitatory and inhibitory parts of oscillator and potential of oscillator...
Definition: hhn.py:465
def __alfa_function(self, time, alfa, betta)
Calculates value of alfa-function for difference between spike generation time and current simulation...
Definition: hhn.py:565
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:552
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:439
def simulate(self, steps, time, solution=solve_type.RK4)
Performs static simulation of oscillatory network based on Hodgkin-Huxley neuron model.
Definition: hhn.py:266
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:400
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:257
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:286
Icn1
External current [mV] for central element 1.
Definition: hhn.py:82
def _calculate_states(self, solution, t, step, int_step)
Caclculates new state of each oscillator in the network.
Definition: hhn.py:346
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