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);
123 IntegerVariable
var)
const;
130 struct IntegerVariableWithRank {
135 bool operator<(
const IntegerVariableWithRank& o)
const {
136 return rank < o.rank;
141 void RefinePartition(std::vector<int>* vars);
144 void MakeRankEqualToStartOfPart(absl::Span<IntegerVariableWithRank> span);
145 void FillTempRanks(
bool reverse_references,
146 absl::Span<const int> enforcements,
147 absl::Span<const int> refs,
148 absl::Span<const int64_t> coeffs);
152 absl::Span<const IntegerVariable> InitialDominatingCandidates(
153 IntegerVariable
var)
const;
154 void ProcessTempRanks();
155 void Initialize(absl::Span<IntegerVariableWithRank> span);
158 void FilterUsingTempRanks();
161 void CheckUsingTempRanks();
173 std::vector<IntegerVariableWithRank> tmp_ranks_;
180 std::vector<int> tmp_vars_;
181 std::unique_ptr<DynamicPartition> partition_;
186 int64_t ct_index_for_signature_ = 0;
190 int num_vars_with_negation_;
195 struct IntegerVariableSpan {
202 std::vector<IntegerVariable> shared_buffer_;
207 std::vector<IntegerVariable> buffer_;
222 num_locks_.
assign(2 * num_variables, 0);
223 locking_ct_index_.
assign(2 * num_variables, -1);
227 void CannotDecrease(absl::Span<const int> refs,
int ct_index = -1);
228 void CannotIncrease(absl::Span<const int> refs,
int ct_index = -1);
232 template <
typename LinearProto>
235 const LinearProto& linear, int64_t min_activity,
236 int64_t max_activity);
250 return can_freely_decrease_until_[RefToIntegerVariable(ref)].value();
255 static IntegerVariable RefToIntegerVariable(
int ref) {
276 VarDomination* var_domination,
277 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.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.