26 terms_.push_back({
var, coeff});
38 terms_.push_back({expr.
var, coeff * expr.
coeff});
48 Literal lit, IntegerValue coeff) {
50 bool has_opposite_view =
56 if (has_direct_view && has_opposite_view) {
59 has_opposite_view =
false;
61 has_direct_view =
false;
64 if (has_direct_view) {
68 if (has_opposite_view) {
78 std::vector<std::pair<IntegerVariable, IntegerValue>>* terms,
80 constraint->
vars.clear();
81 constraint->
coeffs.clear();
85 std::sort(terms->begin(), terms->end());
87 IntegerValue current_coeff(0);
88 for (
const std::pair<IntegerVariable, IntegerValue> entry : *terms) {
89 if (previous_var == entry.first) {
90 current_coeff += entry.second;
91 }
else if (previous_var ==
NegationOf(entry.first)) {
92 current_coeff -= entry.second;
94 if (current_coeff != 0) {
95 constraint->
vars.push_back(previous_var);
96 constraint->
coeffs.push_back(current_coeff);
98 previous_var = entry.first;
99 current_coeff = entry.second;
102 if (current_coeff != 0) {
103 constraint->
vars.push_back(previous_var);
104 constraint->
coeffs.push_back(current_coeff);
119 for (
int i = 0; i < constraint.
vars.size(); ++i) {
120 const IntegerVariable
var = constraint.
vars[i];
121 const IntegerValue coeff = constraint.
coeffs[i];
122 activity += coeff.value() * values[
var];
129 for (
const IntegerValue coeff : constraint.
coeffs) {
132 return std::sqrt(sum);
136 IntegerValue result(0);
137 for (
const IntegerValue coeff : constraint.
coeffs) {
145 DCHECK(std::is_sorted(constraint1.
vars.begin(), constraint1.
vars.end()));
146 DCHECK(std::is_sorted(constraint2.
vars.begin(), constraint2.
vars.end()));
147 double scalar_product = 0.0;
150 while (index_1 < constraint1.
vars.size() &&
151 index_2 < constraint2.
vars.size()) {
152 if (constraint1.
vars[index_1] == constraint2.
vars[index_2]) {
157 }
else if (constraint1.
vars[index_1] > constraint2.
vars[index_2]) {
163 return scalar_product;
169 IntegerValue ComputeGcd(
const std::vector<IntegerValue>& values) {
170 if (values.empty())
return IntegerValue(1);
172 for (
const IntegerValue
value : values) {
176 if (gcd < 0)
return IntegerValue(1);
177 return IntegerValue(gcd);
183 if (constraint->
coeffs.empty())
return;
184 const IntegerValue gcd = ComputeGcd(constraint->
coeffs);
185 if (gcd == 1)
return;
193 for (IntegerValue& coeff : constraint->
coeffs) coeff /= gcd;
198 const int size = constraint->
vars.size();
199 for (
int i = 0; i < size; ++i) {
200 if (constraint->
coeffs[i] == 0)
continue;
201 constraint->
vars[new_size] = constraint->
vars[i];
205 constraint->
vars.resize(new_size);
206 constraint->
coeffs.resize(new_size);
210 const int size = constraint->
vars.size();
211 for (
int i = 0; i < size; ++i) {
212 const IntegerValue coeff = constraint->
coeffs[i];
214 constraint->
coeffs[i] = -coeff;
221 const int size = constraint->
vars.size();
222 for (
int i = 0; i < size; ++i) {
223 const IntegerVariable
var = constraint->
vars[i];
238 std::vector<std::pair<IntegerVariable, IntegerValue>> terms;
240 const int size =
ct->vars.size();
241 for (
int i = 0; i < size; ++i) {
243 terms.push_back({
ct->vars[i],
ct->coeffs[i]});
248 std::sort(terms.begin(), terms.end());
252 for (
const auto& term : terms) {
253 ct->vars.push_back(term.first);
254 ct->coeffs.push_back(term.second);
259 absl::flat_hash_set<IntegerVariable> seen_variables;
260 const int size =
ct.vars.size();
261 for (
int i = 0; i < size; ++i) {
263 if (!seen_variables.insert(
ct.vars[i]).second)
return false;
265 if (!seen_variables.insert(
NegationOf(
ct.vars[i])).second)
return false;
274 for (
int i = 0; i < expr.
vars.size(); ++i) {
279 canonical_expr.
vars.push_back(expr.
vars[i]);
283 return canonical_expr;
288 IntegerValue lower_bound = expr.
offset;
289 for (
int i = 0; i < expr.
vars.size(); ++i) {
290 DCHECK_GE(expr.
coeffs[i], 0) <<
"The expression is not canonicalized";
298 IntegerValue upper_bound = expr.
offset;
299 for (
int i = 0; i < expr.
vars.size(); ++i) {
300 DCHECK_GE(expr.
coeffs[i], 0) <<
"The expression is not canonicalized";
317 for (
int i = 0; i < expr.
vars.size(); ++i) {
319 result.
vars.push_back(expr.
vars[i]);
331 for (
int i = 0; i < expr.
vars.size(); ++i) {
338 return IntegerValue(0);
344 for (
int i = 0; i < expr.
vars.size(); ++i) {
349 return IntegerValue(0);