14 #ifndef OR_TOOLS_SAT_PRESOLVE_CONTEXT_H_
15 #define OR_TOOLS_SAT_PRESOLVE_CONTEXT_H_
24 #include "absl/base/attributes.h"
25 #include "absl/container/flat_hash_map.h"
26 #include "absl/container/flat_hash_set.h"
27 #include "absl/strings/str_cat.h"
28 #include "absl/types/span.h"
30 #include "ortools/sat/cp_model.pb.h"
34 #include "ortools/sat/sat_parameters.pb.h"
89 params_(*
model->GetOrCreate<SatParameters>()),
117 int64_t
MinOf(
int ref)
const;
118 int64_t
MaxOf(
int ref)
const;
127 int64_t
SizeMin(
int ct_ref)
const;
128 int64_t
SizeMax(
int ct_ref)
const;
129 int64_t
EndMin(
int ct_ref)
const;
130 int64_t
EndMax(
int ct_ref)
const;
136 int64_t
MinOf(
const LinearExpressionProto& expr)
const;
137 int64_t
MaxOf(
const LinearExpressionProto& expr)
const;
138 bool IsFixed(
const LinearExpressionProto& expr)
const;
139 int64_t
FixedValue(
const LinearExpressionProto& expr)
const;
144 template <
typename ProtoWithVarsAndCoeffs>
146 const ProtoWithVarsAndCoeffs&
proto)
const {
147 int64_t min_activity = 0;
148 int64_t max_activity = 0;
149 const int num_vars =
proto.vars().size();
150 for (
int i = 0; i < num_vars; ++i) {
152 const int64_t coeff =
proto.coeffs(i);
161 return {min_activity, max_activity};
184 return domains[
var].IsIncludedIn(domain);
212 int ref,
const Domain& domain,
bool* domain_modified =
nullptr);
222 const LinearExpressionProto& expr,
const Domain& domain,
223 bool* domain_modified =
nullptr);
228 const std::string&
message =
"") {
296 bool debug_no_recursion =
false);
453 int var_in_equality, int64_t coeff_in_equality,
454 const ConstraintProto& equality);
459 return objective_map_;
463 const auto it = objective_map_.find(
var);
464 return it == objective_map_.end() ? 0 : it->second;
467 return objective_domain_is_constraining_;
483 return constraint_to_vars_;
487 return constraint_to_vars_[c];
491 return var_to_constraints_[
var];
495 return interval_usage_[c];
528 const LinearExpressionProto& time_j,
529 int active_i,
int active_j);
531 std::tuple<int, int64_t, int, int64_t, int64_t, int, int>
533 const LinearExpressionProto& time_j,
int active_i,
546 const SatParameters&
params()
const {
return params_; }
584 void EraseFromVarToConstraint(
int var,
int c);
587 bool AddRelation(
int x,
int y, int64_t c, int64_t o,
AffineRelation* repo);
589 void AddVariableUsage(
int c);
590 void UpdateLinear1Usage(
const ConstraintProto&
ct,
int c);
596 bool CanonicalizeEncoding(
int* ref, int64_t*
value);
610 void InsertVarValueEncodingInternal(
int literal,
int var, int64_t
value,
611 bool add_constraints);
614 const SatParameters& params_;
619 bool is_unsat_ =
false;
622 std::vector<Domain> domains;
628 absl::flat_hash_map<int, int64_t> objective_map_;
629 int64_t objective_overflow_detection_;
630 std::vector<std::pair<int, int64_t>> tmp_entries_;
631 bool objective_domain_is_constraining_ =
false;
633 double objective_offset_;
634 double objective_scaling_factor_;
635 int64_t objective_integer_before_offset_;
636 int64_t objective_integer_after_offset_;
637 int64_t objective_integer_scaling_factor_;
640 std::vector<std::vector<int>> constraint_to_vars_;
641 std::vector<absl::flat_hash_set<int>> var_to_constraints_;
644 std::vector<int> constraint_to_linear1_var_;
645 std::vector<int> var_to_num_linear1_;
648 std::vector<std::vector<int>> constraint_to_intervals_;
649 std::vector<int> interval_usage_;
652 absl::flat_hash_map<int, SavedVariable> abs_relations_;
655 bool true_literal_is_defined_ =
false;
660 absl::flat_hash_map<int, absl::flat_hash_map<int64_t, SavedLiteral>>
667 absl::flat_hash_map<int,
668 absl::flat_hash_map<int64_t, absl::flat_hash_set<int>>>
670 absl::flat_hash_map<int,
671 absl::flat_hash_map<int64_t, absl::flat_hash_set<int>>>
680 std::vector<int> tmp_new_usage_;
683 absl::flat_hash_set<int> removed_variables_;
688 absl::flat_hash_map<std::tuple<int, int64_t, int, int64_t, int64_t, int, int>,
690 reified_precedences_cache_;
693 absl::flat_hash_map<std::string, int> stats_by_rule_name_;
696 absl::flat_hash_map<std::string, int> interval_representative_;
698 bool model_is_expanded_ =
false;
We call domain any subset of Int64 = [kint64min, kint64max].
A simple class to enforce both an elapsed time limit and a deterministic time limit in the same threa...
Class that owns everything related to a particular optimization model.
int64_t MaxOf(int ref) const
bool CanonicalizeAffineVariable(int ref, int64_t coeff, int64_t mod, int64_t rhs)
bool ExpressionIsALiteral(const LinearExpressionProto &expr, int *literal=nullptr) const
bool IsFullyEncoded(int ref) const
bool StoreAbsRelation(int target_ref, int ref)
bool VariableWithCostIsUnique(int ref) const
ABSL_MUST_USE_RESULT bool SubstituteVariableInObjective(int var_in_equality, int64_t coeff_in_equality, const ConstraintProto &equality)
bool ConstraintIsInactive(int ct_index) const
const std::vector< std::vector< int > > & ConstraintToVarsGraph() const
bool ConstraintVariableUsageIsConsistent()
bool ModelIsExpanded() const
PresolveContext(Model *model, CpModelProto *cp_model, CpModelProto *mapping)
void AddImplication(int a, int b)
bool ModelIsUnsat() const
void AddToObjective(int var, int64_t value)
ABSL_MUST_USE_RESULT bool IntersectDomainWith(int ref, const Domain &domain, bool *domain_modified=nullptr)
bool ConstraintVariableGraphIsUpToDate() const
void NotifyThatModelIsExpanded()
bool StoreLiteralImpliesVarNEqValue(int literal, int var, int64_t value)
bool RecomputeSingletonObjectiveDomain()
int GetOrCreateReifiedPrecedenceLiteral(const LinearExpressionProto &time_i, const LinearExpressionProto &time_j, int active_i, int active_j)
ABSL_MUST_USE_RESULT bool CanonicalizeObjective(bool simplify_domain=true)
bool StoreBooleanEqualityRelation(int ref_a, int ref_b)
int64_t StartMin(int ct_ref) const
const Domain & ObjectiveDomain() const
SolverLogger * logger() const
bool DomainOfVarIsIncludedIn(int var, const Domain &domain)
int64_t ObjectiveCoeff(int var) const
bool VariableWithCostIsUniqueAndRemovable(int ref) const
void WriteObjectiveToProto() const
bool ExpressionIsSingleVariable(const LinearExpressionProto &expr) const
int GetLiteralRepresentative(int ref) const
ABSL_MUST_USE_RESULT bool SetLiteralToTrue(int lit)
int GetOrCreateAffineValueEncoding(const LinearExpressionProto &expr, int64_t value)
std::vector< int > tmp_literals
ABSL_MUST_USE_RESULT bool ScaleFloatingPointObjective()
ABSL_MUST_USE_RESULT bool CanonicalizeOneObjectiveVariable(int var)
bool ObjectiveDomainIsConstraining() const
CpModelProto * mapping_model
const std::vector< int > & ConstraintToVars(int c) const
std::pair< int64_t, int64_t > ComputeMinMaxActivity(const ProtoWithVarsAndCoeffs &proto) const
int GetOrCreateVarValueEncoding(int ref, int64_t value)
void UpdateNewConstraintsVariableUsage()
bool VariableIsUniqueAndRemovable(int ref) const
void RemoveVariableFromAffineRelation(int var)
void RemoveVariableFromObjective(int ref)
ABSL_MUST_USE_RESULT bool NotifyThatModelIsUnsat(const std::string &message="")
bool PropagateAffineRelation(int ref)
int64_t EndMin(int ct_ref) const
SparseBitset< int > modified_domains
Domain DomainOf(int ref) const
int64_t num_presolve_operations
void InitializeNewDomains()
int GetVariableRepresentative(int ref) const
std::string AffineRelationDebugString(int ref) const
const absl::flat_hash_map< int, int64_t > & ObjectiveMap() const
int NewIntVar(const Domain &domain)
void MarkVariableAsRemoved(int ref)
bool InsertVarValueEncoding(int literal, int ref, int64_t value)
void WriteVariableDomainsToProto() const
DomainDeductions deductions
bool AddToObjectiveOffset(int64_t delta)
std::vector< Domain > tmp_left_domains
bool DomainIsEmpty(int ref) const
int GetIntervalRepresentative(int index)
void CanonicalizeVariable(int ref)
void CanonicalizeDomainOfSizeTwo(int var)
SparseBitset< int > var_with_reduced_small_degree
int64_t StartMax(int ct_ref) const
int64_t FixedValue(int ref) const
bool LiteralIsTrue(int lit) const
std::tuple< int, int64_t, int, int64_t, int64_t, int, int > GetReifiedPrecedenceKey(const LinearExpressionProto &time_i, const LinearExpressionProto &time_j, int active_i, int active_j)
int IntervalUsage(int c) const
CpModelProto * working_model
bool HasVarValueEncoding(int ref, int64_t value, int *literal=nullptr)
bool IntervalIsConstant(int ct_ref) const
bool DomainContains(int ref, int64_t value) const
bool LiteralIsFalse(int lit) const
bool ShiftCostInExactlyOne(absl::Span< const int > exactly_one, int64_t shift)
void UpdateRuleStats(const std::string &name, int num_times=1)
const SatParameters & params() const
void RemoveAllVariablesFromAffineRelationConstraint()
AffineRelation::Relation GetAffineRelation(int ref) const
bool VariableIsNotUsedAnymore(int ref) const
void UpdateConstraintVariableUsage(int c)
bool keep_all_feasible_solutions
void AddLiteralToObjective(int ref, int64_t value)
bool IsFixed(int ref) const
int NumAffineRelations() const
std::vector< Domain > tmp_term_domains
bool StoreAffineRelation(int ref_x, int ref_y, int64_t coeff, int64_t offset, bool debug_no_recursion=false)
std::string IntervalDebugString(int ct_ref) const
const absl::flat_hash_set< int > & VarToConstraints(int var) const
ModelRandomGenerator * random()
ABSL_MUST_USE_RESULT bool SetLiteralToFalse(int lit)
int LiteralForExpressionMax(const LinearExpressionProto &expr) const
std::string RefDebugString(int ref) const
int64_t EndMax(int ct_ref) const
bool ConstraintIsOptional(int ct_ref) const
bool ExpressionIsAffineBoolean(const LinearExpressionProto &expr) const
int64_t SizeMax(int ct_ref) const
bool ExploitExactlyOneInObjective(absl::Span< const int > exactly_one)
void ClearPrecedenceCache()
Domain DomainSuperSetOf(const LinearExpressionProto &expr) const
absl::flat_hash_set< int > tmp_literal_set
void ReadObjectiveFromProto()
int64_t SizeMin(int ct_ref) const
void AddImplyInDomain(int b, int x, const Domain &domain)
bool CanBeUsedAsLiteral(int ref) const
bool VariableWasRemoved(int ref) const
void RegisterVariablesUsedInAssumptions()
int64_t MinOf(int ref) const
bool VariableIsOnlyUsedInEncodingAndMaybeInObjective(int ref) const
bool GetAbsRelation(int target_ref, int *ref)
bool StoreLiteralImpliesVarEqValue(int literal, int var, int64_t value)
int Get(PresolveContext *context) const
GurobiMPCallbackContext * context
constexpr int kAffineRelationConstraint
constexpr int kAssumptionsConstraint
bool LoadModelForProbing(PresolveContext *context, Model *local_model)
constexpr int kObjectiveConstraint
Collection of objects used to extend the Constraint Solver library.
#define SOLVER_LOG(logger,...)