diff --git a/src/constraint_solver/constraint_solver.h b/src/constraint_solver/constraint_solver.h index 9b14d3d109..812a03b50a 100644 --- a/src/constraint_solver/constraint_solver.h +++ b/src/constraint_solver/constraint_solver.h @@ -5081,13 +5081,19 @@ class DisjunctiveConstraint : public Constraint { // least transit_evaluator->Run(a, b). This evaluator must always returns // a positive or null value. // This method takes ownership of the evaluator. - virtual void SetTransitionTime(Solver::IndexEvaluator2* transit_evaluator) { + void SetTransitionTime(Solver::IndexEvaluator2* transit_evaluator) { transition_time_.reset(transit_evaluator); if (transition_time_.get() != nullptr) { transition_time_->CheckIsRepeatable(); } } + int64 TransitionTime(int before_index, int after_index) { + return transition_time_ != nullptr + ? transition_time_->Run(before_index, after_index) + : 0; + } + #if !defined(SWIG) virtual const std::vector& nexts() const = 0; virtual const std::vector& actives() const = 0; diff --git a/src/constraint_solver/resource.cc b/src/constraint_solver/resource.cc index a466091ad1..5c5acf39b9 100644 --- a/src/constraint_solver/resource.cc +++ b/src/constraint_solver/resource.cc @@ -636,12 +636,12 @@ class RankedPropagator : public Constraint { RankedPropagator(Solver* const solver, const std::vector& nexts, const std::vector& intervals, const std::vector& slacks, - Solver::IndexEvaluator2* const transition_time) + DisjunctiveConstraint* const disjunctive) : Constraint(solver), nexts_(nexts), intervals_(intervals), slacks_(slacks), - transition_time_(transition_time), + disjunctive_(disjunctive), partial_sequence_(intervals.size()), previous_(intervals.size() + 2, 0) {} @@ -818,9 +818,7 @@ class RankedPropagator : public Constraint { const int before_index = partial_sequence_[before]; const int after_index = partial_sequence_[after]; - return transition_time_ != nullptr - ? transition_time_->Run(before_index, after_index) - : 0; + return disjunctive_->TransitionTime(before_index, after_index); } virtual std::string DebugString() const { @@ -840,7 +838,7 @@ class RankedPropagator : public Constraint { std::vector nexts_; std::vector intervals_; std::vector slacks_; - Solver::IndexEvaluator2* const transition_time_; + DisjunctiveConstraint* const disjunctive_; RevPartialSequence partial_sequence_; std::vector previous_; }; @@ -999,7 +997,7 @@ class FullDisjunctiveConstraint : public DisjunctiveConstraint { std::vector short_slacks(time_slacks_.begin() + 1, time_slacks_.end()); s->AddConstraint(s->RevAlloc(new RankedPropagator( - s, nexts_, intervals_, short_slacks, transition_time_.get()))); + s, nexts_, intervals_, short_slacks, this))); } SequenceVar* sequence_var_;