14 #ifndef OR_TOOLS_SAT_PRESOLVE_UTIL_H_
15 #define OR_TOOLS_SAT_PRESOLVE_UTIL_H_
23 #include "absl/container/flat_hash_map.h"
24 #include "absl/random/bit_gen_ref.h"
25 #include "absl/random/random.h"
26 #include "absl/strings/string_view.h"
27 #include "absl/types/span.h"
31 #include "ortools/sat/cp_model.pb.h"
73 absl::Span<const int> clause);
85 DEFINE_STRONG_INDEX_TYPE(
Index);
86 Index IndexFromLiteral(
int ref)
const {
87 return Index(ref >= 0 ? 2 * ref : -2 * ref - 1);
90 std::vector<int> tmp_num_occurrences_;
94 absl::flat_hash_map<std::pair<Index, int>,
Domain> deductions_;
100 const ConstraintProto& definition, ConstraintProto*
ct);
138 absl::Span<
const std::pair<int, int64_t>> terms,
139 std::vector<std::array<int64_t, 2>>* conditional =
nullptr) {
140 return ComputeActivity(
false, terms, conditional);
143 absl::Span<
const std::pair<int, int64_t>> terms,
144 std::vector<std::array<int64_t, 2>>* conditional =
nullptr) {
145 return ComputeActivity(
true, terms, conditional);
157 absl::flat_hash_set<int>* literals_at_true);
162 absl::Span<const int> literals);
165 bool IsAmo(absl::Span<const int> literals);
168 DEFINE_STRONG_INDEX_TYPE(
Index);
169 Index IndexFromLiteral(
int ref)
const {
170 return Index(ref >= 0 ? 2 * ref : -2 * ref - 1);
173 int64_t ComputeActivity(
174 bool compute_min, absl::Span<
const std::pair<int, int64_t>> terms,
175 std::vector<std::array<int64_t, 2>>* conditional =
nullptr);
177 void PartitionIntoAmo(absl::Span<
const std::pair<int, int64_t>> terms);
181 int64_t ComputeMaxActivityInternal(
182 absl::Span<
const std::pair<int, int64_t>> terms,
183 std::vector<std::array<int64_t, 2>>* conditional =
nullptr);
187 int num_at_most_ones_ = 0;
190 std::vector<std::pair<int, int64_t>> tmp_terms_;
191 std::vector<std::pair<int64_t, int>> to_sort_;
194 absl::flat_hash_map<int, int> used_amo_to_dense_index_;
195 absl::flat_hash_map<int, int64_t> amo_sums_;
196 std::vector<int> partition_;
197 std::vector<int64_t> max_by_partition_;
198 std::vector<int64_t> second_max_by_partition_;
201 std::vector<int> part_starts_;
202 std::vector<int> part_ends_;
203 std::vector<int> part_sizes_;
204 std::vector<int> reordered_literals_;
206 absl::flat_hash_set<int> triggered_amo_;
221 return clause_to_hash_[c] ^ literal_to_hash_[IndexFromLiteral(ref)];
228 DEFINE_STRONG_INDEX_TYPE(
Index);
229 Index IndexFromLiteral(
int ref)
const {
230 return Index(ref >= 0 ? 2 * ref : -2 * ref - 1);
233 absl::BitGenRef random_;
235 std::vector<uint64_t> clause_to_hash_;
248 absl::Span<const int> enforcement,
250 if (clause.size() != enforcement.size() + 1)
return false;
252 for (
int i = 0; i < clause.size(); ++i) {
253 if (clause[i] ==
literal)
continue;
254 if (clause[i] !=
NegatedRef(enforcement[j]))
return false;
We call domain any subset of Int64 = [kint64min, kint64max].
void ClearAndResize(IntegerType size)
std::vector< absl::Span< const int > > PartitionLiteralsIntoAmo(absl::Span< const int > literals)
bool IsAmo(absl::Span< const int > literals)
bool PresolveEnforcement(absl::Span< const int > refs, ConstraintProto *ct, absl::flat_hash_set< int > *literals_at_true)
void AddAtMostOne(absl::Span< const int > amo)
int64_t ComputeMinActivity(absl::Span< const std::pair< int, int64_t >> terms, std::vector< std::array< int64_t, 2 >> *conditional=nullptr)
int64_t ComputeMaxActivity(absl::Span< const std::pair< int, int64_t >> terms, std::vector< std::array< int64_t, 2 >> *conditional=nullptr)
void AddAllAtMostOnes(const CpModelProto &proto)
ClauseWithOneMissingHasher(absl::BitGenRef random)
uint64_t HashOfNegatedLiterals(absl::Span< const int > literals)
uint64_t HashWithout(int c, int ref) const
void RegisterClause(int c, absl::Span< const int > clause)
std::vector< std::pair< int, Domain > > ProcessClause(absl::Span< const int > clause)
void MarkProcessingAsDoneForNow()
Domain ImpliedDomain(int literal_ref, int var) const
int NumDeductions() const
void AddDeduction(int literal_ref, int var, Domain domain)
bool ClauseIsEnforcementImpliesLiteral(absl::Span< const int > clause, absl::Span< const int > enforcement, int literal)
bool SubstituteVariable(int var, int64_t var_coeff_in_definition, const ConstraintProto &definition, ConstraintProto *ct)
Collection of objects used to extend the Constraint Solver library.