16#ifndef OR_TOOLS_SAT_SAT_BASE_H_
17#define OR_TOOLS_SAT_SAT_BASE_H_
26#include "absl/base/attributes.h"
27#include "absl/strings/str_format.h"
28#include "absl/strings/string_view.h"
29#include "absl/types/span.h"
72 : index_(signed_value > 0 ? ((signed_value - 1) << 1)
73 : ((-signed_value - 1) << 1) ^ 1) {
79 Literal(BooleanVariable variable,
bool is_positive)
80 : index_(is_positive ? (variable.
value() << 1)
81 : (variable.
value() << 1) ^ 1) {}
83 BooleanVariable
Variable()
const {
return BooleanVariable(index_ >> 1); }
87 LiteralIndex
Index()
const {
return LiteralIndex(index_); }
88 LiteralIndex
NegatedIndex()
const {
return LiteralIndex(index_ ^ 1); }
91 return (index_ & 1) ? -((index_ >> 1) + 1) : ((index_ >> 1) + 1);
116 absl::Span<const Literal> literals) {
130 assignment_.
Resize(LiteralIndex(num_variables << 1));
214 return absl::StrFormat(
"level:%d type:%d trail_index:%d",
level,
type,
218static_assert(
sizeof(AssignmentInfo) == 8,
219 "ERROR_AssignmentInfo_is_not_well_compacted");
242 current_info_.
level = 0;
245 void Resize(
int num_variables);
256 current_info_.
type = propagator_id;
257 info_[true_literal.
Variable()] = current_info_;
276 BooleanVariable reference_var) {
277 reference_var_with_same_reason_as_[true_literal.
Variable()] = reference_var;
296 const BooleanVariable
var = true_literal.
Variable();
297 reasons_[
var] = reasons_repository_[info_[
var].trail_index];
298 old_type_[
var] = info_[
var].type;
308 absl::Span<const Literal>
Reason(BooleanVariable
var)
const;
324 if (trail_index >= reasons_repository_.size()) {
325 reasons_repository_.resize(trail_index + 1);
327 reasons_repository_[trail_index].clear();
328 return &reasons_repository_[trail_index];
339 const BooleanVariable
var = trail_[trail_index].Variable();
340 info_[
var].type = propagator_id;
341 old_type_[
var] = propagator_id;
348 num_untrailed_enqueues_ +=
index - target_trail_index;
349 for (
int i = target_trail_index; i <
index; ++i) {
365 failing_sat_clause_ =
nullptr;
393 for (
int i = 0; i < current_info_.
trail_index; ++i) {
394 if (!result.empty()) result +=
" ";
395 result += trail_[i].DebugString();
401 int64_t num_untrailed_enqueues_ = 0;
404 std::vector<Literal> trail_;
405 std::vector<Literal> conflict_;
411 reference_var_with_same_reason_as_;
436 mutable std::deque<std::vector<Literal>> reasons_repository_;
442 std::vector<SatPropagator*> propagators_;
444 DISALLOW_COPY_AND_ASSIGN(
Trail);
493 int trail_index)
const {
511 virtual bool IsEmpty()
const {
return false; }
527 const Trail& trail)
const {
531 <<
" trail_.Index()=" << trail.
Index();
539 <<
" trail_.Index()=" << trail.
Index()
540 <<
" level_at_propagation_index="
549 assignment_.
Resize(num_variables);
550 info_.resize(num_variables);
551 trail_.resize(num_variables);
552 reasons_.resize(num_variables);
556 old_type_.
resize(num_variables);
557 reference_var_with_same_reason_as_.
resize(num_variables);
561 if (propagators_.empty()) {
566 propagators_.push_back(propagator);
570 BooleanVariable
var)
const {
574 var = reference_var_with_same_reason_as_[
var];
583 var = reference_var_with_same_reason_as_[
var];
586 const int type = info_[
var].type;
608 return reasons_[
var];
#define DCHECK_NE(val1, val2)
#define CHECK_LT(val1, val2)
#define DCHECK_GE(val1, val2)
#define CHECK_NE(val1, val2)
#define DCHECK_LT(val1, val2)
#define DCHECK(condition)
void resize(size_type new_size)
void Resize(IndexType size)
bool IsSet(IndexType i) const
void ClearTwoBits(IndexType i)
bool AreOneOfTwoBitsSet(IndexType i) const
Literal(int signed_value)
LiteralIndex NegatedIndex() const
LiteralIndex Index() const
Literal(LiteralIndex index)
Literal(BooleanVariable variable, bool is_positive)
BooleanVariable Variable() const
std::string DebugString() const
bool operator==(Literal other) const
bool operator!=(Literal other) const
bool operator<(const Literal &literal) const
Class that owns everything related to a particular optimization model.
int propagation_trail_index_
void SetPropagatorId(int id)
virtual bool Propagate(Trail *trail)=0
SatPropagator(const std::string &name)
bool PropagatePreconditionsAreSatisfied(const Trail &trail) const
virtual void Untrail(const Trail &trail, int trail_index)
virtual bool IsEmpty() const
virtual absl::Span< const Literal > Reason(const Trail &trail, int trail_index) const
bool PropagationIsDone(const Trail &trail) const
void RegisterPropagator(SatPropagator *propagator)
void Enqueue(Literal true_literal, int propagator_id)
SatClause * FailingSatClause() const
void ChangeReason(int trail_index, int propagator_id)
int64_t NumberOfEnqueues() const
std::vector< Literal > * GetEmptyVectorToStoreReason(int trail_index) const
void EnqueueWithSameReasonAs(Literal true_literal, BooleanVariable reference_var)
const VariablesAssignment & Assignment() const
int AssignmentType(BooleanVariable var) const
std::string DebugString()
void SetFailingSatClause(SatClause *clause)
absl::Span< const Literal > Reason(BooleanVariable var) const
BooleanVariable ReferenceVarWithSameReason(BooleanVariable var) const
ABSL_MUST_USE_RESULT bool EnqueueWithStoredReason(Literal true_literal)
void Untrail(int target_trail_index)
std::vector< Literal > * MutableConflict()
const AssignmentInfo & Info(BooleanVariable var) const
absl::Span< const Literal > FailingClause() const
int CurrentDecisionLevel() const
void SetDecisionLevel(int level)
std::vector< Literal > * GetEmptyVectorToStoreReason() const
const Literal & operator[](int index) const
void Resize(int num_variables)
void EnqueueWithUnitReason(Literal true_literal)
void EnqueueSearchDecision(Literal true_literal)
bool LiteralIsAssigned(Literal literal) const
bool VariableIsAssigned(BooleanVariable var) const
bool LiteralIsTrue(Literal literal) const
void AssignFromTrueLiteral(Literal literal)
void UnassignLiteral(Literal literal)
Literal GetTrueLiteralForAssignedVariable(BooleanVariable var) const
bool LiteralIsFalse(Literal literal) const
int NumberOfVariables() const
VariablesAssignment(int num_variables)
void Resize(int num_variables)
DEFINE_STRONG_INDEX_TYPE(ClauseIndex)
std::ostream & operator<<(std::ostream &os, const BoolVar &var)
const LiteralIndex kNoLiteralIndex(-1)
const LiteralIndex kTrueLiteralIndex(-2)
const LiteralIndex kFalseLiteralIndex(-3)
const BooleanVariable kNoBooleanVariable(-1)
Collection of objects used to extend the Constraint Solver library.
std::string DebugString() const
static constexpr int kUnitReason
static constexpr int kSameReasonAs
static constexpr int kFirstFreePropagationId
static constexpr int kSearchDecision
static constexpr int kCachedReason