42 const int num_bits = key.size();
43 for (
int i = 0;
i < num_bits; ++
i) {
44 for (
int j =
i + 1; j < num_bits; ++j) {
45 if (key[
i] <= key[j])
continue;
47 std::swap(key[
i], key[j]);
51 for (
int p = 0; p < (1 << num_bits); ++p) {
52 const int value_i = (p >>
i) & 1;
53 const int value_j = (p >> j) & 1;
55 new_p ^= (value_i <<
i) ^ (value_j << j);
56 new_p ^= (value_i << j) ^ (value_j <<
i);
57 new_bitmask |= ((bitmask >> p) & 1) << new_p;
59 bitmask = new_bitmask;
62 DCHECK(std::is_sorted(key.begin(), key.end()));
68 absl::Span<BooleanVariable> key,
70 CHECK_EQ(clause.size(), key.size());
71 const int num_bits = clause.size();
73 for (
int i = 0;
i < num_bits; ++
i) {
74 key[
i] = clause[
i].Variable();
75 bit_to_remove |= (clause[
i].IsPositive() ? 0 : 1) <<
i;
77 CHECK_LT(bit_to_remove, (1 << num_bits));
102 absl::Span<LiteralIndex> inputs,
103 int& int_function_values) {
104 DCHECK_LT(
i, inputs.size());
105 const int value = at_true ? 1 : 0;
110 const int new_size = inputs.size() - 1;
111 for (
int p = 0; p < (1 << new_size); ++p) {
113 new_truth_table |= ((values >> extended_p) & 1) << p;
115 int_function_values = new_truth_table;
117 for (
int j =
i + 1; j < inputs.size(); ++j) {
118 inputs[j - 1] = inputs[j];
127 absl::Span<LiteralIndex> inputs,
128 int& int_function_values) {
130 CHECK_LE(inputs.size(), 4);
135 const int num_bits = inputs.size();
136 CHECK_LE(num_bits, 4);
139 for (
int i = 0;
i < num_bits; ++
i) {
140 if (
Literal(inputs[
i]).IsPositive())
continue;
147 for (
int p = 0; p < (1 << num_bits); ++p) {
148 new_truth_table |= ((function_values >> p) & 1) << (p ^ to_xor);
150 function_values = new_truth_table;
151 CHECK_EQ(function_values >> (1 << num_bits), 0);
156 CHECK_EQ(function_values >> (1 << num_bits), 0);
159 for (
int i = 0;
i < inputs.size(); ++
i) {
160 for (
int j =
i + 1; j < inputs.size();) {
161 if (inputs[
i] == inputs[j]) {
163 for (
int k = j; k + 1 < inputs.size(); ++k) inputs[k] = inputs[k + 1];
164 inputs.remove_suffix(1);
167 for (
int p = 0; p < (1 << inputs.size()); ++p) {
169 extended_p |= ((p >>
i) & 1) << j;
170 new_truth_table |= ((function_values >> extended_p) & 1) << p;
172 function_values = new_truth_table;
181 for (
int i = 0;
i < inputs.size();) {
183 for (
int p = 0; p < (1 << inputs.size()); ++p) {
184 if (((function_values >> p) & 1) !=
185 ((function_values >> (p ^ (1 <<
i))) & 1)) {
192 for (
int k =
i; k + 1 < inputs.size(); ++k) inputs[k] = inputs[k + 1];
193 inputs.remove_suffix(1);
196 for (
int p = 0; p < (1 << inputs.size()); ++p) {
198 new_truth_table |= ((function_values >> extended_p) & 1) << p;
200 function_values = new_truth_table;
209 if (function_values & 1) {
212 function_values = function_values ^ all_one;
213 DCHECK_EQ(function_values >> (1 << inputs.size()), 0);
215 DCHECK_EQ(function_values & 1, 0);
217 int_function_values = function_values;
218 return inputs.size();