23#include "absl/container/flat_hash_map.h"
24#include "absl/container/flat_hash_set.h"
25#include "absl/strings/str_cat.h"
26#include "absl/strings/str_join.h"
40 const std::vector<std::vector<Literal>>& literal_tuples,
41 const std::vector<Literal>& line_literals) {
43 CHECK_EQ(literal_tuples.size(), line_literals.size());
44 const int num_tuples = line_literals.size();
45 if (num_tuples == 0)
return;
46 const int tuple_size = literal_tuples[0].size();
47 if (tuple_size == 0)
return;
48 for (
int i = 1; i < num_tuples; ++i) {
49 CHECK_EQ(tuple_size, literal_tuples[i].size());
52 absl::flat_hash_map<LiteralIndex, std::vector<LiteralIndex>>
53 line_literals_per_literal;
54 for (
int i = 0; i < num_tuples; ++i) {
55 const LiteralIndex selected_index = line_literals[i].Index();
56 for (
const Literal l : literal_tuples[i]) {
57 line_literals_per_literal[l.Index()].push_back(selected_index);
63 for (
int i = 0; i < num_tuples; ++i) {
64 const Literal line_is_selected = line_literals[i];
65 for (
const Literal lit : literal_tuples[i]) {
75 for (
const auto& p : line_literals_per_literal) {
76 std::vector<Literal> clause;
77 for (
const auto&
index : p.second) {
#define CHECK_EQ(val1, val2)
Class that owns everything related to a particular optimization model.
std::function< void(Model *)> ClauseConstraint(absl::Span< const Literal > literals)
std::function< void(Model *)> LiteralTableConstraint(const std::vector< std::vector< Literal > > &literal_tuples, const std::vector< Literal > &line_literals)
std::function< void(Model *)> Implication(const std::vector< Literal > &enforcement_literals, IntegerLiteral i)
std::function< void(Model *)> ExactlyOneConstraint(const std::vector< Literal > &literals)
Collection of objects used to extend the Constraint Solver library.