14 #ifndef OR_TOOLS_SAT_PRESOLVE_CONTEXT_H_ 15 #define OR_TOOLS_SAT_PRESOLVE_CONTEXT_H_ 99 int64_t
MinOf(
int ref)
const;
100 int64_t
MaxOf(
int ref)
const;
108 int64_t
SizeMin(
int ct_ref)
const;
109 int64_t
SizeMax(
int ct_ref)
const;
110 int64_t
EndMin(
int ct_ref)
const;
111 int64_t
EndMax(
int ct_ref)
const;
130 return domains[
var].IsIncludedIn(domain);
161 int ref,
const Domain& domain,
bool* domain_modified =
nullptr);
172 bool* domain_modified =
nullptr);
177 const std::string&
message =
"") {
341 int var_in_equality, int64_t coeff_in_equality,
343 std::vector<int>* new_vars_in_objective =
nullptr);
348 return objective_map_;
351 return objective_domain_is_constraining_;
367 return constraint_to_vars_[c];
371 return var_to_constraints_[
var];
375 return interval_usage_[c];
463 bool AddRelation(
int x,
int y, int64_t c, int64_t o,
AffineRelation* repo);
465 void AddVariableUsage(
int c);
470 bool VariableIsNotRepresentativeOfEquivalenceClass(
int var)
const;
474 bool RemapEncodingMaps();
480 bool CanonicalizeEncoding(
int* ref, int64_t*
value);
494 void InsertVarValueEncodingInternal(
int literal,
int var, int64_t
value,
495 bool add_constraints);
503 bool is_unsat_ =
false;
506 std::vector<Domain> domains;
512 absl::flat_hash_map<int, int64_t> objective_map_;
513 int64_t objective_overflow_detection_;
514 std::vector<std::pair<int, int64_t>> tmp_entries_;
515 bool objective_domain_is_constraining_ =
false;
517 double objective_offset_;
518 double objective_scaling_factor_;
521 std::vector<std::vector<int>> constraint_to_vars_;
522 std::vector<absl::flat_hash_set<int>> var_to_constraints_;
525 std::vector<int> constraint_to_linear1_var_;
526 std::vector<int> var_to_num_linear1_;
529 std::vector<std::vector<int>> constraint_to_intervals_;
530 std::vector<int> interval_usage_;
533 absl::flat_hash_map<int, SavedVariable> abs_relations_;
539 absl::flat_hash_map<int64_t, SavedVariable> constant_to_ref_;
543 std::deque<int> encoding_remap_queue_;
547 absl::flat_hash_map<int, absl::flat_hash_map<int64_t, SavedLiteral>>
554 absl::flat_hash_map<int,
555 absl::flat_hash_map<int64_t, absl::flat_hash_set<int>>>
557 absl::flat_hash_map<int,
558 absl::flat_hash_map<int64_t, absl::flat_hash_set<int>>>
569 std::vector<int> tmp_new_usage_;
572 absl::flat_hash_set<int> removed_variables_;
577 absl::flat_hash_map<std::tuple<int, int, int, int>,
int>
578 reified_precedences_cache_;
581 absl::flat_hash_map<std::string, int> stats_by_rule_name_;
583 bool model_is_expanded_ =
false;
589 #endif // OR_TOOLS_SAT_PRESOLVE_CONTEXT_H_ int Get(PresolveContext *context) const
int64_t MinOf(int ref) const
A simple class to enforce both an elapsed time limit and a deterministic time limit in the same threa...
std::vector< int > tmp_literals
void InitializeNewDomains()
bool VariableIsUniqueAndRemovable(int ref) const
bool ModelIsUnsat() const
void NotifyThatModelIsExpanded()
void ReadObjectiveFromProto()
ModelRandomGenerator * random()
void RemoveVariableFromAffineRelation(int var)
bool ConstraintVariableGraphIsUpToDate() const
bool ConstraintVariableUsageIsConsistent()
SparseBitset< int64_t > modified_domains
void UpdateRuleStats(const std::string &name, int num_times=1)
void StoreBooleanEqualityRelation(int ref_a, int ref_b)
Class that owns everything related to a particular optimization model.
void AddToObjective(int var, int64_t value)
bool StoreLiteralImpliesVarNEqValue(int literal, int var, int64_t value)
const absl::flat_hash_set< int > & VarToConstraints(int var) const
bool ConstraintIsOptional(int ct_ref) const
int GetOrCreateConstantVar(int64_t cst)
void CanonicalizeDomainOfSizeTwo(int var)
int64_t StartMin(int ct_ref) const
constexpr int kAssumptionsConstraint
#define VLOG(verboselevel)
bool ConstraintIsInactive(int ct_index) const
bool GetAbsRelation(int target_ref, int *ref)
const Domain & ObjectiveDomain() const
bool StoreAffineRelation(int ref_x, int ref_y, int64_t coeff, int64_t offset)
std::string RefDebugString(int ref) const
constexpr int kAffineRelationConstraint
bool VariableIsNotUsedAnymore(int ref) const
bool keep_all_feasible_solutions
std::string AffineRelationDebugString(int ref) const
bool StoreAbsRelation(int target_ref, int ref)
int LiteralForExpressionMax(const LinearExpressionProto &expr) const
int64_t EndMin(int ct_ref) const
const std::vector< int > & ConstraintToVars(int c) const
bool ExpressionIsAffineBoolean(const LinearExpressionProto &expr) const
CpModelProto * mapping_model
bool VariableIsOnlyUsedInEncodingAndMaybeInObjective(int ref) const
int64_t num_presolve_operations
void UpdateConstraintVariableUsage(int c)
CpModelProto * working_model
bool ObjectiveDomainIsConstraining() const
void ExploitFixedDomain(int var)
bool CanBeUsedAsLiteral(int ref) const
int IntervalUsage(int c) const
ABSL_MUST_USE_RESULT bool SetLiteralToFalse(int lit)
Domain DomainOf(int ref) const
int NewIntVar(const Domain &domain)
const SatParameters & params() const
bool HasVarValueEncoding(int ref, int64_t value, int *literal=nullptr)
bool VariableIsRemovable(int ref) const
int64_t EndMax(int ct_ref) const
::PROTOBUF_NAMESPACE_ID::int32 assumptions(int index) const
int64_t SizeMax(int ct_ref) const
bool VariableWasRemoved(int ref) const
void ClearPrecedenceCache()
int64_t MaxOf(int ref) const
void RegisterVariablesUsedInAssumptions()
void WriteObjectiveToProto() const
bool PropagateAffineRelation(int ref)
void AddToObjectiveOffset(int64_t value)
void MarkVariableAsRemoved(int ref)
std::vector< absl::flat_hash_set< int > > var_to_ub_only_constraints
bool DomainIsEmpty(int ref) const
ABSL_MUST_USE_RESULT bool IntersectDomainWith(int ref, const Domain &domain, bool *domain_modified=nullptr)
absl::flat_hash_set< int > tmp_literal_set
bool VariableWithCostIsUniqueAndRemovable(int ref) const
ABSL_MUST_USE_RESULT bool NotifyThatModelIsUnsat(const std::string &message="")
bool SubstituteVariableInObjective(int var_in_equality, int64_t coeff_in_equality, const ConstraintProto &equality, std::vector< int > *new_vars_in_objective=nullptr)
bool ModelIsExpanded() const
SolverLogger * logger() const
bool DomainContains(int ref, int64_t value) const
#define DCHECK(condition)
bool LiteralIsTrue(int lit) const
We call domain any subset of Int64 = [kint64min, kint64max].
int Get(PresolveContext *context) const
void AddImplication(int a, int b)
void UpdateNewConstraintsVariableUsage()
int64_t StartMax(int ct_ref) const
Domain DomainSuperSetOf(const LinearExpressionProto &expr) const
DomainDeductions deductions
std::vector< absl::flat_hash_set< int > > var_to_lb_only_constraints
bool DomainOfVarIsIncludedIn(int var, const Domain &domain)
std::vector< Domain > tmp_term_domains
void AddImplyInDomain(int b, int x, const Domain &domain)
int GetOrCreateReifiedPrecedenceLiteral(int time_i, int time_j, int active_i, int active_j)
int GetVariableRepresentative(int ref) const
bool StoreLiteralImpliesVarEqValue(int literal, int var, int64_t value)
Collection of objects used to extend the Constraint Solver library.
bool IsFixed(int ref) const
int64_t SizeMin(int ct_ref) const
bool ExploitExactlyOneInObjective(absl::Span< const int > exactly_one)
bool IntervalIsConstant(int ct_ref) const
const absl::flat_hash_map< int, int64_t > & ObjectiveMap() const
void RemoveAllVariablesFromAffineRelationConstraint()
std::vector< Domain > tmp_left_domains
std::string IntervalDebugString(int ct_ref) const
constexpr int kObjectiveConstraint
bool LiteralIsFalse(int lit) const
ABSL_MUST_USE_RESULT bool SetLiteralToTrue(int lit)
int GetOrCreateVarValueEncoding(int ref, int64_t value)
void RemoveVariableFromObjective(int var)
int NumEquivRelations() const
GurobiMPCallbackContext * context
int NumAffineRelations() const
void InsertVarValueEncoding(int literal, int ref, int64_t value)
PresolveContext(Model *model, CpModelProto *cp_model, CpModelProto *mapping)
AffineRelation::Relation GetAffineRelation(int ref) const
int GetLiteralRepresentative(int ref) const
ABSL_MUST_USE_RESULT bool CanonicalizeObjective()