16#ifndef OR_TOOLS_SAT_SAT_BASE_H_
17#define OR_TOOLS_SAT_SAT_BASE_H_
26#include "absl/strings/str_format.h"
27#include "absl/types/span.h"
70 : index_(signed_value > 0 ? ((signed_value - 1) << 1)
71 : ((-signed_value - 1) << 1) ^ 1) {
77 Literal(BooleanVariable variable,
bool is_positive)
78 : index_(is_positive ? (variable.
value() << 1)
79 : (variable.
value() << 1) ^ 1) {}
81 BooleanVariable
Variable()
const {
return BooleanVariable(index_ >> 1); }
85 LiteralIndex
Index()
const {
return LiteralIndex(index_); }
86 LiteralIndex
NegatedIndex()
const {
return LiteralIndex(index_ ^ 1); }
89 return (index_ & 1) ? -((index_ >> 1) + 1) : ((index_ >> 1) + 1);
114 absl::Span<const Literal> literals) {
128 assignment_.Resize(LiteralIndex(num_variables << 1));
136 assignment_.Set(
literal.Index());
143 assignment_.ClearTwoBits(
literal.Index());
149 return assignment_.IsSet(
literal.NegatedIndex());
152 return assignment_.IsSet(
literal.Index());
155 return assignment_.AreOneOfTwoBitsSet(
literal.Index());
160 return assignment_.AreOneOfTwoBitsSet(LiteralIndex(
var.value() << 1));
168 return Literal(
var, assignment_.IsSet(LiteralIndex(
var.value() << 1)));
212 return absl::StrFormat(
"level:%d type:%d trail_index:%d",
level,
type,
216static_assert(
sizeof(AssignmentInfo) == 8,
217 "ERROR_AssignmentInfo_is_not_well_compacted");
240 current_info_.
level = 0;
243 void Resize(
int num_variables);
254 current_info_.
type = propagator_id;
255 info_[true_literal.
Variable()] = current_info_;
274 BooleanVariable reference_var) {
275 reference_var_with_same_reason_as_[true_literal.
Variable()] = reference_var;
294 const BooleanVariable
var = true_literal.
Variable();
295 reasons_[
var] = reasons_repository_[info_[
var].trail_index];
296 old_type_[
var] = info_[
var].type;
306 absl::Span<const Literal>
Reason(BooleanVariable
var)
const;
322 if (trail_index >= reasons_repository_.size()) {
323 reasons_repository_.resize(trail_index + 1);
325 reasons_repository_[trail_index].clear();
326 return &reasons_repository_[trail_index];
337 const BooleanVariable
var = trail_[trail_index].Variable();
338 info_[
var].type = propagator_id;
339 old_type_[
var] = propagator_id;
346 num_untrailed_enqueues_ +=
index - target_trail_index;
347 for (
int i = target_trail_index; i <
index; ++i) {
363 failing_sat_clause_ =
nullptr;
391 for (
int i = 0; i < current_info_.
trail_index; ++i) {
392 if (!result.empty()) result +=
" ";
393 result += trail_[i].DebugString();
399 int64_t num_untrailed_enqueues_ = 0;
402 std::vector<Literal> trail_;
403 std::vector<Literal> conflict_;
409 reference_var_with_same_reason_as_;
434 mutable std::deque<std::vector<Literal>> reasons_repository_;
440 std::vector<SatPropagator*> propagators_;
442 DISALLOW_COPY_AND_ASSIGN(
Trail);
491 int trail_index)
const {
519 const Trail& trail)
const {
523 <<
" trail_.Index()=" << trail.
Index();
531 <<
" trail_.Index()=" << trail.
Index()
532 <<
" level_at_propagation_index="
541 assignment_.
Resize(num_variables);
542 info_.resize(num_variables);
543 trail_.resize(num_variables);
544 reasons_.resize(num_variables);
548 old_type_.resize(num_variables);
549 reference_var_with_same_reason_as_.resize(num_variables);
553 if (propagators_.empty()) {
558 propagators_.push_back(propagator);
562 BooleanVariable
var)
const {
566 var = reference_var_with_same_reason_as_[
var];
575 var = reference_var_with_same_reason_as_[
var];
578 const int type = info_[
var].type;
600 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