78 std::vector<int>* postsolve_mapping);
98 CpSolverStatus InfeasibleStatus();
102 bool MaybeRemoveFixedVariables(std::vector<int>* postsolve_mapping);
105 bool ProcessChangedVariables(std::vector<bool>* in_queue,
106 std::deque<int>* queue);
107 void PresolveToFixPoint();
113 void ExpandCpModelAndCanonicalizeConstraints();
126 bool PresolveAllDiff(ConstraintProto* ct);
127 bool PresolveAutomaton(ConstraintProto* ct);
128 bool PresolveElement(
int c, ConstraintProto* ct);
129 bool PresolveIntDiv(
int c, ConstraintProto* ct);
130 bool PresolveIntMod(
int c, ConstraintProto* ct);
131 bool PresolveIntProd(ConstraintProto* ct);
132 bool PresolveInterval(
int c, ConstraintProto* ct);
133 bool PresolveInverse(ConstraintProto* ct);
134 bool DivideLinMaxByGcd(
int c, ConstraintProto* ct);
135 bool PresolveLinMax(
int c, ConstraintProto* ct);
136 bool PresolveLinMaxWhenAllBoolean(ConstraintProto* ct);
137 bool PropagateAndReduceAffineMax(ConstraintProto* ct);
138 bool PropagateAndReduceIntAbs(ConstraintProto* ct);
139 bool PropagateAndReduceLinMax(ConstraintProto* ct);
140 bool PresolveTable(ConstraintProto* ct);
141 void DetectDuplicateIntervals(
142 int c, google::protobuf::RepeatedField<int32_t>* intervals);
143 bool PresolveCumulative(ConstraintProto* ct);
144 bool PresolveNoOverlap(ConstraintProto* ct);
145 bool PresolveNoOverlap2D(
int c, ConstraintProto* ct);
146 bool PresolveReservoir(ConstraintProto* ct);
148 bool PresolveCircuit(ConstraintProto* ct);
149 bool PresolveRoutes(ConstraintProto* ct);
151 bool PresolveAtMostOrExactlyOne(ConstraintProto* ct);
152 bool PresolveAtMostOne(ConstraintProto* ct);
153 bool PresolveExactlyOne(ConstraintProto* ct);
155 bool PresolveBoolAnd(ConstraintProto* ct);
156 bool PresolveBoolOr(ConstraintProto* ct);
157 bool PresolveBoolXor(ConstraintProto* ct);
158 bool PresolveEnforcementLiteral(ConstraintProto* ct);
162 bool CanonicalizeLinearExpression(
const ConstraintProto& ct,
163 LinearExpressionProto* proto);
164 bool CanonicalizeLinearArgument(
const ConstraintProto& ct,
165 LinearArgumentProto* proto);
168 ABSL_MUST_USE_RESULT
bool CanonicalizeLinear(ConstraintProto* ct,
170 bool PropagateDomainsInLinear(
int ct_index, ConstraintProto* ct);
171 bool RemoveSingletonInLinear(ConstraintProto* ct);
172 bool PresolveSmallLinear(ConstraintProto* ct);
173 bool PresolveLinearOfSizeOne(ConstraintProto* ct);
174 bool PresolveLinearOfSizeTwo(ConstraintProto* ct);
175 bool PresolveLinearOnBooleans(ConstraintProto* ct);
176 bool PresolveDiophantine(ConstraintProto* ct);
177 bool AddVarAffineRepresentativeFromLinearEquality(
int target_index,
178 ConstraintProto* ct);
179 bool PresolveLinearEqualityWithModulo(ConstraintProto* ct);
188 void TryToReduceCoefficientsOfLinearConstraint(
int c, ConstraintProto* ct);
194 void ExtractEncodingFromLinear();
195 bool ProcessEncodingFromLinear(
int linear_encoding_ct_index,
196 const ConstraintProto& at_most_or_exactly_one,
197 int64_t* num_unique_terms,
198 int64_t* num_multiple_terms);
202 void DetectDuplicateConstraints();
203 void DetectDuplicateConstraintsWithDifferentEnforcements(
206 Trail* trail =
nullptr);
210 void DetectDominatedLinearConstraints();
215 void ProcessAtMostOneAndLinear();
216 void ProcessOneLinearWithAmo(
int ct_index, ConstraintProto* ct,
223 bool PresolveNoOverlap2DFramed(
224 absl::Span<const Rectangle> fixed_boxes,
225 absl::Span<const RectangleInRange> non_fixed_boxes, ConstraintProto* ct);
236 bool ExpandEncoded2DBinPacking(
237 absl::Span<const Rectangle> fixed_boxes,
238 absl::Span<const RectangleInRange> non_fixed_boxes, ConstraintProto* ct);
243 void ProcessSetPPC();
246 void DetectIncludedEnforcement();
250 bool ProcessSetPPCSubset(
int subset_c,
int superset_c,
251 absl::flat_hash_set<int>* tmp_set,
252 bool* remove_subset,
bool* remove_superset,
253 bool* stop_processing_superset);
257 bool PresolvePureSatPart();
260 void ExtractAtMostOneFromLinear(ConstraintProto* ct);
263 bool DivideLinearByGcd(ConstraintProto* ct);
265 void ExtractEnforcementLiteralFromLinearConstraint(
int ct_index,
266 ConstraintProto* ct);
267 void LowerThanCoeffStrengthening(
bool from_lower_bound, int64_t min_magnitude,
268 int64_t rhs, ConstraintProto* ct);
272 void TransformIntoMaxCliques();
275 void ConvertToBoolAnd();
279 bool PropagateObjective();
284 void ExpandObjective();
292 void ShiftObjectiveWithExactlyOnes();
294 void MaybeTransferLinear1ToAnotherVariable(
int var);
295 void ProcessVariableOnlyUsedInEncoding(
int var);
296 void TryToSimplifyDomain(
int var);
298 void LookAtVariableWithDegreeTwo(
int var);
299 void ProcessVariableInTwoAtMostOrExactlyOne(
int var);
301 void MergeNoOverlapConstraints();
312 bool RemoveCommonPart(
313 const absl::flat_hash_map<int, int64_t>& common_var_coeff_map,
314 absl::Span<
const std::pair<int, int64_t>> block,
321 void FindAlmostIdenticalLinearConstraints();
339 void RunPropagatorsForConstraint(
const ConstraintProto& ct);
343 void EncodeAllAffineRelations();
344 bool PresolveAffineRelationIfAny(
int var);
346 bool ExploitEquivalenceRelations(
int c, ConstraintProto* ct);
348 ABSL_MUST_USE_RESULT
bool RemoveConstraint(ConstraintProto* ct);
349 ABSL_MUST_USE_RESULT
bool MarkConstraintAsFalse(ConstraintProto* ct);
351 std::vector<int>* postsolve_mapping_;
358 std::vector<std::pair<int, int64_t>> tmp_terms_;
361 std::vector<std::array<int64_t, 2>> conditional_mins_;
362 std::vector<std::array<int64_t, 2>> conditional_maxs_;
366 absl::flat_hash_map<int, int> temp_map_;
367 absl::flat_hash_set<int> temp_set_;
368 ConstraintProto temp_ct_;
371 CpModelProto tmp_model_;
376 int64_t max_variation;
379 std::vector<RdEntry> rd_entries_;
380 std::vector<int> rd_vars_;
381 std::vector<int64_t> rd_coeffs_;
382 std::vector<int64_t> rd_magnitudes_;
383 std::vector<int64_t> rd_lbs_;
384 std::vector<int64_t> rd_ubs_;
385 std::vector<int64_t> rd_divisors_;
398 struct IntervalConstraintEq {
399 const CpModelProto* working_model;
400 bool operator()(
int a,
int b)
const;
403 struct IntervalConstraintHash {
404 const CpModelProto* working_model;
405 std::size_t operator()(
int ct_idx)
const;
411 absl::flat_hash_map<int, int, IntervalConstraintHash, IntervalConstraintEq>
412 interval_representative_;