26 if (
coeff == 0)
return;
38 if (
coeff == 0)
return;
58 for (
int i = 0; i < expr.
vars.size(); ++i) {
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);
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];
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;
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) {
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];
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);
#define CHECK_GE(val1, val2)
#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
IntegerValue Min(IntegerTrail *integer_trail) const
IntegerValue LevelZeroMin(IntegerTrail *integer_trail) const
std::vector< IntegerValue > coeffs
std::vector< IntegerVariable > vars
std::string DebugString() const
double LpValue(const absl::StrongVector< IntegerVariable, double > &lp_values) const