2121# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
2222#
2323import numpy as np
24+ import re
2425
26+ try :
27+ import nest
28+ m = re .search (r'.*(\d+)\.(\d+)\.(\d+).*' , nest .version ())
29+ ver_major = int (m .group (1 ))
30+ ver_minor = int (m .group (2 ))
31+ built_in_glifs = ver_major >= 2 and ver_minor >= 20
2532
26- def lif_aibs_converter (config ):
33+ except Exception as e :
34+ built_in_glifs = False
35+
36+
37+ def lif_aibs_converter (config , tau_syn = [5.5 , 8.5 , 2.8 , 5.8 ]):
2738 """
2839
2940 :param config:
@@ -36,11 +47,12 @@ def lif_aibs_converter(config):
3647 'C_m' : coeffs ['C' ] * config ['C' ] * 1.0e12 ,
3748 't_ref' : config ['spike_cut_length' ] * config ['dt' ] * 1.0e03 ,
3849 'V_reset' : config ['El_reference' ] * 1.0e03 ,
50+ 'tau_syn' : tau_syn ,
3951 'V_dynamics_method' : 'linear_exact' } # 'linear_forward_euler' or 'linear_exact'
4052 return params
4153
4254
43- def lif_asc_aibs_converter (config ):
55+ def lif_asc_aibs_converter (config , tau_syn = [ 5.5 , 8.5 , 2.8 , 5.8 ] ):
4456 """
4557
4658 :param config:
@@ -55,8 +67,11 @@ def lif_asc_aibs_converter(config):
5567 'V_reset' : config ['El_reference' ] * 1.0e03 ,
5668 'asc_init' : np .array (config ['init_AScurrents' ]) * 1.0e12 ,
5769 'k' : 1.0 / np .array (config ['asc_tau_array' ]) * 1.0e-03 ,
70+ 'tau_syn' : tau_syn ,
71+ 'asc_decay' : 1.0 / np .array (config ['asc_tau_array' ]) * 1.0e-03 ,
5872 'asc_amps' : np .array (config ['asc_amp_array' ]) * np .array (coeffs ['asc_amp_array' ]) * 1.0e12 ,
59- 'V_dynamics_method' : 'linear_exact' }
73+ 'V_dynamics_method' : 'linear_exact'
74+ }
6075 return params
6176
6277
@@ -237,8 +252,134 @@ def lif_r_asc_a_psc_aibs_converter(config, syn_tau=[5.5, 8.5, 2.8, 5.8]):
237252}
238253
239254
240- def convert_aibs2nest (model_template , dynamics_params ):
255+ def converter_modules (model_template , dynamics_params ):
241256 if model_template in converter_map :
242- return converter_map [model_template ](dynamics_params )
257+ return model_template , converter_map [model_template ](dynamics_params )
243258 else :
244- return dynamics_params
259+ return model_template , dynamics_params
260+
261+
262+ def converter_builtin (model_template , dynamics_params ):
263+ if model_template == 'nest:glif_lif_psc' :
264+ config = dynamics_params
265+ coeffs = config ['coeffs' ]
266+ model_params = {
267+ 'V_m' : config ['El' ] * 1.0e03 + config ['El_reference' ] * 1.0e03 ,
268+ 'V_th' : coeffs ['th_inf' ] * config ['th_inf' ] * 1.0e03 + config ['El_reference' ] * 1.0e03 ,
269+ 'g' : coeffs ['G' ] / config ['R_input' ] * 1.0e09 ,
270+ 'E_L' : config ['El' ] * 1.0e03 + config ['El_reference' ] * 1.0e03 ,
271+ 'C_m' : coeffs ['C' ] * config ['C' ] * 1.0e12 ,
272+ 't_ref' : config ['spike_cut_length' ] * config ['dt' ] * 1.0e03 ,
273+ 'V_reset' : config ['El_reference' ] * 1.0e03 ,
274+ 'tau_syn' : np .array ([5.5 , 8.5 , 2.8 , 5.8 ]), # in ms
275+ 'spike_dependent_threshold' : False ,
276+ 'after_spike_currents' : False ,
277+ 'adapting_threshold' : False
278+ }
279+ return 'nest:glif_psc' , model_params
280+
281+ elif model_template == 'nest:glif_lif_r_psc' :
282+ config = dynamics_params
283+ coeffs = config ['coeffs' ]
284+ threshold_params = config ['threshold_dynamics_method' ]['params' ]
285+ reset_params = config ['voltage_reset_method' ]['params' ]
286+ model_params = {
287+ 'V_m' : config ['El' ] * 1.0e03 + config ['El_reference' ] * 1.0e03 ,
288+ 'V_th' : coeffs ['th_inf' ] * config ['th_inf' ] * 1.0e03 + config ['El_reference' ] * 1.0e03 ,
289+ 'g' : coeffs ['G' ] / config ['R_input' ] * 1.0e09 ,
290+ 'E_L' : config ['El' ] * 1.0e03 + config ['El_reference' ] * 1.0e03 ,
291+ 'C_m' : coeffs ['C' ] * config ['C' ] * 1.0e12 ,
292+ 't_ref' : config ['spike_cut_length' ] * config ['dt' ] * 1.0e03 ,
293+ 'th_spike_add' : threshold_params ['a_spike' ] * 1.0e03 ,
294+ 'th_spike_decay' : threshold_params ['b_spike' ] * 1.0e-03 ,
295+ 'voltage_reset_fraction' : reset_params ['a' ],
296+ 'voltage_reset_add' : reset_params ['b' ] * 1.0e03 ,
297+ 'tau_syn' : np .array ([5.5 , 8.5 , 2.8 , 5.8 ]), # in ms
298+ 'spike_dependent_threshold' : True ,
299+ 'after_spike_currents' : False ,
300+ 'adapting_threshold' : False
301+ }
302+ return 'nest:glif_psc' , model_params
303+
304+ elif model_template == 'nest:glif_lif_asc_psc' :
305+ config = dynamics_params
306+ coeffs = config ['coeffs' ]
307+ model_params = {
308+ 'V_m' : config ['El' ] * 1.0e03 + config ['El_reference' ] * 1.0e03 ,
309+ 'V_th' : coeffs ['th_inf' ] * config ['th_inf' ] * 1.0e03 + config ['El_reference' ] * 1.0e03 ,
310+ 'g' : coeffs ['G' ] / config ['R_input' ] * 1.0e09 ,
311+ 'E_L' : config ['El' ] * 1.0e03 + config ['El_reference' ] * 1.0e03 ,
312+ 'C_m' : coeffs ['C' ] * config ['C' ] * 1.0e12 ,
313+ 't_ref' : config ['spike_cut_length' ] * config ['dt' ] * 1.0e03 ,
314+ 'V_reset' : config ['El_reference' ] * 1.0e03 ,
315+ 'asc_init' : np .array (config ['init_AScurrents' ]) * 1.0e12 ,
316+ 'asc_decay' : 1.0 / np .array (config ['asc_tau_array' ]) * 1.0e-03 ,
317+ 'asc_amps' : np .array (config ['asc_amp_array' ]) * np .array (coeffs ['asc_amp_array' ]) * 1.0e12 ,
318+ 'tau_syn' : np .array ([5.5 , 8.5 , 2.8 , 5.8 ]), # in ms
319+ 'spike_dependent_threshold' : False ,
320+ 'after_spike_currents' : True ,
321+ 'adapting_threshold' : False
322+ }
323+ return 'nest:glif_psc' , model_params
324+
325+ elif model_template == 'nest:glif_lif_r_asc_psc' :
326+ config = dynamics_params
327+ coeffs = config ['coeffs' ]
328+ threshold_params = config ['threshold_dynamics_method' ]['params' ]
329+ reset_params = config ['voltage_reset_method' ]['params' ]
330+ model_params = {
331+ 'V_m' : config ['El' ] * 1.0e03 + config ['El_reference' ] * 1.0e03 ,
332+ 'V_th' : coeffs ['th_inf' ] * config ['th_inf' ] * 1.0e03 + config ['El_reference' ] * 1.0e03 ,
333+ 'g' : coeffs ['G' ] / config ['R_input' ] * 1.0e09 ,
334+ 'E_L' : config ['El' ] * 1.0e03 + config ['El_reference' ] * 1.0e03 ,
335+ 'C_m' : coeffs ['C' ] * config ['C' ] * 1.0e12 ,
336+ 't_ref' : config ['spike_cut_length' ] * config ['dt' ] * 1.0e03 ,
337+ 'th_spike_add' : threshold_params ['a_spike' ] * 1.0e03 ,
338+ 'th_spike_decay' : threshold_params ['b_spike' ] * 1.0e-03 ,
339+ 'voltage_reset_fraction' : reset_params ['a' ],
340+ 'voltage_reset_add' : reset_params ['b' ] * 1.0e03 ,
341+ 'asc_init' : np .array (config ['init_AScurrents' ]) * 1.0e12 ,
342+ 'asc_decay' : 1.0 / np .array (config ['asc_tau_array' ]) * 1.0e-03 ,
343+ 'asc_amps' : np .array (config ['asc_amp_array' ]) * np .array (coeffs ['asc_amp_array' ]) * 1.0e12 ,
344+ 'tau_syn' : np .array ([5.5 , 8.5 , 2.8 , 5.8 ]),
345+ 'asc_r' : (1.0 , 1.0 ),
346+ 'spike_dependent_threshold' : True ,
347+ 'after_spike_currents' : True ,
348+ 'adapting_threshold' : False
349+ }
350+ return 'nest:glif_psc' , model_params
351+
352+ elif model_template == 'nest:glif_lif_r_asc_a_psc' :
353+ config = dynamics_params
354+ coeffs = config ['coeffs' ]
355+ threshold_params = config ['threshold_dynamics_method' ]['params' ]
356+ reset_params = config ['voltage_reset_method' ]['params' ]
357+ model_params = {
358+ 'V_m' : config ['El' ] * 1.0e03 + config ['El_reference' ] * 1.0e03 ,
359+ 'V_th' : coeffs ['th_inf' ] * config ['th_inf' ] * 1.0e03 + config ['El_reference' ] * 1.0e03 ,
360+ 'g' : coeffs ['G' ] / config ['R_input' ] * 1.0e09 ,
361+ 'E_L' : config ['El' ] * 1.0e03 + config ['El_reference' ] * 1.0e03 ,
362+ 'C_m' : coeffs ['C' ] * config ['C' ] * 1.0e12 ,
363+ 't_ref' : config ['spike_cut_length' ] * config ['dt' ] * 1.0e03 ,
364+ 'th_spike_add' : threshold_params ['a_spike' ] * 1.0e03 ,
365+ 'th_spike_decay' : threshold_params ['b_spike' ] * 1.0e-03 ,
366+ 'th_voltage_index' : threshold_params ['a_voltage' ] * coeffs ['a' ] * 1.0e-03 ,
367+ 'th_voltage_decay' : threshold_params ['b_voltage' ] * coeffs ['b' ] * 1.0e-03 ,
368+ 'voltage_reset_fraction' : reset_params ['a' ],
369+ 'voltage_reset_add' : reset_params ['b' ] * 1.0e03 ,
370+ 'asc_init' : np .array (config ['init_AScurrents' ]) * 1.0e12 ,
371+ 'asc_decay' : 1.0 / np .array (config ['asc_tau_array' ]) * 1.0e-03 ,
372+ 'asc_amps' : np .array (config ['asc_amp_array' ]) * np .array (coeffs ['asc_amp_array' ]) * 1.0e12 ,
373+ 'tau_syn' : np .array ([5.5 , 8.5 , 2.8 , 5.8 ]),
374+ 'asc_r' : (1.0 , 1.0 ),
375+ 'spike_dependent_threshold' : True ,
376+ 'after_spike_currents' : True ,
377+ 'adapting_threshold' : True
378+ }
379+ return 'nest:glif_psc' , model_params
380+
381+ else :
382+ return model_template , dynamics_params
383+
384+
385+ convert_aibs2nest = converter_builtin if built_in_glifs else converter_modules
0 commit comments