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);
124 for (
int i = 0; i < constraint.
vars.size(); ++i) {
125 const IntegerVariable
var = constraint.
vars[i];
126 const IntegerValue coeff = constraint.
coeffs[i];
127 activity += coeff.value() * values[
var];
134 for (
const IntegerValue coeff : constraint.
coeffs) {
137 return std::sqrt(sum);
141 IntegerValue result(0);
142 for (
const IntegerValue coeff : constraint.
coeffs) {
150 DCHECK(std::is_sorted(constraint1.
vars.begin(), constraint1.
vars.end()));
151 DCHECK(std::is_sorted(constraint2.
vars.begin(), constraint2.
vars.end()));
152 double scalar_product = 0.0;
155 while (index_1 < constraint1.
vars.size() &&
156 index_2 < constraint2.
vars.size()) {
157 if (constraint1.
vars[index_1] == constraint2.
vars[index_2]) {
162 }
else if (constraint1.
vars[index_1] > constraint2.
vars[index_2]) {
168 return scalar_product;
174 IntegerValue ComputeGcd(
const std::vector<IntegerValue>& values) {
175 if (values.empty())
return IntegerValue(1);
177 for (
const IntegerValue
value : values) {
181 if (gcd < 0)
return IntegerValue(1);
182 return IntegerValue(gcd);
188 if (constraint->
coeffs.empty())
return;
189 const IntegerValue gcd = ComputeGcd(constraint->
coeffs);
190 if (gcd == 1)
return;
198 for (IntegerValue& coeff : constraint->
coeffs) coeff /= gcd;
203 const int size = constraint->
vars.size();
204 for (
int i = 0; i < size; ++i) {
205 if (constraint->
coeffs[i] == 0)
continue;
206 constraint->
vars[new_size] = constraint->
vars[i];
210 constraint->
vars.resize(new_size);
211 constraint->
coeffs.resize(new_size);
215 const int size = constraint->
vars.size();
216 for (
int i = 0; i < size; ++i) {
217 const IntegerValue coeff = constraint->
coeffs[i];
219 constraint->
coeffs[i] = -coeff;
226 const int size = constraint->
vars.size();
227 for (
int i = 0; i < size; ++i) {
228 const IntegerVariable
var = constraint->
vars[i];
243 std::vector<std::pair<IntegerVariable, IntegerValue>> terms;
245 const int size =
ct->vars.size();
246 for (
int i = 0; i < size; ++i) {
248 terms.push_back({
ct->vars[i],
ct->coeffs[i]});
253 std::sort(terms.begin(), terms.end());
257 for (
const auto& term : terms) {
258 ct->vars.push_back(term.first);
259 ct->coeffs.push_back(term.second);
264 absl::flat_hash_set<IntegerVariable> seen_variables;
265 const int size =
ct.vars.size();
266 for (
int i = 0; i < size; ++i) {
268 if (!seen_variables.insert(
ct.vars[i]).second)
return false;
270 if (!seen_variables.insert(
NegationOf(
ct.vars[i])).second)
return false;
279 for (
int i = 0; i < expr.
vars.size(); ++i) {
284 canonical_expr.
vars.push_back(expr.
vars[i]);
288 return canonical_expr;
293 IntegerValue lower_bound = expr.
offset;
294 for (
int i = 0; i < expr.
vars.size(); ++i) {
295 DCHECK_GE(expr.
coeffs[i], 0) <<
"The expression is not canonicalized";
303 IntegerValue upper_bound = expr.
offset;
304 for (
int i = 0; i < expr.
vars.size(); ++i) {
305 DCHECK_GE(expr.
coeffs[i], 0) <<
"The expression is not canonicalized";
322 for (
int i = 0; i < expr.
vars.size(); ++i) {
324 result.
vars.push_back(expr.
vars[i]);
336 for (
int i = 0; i < expr.
vars.size(); ++i) {
343 return IntegerValue(0);
349 for (
int i = 0; i < expr.
vars.size(); ++i) {
354 return IntegerValue(0);