25#include "absl/base/attributes.h"
26#include "absl/container/flat_hash_set.h"
27#include "absl/strings/str_cat.h"
40 if (
coeff == 0)
return;
52 if (
coeff == 0)
return;
72 for (
int i = 0; i < expr.
vars.size(); ++i) {
86 if (integer_trail->
IsFixed(left)) {
88 }
else if (integer_trail->
IsFixed(right)) {
91 const IntegerValue left_min = integer_trail->
LowerBound(left);
92 const IntegerValue right_min = integer_trail->
LowerBound(right);
107 bool has_opposite_view =
113 if (has_direct_view && has_opposite_view) {
116 has_opposite_view =
false;
118 has_direct_view =
false;
121 if (has_direct_view) {
125 if (has_opposite_view) {
157 for (
int i = 0; i < constraint.
vars.size(); ++i) {
158 const IntegerVariable
var = constraint.
vars[i];
160 activity +=
coeff.value() * values[
var];
167 for (
const IntegerValue
coeff : constraint.
coeffs) {
170 return std::sqrt(sum);
174 IntegerValue result(0);
175 for (
const IntegerValue
coeff : constraint.
coeffs) {
183 DCHECK(std::is_sorted(constraint1.
vars.begin(), constraint1.
vars.end()));
184 DCHECK(std::is_sorted(constraint2.
vars.begin(), constraint2.
vars.end()));
185 double scalar_product = 0.0;
188 while (index_1 < constraint1.
vars.size() &&
189 index_2 < constraint2.
vars.size()) {
190 if (constraint1.
vars[index_1] == constraint2.
vars[index_2]) {
195 }
else if (constraint1.
vars[index_1] > constraint2.
vars[index_2]) {
201 return scalar_product;
207IntegerValue ComputeGcd(
const std::vector<IntegerValue>& values) {
208 if (values.empty())
return IntegerValue(1);
210 for (
const IntegerValue
value : values) {
214 if (gcd < 0)
return IntegerValue(1);
215 return IntegerValue(gcd);
221 if (constraint->
coeffs.empty())
return;
222 const IntegerValue gcd = ComputeGcd(constraint->
coeffs);
223 if (gcd == 1)
return;
236 const int size = constraint->
vars.size();
237 for (
int i = 0; i < size; ++i) {
238 if (constraint->
coeffs[i] == 0)
continue;
239 constraint->
vars[new_size] = constraint->
vars[i];
243 constraint->
vars.resize(new_size);
244 constraint->
coeffs.resize(new_size);
248 const int size = constraint->
vars.size();
249 for (
int i = 0; i < size; ++i) {
259 const int size = constraint->
vars.size();
260 for (
int i = 0; i < size; ++i) {
261 const IntegerVariable
var = constraint->
vars[i];
272 for (
int i = 0; i <
vars.size(); ++i) {
279 IntegerValue result =
offset;
280 for (
int i = 0; i <
vars.size(); ++i) {
288 IntegerValue result =
offset;
289 for (
int i = 0; i <
vars.size(); ++i) {
298 for (
int i = 0; i <
vars.size(); ++i) {
299 absl::StrAppend(&result, i > 0 ?
" " :
"",
303 absl::StrAppend(&result,
" + ",
offset.value());
315 std::vector<std::pair<IntegerVariable, IntegerValue>> terms;
317 const int size =
ct->vars.size();
318 for (
int i = 0; i < size; ++i) {
320 terms.push_back({
ct->vars[i],
ct->coeffs[i]});
325 std::sort(terms.begin(), terms.end());
329 for (
const auto& term : terms) {
330 ct->vars.push_back(term.first);
331 ct->coeffs.push_back(term.second);
336 absl::flat_hash_set<IntegerVariable> seen_variables;
337 const int size =
ct.vars.size();
338 for (
int i = 0; i < size; ++i) {
340 if (!seen_variables.insert(
ct.vars[i]).second)
return false;
342 if (!seen_variables.insert(
NegationOf(
ct.vars[i])).second)
return false;
351 for (
int i = 0; i < expr.
vars.size(); ++i) {
356 canonical_expr.
vars.push_back(expr.
vars[i]);
360 return canonical_expr;
366 for (
int i = 0; i < expr.
vars.size(); ++i) {
376 for (
int i = 0; i < expr.
vars.size(); ++i) {
387 int64_t positive_sum(0);
388 int64_t negative_sum(0);
389 for (
int i = 0; i < constraint.
vars.size(); ++i) {
390 const IntegerVariable
var = constraint.
vars[i];
397 if (min_prod > max_prod)
std::swap(min_prod, max_prod);
399 positive_sum =
CapAdd(positive_sum,
std::max(int64_t{0}, max_prod));
400 negative_sum =
CapAdd(negative_sum,
std::min(int64_t{0}, min_prod));
404 if (positive_sum >= limit)
return false;
405 if (negative_sum <= -limit)
return false;
406 if (
CapSub(positive_sum, negative_sum) >= limit)
return false;
422 for (
int i = 0; i < expr.
vars.size(); ++i) {
424 result.
vars.push_back(expr.
vars[i]);
436 for (
int i = 0; i < expr.
vars.size(); ++i) {
443 return IntegerValue(0);
449 for (
int i = 0; i < expr.
vars.size(); ++i) {
454 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)
std::string IntegerTermDebugString(IntegerVariable var, IntegerValue coeff)
void RemoveZeroTerms(LinearConstraint *constraint)
LinearExpression PositiveVarExpr(const LinearExpression &expr)
constexpr IntegerValue kMinIntegerValue(-kMaxIntegerValue.value())
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