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_; }
386 drat_proof_handler_ = drat_proof_handler;
421 current - deterministic_time_at_last_advanced_time_limit_);
422 deterministic_time_at_last_advanced_time_limit_ = current;
432 bool PropagateAndStopAfterOneConflictResolution();
444 bool ClauseIsValidUnderDebugAssignement(
445 const std::vector<Literal>& clause)
const;
446 bool PBConstraintIsValidUnderDebugAssignment(
447 const std::vector<LiteralWithCoeff>& cst,
const Coefficient rhs)
const;
455 Status SolveInternal(
int assumption_level);
472 Status ReapplyDecisionsUpTo(
int level,
int* first_propagation_index);
475 bool IsMemoryLimitReached()
const;
478 bool SetModelUnsat();
481 int DecisionLevel(BooleanVariable
var)
const {
488 SatClause* ReasonClauseOrNull(BooleanVariable
var)
const;
489 UpperBoundedLinearConstraint* ReasonPbConstraintOrNull(
490 BooleanVariable
var)
const;
501 bool ResolvePBConflict(BooleanVariable
var,
502 MutableUpperBoundedLinearConstraint* conflict,
511 bool ClauseIsUsedAsReason(SatClause* clause)
const {
512 const BooleanVariable
var = clause->PropagatedLiteral().Variable();
515 ReasonClauseOrNull(
var) == clause;
520 bool AddProblemClauseInternal(absl::Span<const Literal> literals);
525 bool AddLinearConstraintInternal(
const std::vector<LiteralWithCoeff>& cst,
526 Coefficient rhs, Coefficient max_value);
534 int AddLearnedClauseAndEnqueueUnitPropagation(
535 const std::vector<Literal>& literals,
bool is_redundant);
539 void EnqueueNewDecision(Literal
literal);
545 bool PropagationIsDone()
const;
548 void InitializePropagators();
552 void Untrail(
int target_trail_index);
555 void ProcessNewlyFixedVariablesForDratProof();
559 int ComputeMaxTrailIndex(absl::Span<const Literal> clause)
const;
573 void ComputeFirstUIPConflict(
574 int max_trail_index, std::vector<Literal>* conflict,
575 std::vector<Literal>* reason_used_to_infer_the_conflict,
576 std::vector<SatClause*>* subsumed_clauses);
581 void ComputeUnionOfReasons(
const std::vector<Literal>&
input,
582 std::vector<Literal>* literals);
589 void FillUnsatAssumptions(Literal false_assumption,
590 std::vector<Literal>* unsat_assumptions);
596 void ComputePBConflict(
int max_trail_index, Coefficient initial_slack,
597 MutableUpperBoundedLinearConstraint* conflict,
598 int* backjump_level);
608 void MinimizeConflict(
609 std::vector<Literal>* conflict,
610 std::vector<Literal>* reason_used_to_infer_the_conflict);
611 void MinimizeConflictExperimental(std::vector<Literal>* conflict);
612 void MinimizeConflictSimple(std::vector<Literal>* conflict);
613 void MinimizeConflictRecursively(std::vector<Literal>* conflict);
616 bool CanBeInferedFromConflictVariables(BooleanVariable variable);
623 bool IsConflictValid(
const std::vector<Literal>& literals);
627 int ComputeBacktrackLevel(
const std::vector<Literal>& literals);
642 template <
typename LiteralList>
643 int ComputeLbd(
const LiteralList& literals);
647 void CleanClauseDatabaseIfNeeded();
651 void BumpReasonActivities(
const std::vector<Literal>& literals);
652 void BumpClauseActivity(SatClause* clause);
653 void RescaleClauseActivities(
double scaling_factor);
654 void UpdateClauseActivityIncrement();
656 std::string DebugString(
const SatClause& clause)
const;
657 std::string StatusString(
Status status)
const;
658 std::string RunningStatisticsString()
const;
662 void KeepAllClauseUsedToInfer(BooleanVariable variable);
668 void TryToMinimizeClause(SatClause* clause);
672 std::unique_ptr<Model> owned_model_;
674 BooleanVariable num_variables_ = BooleanVariable(0);
678 BinaryImplicationGraph* binary_implication_graph_;
679 LiteralWatchers* clauses_propagator_;
680 PbConstraints* pb_constraints_;
683 std::vector<SatPropagator*> propagators_;
686 std::vector<SatPropagator*> external_propagators_;
687 SatPropagator* last_propagator_ =
nullptr;
690 std::vector<std::unique_ptr<SatPropagator>> owned_propagators_;
693 bool track_binary_clauses_;
694 BinaryClauseManager binary_clauses_;
698 TimeLimit* time_limit_;
699 SatParameters* parameters_;
700 RestartPolicy* restart_;
701 SatDecisionPolicy* decision_policy_;
704 VariablesAssignment debug_assignment_;
710 int current_decision_level_ = 0;
711 std::vector<Decision> decisions_;
715 int last_decision_or_backtrack_trail_index_ = 0;
718 int assumption_level_ = 0;
723 int num_processed_fixed_variables_ = 0;
724 double deterministic_time_of_last_fixed_variables_cleanup_ = 0.0;
727 int drat_num_processed_fixed_variables_ = 0;
735 int64 num_minimizations = 0;
736 int64 num_literals_removed = 0;
739 int64 num_learned_pb_literals = 0;
742 int64 num_literals_learned = 0;
743 int64 num_literals_forgotten = 0;
744 int64 num_subsumed_clauses = 0;
747 int64 minimization_num_clauses = 0;
748 int64 minimization_num_decisions = 0;
749 int64 minimization_num_true = 0;
750 int64 minimization_num_subsumed = 0;
751 int64 minimization_num_removed_literals = 0;
760 bool model_is_unsat_ =
false;
763 double clause_activity_increment_;
767 int num_learned_clause_before_cleanup_ = 0;
770 SparseBitset<BooleanVariable> is_marked_;
771 SparseBitset<BooleanVariable> is_independent_;
772 SparseBitset<BooleanVariable> tmp_mark_;
773 std::vector<int> min_trail_index_per_level_;
776 std::vector<BooleanVariable> dfs_stack_;
777 std::vector<BooleanVariable> variable_to_process_;
780 std::vector<Literal> literals_scratchpad_;
783 DEFINE_INT_TYPE(SatDecisionLevel,
int);
784 SparseBitset<SatDecisionLevel> is_level_marked_;
787 std::vector<Literal> learned_conflict_;
788 std::vector<Literal> reason_used_to_infer_the_conflict_;
789 std::vector<Literal> extra_reason_literals_;
790 std::vector<SatClause*> subsumed_clauses_;
797 bool block_clause_deletion_ =
false;
801 VariableWithSameReasonIdentifier same_reason_identifier_;
804 std::vector<LiteralWithCoeff> tmp_pb_constraint_;
807 bool is_relevant_for_core_computation_;
810 MutableUpperBoundedLinearConstraint pb_conflict_;
815 double deterministic_time_at_last_advanced_time_limit_ = 0;
818 bool problem_is_pure_sat_;
820 DratProofHandler* drat_proof_handler_;
822 mutable StatsGroup stats_;
833 int64 lower_bound,
int64 upper_bound, std::vector<LiteralWithCoeff>* cst) {
836 true, Coefficient(lower_bound),
837 true, Coefficient(upper_bound), cst);
843 const std::vector<Literal>& literals) {
845 std::vector<LiteralWithCoeff> cst;
846 cst.reserve(literals.size());
847 for (
int i = 0; i < literals.size(); ++i) {
848 cst.emplace_back(literals[i], 1);
851 true, Coefficient(lower_bound),
852 true, Coefficient(upper_bound), &cst);
857 const std::vector<Literal>& literals) {
859 std::vector<LiteralWithCoeff> cst;
860 cst.reserve(literals.size());
861 for (
const Literal l : literals) {
862 cst.emplace_back(l, Coefficient(1));
865 true, Coefficient(1),
866 true, Coefficient(1), &cst);
871 const std::vector<Literal>& literals) {
873 std::vector<LiteralWithCoeff> cst;
874 cst.reserve(literals.size());
875 for (
const Literal l : literals) {
876 cst.emplace_back(l, Coefficient(1));
879 false, Coefficient(0),
880 true, Coefficient(1), &cst);
885 absl::Span<const Literal> literals) {
887 std::vector<LiteralWithCoeff> cst;
888 cst.reserve(literals.size());
889 for (
const Literal l : literals) {
890 cst.emplace_back(l, Coefficient(1));
893 true, Coefficient(1),
894 false, Coefficient(1), &cst);
915 const std::vector<Literal>& literals,
Literal r) {
917 std::vector<Literal> clause;
918 for (
const Literal l : literals) {
931 absl::Span<const Literal> enforcement_literals,
932 absl::Span<const Literal> clause) {
934 std::vector<Literal> tmp;
935 for (
const Literal l : enforcement_literals) {
936 tmp.push_back(l.Negated());
938 for (
const Literal l : clause) {
949 const std::vector<Literal>& literals,
Literal r) {
951 std::vector<Literal> clause;
952 for (
const Literal l : literals) {
954 clause.push_back(l.Negated());
1002 std::vector<Literal> clause_to_exclude_solution;
1003 clause_to_exclude_solution.reserve(current_level);
1004 for (
int i = 0; i < current_level; ++i) {
1005 clause_to_exclude_solution.push_back(
1006 sat_solver->
Decisions()[i].literal.Negated());
1023 #endif // OR_TOOLS_SAT_SAT_SOLVER_H_