26 terms_.push_back({
var, coeff});
38 terms_.push_back({expr.
var, coeff * expr.
coeff});
53 Literal lit, IntegerValue coeff) {
55 bool has_opposite_view =
61 if (has_direct_view && has_opposite_view) {
64 has_opposite_view =
false;
66 has_direct_view =
false;
69 if (has_direct_view) {
73 if (has_opposite_view) {
83 std::vector<std::pair<IntegerVariable, IntegerValue>>* terms,
85 constraint->
vars.clear();
86 constraint->
coeffs.clear();
90 std::sort(terms->begin(), terms->end());
92 IntegerValue current_coeff(0);
93 for (
const std::pair<IntegerVariable, IntegerValue> entry : *terms) {
94 if (previous_var == entry.first) {
95 current_coeff += entry.second;
96 }
else if (previous_var ==
NegationOf(entry.first)) {
97 current_coeff -= entry.second;
99 if (current_coeff != 0) {
100 constraint->
vars.push_back(previous_var);
101 constraint->
coeffs.push_back(current_coeff);
103 previous_var = entry.first;
104 current_coeff = entry.second;
107 if (current_coeff != 0) {
108 constraint->
vars.push_back(previous_var);
109 constraint->
coeffs.push_back(current_coeff);
125 for (
int i = 0; i < constraint.
vars.size(); ++i) {
126 const IntegerVariable
var = constraint.
vars[i];
127 const IntegerValue coeff = constraint.
coeffs[i];
128 activity += coeff.value() * values[
var];
135 for (
const IntegerValue coeff : constraint.
coeffs) {
138 return std::sqrt(sum);
142 IntegerValue result(0);
143 for (
const IntegerValue coeff : constraint.
coeffs) {
151 DCHECK(std::is_sorted(constraint1.
vars.begin(), constraint1.
vars.end()));
152 DCHECK(std::is_sorted(constraint2.
vars.begin(), constraint2.
vars.end()));
153 double scalar_product = 0.0;
156 while (index_1 < constraint1.
vars.size() &&
157 index_2 < constraint2.
vars.size()) {
158 if (constraint1.
vars[index_1] == constraint2.
vars[index_2]) {
163 }
else if (constraint1.
vars[index_1] > constraint2.
vars[index_2]) {
169 return scalar_product;
175 IntegerValue ComputeGcd(
const std::vector<IntegerValue>& values) {
176 if (values.empty())
return IntegerValue(1);
178 for (
const IntegerValue
value : values) {
182 if (gcd < 0)
return IntegerValue(1);
183 return IntegerValue(gcd);
189 if (constraint->
coeffs.empty())
return;
190 const IntegerValue gcd = ComputeGcd(constraint->
coeffs);
191 if (gcd == 1)
return;
199 for (IntegerValue& coeff : constraint->
coeffs) coeff /= gcd;
204 const int size = constraint->
vars.size();
205 for (
int i = 0; i < size; ++i) {
206 if (constraint->
coeffs[i] == 0)
continue;
207 constraint->
vars[new_size] = constraint->
vars[i];
211 constraint->
vars.resize(new_size);
212 constraint->
coeffs.resize(new_size);
216 const int size = constraint->
vars.size();
217 for (
int i = 0; i < size; ++i) {
218 const IntegerValue coeff = constraint->
coeffs[i];
220 constraint->
coeffs[i] = -coeff;
227 const int size = constraint->
vars.size();
228 for (
int i = 0; i < size; ++i) {
229 const IntegerVariable
var = constraint->
vars[i];
244 std::vector<std::pair<IntegerVariable, IntegerValue>> terms;
246 const int size =
ct->vars.size();
247 for (
int i = 0; i < size; ++i) {
249 terms.push_back({
ct->vars[i],
ct->coeffs[i]});
254 std::sort(terms.begin(), terms.end());
258 for (
const auto& term : terms) {
259 ct->vars.push_back(term.first);
260 ct->coeffs.push_back(term.second);
265 absl::flat_hash_set<IntegerVariable> seen_variables;
266 const int size =
ct.vars.size();
267 for (
int i = 0; i < size; ++i) {
269 if (!seen_variables.insert(
ct.vars[i]).second)
return false;
271 if (!seen_variables.insert(
NegationOf(
ct.vars[i])).second)
return false;
280 for (
int i = 0; i < expr.
vars.size(); ++i) {
285 canonical_expr.
vars.push_back(expr.
vars[i]);
289 return canonical_expr;
294 IntegerValue lower_bound = expr.
offset;
295 for (
int i = 0; i < expr.
vars.size(); ++i) {
304 IntegerValue upper_bound = expr.
offset;
305 for (
int i = 0; i < expr.
vars.size(); ++i) {
323 for (
int i = 0; i < expr.
vars.size(); ++i) {
325 result.
vars.push_back(expr.
vars[i]);
337 for (
int i = 0; i < expr.
vars.size(); ++i) {
344 return IntegerValue(0);
350 for (
int i = 0; i < expr.
vars.size(); ++i) {
355 return IntegerValue(0);