14 #ifndef OR_TOOLS_SAT_VAR_DOMINATION_H_
15 #define OR_TOOLS_SAT_VAR_DOMINATION_H_
66 void Reset(
int num_variables);
92 absl::Span<const int64_t> coeffs);
94 absl::Span<const int> refs,
95 absl::Span<const int64_t> coeffs);
97 absl::Span<const int> refs,
98 absl::Span<const int64_t> coeffs);
119 IntegerVariable
var)
const;
126 struct IntegerVariableWithRank {
131 bool operator<(
const IntegerVariableWithRank& o)
const {
132 return rank < o.rank;
137 void RefinePartition(std::vector<int>* vars);
140 void MakeRankEqualToStartOfPart(absl::Span<IntegerVariableWithRank> span);
141 void FillTempRanks(
bool reverse_references,
142 absl::Span<const int> enforcements,
143 absl::Span<const int> refs,
144 absl::Span<const int64_t> coeffs);
148 absl::Span<const IntegerVariable> InitialDominatingCandidates(
149 IntegerVariable
var)
const;
150 void ProcessTempRanks();
151 void Initialize(absl::Span<IntegerVariableWithRank> span);
154 void FilterUsingTempRanks();
157 void CheckUsingTempRanks();
169 std::vector<IntegerVariableWithRank> tmp_ranks_;
176 std::vector<int> tmp_vars_;
177 std::unique_ptr<DynamicPartition> partition_;
182 int64_t ct_index_for_signature_ = 0;
186 int num_vars_with_negation_;
191 struct IntegerVariableSpan {
198 std::vector<IntegerVariable> shared_buffer_;
203 std::vector<IntegerVariable> buffer_;
218 num_locks_.
assign(2 * num_variables, 0);
219 locking_ct_index_.
assign(2 * num_variables, -1);
223 void CannotDecrease(absl::Span<const int> refs,
int ct_index = -1);
224 void CannotIncrease(absl::Span<const int> refs,
int ct_index = -1);
228 template <
typename LinearProto>
231 const LinearProto& linear, int64_t min_activity,
232 int64_t max_activity);
246 return can_freely_decrease_until_[RefToIntegerVariable(ref)].value();
251 static IntegerVariable RefToIntegerVariable(
int ref) {
272 VarDomination* var_domination,
273 DualBoundStrengthening* dual_bound_strengthening);
void assign(size_type n, const value_type &val)
bool Strengthen(PresolveContext *context)
void ProcessLinearConstraint(bool is_objective, const PresolveContext &context, const LinearProto &linear, int64_t min_activity, int64_t max_activity)
void Reset(int num_variables)
int64_t CanFreelyDecreaseUntil(int ref) const
void CannotMove(absl::Span< const int > refs)
void CannotIncrease(absl::Span< const int > refs, int ct_index=-1)
void CannotDecrease(absl::Span< const int > refs, int ct_index=-1)
void ActivityShouldNotIncrease(absl::Span< const int > enforcements, absl::Span< const int > refs, absl::Span< const int64_t > coeffs)
void ActivityShouldNotChange(absl::Span< const int > refs, absl::Span< const int64_t > coeffs)
bool CanFreelyDecrease(int ref) const
static int IntegerVariableToRef(IntegerVariable var)
void Reset(int num_variables)
void ActivityShouldNotDecrease(absl::Span< const int > enforcements, absl::Span< const int > refs, absl::Span< const int64_t > 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 RefIsPositive(int ref)
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 VariableIsPositive(IntegerVariable i)
Collection of objects used to extend the Constraint Solver library.