31 absl::Span<
const std::vector<Literal>> literal_tuples,
32 absl::Span<const Literal> line_literals) {
35 std::vector<Literal>(line_literals.begin(), line_literals.end()),
36 literal_tuples = std::vector<std::vector<Literal>>(
37 literal_tuples.begin(), literal_tuples.end())](
Model* model) {
38 CHECK_EQ(literal_tuples.size(), line_literals.size());
39 const int num_tuples = line_literals.size();
40 if (num_tuples == 0)
return;
41 const int tuple_size = literal_tuples[0].size();
42 if (tuple_size == 0)
return;
43 for (
int i = 1;
i < num_tuples; ++
i) {
44 CHECK_EQ(tuple_size, literal_tuples[
i].size());
47 absl::flat_hash_map<LiteralIndex, std::vector<LiteralIndex>>
48 line_literals_per_literal;
49 for (
int i = 0;
i < num_tuples; ++
i) {
50 const LiteralIndex selected_index = line_literals[
i].Index();
51 for (
const Literal l : literal_tuples[
i]) {
52 line_literals_per_literal[l.Index()].push_back(selected_index);
58 for (
int i = 0;
i < num_tuples; ++
i) {
59 const Literal line_is_selected = line_literals[
i];
60 for (
const Literal lit : literal_tuples[
i]) {
70 for (
const auto& p : line_literals_per_literal) {
71 std::vector<Literal> clause;
72 for (
const auto& index : p.second) {
73 clause.push_back(
Literal(index));