Skip to content

Commit 022c24f

Browse files
authored
Merge pull request #147 from kaeldai/feature/nest2.20
Feature/nest2.20
2 parents 53f9eec + b33ea88 commit 022c24f

16 files changed

+842
-37
lines changed

bmtk/simulator/pointnet/glif_utils.py

Lines changed: 147 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -21,9 +21,20 @@
2121
# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
2222
#
2323
import 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

bmtk/simulator/pointnet/sonata_adaptors.py

Lines changed: 3 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -153,8 +153,9 @@ def preprocess_node_types(network, node_population):
153153
mtemplate = node_type_attrs['model_template']
154154
dyn_params = node_type_attrs['dynamics_params']
155155
if mtemplate.startswith('nest:glif') and dyn_params.get('type', None) == 'GLIF':
156-
node_type_attrs['dynamics_params'] = convert_aibs2nest(mtemplate, dyn_params)
157-
156+
model_template, dynamics_params = convert_aibs2nest(mtemplate, dyn_params)
157+
node_type_attrs['model_template'] = model_template
158+
node_type_attrs['dynamics_params'] = dynamics_params
158159

159160
@staticmethod
160161
def patch_adaptor(adaptor, node_group, network):
@@ -254,8 +255,6 @@ def preprocess_edge_types(network, edge_population):
254255
model_template = edge_type['model_template']
255256
if model_template.startswith('nest'):
256257
edge_type['model_template'] = model_template[5:]
257-
# print edge_type['model_template']
258-
259258

260259
def get_batches(self, edge_group):
261260
src_ids = {}
@@ -338,22 +337,6 @@ def get_batches(self, edge_group):
338337
yield PointEdgeBatched(source_nids=grp_vals['src_nids'].values, target_nids=grp_vals['trg_nids'].values,
339338
nest_params=type_params[edge_id])
340339

341-
#print(type_params[edge_id])
342-
#print(src_ids[edge_id])
343-
#print(grp_vals['src_nids'].values)
344-
#print(trg_ids[edge_id])
345-
#print(grp_vals['trg_nids'].values)
346-
#exit()
347-
348-
349-
'''
350-
batched_edges = []
351-
for et_id in et_id_counter.keys():
352-
batched_edges.append(PointEdgeBatched(src_ids[et_id], trg_ids[et_id], type_params[et_id]))
353-
354-
return batched_edges
355-
'''
356-
357340
@staticmethod
358341
def patch_adaptor(adaptor, edge_group):
359342
edge_adaptor = EdgeAdaptor.patch_adaptor(adaptor, edge_group)
Lines changed: 62 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,62 @@
1+
{
2+
"El_reference": -0.07139990234375,
3+
"C": 8.587009771685807e-11,
4+
"asc_amp_array": [
5+
-7.383464366961142e-11,
6+
-4.496828542736005e-10
7+
],
8+
"init_threshold": 0.023089253057717987,
9+
"threshold_reset_method": {
10+
"params": {},
11+
"name": "inf"
12+
},
13+
"th_inf": 0.023089253057717987,
14+
"spike_cut_length": 134,
15+
"init_AScurrents": [
16+
0.0,
17+
0.0
18+
],
19+
"init_voltage": 0.0,
20+
"threshold_dynamics_method": {
21+
"params": {},
22+
"name": "inf"
23+
},
24+
"voltage_reset_method": {
25+
"params": {},
26+
"name": "zero"
27+
},
28+
"extrapolation_method_name": "endpoints",
29+
"dt": 5e-05,
30+
"voltage_dynamics_method": {
31+
"params": {},
32+
"name": "linear_forward_euler"
33+
},
34+
"El": 0.0,
35+
"asc_tau_array": [
36+
0.03333333333333334,
37+
0.0033333333333333335
38+
],
39+
"R_input": 269390025.97053105,
40+
"AScurrent_dynamics_method": {
41+
"params": {},
42+
"name": "none"
43+
},
44+
"AScurrent_reset_method": {
45+
"params": {},
46+
"name": "none"
47+
},
48+
"dt_multiplier": 10,
49+
"th_adapt": null,
50+
"coeffs": {
51+
"a": 1,
52+
"C": 1,
53+
"b": 1,
54+
"G": 1,
55+
"th_inf": 1.0212937371199788,
56+
"asc_amp_array": [
57+
1.0,
58+
1.0
59+
]
60+
},
61+
"type": "GLIF"
62+
}
Lines changed: 67 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,67 @@
1+
{
2+
"El_reference": -0.07139990234375,
3+
"C": 8.587009771685807e-11,
4+
"asc_amp_array": [
5+
-7.383464366961142e-11,
6+
-4.496828542736005e-10
7+
],
8+
"init_threshold": 0.023089253057717987,
9+
"threshold_reset_method": {
10+
"params": {},
11+
"name": "inf"
12+
},
13+
"th_inf": 0.023089253057717987,
14+
"spike_cut_length": 134,
15+
"init_AScurrents": [
16+
0.0,
17+
0.0
18+
],
19+
"init_voltage": 0.0,
20+
"threshold_dynamics_method": {
21+
"params": {},
22+
"name": "inf"
23+
},
24+
"voltage_reset_method": {
25+
"params": {},
26+
"name": "zero"
27+
},
28+
"extrapolation_method_name": "endpoints",
29+
"dt": 5e-05,
30+
"voltage_dynamics_method": {
31+
"params": {},
32+
"name": "linear_forward_euler"
33+
},
34+
"El": 0.0,
35+
"asc_tau_array": [
36+
0.03333333333333334,
37+
0.0033333333333333335
38+
],
39+
"R_input": 340045253.17350113,
40+
"AScurrent_dynamics_method": {
41+
"params": {},
42+
"name": "exp"
43+
},
44+
"AScurrent_reset_method": {
45+
"params": {
46+
"r": [
47+
1.0,
48+
1.0
49+
]
50+
},
51+
"name": "sum"
52+
},
53+
"dt_multiplier": 10,
54+
"th_adapt": null,
55+
"coeffs": {
56+
"a": 1,
57+
"C": 1,
58+
"b": 1,
59+
"G": 1,
60+
"th_inf": 0.9713141567566914,
61+
"asc_amp_array": [
62+
1.0,
63+
1.0
64+
]
65+
},
66+
"type": "GLIF"
67+
}

0 commit comments

Comments
 (0)