36 const std::vector<IntervalVariable>& vars,
40 if (vars.empty())
return;
51 for (
int i = 0; i < demands.size(); ++i) {
52 if (intervals->MaxSize(vars[i]) == 0)
continue;
55 builder.
AddTerm(demands[i], IntegerValue(1));
59 std::vector<Literal> enforcement_literals;
60 if (intervals->IsOptional(vars[i])) {
61 enforcement_literals.push_back(intervals->PresenceLiteral(vars[i]));
67 if (intervals->MinSize(vars[i]) == 0) {
68 enforcement_literals.push_back(encoder->GetOrCreateAssociatedLiteral(
73 if (enforcement_literals.empty()) {
80 if (vars.size() == 1)
return;
82 const SatParameters&
parameters = *(
model->GetOrCreate<SatParameters>());
86 if (
parameters.use_disjunctive_constraint_in_cumulative_constraint()) {
94 std::vector<IntervalVariable> in_disjunction;
95 for (
int i = 0; i < vars.size(); ++i) {
96 if (intervals->MinSize(vars[i]) > 0 &&
97 2 * integer_trail->LowerBound(demands[i]) >
98 integer_trail->UpperBound(
capacity)) {
99 in_disjunction.push_back(vars[i]);
120 if (in_disjunction.size() == vars.size())
return;
123 if (helper ==
nullptr) {
125 model->TakeOwnership(helper);
134 model->TakeOwnership(time_tabling);
138 if (
parameters.use_overload_checker_in_cumulative_constraint()) {
145 if (
parameters.use_timetable_edge_finding_in_cumulative_constraint()) {
149 model->TakeOwnership(time_table_edge_finding);
155 const std::vector<IntervalVariable>& vars,
159 if (vars.empty())
return;
163 const Coefficient fixed_capacity(
166 const int num_tasks = vars.size();
171 std::vector<IntegerVariable> start_vars;
172 std::vector<IntegerVariable> end_vars;
173 std::vector<IntegerValue> fixed_demands;
175 for (
int t = 0; t < num_tasks; ++t) {
176 start_vars.push_back(intervals->StartVar(vars[t]));
177 end_vars.push_back(intervals->EndVar(vars[t]));
179 fixed_demands.push_back(integer_trail->
LowerBound(demands[t]));
185 for (
int t = 0; t < num_tasks; ++t) {
190 for (IntegerValue
time = min_start;
time < max_end; ++
time) {
191 std::vector<LiteralWithCoeff> literals_with_coeff;
192 for (
int t = 0; t < num_tasks; ++t) {
201 std::vector<Literal> consume_condition;
205 if (intervals->IsOptional(vars[t])) {
206 consume_condition.push_back(intervals->PresenceLiteral(vars[t]));
210 consume_condition.push_back(encoder->GetOrCreateAssociatedLiteral(
212 consume_condition.push_back(encoder->GetOrCreateAssociatedLiteral(
214 IntegerValue(
time + 1))));
222 literals_with_coeff.push_back(
227 fixed_capacity, &literals_with_coeff);