From 4f28a9066f022ec2df9d42b6ca8178ef987db7d1 Mon Sep 17 00:00:00 2001 From: Dimos Tsouros Date: Wed, 5 Jul 2023 21:51:30 +0200 Subject: [PATCH 1/3] normalize numexpr in decompose in tree --- cpmpy/transformations/decompose_global.py | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/cpmpy/transformations/decompose_global.py b/cpmpy/transformations/decompose_global.py index 7b43dd668..4e89ae07b 100644 --- a/cpmpy/transformations/decompose_global.py +++ b/cpmpy/transformations/decompose_global.py @@ -8,7 +8,7 @@ from ..expressions.variables import _BoolVarImpl, intvar, boolvar, _NumVarImpl, cpm_array, NDVarArray from ..expressions.utils import is_any_list, eval_comparison from ..expressions.python_builtins import all -from .flatten_model import flatten_constraint +from .flatten_model import flatten_constraint, normalized_numexpr def decompose_in_tree(lst_of_expr, supported=set(), supported_reified=set(), _toplevel=None, nested=False): @@ -47,6 +47,8 @@ def decompose_in_tree(lst_of_expr, supported=set(), supported_reified=set(), _to continue elif isinstance(expr, Operator): + expr, base_con = normalized_numexpr(expr) + _toplevel.extend(base_con) # should be added toplevel # recurse into arguments, recreate through constructor (we know it stores no other state) args = decompose_in_tree(expr.args, supported, supported_reified, _toplevel, nested=True) newlist.append(Operator(expr.name, args)) From 0ab52f4e944c1d36f7b10b6013c918d2786c9de5 Mon Sep 17 00:00:00 2001 From: Dimos Tsouros Date: Wed, 5 Jul 2023 21:51:39 +0200 Subject: [PATCH 2/3] Comment fix --- cpmpy/transformations/flatten_model.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/cpmpy/transformations/flatten_model.py b/cpmpy/transformations/flatten_model.py index 7ede29f4f..af108305b 100644 --- a/cpmpy/transformations/flatten_model.py +++ b/cpmpy/transformations/flatten_model.py @@ -536,7 +536,7 @@ def normalized_numexpr(expr): newexpr = Operator(expr.name, flatvars) return (newexpr, [c for con in flatcons for c in con]) else: - # Global constraint (non-Boolean) (examples: Max,Min,Element) + # Globalfunction (examples: Max,Min,Element) # just recursively flatten args, which can be lists if all(__is_flat_var_or_list(arg) for arg in expr.args): From f1a880292cb3b8c81c78d3de42cd7497ed773f31 Mon Sep 17 00:00:00 2001 From: Dimos Tsouros Date: Wed, 5 Jul 2023 22:43:25 +0200 Subject: [PATCH 3/3] only normalize when globalfunction --- cpmpy/transformations/decompose_global.py | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/cpmpy/transformations/decompose_global.py b/cpmpy/transformations/decompose_global.py index 4e89ae07b..7548aede1 100644 --- a/cpmpy/transformations/decompose_global.py +++ b/cpmpy/transformations/decompose_global.py @@ -47,8 +47,9 @@ def decompose_in_tree(lst_of_expr, supported=set(), supported_reified=set(), _to continue elif isinstance(expr, Operator): - expr, base_con = normalized_numexpr(expr) - _toplevel.extend(base_con) # should be added toplevel + if any(isinstance(a,GlobalFunction) for a in expr.args): + expr, base_con = normalized_numexpr(expr) + _toplevel.extend(base_con) # should be added toplevel # recurse into arguments, recreate through constructor (we know it stores no other state) args = decompose_in_tree(expr.args, supported, supported_reified, _toplevel, nested=True) newlist.append(Operator(expr.name, args))