Skip to content

Commit b786d5f

Browse files
authored
suppress warning and stdout messages in Jupyter notebooks (#1161)
1 parent 0a4202f commit b786d5f

File tree

15 files changed

+1472
-18329
lines changed

15 files changed

+1472
-18329
lines changed

doc/tutorials/active_dendrite/nestml_active_dendrite_tutorial.ipynb

Lines changed: 87 additions & 170 deletions
Large diffs are not rendered by default.

doc/tutorials/inhomogeneous_poisson/inhomogeneous_poisson.ipynb

Lines changed: 33 additions & 186 deletions
Large diffs are not rendered by default.

doc/tutorials/izhikevich/nestml_izhikevich_tutorial.ipynb

Lines changed: 13 additions & 116 deletions
Large diffs are not rendered by default.

doc/tutorials/ornstein_uhlenbeck_noise/nestml_ou_noise_tutorial.ipynb

Lines changed: 32 additions & 181 deletions
Large diffs are not rendered by default.

doc/tutorials/sequence_learning/sequence_learning.ipynb

Lines changed: 74 additions & 255 deletions
Large diffs are not rendered by default.

doc/tutorials/spike_frequency_adaptation/nestml_spike_frequency_adaptation_tutorial.ipynb

Lines changed: 399 additions & 2932 deletions
Large diffs are not rendered by default.

doc/tutorials/stdp_dopa_synapse/stdp_dopa_synapse.ipynb

Lines changed: 180 additions & 5663 deletions
Large diffs are not rendered by default.

doc/tutorials/stdp_third_factor_active_dendrite/stdp_third_factor_active_dendrite.ipynb

Lines changed: 103 additions & 412 deletions
Large diffs are not rendered by default.

doc/tutorials/stdp_windows/stdp_windows.ipynb

Lines changed: 329 additions & 5836 deletions
Large diffs are not rendered by default.

doc/tutorials/triplet_stdp_synapse/triplet_stdp_synapse.ipynb

Lines changed: 193 additions & 2564 deletions
Large diffs are not rendered by default.

pynestml/codegeneration/nest_code_generator.py

Lines changed: 4 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -923,15 +923,14 @@ def ode_toolbox_analysis(self, neuron: ASTModel, kernel_buffers: Mapping[ASTKern
923923

924924
return analytic_solver, numeric_solver
925925

926-
def update_symbol_table(self, neuron) -> None:
926+
def update_symbol_table(self, model) -> None:
927927
"""
928928
Update symbol table and scope.
929929
"""
930-
SymbolTable.delete_model_scope(neuron.get_name())
930+
SymbolTable.delete_model_scope(model.get_name())
931931
symbol_table_visitor = ASTSymbolTableVisitor()
932-
neuron.accept(symbol_table_visitor)
933-
CoCosManager.check_cocos(neuron, after_ast_rewrite=True)
934-
SymbolTable.add_model_scope(neuron.get_name(), neuron.get_scope())
932+
model.accept(symbol_table_visitor)
933+
SymbolTable.add_model_scope(model.get_name(), model.get_scope())
935934

936935
def get_spike_update_expressions(self, neuron: ASTModel, kernel_buffers, solver_dicts, delta_factors) -> Tuple[Dict[str, ASTAssignment], Dict[str, ASTAssignment]]:
937936
r"""

pynestml/codegeneration/nest_code_generator_utils.py

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -24,13 +24,14 @@
2424
import re
2525
import tempfile
2626
import uuid
27-
from pynestml.meta_model.ast_node import ASTNode
2827

28+
from pynestml.meta_model.ast_node import ASTNode
2929
from pynestml.meta_model.ast_variable import ASTVariable
3030
from pynestml.symbols.symbol import SymbolKind
3131
from pynestml.symbols.variable_symbol import BlockType
3232
from pynestml.symbols.variable_symbol import VariableSymbol
3333
from pynestml.visitors.ast_visitor import ASTVisitor
34+
from pynestml.utils.logger import Logger
3435

3536

3637
class NESTCodeGeneratorUtils:
@@ -82,6 +83,9 @@ def generate_code_for(cls,
8283
"""
8384
from pynestml.frontend.pynestml_frontend import generate_nest_target
8485

86+
# convert string to level to check correct formatting
87+
Logger.string_to_level(logging_level)
88+
8589
# generate temporary install directory
8690
install_path = tempfile.mkdtemp(prefix="nestml_target_")
8791

@@ -130,6 +134,9 @@ def generate_code_for(cls,
130134
if codegen_opts:
131135
_codegen_opts.update(codegen_opts)
132136

137+
if logging_level.upper() != "DEBUG":
138+
_codegen_opts["redirect_build_output"] = True # hide stdout and stderr if not in DEBUG log level
139+
133140
if not module_name:
134141
# generate unique ID
135142
uniq_id = str(uuid.uuid4().hex)

pynestml/utils/ast_source_location.py

Lines changed: 7 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -97,13 +97,12 @@ def get_end_column(self):
9797
"""
9898
return self.end_column
9999

100-
def equals(self, source_position):
100+
def equals(self, source_position) -> bool:
101101
"""
102102
Checks if the handed over position is equal to this.
103103
:param source_position: a source position.
104104
:type source_position: ASTSourceLocation
105105
:return: True if equal, otherwise False.
106-
:rtype: bool
107106
"""
108107
if not isinstance(source_position, ASTSourceLocation):
109108
return False
@@ -112,6 +111,12 @@ def equals(self, source_position):
112111
and self.get_end_line() == source_position.get_end_line()
113112
and self.get_end_column() == source_position.get_end_column())
114113

114+
def __eq__(self, other) -> bool:
115+
return self.equals(other)
116+
117+
def __hash__(self) -> int:
118+
return hash((self.get_start_line(), self.get_start_column(), self.get_end_line(), self.get_end_column()))
119+
115120
def before(self, source_position):
116121
"""
117122
Checks if the handed over position is smaller than this.

pynestml/utils/logger.py

Lines changed: 9 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -112,7 +112,7 @@ def set_log(cls, log, counter):
112112
cls.curr_message = counter
113113

114114
@classmethod
115-
def log_message(cls, node: ASTNode = None, code: MessageCode = None, message: str = None, error_position: ASTSourceLocation = None, log_level: LoggingLevel = None):
115+
def log_message(cls, node: ASTNode = None, code: MessageCode = None, message: str = None, error_position: ASTSourceLocation = None, log_level: LoggingLevel = None, allow_duplicates: bool = False):
116116
"""
117117
Logs the handed over message on the handed over node. If the current logging is appropriate, the message is also printed.
118118
@@ -121,6 +121,7 @@ def log_message(cls, node: ASTNode = None, code: MessageCode = None, message: st
121121
:param error_position: the position on which the error occurred.
122122
:param message: a message.
123123
:param log_level: the corresponding log level.
124+
:param allow_duplicates: whether to ignore or suppress duplicate messages.
124125
"""
125126
if cls.log_frozen:
126127
return
@@ -137,16 +138,19 @@ def log_message(cls, node: ASTNode = None, code: MessageCode = None, message: st
137138
from pynestml.meta_model.ast_model import ASTModel
138139

139140
if isinstance(node, ASTModel):
140-
cls.log[cls.curr_message] = (
141-
node.get_artifact_name(), node, log_level, code, error_position, message)
141+
new_log_entry = (node.get_artifact_name(), node, log_level, code, error_position, message)
142142
else:
143143
if cls.current_node is not None:
144144
artifact_name = cls.current_node.get_artifact_name()
145145
else:
146146
artifact_name = ""
147147

148-
cls.log[cls.curr_message] = (artifact_name, cls.current_node,
149-
log_level, code, error_position, message)
148+
new_log_entry = (artifact_name, cls.current_node, log_level, code, error_position, message)
149+
150+
if not allow_duplicates and new_log_entry in cls.log.values():
151+
return
152+
153+
cls.log[cls.curr_message] = new_log_entry
150154

151155
cls.curr_message += 1
152156
if cls.no_print:

tests/test_cocos.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -155,7 +155,7 @@ def test_valid_numerator_of_unit_one(self):
155155

156156
def test_invalid_names_of_neurons_unique(self):
157157
model = self._parse_and_validate_model(os.path.join(os.path.realpath(os.path.join(os.path.dirname(__file__), 'invalid')), 'CoCoMultipleNeuronsWithEqualName.nestml'))
158-
assert len(Logger.get_all_messages_of_level_and_or_node(model, LoggingLevel.ERROR)) == 3
158+
assert len(Logger.get_all_messages_of_level_and_or_node(model, LoggingLevel.ERROR)) == 2
159159

160160
def test_valid_names_of_neurons_unique(self):
161161
self._parse_and_validate_model(os.path.join(os.path.realpath(os.path.join(os.path.dirname(__file__), 'valid')), 'CoCoMultipleNeuronsWithEqualName.nestml'))

0 commit comments

Comments
 (0)