14#ifndef OR_TOOLS_SAT_VAR_DOMINATION_H_
15#define OR_TOOLS_SAT_VAR_DOMINATION_H_
64 void Reset(
int num_variables);
90 absl::Span<const int64> coeffs);
92 absl::Span<const int> refs,
93 absl::Span<const int64> coeffs);
95 absl::Span<const int> refs,
96 absl::Span<const int64> coeffs);
117 IntegerVariable
var)
const;
124 struct IntegerVariableWithRank {
129 bool operator<(
const IntegerVariableWithRank& o)
const {
130 return rank < o.rank;
135 void RefinePartition(std::vector<int>* vars);
138 void MakeRankEqualToStartOfPart(absl::Span<IntegerVariableWithRank> span);
139 void FillTempRanks(
bool reverse_references,
140 absl::Span<const int> enforcements,
141 absl::Span<const int> refs,
142 absl::Span<const int64> coeffs);
146 absl::Span<const IntegerVariable> InitialDominatingCandidates(
147 IntegerVariable
var)
const;
148 void ProcessTempRanks();
149 void Initialize(absl::Span<IntegerVariableWithRank> span);
152 void FilterUsingTempRanks();
155 void CheckUsingTempRanks();
167 std::vector<IntegerVariableWithRank> tmp_ranks_;
174 std::vector<int> tmp_vars_;
175 std::unique_ptr<DynamicPartition> partition_;
180 int64 ct_index_for_signature_ = 0;
184 int num_vars_with_negation_;
189 struct IntegerVariableSpan {
196 std::vector<IntegerVariable> shared_buffer_;
201 std::vector<IntegerVariable> buffer_;
216 num_locks_.
assign(2 * num_variables, 0);
217 locking_ct_index_.
assign(2 * num_variables, -1);
221 void CannotDecrease(absl::Span<const int> refs,
int ct_index = -1);
222 void CannotIncrease(absl::Span<const int> refs,
int ct_index = -1);
226 template <
typename LinearProto>
229 const LinearProto& linear,
int64 min_activity,
244 return can_freely_decrease_until_[RefToIntegerVariable(ref)].value();
249 static IntegerVariable RefToIntegerVariable(
int ref) {
270 VarDomination* var_domination,
271 DualBoundStrengthening* dual_bound_strengthening);
void assign(size_type n, const value_type &val)
int64 CanFreelyDecreaseUntil(int ref) const
bool Strengthen(PresolveContext *context)
void Reset(int num_variables)
void CannotMove(absl::Span< const int > refs)
void ProcessLinearConstraint(bool is_objective, const PresolveContext &context, const LinearProto &linear, int64 min_activity, int64 max_activity)
void CannotIncrease(absl::Span< const int > refs, int ct_index=-1)
void CannotDecrease(absl::Span< const int > refs, int ct_index=-1)
void ActivityShouldNotDecrease(absl::Span< const int > enforcements, absl::Span< const int > refs, absl::Span< const int64 > coeffs)
bool CanFreelyDecrease(int ref) const
void ActivityShouldNotIncrease(absl::Span< const int > enforcements, absl::Span< const int > refs, absl::Span< const int64 > coeffs)
static int IntegerVariableToRef(IntegerVariable var)
void Reset(int num_variables)
void ActivityShouldNotChange(absl::Span< const int > refs, absl::Span< const int64 > coeffs)
absl::Span< const IntegerVariable > DominatingVariables(int ref) const
std::string DominationDebugString(IntegerVariable var) const
static IntegerVariable RefToIntegerVariable(int ref)
void CanOnlyDominateEachOther(absl::Span< const int > refs)
GurobiMPCallbackContext * context
bool VariableIsPositive(IntegerVariable i)
constexpr IntegerValue kMinIntegerValue(-kMaxIntegerValue)
void DetectDominanceRelations(const PresolveContext &context, VarDomination *var_domination, DualBoundStrengthening *dual_bound_strengthening)
bool ExploitDominanceRelations(const VarDomination &var_domination, PresolveContext *context)
bool RefIsPositive(int ref)
The vehicle routing library lets one model and solve generic vehicle routing problems ranging from th...