From 2d2ae757a0c686bd625e131db5fe3954356c1b3b Mon Sep 17 00:00:00 2001 From: ManCla Date: Thu, 11 Dec 2025 20:49:05 +0100 Subject: [PATCH 1/3] deep copy partial computations stored in ast.results to avoid side-effects --- rtamt/semantics/stl/discrete_time/offline/ast_visitor.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/rtamt/semantics/stl/discrete_time/offline/ast_visitor.py b/rtamt/semantics/stl/discrete_time/offline/ast_visitor.py index 6a5af93..611fc2e 100644 --- a/rtamt/semantics/stl/discrete_time/offline/ast_visitor.py +++ b/rtamt/semantics/stl/discrete_time/offline/ast_visitor.py @@ -1,6 +1,7 @@ import math import operator import collections +import copy from rtamt.syntax.ast.visitor.stl.ast_visitor import StlAstVisitor from rtamt.semantics.enumerations.comp_oper import StlComparisonOperator @@ -11,7 +12,7 @@ class StlDiscreteTimeOfflineAstVisitor(StlAstVisitor): def visit(self, node, *args, **kwargs): result = super(StlDiscreteTimeOfflineAstVisitor, self).visit(node, *args, **kwargs) - self.ast.results[node] = result + self.ast.results[node] = copy.deepcopy(result) return result def visitPredicate(self, node, *args, **kwargs): From 2ae3184ba91bfef56fafa1c9fdacb2bb0f4cd422 Mon Sep 17 00:00:00 2001 From: ManCla Date: Thu, 11 Dec 2025 21:18:48 +0100 Subject: [PATCH 2/3] shallow copy of var before returning it --- rtamt/semantics/stl/discrete_time/offline/ast_visitor.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/rtamt/semantics/stl/discrete_time/offline/ast_visitor.py b/rtamt/semantics/stl/discrete_time/offline/ast_visitor.py index 611fc2e..36636b4 100644 --- a/rtamt/semantics/stl/discrete_time/offline/ast_visitor.py +++ b/rtamt/semantics/stl/discrete_time/offline/ast_visitor.py @@ -42,7 +42,7 @@ def visitVariable(self, node, *args, **kwargs): for v in var: sample_return.append(operator.attrgetter(node.field)(v)) else: - sample_return = var + sample_return = list(var) return sample_return From 7b80b24714a43d96ea8b1a4a5dbb849c93f8a897 Mon Sep 17 00:00:00 2001 From: ManCla Date: Thu, 11 Dec 2025 21:19:19 +0100 Subject: [PATCH 3/3] avoid in-place computations to avoid side-effects --- rtamt/semantics/stl/discrete_time/offline/ast_visitor.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/rtamt/semantics/stl/discrete_time/offline/ast_visitor.py b/rtamt/semantics/stl/discrete_time/offline/ast_visitor.py index 36636b4..ebcdad2 100644 --- a/rtamt/semantics/stl/discrete_time/offline/ast_visitor.py +++ b/rtamt/semantics/stl/discrete_time/offline/ast_visitor.py @@ -377,7 +377,7 @@ def visitTimedAlways(self, node, *args, **kwargs): begin, end = self.time_unit_transformer(node) sample_len = len(sample) if sample_len <= end: - sample += [float('inf')] * (end - sample_len + 1) + sample = sample + [float('inf')] * (end - sample_len + 1) diff = end - begin sample_return = [min(sample[j:j+diff+1]) for j in range(begin, end+1)] @@ -393,7 +393,7 @@ def visitTimedEventually(self, node, *args, **kwargs): sample_len = len(sample) if sample_len <= end: - sample += [-float('inf')] * (end - sample_len + 1) + sample = sample + [-float('inf')] * (end - sample_len + 1) diff = end - begin sample_return = [max(sample[j:j+diff+1]) for j in range(begin, end+1)]