19 #ifndef OR_TOOLS_SAT_SAT_SOLVER_H_
20 #define OR_TOOLS_SAT_SAT_SOLVER_H_
29 #include "absl/container/flat_hash_map.h"
30 #include "absl/types/span.h"
90 return BooleanVariable(num_vars);
126 bool use_upper_bound, Coefficient upper_bound,
127 std::vector<LiteralWithCoeff>* cst);
144 owned_propagators_.push_back(std::move(propagator));
161 const std::vector<std::pair<Literal, double>>& prefs) {
163 for (
const std::pair<Literal, double> p : prefs) {
210 const std::vector<Literal>& assumptions);
320 template <
typename Output>
328 if (num_processed_fixed_variables_ < trail_->
Index()) {
339 out->AddClause(clause->AsSpan());
360 const std::vector<Decision>&
Decisions()
const {
return decisions_; }
391 drat_proof_handler_ = drat_proof_handler;
426 current - deterministic_time_at_last_advanced_time_limit_);
427 deterministic_time_at_last_advanced_time_limit_ = current;
434 if (!decisions_.empty())
return decisions_[0].trail_index;
436 return trail_->
Index();
443 bool PropagateAndStopAfterOneConflictResolution();
455 bool ClauseIsValidUnderDebugAssignement(
456 const std::vector<Literal>& clause)
const;
457 bool PBConstraintIsValidUnderDebugAssignment(
458 const std::vector<LiteralWithCoeff>& cst,
const Coefficient rhs)
const;
466 Status SolveInternal(
int assumption_level);
483 Status ReapplyDecisionsUpTo(
int level,
int* first_propagation_index);
486 bool IsMemoryLimitReached()
const;
489 bool SetModelUnsat();
492 int DecisionLevel(BooleanVariable
var)
const {
499 SatClause* ReasonClauseOrNull(BooleanVariable
var)
const;
500 UpperBoundedLinearConstraint* ReasonPbConstraintOrNull(
501 BooleanVariable
var)
const;
512 bool ResolvePBConflict(BooleanVariable
var,
513 MutableUpperBoundedLinearConstraint* conflict,
522 bool ClauseIsUsedAsReason(SatClause* clause)
const {
523 const BooleanVariable
var = clause->PropagatedLiteral().Variable();
526 ReasonClauseOrNull(
var) == clause;
531 bool AddProblemClauseInternal(absl::Span<const Literal> literals);
536 bool AddLinearConstraintInternal(
const std::vector<LiteralWithCoeff>& cst,
537 Coefficient rhs, Coefficient max_value);
545 int AddLearnedClauseAndEnqueueUnitPropagation(
546 const std::vector<Literal>& literals,
bool is_redundant);
550 void EnqueueNewDecision(Literal
literal);
556 bool PropagationIsDone()
const;
559 void InitializePropagators();
563 void Untrail(
int target_trail_index);
566 void ProcessNewlyFixedVariablesForDratProof();
570 int ComputeMaxTrailIndex(absl::Span<const Literal> clause)
const;
584 void ComputeFirstUIPConflict(
585 int max_trail_index, std::vector<Literal>* conflict,
586 std::vector<Literal>* reason_used_to_infer_the_conflict,
587 std::vector<SatClause*>* subsumed_clauses);
592 void ComputeUnionOfReasons(
const std::vector<Literal>&
input,
593 std::vector<Literal>* literals);
600 void FillUnsatAssumptions(Literal false_assumption,
601 std::vector<Literal>* unsat_assumptions);
607 void ComputePBConflict(
int max_trail_index, Coefficient initial_slack,
608 MutableUpperBoundedLinearConstraint* conflict,
609 int* backjump_level);
619 void MinimizeConflict(
620 std::vector<Literal>* conflict,
621 std::vector<Literal>* reason_used_to_infer_the_conflict);
622 void MinimizeConflictExperimental(std::vector<Literal>* conflict);
623 void MinimizeConflictSimple(std::vector<Literal>* conflict);
624 void MinimizeConflictRecursively(std::vector<Literal>* conflict);
627 bool CanBeInferedFromConflictVariables(BooleanVariable variable);
634 bool IsConflictValid(
const std::vector<Literal>& literals);
638 int ComputeBacktrackLevel(
const std::vector<Literal>& literals);
653 template <
typename LiteralList>
654 int ComputeLbd(
const LiteralList& literals);
658 void CleanClauseDatabaseIfNeeded();
662 void BumpReasonActivities(
const std::vector<Literal>& literals);
663 void BumpClauseActivity(SatClause* clause);
664 void RescaleClauseActivities(
double scaling_factor);
665 void UpdateClauseActivityIncrement();
667 std::string DebugString(
const SatClause& clause)
const;
668 std::string StatusString(
Status status)
const;
669 std::string RunningStatisticsString()
const;
673 void KeepAllClauseUsedToInfer(BooleanVariable variable);
679 void TryToMinimizeClause(SatClause* clause);
683 std::unique_ptr<Model> owned_model_;
685 BooleanVariable num_variables_ = BooleanVariable(0);
689 BinaryImplicationGraph* binary_implication_graph_;
690 LiteralWatchers* clauses_propagator_;
691 PbConstraints* pb_constraints_;
694 std::vector<SatPropagator*> propagators_;
697 std::vector<SatPropagator*> external_propagators_;
698 SatPropagator* last_propagator_ =
nullptr;
701 std::vector<std::unique_ptr<SatPropagator>> owned_propagators_;
704 bool track_binary_clauses_;
705 BinaryClauseManager binary_clauses_;
709 TimeLimit* time_limit_;
710 SatParameters* parameters_;
711 RestartPolicy* restart_;
712 SatDecisionPolicy* decision_policy_;
715 VariablesAssignment debug_assignment_;
721 int current_decision_level_ = 0;
722 std::vector<Decision> decisions_;
726 int last_decision_or_backtrack_trail_index_ = 0;
729 int assumption_level_ = 0;
734 int num_processed_fixed_variables_ = 0;
735 double deterministic_time_of_last_fixed_variables_cleanup_ = 0.0;
738 int drat_num_processed_fixed_variables_ = 0;
747 int64 num_minimizations = 0;
748 int64 num_literals_removed = 0;
751 int64 num_learned_pb_literals = 0;
754 int64 num_literals_learned = 0;
755 int64 num_literals_forgotten = 0;
756 int64 num_subsumed_clauses = 0;
759 int64 minimization_num_clauses = 0;
760 int64 minimization_num_decisions = 0;
761 int64 minimization_num_true = 0;
762 int64 minimization_num_subsumed = 0;
763 int64 minimization_num_removed_literals = 0;
772 bool model_is_unsat_ =
false;
775 double clause_activity_increment_;
779 int num_learned_clause_before_cleanup_ = 0;
782 SparseBitset<BooleanVariable> is_marked_;
783 SparseBitset<BooleanVariable> is_independent_;
784 SparseBitset<BooleanVariable> tmp_mark_;
785 std::vector<int> min_trail_index_per_level_;
788 std::vector<BooleanVariable> dfs_stack_;
789 std::vector<BooleanVariable> variable_to_process_;
792 std::vector<Literal> literals_scratchpad_;
795 DEFINE_INT_TYPE(SatDecisionLevel,
int);
796 SparseBitset<SatDecisionLevel> is_level_marked_;
799 std::vector<Literal> learned_conflict_;
800 std::vector<Literal> reason_used_to_infer_the_conflict_;
801 std::vector<Literal> extra_reason_literals_;
802 std::vector<SatClause*> subsumed_clauses_;
809 bool block_clause_deletion_ =
false;
813 VariableWithSameReasonIdentifier same_reason_identifier_;
816 std::vector<LiteralWithCoeff> tmp_pb_constraint_;
819 bool is_relevant_for_core_computation_;
822 MutableUpperBoundedLinearConstraint pb_conflict_;
827 double deterministic_time_at_last_advanced_time_limit_ = 0;
830 bool problem_is_pure_sat_;
832 DratProofHandler* drat_proof_handler_;
834 mutable StatsGroup stats_;
845 void MinimizeCore(SatSolver* solver, std::vector<Literal>* core);
854 int64 lower_bound,
int64 upper_bound, std::vector<LiteralWithCoeff>* cst) {
857 true, Coefficient(lower_bound),
858 true, Coefficient(upper_bound), cst);
864 const std::vector<Literal>& literals) {
866 std::vector<LiteralWithCoeff> cst;
867 cst.reserve(literals.size());
868 for (
int i = 0; i < literals.size(); ++i) {
869 cst.emplace_back(literals[i], 1);
872 true, Coefficient(lower_bound),
873 true, Coefficient(upper_bound), &cst);
878 const std::vector<Literal>& literals) {
880 std::vector<LiteralWithCoeff> cst;
881 cst.reserve(literals.size());
882 for (
const Literal l : literals) {
883 cst.emplace_back(l, Coefficient(1));
886 true, Coefficient(1),
887 true, Coefficient(1), &cst);
892 const std::vector<Literal>& literals) {
894 std::vector<LiteralWithCoeff> cst;
895 cst.reserve(literals.size());
896 for (
const Literal l : literals) {
897 cst.emplace_back(l, Coefficient(1));
900 false, Coefficient(0),
901 true, Coefficient(1), &cst);
906 absl::Span<const Literal> literals) {
908 std::vector<LiteralWithCoeff> cst;
909 cst.reserve(literals.size());
910 for (
const Literal l : literals) {
911 cst.emplace_back(l, Coefficient(1));
914 true, Coefficient(1),
915 false, Coefficient(1), &cst);
936 const std::vector<Literal>& literals,
Literal r) {
938 std::vector<Literal> clause;
939 for (
const Literal l : literals) {
952 absl::Span<const Literal> enforcement_literals,
953 absl::Span<const Literal> clause) {
955 std::vector<Literal> tmp;
956 for (
const Literal l : enforcement_literals) {
957 tmp.push_back(l.Negated());
959 for (
const Literal l : clause) {
970 const std::vector<Literal>& literals,
Literal r) {
972 std::vector<Literal> clause;
973 for (
const Literal l : literals) {
975 clause.push_back(l.Negated());
1023 std::vector<Literal> clause_to_exclude_solution;
1024 clause_to_exclude_solution.reserve(current_level);
1025 for (
int i = 0; i < current_level; ++i) {
1026 clause_to_exclude_solution.push_back(
1027 sat_solver->
Decisions()[i].literal.Negated());
1044 #endif // OR_TOOLS_SAT_SAT_SOLVER_H_