Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
4 changes: 3 additions & 1 deletion cpmpy/solvers/pumpkin.py
Original file line number Diff line number Diff line change
Expand Up @@ -50,7 +50,7 @@
from ..expressions.variables import _BoolVarImpl, NegBoolView, _IntVarImpl, _NumVarImpl, intvar, boolvar
from ..expressions.utils import is_num, is_any_list, get_bounds
from ..transformations.get_variables import get_variables
from ..transformations.linearize import canonical_comparison
from ..transformations.linearize import canonical_comparison, linearize_constraint
from ..transformations.normalize import toplevel_list
from ..transformations.decompose_global import decompose_in_tree
from ..transformations.flatten_model import flatten_constraint
Expand Down Expand Up @@ -327,6 +327,8 @@ def transform(self, cpm_expr):
cpm_cons = only_implies(cpm_cons, csemap=self._csemap)
supported_halfreif = {"or", "sum", "wsum", "sub", "mul", "div", "abs", "min", "max"}
cpm_cons = reify_rewrite(cpm_cons, supported=supported_halfreif, csemap=self._csemap) # reified element not supported yet
supported_linear = {"or", "sum", "wsum", "sub", "mul", "div", "abs", "min", "max", "alldifferent", "cumulative", "table", "negative_table", "element"}
cpm_cons = linearize_constraint(cpm_cons, supported=supported_linear, csemap=self._csemap) # linearize unsupported constraints for pumpkin
cpm_cons = only_numexpr_equality(cpm_cons, supported=frozenset(["sum", "wsum", "sub"]),csemap=self._csemap) # supports >, <, !=
cpm_cons = canonical_comparison(cpm_cons) # ensure rhs is always a constant
return cpm_cons
Expand Down
4 changes: 4 additions & 0 deletions cpmpy/transformations/linearize.py
Original file line number Diff line number Diff line change
Expand Up @@ -85,6 +85,10 @@ def linearize_constraint(lst_of_expr, supported={"sum","wsum"}, reified=False, c

newlist = []
for cpm_expr in lst_of_expr:
if cpm_expr.name in supported:
newlist.append(cpm_expr)
continue

# Boolean literals are handled as trivial linears or unit clauses depending on `supported`
if isinstance(cpm_expr, _BoolVarImpl):
if "or" in supported:
Expand Down
Loading