Skip to content

Commit 7e1d4ac

Browse files
committed
Merge remote-tracking branch 'upstream/master' into nestml_gpu
2 parents 5eb7a3c + ff24afe commit 7e1d4ac

File tree

10 files changed

+202
-20
lines changed

10 files changed

+202
-20
lines changed

.github/workflows/nestml-build.yml

Lines changed: 67 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -47,6 +47,73 @@ jobs:
4747
run: |
4848
python3 extras/codeanalysis/check_copyright_headers.py && python3 -m pycodestyle $GITHUB_WORKSPACE -v --ignore=E241,E501,E714,E713,E714,E252,W503 --exclude=$GITHUB_WORKSPACE/doc,$GITHUB_WORKSPACE/.git,$GITHUB_WORKSPACE/NESTML.egg-info,$GITHUB_WORKSPACE/pynestml/generated,$GITHUB_WORKSPACE/extras,$GITHUB_WORKSPACE/build,$GITHUB_WORKSPACE/.github
4949
50+
build_and_test_py_standalone:
51+
needs: [static_checks]
52+
runs-on: ubuntu-latest
53+
steps:
54+
# Checkout the repository contents
55+
- name: Checkout NESTML code
56+
uses: actions/checkout@v3
57+
58+
# Setup Python version
59+
- name: Setup Python 3.8
60+
uses: actions/setup-python@v4
61+
with:
62+
python-version: 3.8
63+
64+
# Install dependencies
65+
- name: Install apt dependencies
66+
run: |
67+
sudo apt-get update
68+
sudo apt-get install libgsl0-dev libncurses5-dev pkg-config
69+
sudo apt-get install python3-all-dev python3-matplotlib python3-numpy python3-scipy ipython3
70+
71+
# Install Python dependencies
72+
- name: Python dependencies
73+
run: |
74+
python -m pip install --upgrade pip pytest jupyterlab matplotlib pycodestyle scipy
75+
python -m pip install -r requirements.txt
76+
77+
# Install Java
78+
- name: Install Java 11
79+
uses: actions/setup-java@v2
80+
with:
81+
distribution: 'zulu'
82+
java-version: '11.0.x'
83+
java-package: jre
84+
85+
# Install Antlr4
86+
- name: Install Antlr4
87+
run: |
88+
wget http://www.antlr.org/download/antlr-4.10-complete.jar
89+
echo \#\!/bin/bash > antlr4
90+
echo java -cp \"`pwd`/antlr-4.10-complete.jar:$CLASSPATH\" org.antlr.v4.Tool \"\$@\" >> antlr4
91+
echo >> antlr4
92+
chmod +x antlr4
93+
echo PATH=$PATH:`pwd` >> $GITHUB_ENV
94+
95+
# Install NESTML
96+
- name: Install NESTML
97+
run: |
98+
export PYTHONPATH=${{ env.PYTHONPATH }}:${{ env.NEST_INSTALL }}/lib/python3.8/site-packages
99+
#echo PYTHONPATH=`pwd` >> $GITHUB_ENV
100+
echo "PYTHONPATH=$PYTHONPATH" >> $GITHUB_ENV
101+
python setup.py install
102+
103+
- name: Generate Lexer and Parser using Antlr4
104+
run: |
105+
cd pynestml/grammars
106+
./generate_lexer_parser
107+
108+
# Run integration tests
109+
- name: Run integration tests
110+
run: |
111+
rc=0
112+
for fn in $GITHUB_WORKSPACE/tests/python_standalone_tests/*.py; do
113+
pytest -s -o log_cli=true -o log_cli_level="DEBUG" ${fn} || rc=1
114+
done;
115+
exit $rc
116+
50117
build_and_test:
51118
needs: [static_checks]
52119
runs-on: ubuntu-latest

pynestml/codegeneration/printers/nest_variable_printer.py

Lines changed: 0 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -47,7 +47,6 @@ def __init__(self, expression_printer: ExpressionPrinter, with_origin: bool = Tr
4747
super().__init__(expression_printer)
4848
self.with_origin = with_origin
4949
self.with_vector_parameter = with_vector_parameter
50-
self._state_symbols = []
5150

5251
def print_variable(self, variable: ASTVariable) -> str:
5352
"""
@@ -159,8 +158,6 @@ def _print_buffer_value(self, variable: ASTVariable) -> str:
159158
return variable_symbol.get_symbol_name() + '_grid_sum_'
160159

161160
def _print(self, variable: ASTVariable, symbol, with_origin: bool = True) -> str:
162-
assert all([type(s) == str for s in self._state_symbols])
163-
164161
variable_name = CppVariablePrinter._print_cpp_name(variable.get_complete_name())
165162

166163
if symbol.is_local():

pynestml/codegeneration/printers/python_stepping_function_variable_printer.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -45,7 +45,7 @@ def print_variable(self, node: ASTVariable) -> str:
4545
symbol = node.get_scope().resolve_to_symbol(node.get_complete_name(), SymbolKind.VARIABLE)
4646

4747
if symbol.is_state() and not symbol.is_inline_expression:
48-
if node.get_complete_name() in self._state_symbols:
48+
if "_is_numeric" in dir(node) and node._is_numeric:
4949
# ode_state[] here is---and must be---the state vector supplied by the integrator, not the state vector in the node, node.S_.ode_state[].
5050
return "ode_state[node.S_.ode_state_variable_name_to_index[\"" + CppVariablePrinter._print_cpp_name(node.get_complete_name()) + "\"]]"
5151

pynestml/codegeneration/printers/python_variable_printer.py

Lines changed: 0 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -45,7 +45,6 @@ def __init__(self, expression_printer: ExpressionPrinter, with_origin: bool = Tr
4545
super().__init__(expression_printer)
4646
self.with_origin = with_origin
4747
self.with_vector_parameter = with_vector_parameter
48-
self._state_symbols = []
4948

5049
@classmethod
5150
def _print_python_name(cls, variable_name: str) -> str:
@@ -146,8 +145,6 @@ def _print_vector_parameter_name_reference(self, variable: ASTVariable) -> str:
146145
return self._expression_printer.print(vector_parameter)
147146

148147
def _print(self, variable, symbol, with_origin: bool = True) -> str:
149-
assert all([type(s) == str for s in self._state_symbols])
150-
151148
variable_name = PythonVariablePrinter._print_python_name(variable.get_complete_name())
152149

153150
if symbol.is_local():

pynestml/codegeneration/python_code_generator_utils.py

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -19,21 +19,22 @@
1919
# You should have received a copy of the GNU General Public License
2020
# along with NEST. If not, see <http://www.gnu.org/licenses/>.
2121

22+
from pynestml.meta_model.ast_variable import ASTVariable
2223
from pynestml.symbols.variable_symbol import VariableSymbol
2324
from pynestml.symbols.variable_symbol import BlockType
2425

2526

2627
class PythonCodeGeneratorUtils:
2728

2829
@classmethod
29-
def print_symbol_origin(cls, variable_symbol: VariableSymbol) -> str:
30+
def print_symbol_origin(cls, variable_symbol: VariableSymbol, variable: ASTVariable) -> str:
3031
"""
3132
Returns a prefix corresponding to the origin of the variable symbol.
3233
:param variable_symbol: a single variable symbol.
3334
:return: the corresponding prefix
3435
"""
3536
if variable_symbol.block_type in [BlockType.STATE, BlockType.EQUATION]:
36-
if numerical_state_symbols and variable_symbol.get_symbol_name() in numerical_state_symbols:
37+
if "_is_numeric" in dir(variable) and variable._is_numeric:
3738
return 'self.S_.ode_state[self.S_.ode_state_variable_name_to_index["%s"]]'
3839

3940
return 'self.S_.%s'

pynestml/codegeneration/python_standalone_code_generator.py

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -64,7 +64,8 @@ class PythonStandaloneCodeGenerator(NESTCodeGenerator):
6464
"neuron": ["@NEURON_NAME@.py.jinja2"]
6565
},
6666
"module_templates": ["simulator.py.jinja2", "test_python_standalone_module.py.jinja2", "neuron.py.jinja2", "spike_generator.py.jinja2", "utils.py.jinja2"]
67-
}
67+
},
68+
"solver": "analytic"
6869
}
6970

7071
def __init__(self, options: Optional[Mapping[str, Any]] = None):

pynestml/codegeneration/resources_nest/point_neuron/common/NeuronClass.jinja2

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -576,7 +576,7 @@ void {{neuronName}}::handle(nest::DataLoggingRequest& e)
576576
void {{neuronName}}::handle(nest::SpikeEvent &e)
577577
{
578578
assert(e.get_delay_steps() > 0);
579-
assert( e.get_rport() < static_cast< int >( B_.spike_inputs_.size() ) );
579+
assert( e.get_rport() < B_.spike_inputs_.size() );
580580

581581
double weight = e.get_weight();
582582
size_t nestml_buffer_idx = 0;

pynestml/codegeneration/resources_nest/point_neuron/common/NeuronHeader.jinja2

Lines changed: 44 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -231,7 +231,11 @@ public:
231231
/**
232232
* Used to validate that we can send {{ output_event.OutputEvent() }} to desired target:port.
233233
**/
234+
{%- if not (nest_version.startswith("v2") or nest_version.startswith("v3.0") or nest_version.startswith("v3.1") or nest_version.startswith("v3.2") or nest_version.startswith("v3.3") or nest_version.startswith("v3.4")) %}
235+
size_t send_test_event(nest::Node& target, size_t receptor_type, nest::synindex, bool) override;
236+
{%- else %}
234237
nest::port send_test_event(nest::Node& target, nest::rport receptor_type, nest::synindex, bool) override;
238+
{%- endif %}
235239

236240
// -------------------------------------------------------------------------
237241
// Functions handling incoming events.
@@ -248,12 +252,24 @@ public:
248252
void handle(nest::DataLoggingRequest &) override;//! allow recording with multimeter
249253

250254
{%- if has_spike_input %}
255+
{%- if not (nest_version.startswith("v2") or nest_version.startswith("v3.0") or nest_version.startswith("v3.1") or nest_version.startswith("v3.2") or nest_version.startswith("v3.3") or nest_version.startswith("v3.4")) %}
256+
size_t handles_test_event(nest::SpikeEvent&, size_t) override;
257+
{%- else %}
251258
nest::port handles_test_event(nest::SpikeEvent&, nest::port) override;
252259
{%- endif %}
260+
{%- endif %}
253261
{%- if has_continuous_input %}
262+
{%- if not (nest_version.startswith("v2") or nest_version.startswith("v3.0") or nest_version.startswith("v3.1") or nest_version.startswith("v3.2") or nest_version.startswith("v3.3") or nest_version.startswith("v3.4")) %}
263+
size_t handles_test_event(nest::CurrentEvent&, size_t) override;
264+
{%- else %}
254265
nest::port handles_test_event(nest::CurrentEvent&, nest::port) override;
255266
{%- endif %}
267+
{%- endif %}
268+
{%- if not (nest_version.startswith("v2") or nest_version.startswith("v3.0") or nest_version.startswith("v3.1") or nest_version.startswith("v3.2") or nest_version.startswith("v3.3") or nest_version.startswith("v3.4")) %}
269+
size_t handles_test_event(nest::DataLoggingRequest&, size_t) override;
270+
{%- else %}
256271
nest::port handles_test_event(nest::DataLoggingRequest&, nest::port) override;
272+
{%- endif %}
257273

258274
// -------------------------------------------------------------------------
259275
// Functions for getting/setting parameters and state values.
@@ -392,13 +408,25 @@ private:
392408
* @note Excluded lower and upper bounds are defined as MIN_, MAX_.
393409
* Excluding port 0 avoids accidental connections.
394410
**/
411+
{%- if not (nest_version.startswith("v2") or nest_version.startswith("v3.0") or nest_version.startswith("v3.1") or nest_version.startswith("v3.2") or nest_version.startswith("v3.3") or nest_version.startswith("v3.4")) %}
412+
static const size_t MIN_SPIKE_RECEPTOR = 1;
413+
{%- else %}
395414
static const nest::port MIN_SPIKE_RECEPTOR = 1;
415+
{%- endif %}
396416
{%- set ns = namespace(count=1) %}
417+
{%- else %}
418+
{%- if not (nest_version.startswith("v2") or nest_version.startswith("v3.0") or nest_version.startswith("v3.1") or nest_version.startswith("v3.2") or nest_version.startswith("v3.3") or nest_version.startswith("v3.4")) %}
419+
static const size_t MIN_SPIKE_RECEPTOR = 0;
397420
{%- else %}
398421
static const nest::port MIN_SPIKE_RECEPTOR = 0;
422+
{%- endif %}
399423
{%- set ns = namespace(count=0) %}
400424
{%- endif %}
425+
{%- if not (nest_version.startswith("v2") or nest_version.startswith("v3.0") or nest_version.startswith("v3.1") or nest_version.startswith("v3.2") or nest_version.startswith("v3.3") or nest_version.startswith("v3.4")) %}
426+
static const size_t PORT_NOT_AVAILABLE = -1;
427+
{%- else %}
401428
static const nest::port PORT_NOT_AVAILABLE = -1;
429+
{%- endif %}
402430

403431
enum SynapseTypes
404432
{
@@ -772,7 +800,11 @@ private:
772800

773801
}; /* neuron {{neuronName}} */
774802

803+
{%- if not (nest_version.startswith("v2") or nest_version.startswith("v3.0") or nest_version.startswith("v3.1") or nest_version.startswith("v3.2") or nest_version.startswith("v3.3") or nest_version.startswith("v3.4")) %}
804+
inline size_t {{neuronName}}::send_test_event(nest::Node& target, size_t receptor_type, nest::synindex, bool)
805+
{%- else %}
775806
inline nest::port {{neuronName}}::send_test_event(nest::Node& target, nest::rport receptor_type, nest::synindex, bool)
807+
{%- endif %}
776808
{
777809
// You should usually not change the code in this function.
778810
// It confirms that the target of connection @c c accepts @c {{ output_event.OutputEvent() }} on
@@ -783,7 +815,11 @@ inline nest::port {{neuronName}}::send_test_event(nest::Node& target, nest::rpor
783815
}
784816
{%- if has_spike_input %}
785817

818+
{%- if not (nest_version.startswith("v2") or nest_version.startswith("v3.0") or nest_version.startswith("v3.1") or nest_version.startswith("v3.2") or nest_version.startswith("v3.3") or nest_version.startswith("v3.4")) %}
819+
inline size_t {{neuronName}}::handles_test_event(nest::SpikeEvent&, size_t receptor_type)
820+
{%- else %}
786821
inline nest::port {{neuronName}}::handles_test_event(nest::SpikeEvent&, nest::port receptor_type)
822+
{%- endif %}
787823
{
788824
{%- if (neuron.get_multiple_receptors())|length > 1 or neuron.is_multisynapse_spikes() %}
789825
assert( B_.spike_inputs_.size() == NUM_SPIKE_RECEPTORS );
@@ -807,7 +843,11 @@ inline nest::port {{neuronName}}::handles_test_event(nest::SpikeEvent&, nest::po
807843
{%- endif %}
808844
{%- if has_continuous_input %}
809845

846+
{%- if not (nest_version.startswith("v2") or nest_version.startswith("v3.0") or nest_version.startswith("v3.1") or nest_version.startswith("v3.2") or nest_version.startswith("v3.3") or nest_version.startswith("v3.4")) %}
847+
inline size_t {{neuronName}}::handles_test_event(nest::CurrentEvent&, size_t receptor_type)
848+
{%- else %}
810849
inline nest::port {{neuronName}}::handles_test_event(nest::CurrentEvent&, nest::port receptor_type)
850+
{%- endif %}
811851
{
812852
// You should usually not change the code in this function.
813853
// It confirms to the connection management system that we are able
@@ -821,7 +861,11 @@ inline nest::port {{neuronName}}::handles_test_event(nest::CurrentEvent&, nest::
821861
}
822862
{%- endif %}
823863

864+
{%- if not (nest_version.startswith("v2") or nest_version.startswith("v3.0") or nest_version.startswith("v3.1") or nest_version.startswith("v3.2") or nest_version.startswith("v3.3") or nest_version.startswith("v3.4")) %}
865+
inline size_t {{neuronName}}::handles_test_event(nest::DataLoggingRequest& dlr, size_t receptor_type)
866+
{%- else %}
824867
inline nest::port {{neuronName}}::handles_test_event(nest::DataLoggingRequest& dlr, nest::port receptor_type)
868+
{%- endif %}
825869
{
826870
// You should usually not change the code in this function.
827871
// It confirms to the connection management system that we are able

0 commit comments

Comments
 (0)