14#ifndef ORTOOLS_SAT_SCHEDULING_CUTS_H_
15#define ORTOOLS_SAT_SCHEDULING_CUTS_H_
23#include "absl/types/span.h"
50 const std::optional<AffineExpression>& makespan,
Model* model);
91 const std::optional<AffineExpression>& makespan,
Model* model);
162 std::vector<std::pair<IntegerValue, IntegerValue>>
profile_;
171 void Init(absl::Span<std::unique_ptr<CompletionTimeEvent>> events,
175 absl::Span<std::unique_ptr<CompletionTimeEvent>> events,
176 absl::Span<const int> permutation);
179 void BuildPredecessors(
180 absl::Span<std::unique_ptr<CompletionTimeEvent>> events,
Model* model);
183 int max_task_index_ = 0;
184 std::vector<bool> visited_;
193template <
typename Sink>
197 sink.Append(
"FINISHED");
200 sink.Append(
"ABORTED");
203 sink.Append(
"NO_VALID_PERMUTATION");
217 absl::Span<CompletionTimeEvent*> events, IntegerValue capacity_max,
218 double unweighted_threshold,
double weighted_threshold,
219 CtExhaustiveHelper& helper,
double& min_sum_of_ends,
220 double& min_sum_of_weighted_ends,
bool& cut_use_precedences,
221 int& exploration_credit);
229 std::vector<std::unique_ptr<E>>& events) {
230 if (events.empty())
return {};
232 std::sort(events.begin(), events.end(),
233 [](
const std::unique_ptr<E>& a,
const std::unique_ptr<E>&
b) {
234 return std::tie(a->start_min, a->end_max) <
235 std::tie(b->start_min, b->end_max);
237 const int size = events.size();
238 std::vector<absl::Span<std::unique_ptr<E>>> result;
239 IntegerValue max_end_max = events[0]->end_max;
241 for (
int i = 1;
i < size; ++
i) {
242 const E&
event = *events[
i];
243 if (event.start_min >= max_end_max) {
245 result.push_back(absl::MakeSpan(events.data() + start,
i - start));
249 max_end_max = std::max(max_end_max, event.end_max);
251 if (size - start > 1) {
252 result.push_back(absl::MakeSpan(events.data() + start, size - start));
const CompactVectorVector< int > & predecessors() const
std::vector< IntegerValue > assigned_ends_
std::vector< std::pair< IntegerValue, IntegerValue > > profile_
int max_task_index() const
void Init(absl::Span< std::unique_ptr< CompletionTimeEvent > > events, Model *model)
bool PermutationIsCompatibleWithPrecedences(absl::Span< std::unique_ptr< CompletionTimeEvent > > events, absl::Span< const int > permutation)
std::vector< CompletionTimeEvent * > residual_events_
CtExhaustiveHelper()=default
DagTopologicalSortIterator valid_permutation_iterator_
std::vector< std::pair< IntegerValue, IntegerValue > > new_profile_
std::vector< int > task_to_index_
CutGenerator CreateCumulativeCompletionTimeCutGenerator(SchedulingConstraintHelper *helper, SchedulingDemandHelper *demands_helper, const AffineExpression &capacity, Model *model)
CompletionTimeExplorationStatus ComputeMinSumOfWeightedEndMins(absl::Span< CompletionTimeEvent * > events, IntegerValue capacity_max, double unweighted_threshold, double weighted_threshold, CtExhaustiveHelper &helper, double &min_sum_of_ends, double &min_sum_of_weighted_ends, bool &cut_use_precedences, int &exploration_credit)
CutGenerator CreateCumulativePrecedenceCutGenerator(SchedulingConstraintHelper *helper, SchedulingDemandHelper *demands_helper, const AffineExpression &capacity, Model *model)
std::vector< absl::Span< std::unique_ptr< E > > > SplitEventsInIndendentSets(std::vector< std::unique_ptr< E > > &events)
CutGenerator CreateCumulativeEnergyCutGenerator(SchedulingConstraintHelper *helper, SchedulingDemandHelper *demands_helper, const AffineExpression &capacity, const std::optional< AffineExpression > &makespan, Model *model)
CutGenerator CreateCumulativeTimeTableCutGenerator(SchedulingConstraintHelper *helper, SchedulingDemandHelper *demands_helper, const AffineExpression &capacity, Model *model)
CutGenerator CreateNoOverlapCompletionTimeCutGenerator(SchedulingConstraintHelper *helper, Model *model)
CutGenerator CreateNoOverlapEnergyCutGenerator(SchedulingConstraintHelper *helper, const std::optional< AffineExpression > &makespan, Model *model)
CutGenerator CreateNoOverlapPrecedenceCutGenerator(SchedulingConstraintHelper *helper, Model *model)
void AbslStringify(Sink &sink, EdgePosition e)
CompletionTimeExplorationStatus
std::vector< LiteralValueValue > decomposed_energy
CompletionTimeEvent(int t, SchedulingConstraintHelper *x_helper, SchedulingDemandHelper *demands_helper)
std::string DebugString() const
bool use_decomposed_energy_min