 |
OR-Tools
8.0
|
Go to the documentation of this file.
17 #ifndef OR_TOOLS_SAT_CLAUSE_H_
18 #define OR_TOOLS_SAT_CLAUSE_H_
25 #include "absl/container/flat_hash_map.h"
26 #include "absl/container/flat_hash_set.h"
27 #include "absl/container/inlined_vector.h"
28 #include "absl/types/span.h"
59 void operator delete(
void* p) {
64 int size()
const {
return size_; }
65 int empty()
const {
return size_ == 0; }
69 const Literal*
const end()
const {
return &(literals_[size_]); }
85 return absl::Span<const Literal>(&(literals_[1]), size_ - 1);
89 absl::Span<const Literal>
AsSpan()
const {
90 return absl::Span<const Literal>(&(literals_[0]), size_);
116 Literal* literals() {
return &(literals_[0]); }
121 void Clear() { size_ = 0; }
125 void Rewrite(absl::Span<const Literal> new_clause) {
127 for (
const Literal l : new_clause) literals_[size_++] = l;
134 Literal literals_[0];
165 void Resize(
int num_variables);
169 absl::Span<const Literal>
Reason(
const Trail& trail,
170 int trail_index)
const final;
179 bool AddClause(absl::Span<const Literal> literals);
223 return &clauses_info_;
229 return num_inspected_clause_literals_;
239 drat_proof_handler_ = drat_proof_handler;
246 for (; to_minimize_index_ < clauses_.size(); ++to_minimize_index_) {
247 if (!clauses_[to_minimize_index_]->IsAttached())
continue;
249 return clauses_[to_minimize_index_++];
277 SatClause* clause, absl::Span<const Literal> new_clause);
312 return watchers_on_false_[false_literal.
Index()];
322 bool PropagateOnFalse(
Literal false_literal,
Trail* trail);
336 std::vector<SatClause*> reasons_;
341 bool is_clean_ =
true;
346 int64 num_inspected_clauses_;
347 int64 num_inspected_clause_literals_;
348 int64 num_watched_clauses_;
352 bool all_clauses_are_attached_ =
true;
361 std::vector<SatClause*> clauses_;
363 int to_minimize_index_ = 0;
366 absl::flat_hash_map<SatClause*, ClauseInfo> clauses_info_;
392 if (p.first > p.second) std::swap(p.first, p.second);
393 if (set_.find(p) == set_.end()) {
395 newly_added_.push_back(c);
402 const std::vector<BinaryClause>&
newly_added()
const {
return newly_added_; }
406 absl::flat_hash_set<std::pair<int, int>> set_;
407 std::vector<BinaryClause> newly_added_;
459 stats_(
"BinaryImplicationGraph"),
468 LOG(INFO) <<
"num_redundant_implications " << num_redundant_implications_;
474 absl::Span<const Literal>
Reason(
const Trail& trail,
475 int trail_index)
const final;
478 void Resize(
int num_variables);
481 bool IsEmpty() {
return num_implications_ == 0 && at_most_ones_.
empty(); }
502 ABSL_MUST_USE_RESULT
bool AddAtMostOne(absl::Span<const Literal> at_most_one);
515 std::vector<Literal>* c);
519 const Trail& trail, std::vector<Literal>* c,
541 bool IsDag()
const {
return is_dag_; }
547 return reverse_topological_order_;
553 return implications_[l.
Index()];
560 if (l.
Index() >= representative_of_.
size())
return l;
587 int64 max_num_explored_nodes = 1e8);
607 CHECK_EQ(num_redundant_literals_ % 2, 0);
608 return num_redundant_literals_;
613 return num_redundant_implications_;
630 template <
typename Output>
635 absl::flat_hash_set<std::pair<LiteralIndex, LiteralIndex>>
637 for (LiteralIndex i(0); i < implications_.size(); ++i) {
639 for (
const Literal b : implications_[i]) {
645 duplicate_detection.insert({a.Index(), b.Index()}).second) {
646 out->AddBinaryClause(
a,
b);
653 drat_proof_handler_ = drat_proof_handler;
661 reasons_[trail_index] = new_reason.
Negated();
679 return estimated_sizes_[
literal.Index()];
692 BooleanVariable
var, std::deque<std::vector<Literal>>* postsolve_clauses);
701 bool FixLiteral(
Literal true_literal);
707 bool PropagateOnTrue(
Literal true_literal,
Trail* trail);
710 void RemoveRedundantLiterals(std::vector<Literal>* conflict);
714 void MarkDescendants(
Literal root);
720 std::vector<Literal> ExpandAtMostOne(
721 const absl::Span<const Literal> at_most_one);
727 bool CleanUpAndAddAtMostOnes(
const int base_index);
736 std::deque<Literal> reasons_;
749 int64 num_implications_ = 0;
759 std::vector<Literal> at_most_one_buffer_;
762 int64 num_propagations_ = 0;
763 int64 num_inspections_ = 0;
764 int64 num_minimization_ = 0;
765 int64 num_literals_removed_ = 0;
766 int64 num_redundant_implications_ = 0;
767 int64 num_redundant_literals_ = 0;
777 std::vector<Literal> dfs_stack_;
781 int64 work_done_in_mark_descendants_ = 0;
784 bool is_dag_ =
false;
785 std::vector<LiteralIndex> reverse_topological_order_;
790 std::vector<Literal> direct_implications_;
791 std::vector<Literal> direct_implications_of_negated_literal_;
797 int num_processed_fixed_variables_ = 0;
805 #endif // OR_TOOLS_SAT_CLAUSE_H_
bool Propagate(Trail *trail) final
bool LiteralIsTrue(Literal literal) const
void MinimizeConflictWithReachability(std::vector< Literal > *c)
~BinaryImplicationGraph() override
std::string DebugString() const
#define IF_STATS_ENABLED(instructions)
Literal SecondLiteral() const
bool DetectEquivalences(bool log_info=false)
SatClause * NextClauseToMinimize()
const LiteralIndex kNoLiteralIndex(-1)
BinaryImplicationGraph(Model *model)
int64 num_propagations() const
bool ComputeTransitiveReduction(bool log_info=false)
int64 num_clauses() const
absl::Span< const Literal > Reason(const Trail &trail, int trail_index) const final
void Detach(SatClause *clause)
const std::vector< Watcher > & WatcherListOnFalse(Literal false_literal) const
void MinimizeConflictFirst(const Trail &trail, std::vector< Literal > *c, SparseBitset< BooleanVariable > *marked)
bool IsRedundant(Literal l) const
bool operator==(BinaryClause o) const
int64 num_inspections() const
void Attach(SatClause *clause, Trail *trail)
int DirectImplicationsEstimatedSize(Literal literal) const
int64 num_implications() const
void InprocessingRemoveClause(SatClause *clause)
void ExtractAllBinaryClauses(Output *out) const
The vehicle routing library lets one model and solve generic vehicle routing problems ranging from th...
ABSL_MUST_USE_RESULT bool InprocessingFixLiteral(Literal true_literal)
absl::flat_hash_map< SatClause *, ClauseInfo > * mutable_clauses_info()
bool operator!=(BinaryClause o) const
int64 num_literals_removed() const
void SetDratProofHandler(DratProofHandler *drat_proof_handler)
void AddImplication(Literal a, Literal b)
void MinimizeConflictExperimental(const Trail &trail, std::vector< Literal > *c)
bool AddBinaryClauseDuringSearch(Literal a, Literal b)
Class that owns everything related to a particular optimization model.
bool IsRemoved(Literal l) const
void ChangeReason(int trail_index, Literal new_reason)
SatClause * ReasonClause(int trail_index) const
bool RemoveFixedLiteralsAndTestIfTrue(const VariablesAssignment &assignment)
void LazyDetach(SatClause *clause)
const absl::InlinedVector< Literal, 6 > & Implications(Literal l) const
void ChangeReason(int trail_index, int propagator_id)
void DeleteRemovedClauses()
~LiteralWatchers() override
void RemoveBooleanVariable(BooleanVariable var, std::deque< std::vector< Literal >> *postsolve_clauses)
void AddBinaryClause(Literal a, Literal b)
void ResetToMinimizeIndex()
int64 NumImplicationOnVariableRemoval(BooleanVariable var)
int64 num_inspected_clauses() const
bool protected_during_next_cleanup
absl::Span< const Literal > Reason(const Trail &trail, int trail_index) const final
const std::vector< SatClause * > & AllClausesInCreationOrder() const
SatClause * InprocessingAddClause(absl::Span< const Literal > new_clause)
A simple class to enforce both an elapsed time limit and a deterministic time limit in the same threa...
bool TransformIntoMaxCliques(std::vector< std::vector< Literal >> *at_most_ones, int64 max_num_explored_nodes=1e8)
int64 num_watched_clauses() const
bool AddClause(absl::Span< const Literal > literals, Trail *trail)
SatClause * AddRemovableClause(const std::vector< Literal > &literals, Trail *trail)
const VariablesAssignment & Assignment() const
int64 literal_size() const
bool Propagate(Trail *trail) final
const std::vector< BinaryClause > & newly_added() const
void MinimizeConflictFirstWithTransitiveReduction(const Trail &trail, std::vector< Literal > *c, SparseBitset< BooleanVariable > *marked, random_engine_t *random)
Watcher(SatClause *c, Literal b, int i=2)
Literal PropagatedLiteral() const
void RegisterPropagator(SatPropagator *propagator)
ABSL_MUST_USE_RESULT bool AddAtMostOne(absl::Span< const Literal > at_most_one)
bool IsSatisfied(const VariablesAssignment &assignment) const
Literal FirstLiteral() const
void CleanupAllRemovedVariables()
ABSL_MUST_USE_RESULT bool InprocessingRewriteClause(SatClause *clause, absl::Span< const Literal > new_clause)
const Literal *const end() const
LiteralWatchers(Model *model)
void SetDratProofHandler(DratProofHandler *drat_proof_handler)
int64 num_inspected_clause_literals() const
absl::Span< const Literal > PropagationReason() const
int64 literal_size() const
int64 num_removable_clauses() const
const std::vector< Literal > & DirectImplications(Literal literal)
void Resize(int num_variables)
std::string StatString() const
BinaryClause(Literal _a, Literal _b)
#define DISALLOW_COPY_AND_ASSIGN(TypeName)
bool FindFailedLiteralAroundVar(BooleanVariable var, bool *is_unsat)
bool IsRemovable(SatClause *const clause) const
const Literal *const begin() const
absl::Span< const Literal > AsSpan() const
int64 num_redundant_implications() const
const std::vector< LiteralIndex > & ReverseTopologicalOrder() const
void Resize(int num_variables)
LiteralIndex Index() const
static SatClause * Create(absl::Span< const Literal > literals)
void RemoveFixedVariables()
Literal RepresentativeOf(Literal l) const
std::mt19937 random_engine_t
int64 num_redundant_literals() const
int64 num_minimization() const
bool ContainsKey(const Collection &collection, const Key &key)