14 #ifndef OR_TOOLS_SAT_CP_MODEL_PRESOLVE_H_
15 #define OR_TOOLS_SAT_CP_MODEL_PRESOLVE_H_
41 const PresolveContext&
context);
67 std::vector<int>* postsolve_mapping);
82 void PresolveToFixPoint();
98 bool PresolveAutomaton(ConstraintProto*
ct);
99 bool PresolveCircuit(ConstraintProto*
ct);
100 bool PresolveRoutes(ConstraintProto*
ct);
101 bool PresolveCumulative(ConstraintProto*
ct);
102 bool PresolveNoOverlap(ConstraintProto*
ct);
103 bool PresolveReservoir(ConstraintProto*
ct);
104 bool PresolveAllDiff(ConstraintProto*
ct);
105 bool PresolveTable(ConstraintProto*
ct);
106 bool PresolveElement(ConstraintProto*
ct);
107 bool PresolveInterval(
int c, ConstraintProto*
ct);
108 bool PresolveIntDiv(ConstraintProto*
ct);
109 bool PresolveIntProd(ConstraintProto*
ct);
110 bool PresolveIntMin(ConstraintProto*
ct);
111 bool PresolveIntMax(ConstraintProto*
ct);
112 bool PresolveLinMin(ConstraintProto*
ct);
113 bool PresolveLinMax(ConstraintProto*
ct);
114 bool PresolveIntAbs(ConstraintProto*
ct);
115 bool PresolveBoolXor(ConstraintProto*
ct);
117 bool PresolveAtMostOrExactlyOne(ConstraintProto*
ct);
118 bool PresolveAtMostOne(ConstraintProto*
ct);
119 bool PresolveExactlyOne(ConstraintProto*
ct);
121 bool PresolveBoolAnd(ConstraintProto*
ct);
122 bool PresolveBoolOr(ConstraintProto*
ct);
123 bool PresolveEnforcementLiteral(ConstraintProto*
ct);
127 template <
typename ProtoWithVarsAndCoeffs>
128 bool CanonicalizeLinearExpressionInternal(
const ConstraintProto&
ct,
129 ProtoWithVarsAndCoeffs*
proto,
131 bool CanonicalizeLinearExpression(
const ConstraintProto&
ct,
132 LinearExpressionProto* exp);
135 bool CanonicalizeLinear(ConstraintProto*
ct);
136 bool PropagateDomainsInLinear(
int c, ConstraintProto*
ct);
137 bool RemoveSingletonInLinear(ConstraintProto*
ct);
138 bool PresolveSmallLinear(ConstraintProto*
ct);
139 bool PresolveLinearOnBooleans(ConstraintProto*
ct);
140 void PresolveLinearEqualityModuloTwo(ConstraintProto*
ct);
143 int64_t StartMin(
const IntervalConstraintProto&
interval)
const;
144 int64_t EndMax(
const IntervalConstraintProto&
interval)
const;
145 int64_t SizeMin(
const IntervalConstraintProto&
interval)
const;
146 int64_t SizeMax(
const IntervalConstraintProto&
interval)
const;
150 bool ProcessSetPPC();
155 bool ProcessSetPPCSubset(
int c1,
int c2,
const std::vector<int>& c2_minus_c1,
156 const std::vector<int>& original_constraint_index,
157 std::vector<bool>* marked_for_removal);
159 void PresolvePureSatPart();
162 void ExtractAtMostOneFromLinear(ConstraintProto*
ct);
164 void DivideLinearByGcd(ConstraintProto*
ct);
166 void ExtractEnforcementLiteralFromLinearConstraint(
int ct_index,
167 ConstraintProto*
ct);
171 void TransformIntoMaxCliques();
174 void ExtractBoolAnd();
176 void ExpandObjective();
178 void TryToSimplifyDomain(
int var);
180 void MergeNoOverlapConstraints();
184 void EncodeAllAffineRelations();
185 bool PresolveAffineRelationIfAny(
int var);
187 bool ExploitEquivalenceRelations(
int c, ConstraintProto*
ct);
189 ABSL_MUST_USE_RESULT
bool RemoveConstraint(ConstraintProto*
ct);
190 ABSL_MUST_USE_RESULT
bool MarkConstraintAsFalse(ConstraintProto*
ct);
192 std::vector<int>* postsolve_mapping_;
197 std::vector<std::pair<int, int64_t>> tmp_terms_;
221 const CpModelProto& in_model,
222 const std::vector<int>& ignored_constraints);
226 bool CreateUnsatModel();
228 void CopyEnforcementLiterals(
const ConstraintProto& orig,
229 ConstraintProto* dest);
230 bool OneEnforcementLiteralIsFalse(
const ConstraintProto&
ct)
const;
233 bool CopyBoolOr(
const ConstraintProto&
ct);
234 bool CopyBoolAnd(
const ConstraintProto&
ct);
235 bool CopyLinear(
const ConstraintProto&
ct);
236 bool CopyAtMostOne(
const ConstraintProto&
ct);
237 bool CopyExactlyOne(
const ConstraintProto&
ct);
238 bool CopyInterval(
const ConstraintProto&
ct,
int c);
241 int64_t skipped_non_zero_ = 0;
244 std::vector<int> non_fixed_variables_;
245 std::vector<int64_t> non_fixed_coefficients_;
246 absl::flat_hash_map<int, int> interval_mapping_;
247 int starting_constraint_index_ = 0;
248 std::vector<int> temp_enforcement_literals_;
249 std::vector<int> temp_literals_;
264 std::vector<int>* postsolve_mapping);
void RemoveEmptyConstraints()
CpModelPresolver(PresolveContext *context, std::vector< int > *postsolve_mapping)
bool PresolveOneConstraint(int c)
ModelCopy(PresolveContext *context)
bool ImportAndSimplifyConstraints(const CpModelProto &in_model, const std::vector< int > &ignored_constraints)
CpModelProto const * model_proto
GurobiMPCallbackContext * context
bool PresolveCpModel(PresolveContext *context, std::vector< int > *postsolve_mapping)
void CopyEverythingExceptVariablesAndConstraintsFieldsIntoContext(const CpModelProto &in_model, PresolveContext *context)
std::vector< int > FindDuplicateConstraints(const CpModelProto &model_proto)
bool ImportConstraintsWithBasicPresolveIntoContext(const CpModelProto &in_model, PresolveContext *context)
void ApplyVariableMapping(const std::vector< int > &mapping, const PresolveContext &context)
Collection of objects used to extend the Constraint Solver library.