14 #ifndef OR_TOOLS_SAT_VAR_DOMINATION_H_
15 #define OR_TOOLS_SAT_VAR_DOMINATION_H_
22 #include "absl/types/span.h"
70 void Reset(
int num_variables);
96 absl::Span<const int64_t> coeffs);
98 absl::Span<const int> refs,
99 absl::Span<const int64_t> coeffs);
101 absl::Span<const int> refs,
102 absl::Span<const int64_t> coeffs);
126 IntegerVariable
var)
const;
133 struct IntegerVariableWithRank {
138 bool operator<(
const IntegerVariableWithRank& o)
const {
139 return rank < o.rank;
144 void RefinePartition(std::vector<int>* vars);
147 void MakeRankEqualToStartOfPart(absl::Span<IntegerVariableWithRank> span);
148 void FillTempRanks(
bool reverse_references,
149 absl::Span<const int> enforcements,
150 absl::Span<const int> refs,
151 absl::Span<const int64_t> coeffs);
155 absl::Span<const IntegerVariable> InitialDominatingCandidates(
156 IntegerVariable
var)
const;
157 void ProcessTempRanks();
158 void Initialize(absl::Span<IntegerVariableWithRank> span);
161 void FilterUsingTempRanks();
164 void CheckUsingTempRanks();
176 std::vector<IntegerVariableWithRank> tmp_ranks_;
183 std::vector<int> tmp_vars_;
184 std::unique_ptr<SimpleDynamicPartition> partition_;
189 int64_t ct_index_for_signature_ = 0;
193 int num_vars_with_negation_;
198 struct IntegerVariableSpan {
205 std::vector<IntegerVariable> shared_buffer_;
210 std::vector<IntegerVariable> buffer_;
225 num_locks_.
assign(2 * num_variables, 0);
226 locking_ct_index_.
assign(2 * num_variables, -1);
230 void CannotDecrease(absl::Span<const int> refs,
int ct_index = -1);
231 void CannotIncrease(absl::Span<const int> refs,
int ct_index = -1);
232 void CannotMove(absl::Span<const int> refs,
int ct_index = -1);
235 template <
typename LinearProto>
238 const LinearProto& linear, int64_t min_activity,
239 int64_t max_activity,
int ct_index = -1);
253 return can_freely_decrease_until_[RefToIntegerVariable(ref)].value();
261 static IntegerVariable RefToIntegerVariable(
int ref) {
277 int num_deleted_constraints_ = 0;
284 VarDomination* var_domination,
285 DualBoundStrengthening* dual_bound_strengthening);
void assign(size_type n, const value_type &val)
bool Strengthen(PresolveContext *context)
int NumDeletedConstraints() const
void Reset(int num_variables)
int64_t CanFreelyDecreaseUntil(int ref) const
void ProcessLinearConstraint(bool is_objective, const PresolveContext &context, const LinearProto &linear, int64_t min_activity, int64_t max_activity, int ct_index=-1)
void CannotMove(absl::Span< const int > refs, int ct_index=-1)
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.value())
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.