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));
212 return absl::StrFormat(
"level:%d type:%d trail_index:%d",
level,
type,
216 static_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];
606 #endif // OR_TOOLS_SAT_SAT_BASE_H_ bool PropagatePreconditionsAreSatisfied(const Trail &trail) const
std::vector< Literal > * GetEmptyVectorToStoreReason() const
DEFINE_INT_TYPE(ClauseIndex, int)
static constexpr int kFirstFreePropagationId
static constexpr int kCachedReason
Class that owns everything related to a particular optimization model.
Literal(int signed_value)
void UnassignLiteral(Literal literal)
std::vector< Literal > * MutableConflict()
SatClause * FailingSatClause() const
std::string DebugString() const
bool LiteralIsFalse(Literal literal) const
bool LiteralIsTrue(Literal literal) const
void AssignFromTrueLiteral(Literal literal)
LiteralIndex Index() const
int64_t NumberOfEnqueues() const
int NumberOfVariables() const
bool operator==(Literal other) const
const LiteralIndex kTrueLiteralIndex(-2)
Literal(BooleanVariable variable, bool is_positive)
const Literal & operator[](int index) const
#define CHECK_LT(val1, val2)
std::vector< Literal > * GetEmptyVectorToStoreReason(int trail_index) const
void Enqueue(Literal true_literal, int propagator_id)
void EnqueueWithUnitReason(Literal true_literal)
bool operator<(const Literal &literal) const
void ChangeReason(int trail_index, int propagator_id)
Literal(LiteralIndex index)
void SetFailingSatClause(SatClause *clause)
void resize(size_type new_size)
void ClearTwoBits(IndexType i)
LiteralIndex NegatedIndex() const
BooleanVariable Variable() const
bool PropagationIsDone(const Trail &trail) const
const BooleanVariable kNoBooleanVariable(-1)
std::string DebugString()
#define DCHECK_NE(val1, val2)
SatPropagator(const std::string &name)
void Untrail(int target_trail_index)
static constexpr int kSameReasonAs
virtual absl::Span< const Literal > Reason(const Trail &trail, int trail_index) const
static constexpr int kUnitReason
bool VariableIsAssigned(BooleanVariable var) const
bool LiteralIsAssigned(Literal literal) const
Literal GetTrueLiteralForAssignedVariable(BooleanVariable var) const
void EnqueueSearchDecision(Literal true_literal)
virtual bool Propagate(Trail *trail)=0
#define DCHECK_GE(val1, val2)
bool operator!=(Literal other) const
const LiteralIndex kFalseLiteralIndex(-3)
void SetPropagatorId(int id)
#define DCHECK(condition)
virtual void Untrail(const Trail &trail, int trail_index)
void EnqueueWithSameReasonAs(Literal true_literal, BooleanVariable reference_var)
bool IsSet(IndexType i) const
void RegisterPropagator(SatPropagator *propagator)
BooleanVariable ReferenceVarWithSameReason(BooleanVariable var) const
Collection of objects used to extend the Constraint Solver library.
void Resize(int num_variables)
VariablesAssignment(int num_variables)
std::string DebugString() const
int AssignmentType(BooleanVariable var) const
static constexpr int kSearchDecision
std::ostream & operator<<(std::ostream &os, const BoolVar &var)
const LiteralIndex kNoLiteralIndex(-1)
const VariablesAssignment & Assignment() const
int propagation_trail_index_
void SetDecisionLevel(int level)
absl::Span< const Literal > Reason(BooleanVariable var) const
absl::Span< const Literal > FailingClause() const
void Resize(IndexType size)
bool AreOneOfTwoBitsSet(IndexType i) const
ABSL_MUST_USE_RESULT bool EnqueueWithStoredReason(Literal true_literal)
int CurrentDecisionLevel() const
void Resize(int num_variables)
#define CHECK_NE(val1, val2)
const AssignmentInfo & Info(BooleanVariable var) const
#define DCHECK_LT(val1, val2)