Skip to content

Commit 6e2b725

Browse files
clinssenC.A.P. Linssen
andauthored
add pi predefined constant (#1075)
Co-authored-by: C.A.P. Linssen <[email protected]>
1 parent 761ba33 commit 6e2b725

9 files changed

+39
-51
lines changed

doc/nestml_language/nestml_language_concepts.rst

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -579,6 +579,8 @@ The following variables and constants are predefined in NESTML and can be used o
579579
- The current simulation time (read only)
580580
* - ``e``
581581
- Euler's constant (2.718...)
582+
* - ``pi``
583+
- pi (3.14159...)
582584
* - ``inf``
583585
- Floating point infinity
584586

pynestml/codegeneration/printers/c_variable_printer.py

Lines changed: 0 additions & 41 deletions
This file was deleted.

pynestml/codegeneration/printers/cpp_variable_printer.py

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -49,6 +49,9 @@ def print_variable(self, node: ASTVariable) -> str:
4949
assert isinstance(node, ASTVariable)
5050

5151
if node.get_name() == PredefinedVariables.E_CONSTANT:
52-
return "numerics::e"
52+
return "2.718281828459045235360287471352" # not defined in C++11 stdlib
53+
54+
if node.get_name() == PredefinedVariables.E_CONSTANT:
55+
return "M_PI" # from <cmath>
5356

5457
return CppVariablePrinter._print_cpp_name(node.get_complete_name())

pynestml/codegeneration/printers/nest_variable_printer.py

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -72,7 +72,10 @@ def print_variable(self, variable: ASTVariable) -> str:
7272
return "((post_neuron_t*)(__target))->get_" + _name + "(_tr_t)"
7373

7474
if variable.get_name() == PredefinedVariables.E_CONSTANT:
75-
return "numerics::e"
75+
return "numerics::e" # from nest::
76+
77+
if variable.get_name() == PredefinedVariables.PI_CONSTANT:
78+
return "numerics::pi" # from nest::
7679

7780
if variable.get_name() == PredefinedVariables.TIME_CONSTANT:
7881
return "get_t()"

pynestml/codegeneration/printers/python_stepping_function_variable_printer.py

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -42,6 +42,9 @@ def print_variable(self, node: ASTVariable) -> str:
4242
if node.get_name() == PredefinedVariables.E_CONSTANT:
4343
return "np.e"
4444

45+
if node.get_name() == PredefinedVariables.PI_CONSTANT:
46+
return "np.pi"
47+
4548
symbol = node.get_scope().resolve_to_symbol(node.get_complete_name(), SymbolKind.VARIABLE)
4649

4750
if symbol.is_state() and not symbol.is_inline_expression:

pynestml/codegeneration/printers/python_variable_printer.py

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -74,6 +74,9 @@ def print_variable(self, variable: ASTVariable) -> str:
7474
if variable.get_name() == PredefinedVariables.E_CONSTANT:
7575
return "math.e"
7676

77+
if variable.get_name() == PredefinedVariables.PI_CONSTANT:
78+
return "math.pi"
79+
7780
symbol = variable.get_scope().resolve_to_symbol(variable.get_complete_name(), SymbolKind.VARIABLE)
7881
if symbol is None:
7982
# test if variable name can be resolved to a type

pynestml/codegeneration/printers/spinnaker_c_variable_printer.py

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -63,6 +63,9 @@ def print_variable(self, variable: ASTVariable) -> str:
6363
if variable.get_name() == PredefinedVariables.E_CONSTANT:
6464
return "REAL_CONST(2.718282)"
6565

66+
if variable.get_name() == PredefinedVariables.PI_CONSTANT:
67+
return "REAL_CONST(3.14159)"
68+
6669
symbol = variable.get_scope().resolve_to_symbol(variable.get_complete_name(), SymbolKind.VARIABLE)
6770
if symbol is None:
6871
# test if variable name can be resolved to a type

pynestml/symbols/predefined_variables.py

Lines changed: 17 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -29,9 +29,10 @@ class PredefinedVariables:
2929
"""
3030
This class is used to store all predefined variables as generally available.
3131
"""
32-
name2variable = {} # type: Mapping[str, VariableSymbol]
33-
E_CONSTANT = 'e' # type: str
34-
TIME_CONSTANT = 't' # type: str
32+
name2variable: Mapping[str, VariableSymbol] = {}
33+
E_CONSTANT: str = 'e'
34+
PI_CONSTANT: str = 'pi'
35+
TIME_CONSTANT: str = 't'
3536

3637
@classmethod
3738
def register_variables(cls):
@@ -40,6 +41,7 @@ def register_variables(cls):
4041
"""
4142
cls.name2variable = {}
4243
cls.__register_euler_constant()
44+
cls.__register_pi_constant()
4345
cls.__register_time_constant()
4446

4547
@classmethod
@@ -53,7 +55,6 @@ def __register_predefined_type_variables(cls):
5355
type_symbol=PredefinedTypes.get_type(name),
5456
variable_type=VariableType.TYPE)
5557
cls.name2variable[name] = symbol
56-
return
5758

5859
@classmethod
5960
def __register_euler_constant(cls):
@@ -64,7 +65,16 @@ def __register_euler_constant(cls):
6465
is_predefined=True, type_symbol=PredefinedTypes.get_real_type(),
6566
variable_type=VariableType.VARIABLE)
6667
cls.name2variable[cls.E_CONSTANT] = symbol
67-
return
68+
69+
@classmethod
70+
def __register_pi_constant(cls):
71+
"""
72+
Adds the pi constant.
73+
"""
74+
symbol = VariableSymbol(name='pi', block_type=BlockType.STATE,
75+
is_predefined=True, type_symbol=PredefinedTypes.get_real_type(),
76+
variable_type=VariableType.VARIABLE)
77+
cls.name2variable[cls.PI_CONSTANT] = symbol
6878

6979
@classmethod
7080
def __register_time_constant(cls):
@@ -75,7 +85,6 @@ def __register_time_constant(cls):
7585
is_predefined=True, type_symbol=PredefinedTypes.get_type('ms'),
7686
variable_type=VariableType.VARIABLE)
7787
cls.name2variable[cls.TIME_CONSTANT] = symbol
78-
return
7988

8089
@classmethod
8190
def get_time_constant(cls):
@@ -106,8 +115,8 @@ def get_variable(cls, name):
106115
"""
107116
if name in cls.name2variable.keys():
108117
return cls.name2variable[name]
109-
else:
110-
return None
118+
119+
return None
111120

112121
@classmethod
113122
def get_variables(cls):

tests/resources/ExpressionCollection.nestml

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -152,6 +152,9 @@ model ExpressionCollection:
152152
testerf real = erf(0.)
153153
testerfc real = erfc(0.)
154154

155+
test_e real = e
156+
test_pi real = pi
157+
155158
equations:
156159
#neuron aeif_cond_alpha_neuron
157160
test0 = E_L

0 commit comments

Comments
 (0)