14#ifndef ORTOOLS_SAT_CP_CONSTRAINTS_H_
15#define ORTOOLS_SAT_CP_CONSTRAINTS_H_
22#include "absl/log/check.h"
23#include "absl/types/span.h"
43 const std::vector<Literal>& literals,
bool value,
61 EnforcementId enforcement_id_;
78 absl::Span<const AffineExpression> exprs,
79 absl::Span<const Literal> selectors,
80 absl::Span<const Literal> enforcements,
90 return "GreaterThanAtLeastOneOfPropagator";
100 const IntegerVariable target_var_;
117 std::vector<IntegerValue> result(
input.size());
118 for (
int i = 0;
i <
input.size(); ++
i) {
119 result[
i] = IntegerValue(
input[
i]);
126 absl::Span<const Literal> enforcement_literals,
127 const std::vector<Literal>& literals,
bool value) {
128 return [=, enforcement_literals = std::vector<Literal>(
129 enforcement_literals.begin(), enforcement_literals.end())](
137 IntegerVariable target_var,
const absl::Span<const IntegerVariable> vars,
138 const absl::Span<const IntegerValue> offsets,
139 const absl::Span<const Literal> selectors,
140 const absl::Span<const Literal> enforcements) {
141 return [=](
Model* model) {
142 std::vector<AffineExpression> exprs;
143 for (
int i = 0;
i < vars.size(); ++
i) {
148 enforcements, model);
164 IntegerVariable target_var, absl::Span<const IntegerVariable> vars,
165 absl::Span<const Literal> selectors) {
166 CHECK_EQ(vars.size(), selectors.size());
168 selectors = std::vector<Literal>(selectors.begin(), selectors.end()),
169 vars = std::vector<IntegerVariable>(vars.begin(), vars.end())](
171 const std::vector<IntegerValue> offsets(vars.size(), IntegerValue(0));
172 if (vars.size() > 2) {
177 if (vars.size() > 2) {
BooleanXorPropagator & operator=(const BooleanXorPropagator &)=delete
BooleanXorPropagator(const BooleanXorPropagator &)=delete
BooleanXorPropagator(absl::Span< const Literal > enforcement_literals, const std::vector< Literal > &literals, bool value, Model *model)
GreaterThanAtLeastOneOfPropagator & operator=(const GreaterThanAtLeastOneOfPropagator &)=delete
void RegisterWith(GenericLiteralWatcher *watcher)
GreaterThanAtLeastOneOfPropagator(const GreaterThanAtLeastOneOfPropagator &)=delete
GreaterThanAtLeastOneOfPropagator(IntegerVariable target_var, absl::Span< const AffineExpression > exprs, absl::Span< const Literal > selectors, absl::Span< const Literal > enforcements, Model *model)
std::string LazyReasonName() const override
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 *)> PartialIsOneOfVar(IntegerVariable target_var, absl::Span< const IntegerVariable > vars, absl::Span< const Literal > selectors)
std::vector< IntegerVariable > NegationOf(absl::Span< const IntegerVariable > vars)
std::function< void(Model *)> LiteralXorIs(absl::Span< const Literal > enforcement_literals, const std::vector< Literal > &literals, bool value)
std::vector< IntegerValue > ToIntegerValueVector(absl::Span< const int64_t > input)
static int input(yyscan_t yyscanner)