26 if (coeff == 0)
return;
30 terms_.push_back({
var, coeff});
38 if (coeff == 0)
return;
43 terms_.push_back({expr.
var, coeff * expr.
coeff});
58 for (
int i = 0; i < expr.
vars.size(); ++i) {
61 terms_.push_back({expr.
vars[i], expr.
coeffs[i] * coeff});
66 offset_ += expr.
offset * coeff;
72 if (integer_trail->
IsFixed(left)) {
74 }
else if (integer_trail->
IsFixed(right)) {
77 const IntegerValue left_min = integer_trail->
LowerBound(left);
78 const IntegerValue right_min = integer_trail->
LowerBound(right);
91 Literal lit, IntegerValue coeff) {
93 bool has_opposite_view =
99 if (has_direct_view && has_opposite_view) {
102 has_opposite_view =
false;
104 has_direct_view =
false;
107 if (has_direct_view) {
111 if (has_opposite_view) {
143 for (
int i = 0; i < constraint.
vars.size(); ++i) {
144 const IntegerVariable
var = constraint.
vars[i];
145 const IntegerValue coeff = constraint.
coeffs[i];
146 activity += coeff.value() * values[
var];
153 for (
const IntegerValue coeff : constraint.
coeffs) {
156 return std::sqrt(sum);
160 IntegerValue result(0);
161 for (
const IntegerValue coeff : constraint.
coeffs) {
169 DCHECK(std::is_sorted(constraint1.
vars.begin(), constraint1.
vars.end()));
170 DCHECK(std::is_sorted(constraint2.
vars.begin(), constraint2.
vars.end()));
171 double scalar_product = 0.0;
174 while (index_1 < constraint1.
vars.size() &&
175 index_2 < constraint2.
vars.size()) {
176 if (constraint1.
vars[index_1] == constraint2.
vars[index_2]) {
181 }
else if (constraint1.
vars[index_1] > constraint2.
vars[index_2]) {
187 return scalar_product;
193 IntegerValue ComputeGcd(
const std::vector<IntegerValue>& values) {
194 if (values.empty())
return IntegerValue(1);
196 for (
const IntegerValue
value : values) {
200 if (gcd < 0)
return IntegerValue(1);
201 return IntegerValue(gcd);
207 if (constraint->
coeffs.empty())
return;
208 const IntegerValue gcd = ComputeGcd(constraint->
coeffs);
209 if (gcd == 1)
return;
217 for (IntegerValue& coeff : constraint->
coeffs) coeff /= gcd;
222 const int size = constraint->
vars.size();
223 for (
int i = 0; i < size; ++i) {
224 if (constraint->
coeffs[i] == 0)
continue;
225 constraint->
vars[new_size] = constraint->
vars[i];
229 constraint->
vars.resize(new_size);
230 constraint->
coeffs.resize(new_size);
234 const int size = constraint->
vars.size();
235 for (
int i = 0; i < size; ++i) {
236 const IntegerValue coeff = constraint->
coeffs[i];
238 constraint->
coeffs[i] = -coeff;
245 const int size = constraint->
vars.size();
246 for (
int i = 0; i < size; ++i) {
247 const IntegerVariable
var = constraint->
vars[i];
258 for (
int i = 0; i <
vars.size(); ++i) {
265 IntegerValue result =
offset;
266 for (
int i = 0; i <
vars.size(); ++i) {
274 IntegerValue result =
offset;
275 for (
int i = 0; i <
vars.size(); ++i) {
283 for (
int i = 0; i <
vars.size(); ++i) {
284 absl::StrAppend(&result, i > 0 ?
" " :
"",
288 absl::StrAppend(&result,
" + ",
offset.value());
300 std::vector<std::pair<IntegerVariable, IntegerValue>> terms;
302 const int size =
ct->vars.size();
303 for (
int i = 0; i < size; ++i) {
305 terms.push_back({
ct->vars[i],
ct->coeffs[i]});
310 std::sort(terms.begin(), terms.end());
314 for (
const auto& term : terms) {
315 ct->vars.push_back(term.first);
316 ct->coeffs.push_back(term.second);
321 absl::flat_hash_set<IntegerVariable> seen_variables;
322 const int size =
ct.vars.size();
323 for (
int i = 0; i < size; ++i) {
325 if (!seen_variables.insert(
ct.vars[i]).second)
return false;
327 if (!seen_variables.insert(
NegationOf(
ct.vars[i])).second)
return false;
336 for (
int i = 0; i < expr.
vars.size(); ++i) {
341 canonical_expr.
vars.push_back(expr.
vars[i]);
345 return canonical_expr;
351 for (
int i = 0; i < expr.
vars.size(); ++i) {
361 for (
int i = 0; i < expr.
vars.size(); ++i) {
372 int64_t positive_sum(0);
373 int64_t negative_sum(0);
374 for (
int i = 0; i < constraint.
vars.size(); ++i) {
375 const IntegerVariable
var = constraint.
vars[i];
376 const IntegerValue coeff = constraint.
coeffs[i];
380 int64_t min_prod =
CapProd(coeff.value(), lb.value());
381 int64_t max_prod =
CapProd(coeff.value(), ub.value());
382 if (min_prod > max_prod)
std::swap(min_prod, max_prod);
384 positive_sum =
CapAdd(positive_sum,
std::max(int64_t{0}, max_prod));
385 negative_sum =
CapAdd(negative_sum,
std::min(int64_t{0}, min_prod));
389 if (positive_sum >= limit)
return false;
390 if (negative_sum <= -limit)
return false;
391 if (
CapSub(positive_sum, negative_sum) >= limit)
return false;
407 for (
int i = 0; i < expr.
vars.size(); ++i) {
409 result.
vars.push_back(expr.
vars[i]);
421 for (
int i = 0; i < expr.
vars.size(); ++i) {
428 return IntegerValue(0);
434 for (
int i = 0; i < expr.
vars.size(); ++i) {
439 return IntegerValue(0);
int64_t CapSub(int64_t x, int64_t y)
IntegerValue GetCoefficient(const IntegerVariable var, const LinearExpression &expr)
double ComputeL2Norm(const LinearConstraint &constraint)
#define CHECK_GE(val1, val2)
IntegerValue LinExprLowerBound(const LinearExpression &expr, const IntegerTrail &integer_trail)
std::vector< IntegerValue > coeffs
constexpr IntegerValue kMinIntegerValue(-kMaxIntegerValue)
IntegerValue LowerBound(IntegerVariable i) const
void swap(IdMap< K, V > &a, IdMap< K, V > &b)
void AddLinearExpression(const LinearExpression &expr)
std::string IntegerTermDebugString(IntegerVariable var, IntegerValue coeff)
LinearExpression PositiveVarExpr(const LinearExpression &expr)
void AddTerm(IntegerVariable var, IntegerValue coeff)
int64_t CapProd(int64_t x, int64_t y)
ABSL_MUST_USE_RESULT bool AddLiteralTerm(Literal lit, IntegerValue coeff)
void MakeAllCoefficientsPositive(LinearConstraint *constraint)
double LpValue(const absl::StrongVector< IntegerVariable, double > &lp_values) const
constexpr IntegerValue kMaxIntegerValue(std::numeric_limits< IntegerValue::ValueType >::max() - 1)
std::vector< IntegerValue > coeffs
const IntegerVariable GetLiteralView(Literal lit) const
LinearExpression CanonicalizeExpr(const LinearExpression &expr)
double ComputeActivity(const LinearConstraint &constraint, const absl::StrongVector< IntegerVariable, double > &values)
std::vector< IntegerVariable > vars
std::vector< IntegerVariable > vars
double ToDouble(IntegerValue value)
void DivideByGCD(LinearConstraint *constraint)
LinearConstraint BuildConstraint(IntegerValue lb, IntegerValue ub)
int64_t CapAdd(int64_t x, int64_t y)
IntegerValue ComputeInfinityNorm(const LinearConstraint &constraint)
IntegerValue LevelZeroUpperBound(IntegerVariable var) const
static int64_t GCD64(int64_t x, int64_t y)
std::string DebugString() const
bool VariableIsPositive(IntegerVariable i)
#define DCHECK_GE(val1, val2)
bool ValidateLinearConstraintForOverflow(const LinearConstraint &constraint, const IntegerTrail &integer_trail)
double ScalarProduct(const LinearConstraint &constraint1, const LinearConstraint &constraint2)
IntegerValue LinExprUpperBound(const LinearExpression &expr, const IntegerTrail &integer_trail)
std::vector< IntegerVariable > NegationOf(const std::vector< IntegerVariable > &vars)
void CanonicalizeConstraint(LinearConstraint *ct)
#define DCHECK(condition)
IntegerValue Min(IntegerTrail *integer_trail) const
IntegerValue FloorRatio(IntegerValue dividend, IntegerValue positive_divisor)
void AddConstant(IntegerValue value)
void CleanTermsAndFillConstraint(std::vector< std::pair< IntegerVariable, IntegerValue >> *terms, ClassWithVarsAndCoeffs *output)
IntegerValue CeilRatio(IntegerValue dividend, IntegerValue positive_divisor)
IntegerValue UpperBound(IntegerVariable i) const
Collection of objects used to extend the Constraint Solver library.
const IntegerVariable kNoIntegerVariable(-1)
IntegerValue FixedValue(IntegerVariable i) const
LinearExpression BuildExpression()
IntType IntTypeAbs(IntType t)
void MakeAllVariablesPositive(LinearConstraint *constraint)
IntegerValue LevelZeroMin(IntegerTrail *integer_trail) const
IntegerValue LevelZeroLowerBound(IntegerVariable var) const
void RemoveZeroTerms(LinearConstraint *constraint)
bool IsFixed(IntegerVariable i) const
void AddQuadraticLowerBound(AffineExpression left, AffineExpression right, IntegerTrail *integer_trail)
IntegerValue GetCoefficientOfPositiveVar(const IntegerVariable var, const LinearExpression &expr)
bool NoDuplicateVariable(const LinearConstraint &ct)