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;
193IntegerValue 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) {
266 for (
int i = 0; i <
vars.size(); ++i) {
267 absl::StrAppend(&result, i > 0 ?
" " :
"",
271 absl::StrAppend(&result,
" + ",
offset.value());
283 std::vector<std::pair<IntegerVariable, IntegerValue>> terms;
285 const int size =
ct->vars.size();
286 for (
int i = 0; i < size; ++i) {
288 terms.push_back({
ct->vars[i],
ct->coeffs[i]});
293 std::sort(terms.begin(), terms.end());
297 for (
const auto& term : terms) {
298 ct->vars.push_back(term.first);
299 ct->coeffs.push_back(term.second);
304 absl::flat_hash_set<IntegerVariable> seen_variables;
305 const int size =
ct.vars.size();
306 for (
int i = 0; i < size; ++i) {
308 if (!seen_variables.insert(
ct.vars[i]).second)
return false;
310 if (!seen_variables.insert(
NegationOf(
ct.vars[i])).second)
return false;
319 for (
int i = 0; i < expr.
vars.size(); ++i) {
324 canonical_expr.
vars.push_back(expr.
vars[i]);
328 return canonical_expr;
334 for (
int i = 0; i < expr.
vars.size(); ++i) {
344 for (
int i = 0; i < expr.
vars.size(); ++i) {
355 int64_t positive_sum(0);
356 int64_t negative_sum(0);
357 for (
int i = 0; i < constraint.
vars.size(); ++i) {
358 const IntegerVariable
var = constraint.
vars[i];
359 const IntegerValue coeff = constraint.
coeffs[i];
363 int64_t min_prod =
CapProd(coeff.value(), lb.value());
364 int64_t max_prod =
CapProd(coeff.value(), ub.value());
365 if (min_prod > max_prod)
std::swap(min_prod, max_prod);
367 positive_sum =
CapAdd(positive_sum,
std::max(int64_t{0}, max_prod));
368 negative_sum =
CapAdd(negative_sum,
std::min(int64_t{0}, min_prod));
372 if (positive_sum >= limit)
return false;
373 if (negative_sum <= -limit)
return false;
374 if (
CapSub(positive_sum, negative_sum) >= limit)
return false;
390 for (
int i = 0; i < expr.
vars.size(); ++i) {
392 result.
vars.push_back(expr.
vars[i]);
404 for (
int i = 0; i < expr.
vars.size(); ++i) {
411 return IntegerValue(0);
417 for (
int i = 0; i < expr.
vars.size(); ++i) {
422 return IntegerValue(0);
#define DCHECK_GE(val1, val2)
#define DCHECK(condition)
static int64_t GCD64(int64_t x, int64_t y)
const IntegerVariable GetLiteralView(Literal lit) const
bool IsFixed(IntegerVariable i) const
IntegerValue UpperBound(IntegerVariable i) const
IntegerValue LevelZeroUpperBound(IntegerVariable var) const
IntegerValue FixedValue(IntegerVariable i) const
IntegerValue LevelZeroLowerBound(IntegerVariable var) const
IntegerValue LowerBound(IntegerVariable i) const
ABSL_MUST_USE_RESULT bool AddLiteralTerm(Literal lit, IntegerValue coeff)
void AddConstant(IntegerValue value)
void AddLinearExpression(const LinearExpression &expr)
LinearConstraint BuildConstraint(IntegerValue lb, IntegerValue ub)
void AddQuadraticLowerBound(AffineExpression left, AffineExpression right, IntegerTrail *integer_trail)
LinearExpression BuildExpression()
void AddTerm(IntegerVariable var, IntegerValue coeff)
void swap(IdMap< K, V > &a, IdMap< K, V > &b)
IntegerValue FloorRatio(IntegerValue dividend, IntegerValue positive_divisor)
bool ValidateLinearConstraintForOverflow(const LinearConstraint &constraint, const IntegerTrail &integer_trail)
constexpr IntegerValue kMaxIntegerValue(std::numeric_limits< IntegerValue::ValueType >::max() - 1)
IntegerValue LinExprLowerBound(const LinearExpression &expr, const IntegerTrail &integer_trail)
IntType IntTypeAbs(IntType t)
IntegerValue CeilRatio(IntegerValue dividend, IntegerValue positive_divisor)
constexpr IntegerValue kMinIntegerValue(-kMaxIntegerValue)
std::string IntegerTermDebugString(IntegerVariable var, IntegerValue coeff)
void RemoveZeroTerms(LinearConstraint *constraint)
LinearExpression PositiveVarExpr(const LinearExpression &expr)
double ScalarProduct(const LinearConstraint &constraint1, const LinearConstraint &constraint2)
const IntegerVariable kNoIntegerVariable(-1)
void MakeAllCoefficientsPositive(LinearConstraint *constraint)
LinearExpression CanonicalizeExpr(const LinearExpression &expr)
void CleanTermsAndFillConstraint(std::vector< std::pair< IntegerVariable, IntegerValue > > *terms, ClassWithVarsAndCoeffs *output)
void CanonicalizeConstraint(LinearConstraint *ct)
bool NoDuplicateVariable(const LinearConstraint &ct)
double ComputeL2Norm(const LinearConstraint &constraint)
IntegerValue GetCoefficient(const IntegerVariable var, const LinearExpression &expr)
void MakeAllVariablesPositive(LinearConstraint *constraint)
std::vector< IntegerVariable > NegationOf(const std::vector< IntegerVariable > &vars)
IntegerValue GetCoefficientOfPositiveVar(const IntegerVariable var, const LinearExpression &expr)
IntegerValue ComputeInfinityNorm(const LinearConstraint &constraint)
IntegerValue LinExprUpperBound(const LinearExpression &expr, const IntegerTrail &integer_trail)
bool VariableIsPositive(IntegerVariable i)
void DivideByGCD(LinearConstraint *constraint)
double ComputeActivity(const LinearConstraint &constraint, const absl::StrongVector< IntegerVariable, double > &values)
double ToDouble(IntegerValue value)
Collection of objects used to extend the Constraint Solver library.
int64_t CapAdd(int64_t x, int64_t y)
int64_t CapSub(int64_t x, int64_t y)
int64_t CapProd(int64_t x, int64_t y)
std::vector< IntegerValue > coeffs
std::vector< IntegerVariable > vars
std::vector< IntegerValue > coeffs
std::vector< IntegerVariable > vars
std::string DebugString() const
double LpValue(const absl::StrongVector< IntegerVariable, double > &lp_values) const