[CP-SAT} add support for element with affine expressions in C++

This commit is contained in:
Laurent Perron
2024-10-18 15:25:55 +02:00
parent dd03f0cbfa
commit b620d7e89c
2 changed files with 51 additions and 13 deletions

View File

@@ -927,24 +927,52 @@ Constraint CpModelBuilder::AddAllDifferent(
}
Constraint CpModelBuilder::AddVariableElement(
IntVar index, absl::Span<const IntVar> variables, IntVar target) {
LinearExpr index, absl::Span<const IntVar> variables, LinearExpr target) {
ConstraintProto* const proto = cp_model_.add_constraints();
proto->mutable_element()->set_index(index.index_);
proto->mutable_element()->set_target(target.index_);
*proto->mutable_element()->mutable_linear_index() = LinearExprToProto(index);
*proto->mutable_element()->mutable_linear_target() =
LinearExprToProto(target);
for (const IntVar& var : variables) {
proto->mutable_element()->add_vars(var.index_);
*proto->mutable_element()->add_exprs() = LinearExprToProto(var);
}
return Constraint(proto);
}
Constraint CpModelBuilder::AddElement(IntVar index,
Constraint CpModelBuilder::AddElement(LinearExpr index,
absl::Span<const int64_t> values,
IntVar target) {
LinearExpr target) {
ConstraintProto* const proto = cp_model_.add_constraints();
proto->mutable_element()->set_index(index.index_);
proto->mutable_element()->set_target(target.index_);
*proto->mutable_element()->mutable_linear_index() = LinearExprToProto(index);
*proto->mutable_element()->mutable_linear_target() =
LinearExprToProto(target);
for (int64_t value : values) {
proto->mutable_element()->add_vars(IndexFromConstant(value));
proto->mutable_element()->add_exprs()->set_offset(value);
}
return Constraint(proto);
}
Constraint CpModelBuilder::AddElement(LinearExpr index,
absl::Span<const LinearExpr> expressions,
LinearExpr target) {
ConstraintProto* const proto = cp_model_.add_constraints();
*proto->mutable_element()->mutable_linear_index() = LinearExprToProto(index);
*proto->mutable_element()->mutable_linear_target() =
LinearExprToProto(target);
for (const LinearExpr& expr : expressions) {
*proto->mutable_element()->add_exprs() = LinearExprToProto(expr);
}
return Constraint(proto);
}
Constraint CpModelBuilder::AddElement(
LinearExpr index, std::initializer_list<LinearExpr> expressions,
LinearExpr target) {
ConstraintProto* const proto = cp_model_.add_constraints();
*proto->mutable_element()->mutable_linear_index() = LinearExprToProto(index);
*proto->mutable_element()->mutable_linear_target() =
LinearExprToProto(target);
for (const LinearExpr& expr : expressions) {
*proto->mutable_element()->add_exprs() = LinearExprToProto(expr);
}
return Constraint(proto);
}

View File

@@ -845,13 +845,23 @@ class CpModelBuilder {
Constraint AddAllDifferent(std::initializer_list<LinearExpr> exprs);
/// Adds the element constraint: variables[index] == target
Constraint AddVariableElement(IntVar index,
Constraint AddVariableElement(LinearExpr index,
absl::Span<const IntVar> variables,
IntVar target);
LinearExpr target);
/// Adds the element constraint: expressions[index] == target.
Constraint AddElement(LinearExpr index,
absl::Span<const LinearExpr> expressions,
LinearExpr target);
/// Adds the element constraint: expressions[index] == target.
Constraint AddElement(LinearExpr index,
std::initializer_list<LinearExpr> expressions,
LinearExpr target);
/// Adds the element constraint: values[index] == target
Constraint AddElement(IntVar index, absl::Span<const int64_t> values,
IntVar target);
Constraint AddElement(LinearExpr index, absl::Span<const int64_t> values,
LinearExpr target);
/**
* Adds a circuit constraint.