14#ifndef OR_TOOLS_SAT_CP_CONSTRAINTS_H_
15#define OR_TOOLS_SAT_CP_CONSTRAINTS_H_
21#include "absl/log/check.h"
22#include "absl/types/span.h"
41 : literals_(literals),
44 integer_trail_(integer_trail) {}
75 absl::Span<const AffineExpression> exprs,
76 absl::Span<const Literal> selectors,
77 absl::Span<const Literal> enforcements,
90 void Explain(
int id, IntegerValue propagation_slack,
91 IntegerVariable var_to_explain,
int trail_index,
93 std::vector<
int>* trail_indices_reason) final;
96 const IntegerVariable target_var_;
113 std::vector<IntegerValue> result(
input.size());
114 for (
int i = 0;
i <
input.size(); ++
i) {
115 result[
i] = IntegerValue(
input[
i]);
122 const std::vector<Literal>& literals,
bool value) {
134 IntegerVariable target_var,
const absl::Span<const IntegerVariable> vars,
135 const absl::Span<const IntegerValue> offsets,
136 const absl::Span<const Literal> selectors,
137 const absl::Span<const Literal> enforcements) {
138 return [=](
Model* model) {
139 std::vector<AffineExpression> exprs;
140 for (
int i = 0;
i < vars.size(); ++
i) {
145 enforcements, model);
161 IntegerVariable target_var, absl::Span<const IntegerVariable> vars,
162 absl::Span<const Literal> selectors) {
163 CHECK_EQ(vars.size(), selectors.size());
165 selectors = std::vector<Literal>(selectors.begin(), selectors.end()),
166 vars = std::vector<IntegerVariable>(vars.begin(), vars.end())](
168 const std::vector<IntegerValue> offsets(vars.size(), IntegerValue(0));
169 if (vars.size() > 2) {
174 if (vars.size() > 2) {
BooleanXorPropagator & operator=(const BooleanXorPropagator &)=delete
BooleanXorPropagator(const std::vector< Literal > &literals, bool value, Trail *trail, IntegerTrail *integer_trail)
void RegisterWith(GenericLiteralWatcher *watcher)
BooleanXorPropagator(const BooleanXorPropagator &)=delete
This type is neither copyable nor movable.
GreaterThanAtLeastOneOfPropagator & operator=(const GreaterThanAtLeastOneOfPropagator &)=delete
void Explain(int id, IntegerValue propagation_slack, IntegerVariable var_to_explain, int trail_index, std::vector< Literal > *literals_reason, std::vector< int > *trail_indices_reason) final
For LazyReasonInterface.
void RegisterWith(GenericLiteralWatcher *watcher)
GreaterThanAtLeastOneOfPropagator(const GreaterThanAtLeastOneOfPropagator &)=delete
This type is neither copyable nor movable.
GreaterThanAtLeastOneOfPropagator(IntegerVariable target_var, absl::Span< const AffineExpression > exprs, absl::Span< const Literal > selectors, absl::Span< const Literal > enforcements, Model *model)
LazyReasonInterface()=default
T Add(std::function< T(Model *)> f)
PropagatorInterface()=default
std::function< void(Model *)> GreaterThanAtLeastOneOf(IntegerVariable target_var, const absl::Span< const IntegerVariable > vars, const absl::Span< const IntegerValue > offsets, const absl::Span< const Literal > selectors, const absl::Span< const Literal > enforcements)
std::function< void(Model *)> LiteralXorIs(const std::vector< Literal > &literals, bool value)
Enforces the XOR of a set of literals to be equal to the given value.
std::function< void(Model *)> PartialIsOneOfVar(IntegerVariable target_var, absl::Span< const IntegerVariable > vars, absl::Span< const Literal > selectors)
std::vector< IntegerVariable > NegationOf(absl::Span< const IntegerVariable > vars)
Returns the vector of the negated variables.
std::vector< IntegerValue > ToIntegerValueVector(absl::Span< const int64_t > input)
In SWIG mode, we don't want anything besides these top-level includes.
static int input(yyscan_t yyscanner)