From e413e863cfdded0101b24957087b39dfecfdc6ca Mon Sep 17 00:00:00 2001 From: anovoselcev Date: Mon, 2 Oct 2023 07:47:07 -0400 Subject: [PATCH] add constraint for tied-def operands --- src/solvers/gecode/common/definitions.hpp | 3 ++- src/solvers/gecode/common/util.cpp | 1 + src/solvers/gecode/models/model.cpp | 2 ++ src/solvers/gecode/models/parameters.cpp | 1 + src/solvers/gecode/models/relaxedmodel.cpp | 2 ++ 5 files changed, 8 insertions(+), 1 deletion(-) diff --git a/src/solvers/gecode/common/definitions.hpp b/src/solvers/gecode/common/definitions.hpp index 86712bfc..86230a4d 100644 --- a/src/solvers/gecode/common/definitions.hpp +++ b/src/solvers/gecode/common/definitions.hpp @@ -104,7 +104,8 @@ enum UnisonConstraintExprId TEMPORARY_OVERLAP_EXPR, // ex-PRESOLVER_OVERLAPPING_TEMPORARIES CALLER_SAVED_EXPR, // ex-PRESOLVER_CALLER_SAVED_TEMPORARY ALLOCATED_EXPR, // ex-PRESOLVER_OPERAND_CLASS - ALIGNED_EXPR + ALIGNED_EXPR, + TIED_DEF_EXPR }; diff --git a/src/solvers/gecode/common/util.cpp b/src/solvers/gecode/common/util.cpp index c0d0ddfe..477ad45c 100644 --- a/src/solvers/gecode/common/util.cpp +++ b/src/solvers/gecode/common/util.cpp @@ -336,6 +336,7 @@ bool in_block(UnisonConstraintExpr & e, block b, const Parameters * input) { case SHARE_EXPR: case OPERAND_OVERLAP_EXPR: case ALLOCATED_EXPR: + case TIED_DEF_EXPR: return (input->pb[e.data[0]] == b); case TEMPORARY_OVERLAP_EXPR: case CALLER_SAVED_EXPR: diff --git a/src/solvers/gecode/models/model.cpp b/src/solvers/gecode/models/model.cpp index 330d5b4b..de98f9b5 100644 --- a/src/solvers/gecode/models/model.cpp +++ b/src/solvers/gecode/models/model.cpp @@ -112,6 +112,8 @@ BoolVar Model::adhoc_constraint_var(UnisonConstraintExpr & e) { return v; case ALIGNED_EXPR: return var(ry(e.data[1]) == (ry(e.data[0]) + e.data[2])); + case TIED_DEF_EXPR: + return var((ry(e.data[0]) == ry(e.data[1])) && (pls(e.data[0]) == ple(e.data[1]))); default: GECODE_NEVER; } diff --git a/src/solvers/gecode/models/parameters.cpp b/src/solvers/gecode/models/parameters.cpp index be8c291f..382406ab 100644 --- a/src/solvers/gecode/models/parameters.cpp +++ b/src/solvers/gecode/models/parameters.cpp @@ -1143,6 +1143,7 @@ void Parameters::get_element(Json::Value root, UnisonConstraintExpr & e) { case OPERAND_OVERLAP_EXPR: case TEMPORARY_OVERLAP_EXPR: case ALLOCATED_EXPR: + case TIED_DEF_EXPR: for (unsigned int i = 0; i < 2; i++) { iti++; e.data.push_back((*iti).asInt()); diff --git a/src/solvers/gecode/models/relaxedmodel.cpp b/src/solvers/gecode/models/relaxedmodel.cpp index 32f992fb..5eec102f 100644 --- a/src/solvers/gecode/models/relaxedmodel.cpp +++ b/src/solvers/gecode/models/relaxedmodel.cpp @@ -128,6 +128,8 @@ BoolVar RelaxedModel::relaxed_adhoc_constraint_var(UnisonConstraintExpr & e) { return v; case ALIGNED_EXPR: return var(ry(e.data[1]) == (ry(e.data[0]) + e.data[2])); + case TIED_DEF_EXPR: + return var((ry(e.data[0]) == ry(e.data[1])) && (pls(e.data[0]) == ple(e.data[1]))); default: GECODE_NEVER; }