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/types/span.h"
71 : index_(signed_value > 0 ? ((signed_value - 1) << 1)
72 : ((-signed_value - 1) << 1) ^ 1) {
78 Literal(BooleanVariable variable,
bool is_positive)
79 : index_(is_positive ? (variable.
value() << 1)
80 : (variable.
value() << 1) ^ 1) {}
82 BooleanVariable
Variable()
const {
return BooleanVariable(index_ >> 1); }
86 LiteralIndex
Index()
const {
return LiteralIndex(index_); }
87 LiteralIndex
NegatedIndex()
const {
return LiteralIndex(index_ ^ 1); }
90 return (index_ & 1) ? -((index_ >> 1) + 1) : ((index_ >> 1) + 1);
115 absl::Span<const Literal> literals) {
129 assignment_.Resize(LiteralIndex(num_variables << 1));
137 assignment_.Set(
literal.Index());
144 assignment_.ClearTwoBits(
literal.Index());
150 return assignment_.IsSet(
literal.NegatedIndex());
153 return assignment_.IsSet(
literal.Index());
156 return assignment_.AreOneOfTwoBitsSet(
literal.Index());
161 return assignment_.AreOneOfTwoBitsSet(LiteralIndex(
var.value() << 1));
169 return Literal(
var, assignment_.IsSet(LiteralIndex(
var.value() << 1)));
213 return absl::StrFormat(
"level:%d type:%d trail_index:%d",
level,
type,
217static_assert(
sizeof(AssignmentInfo) == 8,
218 "ERROR_AssignmentInfo_is_not_well_compacted");
241 current_info_.
level = 0;
244 void Resize(
int num_variables);
255 current_info_.
type = propagator_id;
256 info_[true_literal.
Variable()] = current_info_;
275 BooleanVariable reference_var) {
276 reference_var_with_same_reason_as_[true_literal.
Variable()] = reference_var;
295 const BooleanVariable
var = true_literal.
Variable();
296 reasons_[
var] = reasons_repository_[info_[
var].trail_index];
297 old_type_[
var] = info_[
var].type;
307 absl::Span<const Literal>
Reason(BooleanVariable
var)
const;
323 if (trail_index >= reasons_repository_.size()) {
324 reasons_repository_.resize(trail_index + 1);
326 reasons_repository_[trail_index].clear();
327 return &reasons_repository_[trail_index];
338 const BooleanVariable
var = trail_[trail_index].Variable();
339 info_[
var].type = propagator_id;
340 old_type_[
var] = propagator_id;
347 num_untrailed_enqueues_ +=
index - target_trail_index;
348 for (
int i = target_trail_index; i <
index; ++i) {
364 failing_sat_clause_ =
nullptr;
392 for (
int i = 0; i < current_info_.
trail_index; ++i) {
393 if (!result.empty()) result +=
" ";
394 result += trail_[i].DebugString();
400 int64_t num_untrailed_enqueues_ = 0;
403 std::vector<Literal> trail_;
404 std::vector<Literal> conflict_;
410 reference_var_with_same_reason_as_;
435 mutable std::deque<std::vector<Literal>> reasons_repository_;
441 std::vector<SatPropagator*> propagators_;
443 DISALLOW_COPY_AND_ASSIGN(
Trail);
492 int trail_index)
const {
520 const Trail& trail)
const {
524 <<
" trail_.Index()=" << trail.
Index();
532 <<
" trail_.Index()=" << trail.
Index()
533 <<
" level_at_propagation_index="
542 assignment_.
Resize(num_variables);
543 info_.resize(num_variables);
544 trail_.resize(num_variables);
545 reasons_.resize(num_variables);
549 old_type_.resize(num_variables);
550 reference_var_with_same_reason_as_.resize(num_variables);
554 if (propagators_.empty()) {
559 propagators_.push_back(propagator);
563 BooleanVariable
var)
const {
567 var = reference_var_with_same_reason_as_[
var];
576 var = reference_var_with_same_reason_as_[
var];
579 const int type = info_[
var].type;
601 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)
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 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)
std::ostream & operator<<(std::ostream &os, const BoolVar &var)
const LiteralIndex kNoLiteralIndex(-1)
const LiteralIndex kTrueLiteralIndex(-2)
DEFINE_INT_TYPE(ClauseIndex, int)
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