79 std::vector<int>* postsolve_mapping);
99 CpSolverStatus InfeasibleStatus();
103 bool MaybeRemoveFixedVariables(std::vector<int>* postsolve_mapping);
106 bool ProcessChangedVariables(std::vector<bool>* in_queue,
107 std::deque<int>* queue);
108 void PresolveToFixPoint();
114 void ExpandCpModelAndCanonicalizeConstraints();
127 bool PresolveAllDiff(ConstraintProto* ct);
128 bool PresolveAutomaton(ConstraintProto* ct);
129 bool PresolveElement(
int c, ConstraintProto* ct);
130 bool PresolveIntDiv(
int c, ConstraintProto* ct);
131 bool PresolveIntMod(
int c, ConstraintProto* ct);
132 bool PresolveIntProd(ConstraintProto* ct);
133 bool PresolveInterval(
int c, ConstraintProto* ct);
134 bool PresolveInverse(ConstraintProto* ct);
135 bool DivideLinMaxByGcd(
int c, ConstraintProto* ct);
136 bool PresolveLinMax(
int c, ConstraintProto* ct);
137 bool PresolveLinMaxWhenAllBoolean(ConstraintProto* ct);
138 bool PropagateAndReduceAffineMax(ConstraintProto* ct);
139 bool PropagateAndReduceIntAbs(ConstraintProto* ct);
140 bool PropagateAndReduceLinMax(ConstraintProto* ct);
141 bool PresolveTable(ConstraintProto* ct);
142 void DetectDuplicateIntervals(
143 int c, google::protobuf::RepeatedField<int32_t>* intervals);
144 bool PresolveCumulative(ConstraintProto* ct);
145 bool PresolveNoOverlap(ConstraintProto* ct);
146 bool PresolveNoOverlap2D(
int c, ConstraintProto* ct);
147 bool PresolveReservoir(ConstraintProto* ct);
149 bool PresolveCircuit(ConstraintProto* ct);
150 bool PresolveRoutes(ConstraintProto* ct);
152 bool PresolveAtMostOrExactlyOne(ConstraintProto* ct);
153 bool PresolveAtMostOne(ConstraintProto* ct);
154 bool PresolveExactlyOne(ConstraintProto* ct);
156 bool PresolveBoolAnd(ConstraintProto* ct);
157 bool PresolveBoolOr(ConstraintProto* ct);
158 bool PresolveBoolXor(ConstraintProto* ct);
159 bool PresolveEnforcementLiteral(ConstraintProto* ct);
163 bool CanonicalizeLinearExpression(
const ConstraintProto& ct,
164 LinearExpressionProto* proto);
165 bool CanonicalizeLinearArgument(
const ConstraintProto& ct,
166 LinearArgumentProto* proto);
169 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_;
391 struct IntervalConstraintEq {
392 const CpModelProto* working_model;
393 bool operator()(
int a,
int b)
const;
396 struct IntervalConstraintHash {
397 const CpModelProto* working_model;
398 std::size_t operator()(
int ct_idx)
const;
404 absl::flat_hash_map<int, int, IntervalConstraintHash, IntervalConstraintEq>
405 interval_representative_;