Skip to content

Commit cea0f37

Browse files
authored
Merge pull request #368 from NeuroML/experimental
Better handling of nested if statements in xpp parser
2 parents 4a3c164 + 771d66c commit cea0f37

File tree

1 file changed

+42
-2
lines changed

1 file changed

+42
-2
lines changed

pyneuroml/xppaut/__init__.py

Lines changed: 42 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,14 @@
1717

1818
verbose = False
1919

20+
temp_var_count = 0
21+
22+
def get_new_temp_var():
23+
global temp_var_count
24+
tv = 'TMP__%i'%temp_var_count
25+
temp_var_count+=1
26+
return tv
27+
2028
def _closing_bracket_index(expr, open_bracket_index):
2129
depth = 0
2230
logger.debug('Looking for closing bracket of %s from %i, i.e. %s'%(expr, open_bracket_index, expr[open_bracket_index:]))
@@ -123,8 +131,35 @@ def parse_script(file_path):
123131
else:
124132
# "Normal" variable...
125133
expr = value.strip()
134+
135+
#### This should be refactored to make it 'infinitely' recursive...
126136
if 'if' in expr and 'else' in expr:
127-
data["conditional_derived_variables"][key.strip()] = _split_if_then_else(expr)
137+
var_0 = key.strip()
138+
ite_0 = _split_if_then_else(expr)
139+
140+
if 'if' in ite_0['value_true']:
141+
ite_1 = _split_if_then_else(ite_0['value_true'])
142+
new_var_name1 = get_new_temp_var()
143+
144+
if 'if' in ite_1['value_false']:
145+
ite_2 = _split_if_then_else(ite_1['value_false'])
146+
new_var_name2 = get_new_temp_var()
147+
148+
if 'if' in ite_2['value_true']:
149+
ite_3 = _split_if_then_else(ite_2['value_true'])
150+
new_var_name3 = get_new_temp_var()
151+
152+
data["conditional_derived_variables"][new_var_name3] = ite_3
153+
ite_2['value_true'] = new_var_name3
154+
155+
data["conditional_derived_variables"][new_var_name2] = ite_2
156+
ite_1['value_false'] = new_var_name2
157+
158+
data["conditional_derived_variables"][var_0] = ite_0
159+
data["conditional_derived_variables"][new_var_name1] = ite_1
160+
ite_0['value_true'] = new_var_name1
161+
162+
data["conditional_derived_variables"][var_0] = ite_0
128163
else:
129164
k = key.strip()
130165
if ' ' in k:
@@ -601,7 +636,12 @@ def run_xpp_file(filename, plot, show_plot_already=True, plot_separately={}):
601636
try:
602637
ret_string = sp.check_output(
603638
cmds, cwd=cwd, shell=False, stderr=sp.STDOUT
604-
)
639+
).decode("utf-8")
640+
641+
xpp_error_phrases = ['Error allocating', 'illegal expression']
642+
for err in xpp_error_phrases:
643+
if err in ret_string:
644+
raise Exception("Command: %s failed! Full output from XPP: \n==========================\n%s\n==========================" % (cmds, ret_string))
605645
logger.info(
606646
"Commands: %s completed successfully" % (cmds)
607647
)

0 commit comments

Comments
 (0)