14 #ifndef OR_TOOLS_CONSTRAINT_SOLVER_ROUTING_LP_SCHEDULING_H_
15 #define OR_TOOLS_CONSTRAINT_SOLVER_ROUTING_LP_SCHEDULING_H_
29 #include "absl/container/flat_hash_map.h"
30 #include "absl/time/time.h"
35 #include "ortools/constraint_solver/routing_parameters.pb.h"
37 #include "ortools/glop/parameters.pb.h"
40 #include "ortools/sat/cp_model.pb.h"
43 #include "ortools/sat/sat_parameters.pb.h"
64 const std::function<int64_t(int64_t)>& next_accessor,
66 const std::vector<RoutingModel::RouteDimensionTravelInfo>*
67 dimension_travel_info_per_route =
nullptr);
70 return propagated_bounds_[PositiveNode(
index)];
74 const int64_t negated_upper_bound = propagated_bounds_[NegativeNode(
index)];
77 : -negated_upper_bound;
90 static const int kNoParent;
91 static const int kParentToBePropagated;
95 int PositiveNode(
int index)
const {
return 2 *
index; }
96 int NegativeNode(
int index)
const {
return 2 *
index + 1; }
98 void AddNodeToQueue(
int node) {
99 if (!node_in_queue_[node]) {
100 bf_queue_.push_back(node);
101 node_in_queue_[node] =
true;
108 void AddArcs(
int first_index,
int second_index, int64_t offset);
110 bool InitializeArcsAndBounds(
111 const std::function<int64_t(int64_t)>& next_accessor,
112 int64_t cumul_offset,
113 const std::vector<RoutingModel::RouteDimensionTravelInfo>*
114 dimension_travel_info_per_route =
nullptr);
116 bool UpdateCurrentLowerBoundOfNode(
int node, int64_t new_lb, int64_t offset);
118 bool DisassembleSubtree(
int source,
int target);
120 bool CleanupAndReturnFalse() {
122 for (
int node_to_cleanup : bf_queue_) {
123 node_in_queue_[node_to_cleanup] =
false;
129 const RoutingDimension& dimension_;
130 const int64_t num_nodes_;
135 std::vector<std::vector<ArcInfo>> outgoing_arcs_;
137 std::deque<int> bf_queue_;
138 std::vector<bool> node_in_queue_;
139 std::vector<int> tree_parent_node_of_;
143 std::vector<int64_t> propagated_bounds_;
146 std::vector<int> tmp_dfs_stack_;
149 std::vector<std::pair<int64_t, int64_t>>
150 visited_pickup_delivery_indices_for_pair_;
172 const std::vector<int64_t>& starts,
173 const std::vector<int64_t>& ends) = 0;
213 const std::vector<std::pair<int, double>>& variable_coeffs) {
216 for (
const auto& variable_coeff : variable_coeffs) {
226 const std::vector<std::pair<int, double>>& weighted_variables) {
234 const int under_lower_bound_ct =
255 const int within_bounds_ct =
258 return within_bounds;
265 : is_relaxation_(is_relaxation) {
270 linear_program_.
Clear();
272 allowed_intervals_.clear();
286 const int64_t kMaxValue = 1e10;
288 const double lp_max =
290 if (lp_min <= lp_max) {
299 const std::vector<int64_t>& ends)
override {
304 allowed_intervals_[
index] =
305 std::make_unique<SortedDisjointIntervalList>(starts, ends);
324 for (glop::ColIndex i(0); i < linear_program_.
num_variables(); ++i) {
350 double max_coefficient = 0;
351 for (
int variable = 0; variable <
NumVariables(); variable++) {
355 DCHECK_GE(max_coefficient, 0);
356 if (max_coefficient == 0) {
361 double normalized_objective_value = 0;
362 for (
int variable = 0; variable <
NumVariables(); variable++) {
365 const double normalized_coeff =
coefficient / max_coefficient;
367 normalized_objective_value += normalized_coeff *
GetValue(variable);
370 normalized_objective_value =
std::max(
373 normalized_objective_value);
376 std::vector<int> )
override {}
378 std::vector<int> )
override {}
382 absl::ToDoubleSeconds(duration_limit));
396 if (is_relaxation_) {
399 for (
const auto& allowed_interval : allowed_intervals_) {
400 const double value_double =
GetValue(allowed_interval.first);
401 const int64_t
value =
406 allowed_interval.second.get();
408 if (it == interval_list->
end() || value < it->
start) {
426 glop::GlopParameters params;
437 const bool is_relaxation_;
440 absl::flat_hash_map<int, std::unique_ptr<SortedDisjointIntervalList>>
447 parameters_.set_num_search_workers(1);
450 parameters_.set_cp_model_presolve(
true);
451 parameters_.set_max_presolve_iterations(0);
452 parameters_.set_catch_sigint_signal(
false);
453 parameters_.set_mip_max_bound(1e8);
454 parameters_.set_search_branching(sat::SatParameters::LP_SEARCH);
455 parameters_.set_linearization_level(2);
456 parameters_.set_cut_level(0);
457 parameters_.set_use_absl_random(
false);
463 objective_coefficients_.clear();
466 const int index = model_.variables_size();
467 sat::IntegerVariableProto*
const variable = model_.add_variables();
468 variable->add_domain(0);
469 variable->add_domain(
static_cast<int64_t
>(parameters_.mip_max_bound()));
473 model_.mutable_variables(
index)->set_name(
name.data());
478 const int64_t capped_upper_bound =
479 std::min<int64_t>(
upper_bound, parameters_.mip_max_bound());
480 if (
lower_bound > capped_upper_bound)
return false;
481 sat::IntegerVariableProto*
const variable = model_.mutable_variables(
index);
483 variable->set_domain(1, capped_upper_bound);
487 const std::vector<int64_t>& ends)
override {
488 DCHECK_EQ(starts.size(), ends.size());
490 for (
int i = 0; i < starts.size(); ++i) {
494 absl::StrFormat(
"disjoint(%ld, %ld)",
index, i));
500 model_.mutable_constraints(window_ct)->add_enforcement_literal(variable);
504 return model_.variables(
index).domain(0);
507 const auto& domain = model_.variables(
index).domain();
508 return domain[domain.size() - 1];
511 if (
index >= objective_coefficients_.size()) {
512 objective_coefficients_.resize(
index + 1, 0);
515 sat::FloatObjectiveProto*
const objective =
516 model_.mutable_floating_point_objective();
517 objective->add_vars(
index);
521 return (
index < objective_coefficients_.size())
522 ? objective_coefficients_[
index]
526 model_.mutable_floating_point_objective()->Clear();
530 sat::LinearConstraintProto*
const ct =
531 model_.add_constraints()->mutable_linear();
534 return model_.constraints_size() - 1;
537 sat::LinearConstraintProto*
const ct =
538 model_.mutable_constraints(ct_index)->mutable_linear();
541 ct->add_coeffs(integer_coefficient);
545 const sat::CpObjectiveProto& objective = response_.integer_objective();
546 int64_t activity = 0;
547 for (
int i = 0; i < objective.vars_size(); ++i) {
548 activity += response_.solution(objective.vars(i)) * objective.coeffs(i);
552 for (
int i = 0; i < objective.vars_size(); ++i) {
555 model_.clear_objective();
558 sat::LinearArgumentProto*
const ct =
559 model_.add_constraints()->mutable_lin_max();
560 ct->mutable_target()->add_vars(max_var);
561 ct->mutable_target()->add_coeffs(1);
562 for (
const int var : vars) {
563 sat::LinearExpressionProto*
const expr =
ct->add_exprs();
569 sat::LinearArgumentProto*
const ct =
570 model_.add_constraints()->mutable_int_prod();
571 ct->mutable_target()->add_vars(product_var);
572 ct->mutable_target()->add_coeffs(1);
573 for (
const int var : vars) {
574 sat::LinearExpressionProto* expr =
ct->add_exprs();
580 DCHECK_LT(
ct, model_.constraints_size());
581 model_.mutable_constraints(
ct)->add_enforcement_literal(condition);
584 parameters_.set_max_time_in_seconds(absl::ToDoubleSeconds(duration_limit));
585 VLOG(2) << model_.DebugString();
586 if (hint_.vars_size() == model_.variables_size()) {
587 *model_.mutable_solution_hint() = hint_;
592 VLOG(2) << response_.DebugString();
595 !model_.has_floating_point_objective())) {
597 for (
int i = 0; i < response_.solution_size(); ++i) {
599 hint_.add_values(response_.solution(i));
609 return response_.solution(
index);
618 bool ModelIsEmpty()
const override {
return model_.ByteSizeLong() == 0; }
624 sat::CpModelProto model_;
625 sat::CpSolverResponse response_;
626 sat::SatParameters parameters_;
627 std::vector<double> objective_coefficients_;
628 sat::PartialVariableAssignment hint_;
638 bool use_precedence_propagator);
645 int vehicle,
const std::function<int64_t(int64_t)>& next_accessor,
648 std::vector<int64_t>* break_values, int64_t*
cost, int64_t* transit_cost,
649 bool clear_lp =
true);
655 int vehicle,
const std::function<int64_t(int64_t)>& next_accessor,
658 const std::vector<int64_t>& solution_cumul_values,
659 const std::vector<int64_t>& solution_break_values, int64_t*
cost,
660 int64_t* transit_cost, int64_t* cost_offset =
nullptr,
661 bool reuse_previous_model_if_possible =
true,
bool clear_lp =
false,
662 bool clear_solution_constraints =
true,
663 absl::Duration*
const solve_duration =
nullptr);
666 int vehicle,
const std::function<int64_t(int64_t)>& next_accessor,
667 const std::function<int64_t(int64_t, int64_t)>& transit_accessor,
669 const std::vector<RoutingModel::ResourceGroup::Resource>& resources,
670 const std::vector<int>& resource_indices,
bool optimize_vehicle_costs,
672 std::vector<int64_t>* costs_without_transits,
673 std::vector<std::vector<int64_t>>* cumul_values,
674 std::vector<std::vector<int64_t>>* break_values,
bool clear_lp =
true);
677 const std::function<int64_t(int64_t)>& next_accessor,
678 const std::vector<RouteDimensionTravelInfo>&
679 dimension_travel_info_per_route,
681 std::vector<int64_t>* break_values,
682 std::vector<std::vector<int>>* resource_indices_per_group, int64_t*
cost,
683 int64_t* transit_cost,
bool clear_lp =
true);
686 const std::function<int64_t(int64_t)>& next_accessor,
687 const std::vector<RouteDimensionTravelInfo>&
688 dimension_travel_info_per_route,
690 std::vector<int64_t>* break_values,
691 std::vector<std::vector<int>>* resource_indices_per_group);
694 int vehicle,
const std::function<int64_t(int64_t)>& next_accessor,
698 std::vector<int64_t>* break_values);
709 bool InitSingleRoute(
int vehicle,
710 const std::function<int64_t(int64_t)>& next_accessor,
711 const RouteDimensionTravelInfo& dimension_travel_info,
713 std::vector<int64_t>* cumul_values, int64_t*
cost,
714 int64_t* transit_cost, int64_t* cumul_offset,
715 int64_t*
const cost_offset);
719 bool ExtractRouteCumulBounds(
const std::vector<int64_t>& route,
720 int64_t cumul_offset);
725 bool TightenRouteCumulBounds(
const std::vector<int64_t>& route,
726 const std::vector<int64_t>& min_transits,
727 int64_t cumul_offset);
733 bool SetRouteCumulConstraints(
734 int vehicle,
const std::function<int64_t(int64_t)>& next_accessor,
735 const std::function<int64_t(int64_t, int64_t)>& transit_accessor,
736 const RouteDimensionTravelInfo& dimension_travel_info,
737 int64_t cumul_offset,
bool optimize_costs,
739 int64_t* route_cost_offset);
744 bool SetRouteTravelConstraints(
745 const RouteDimensionTravelInfo& dimension_travel_info,
746 const std::vector<int>& lp_slacks,
747 const std::vector<int64_t>& fixed_transit,
757 bool SetGlobalConstraints(
758 const std::function<int64_t(int64_t)>& next_accessor,
759 int64_t cumul_offset,
bool optimize_costs,
762 void SetValuesFromLP(
const std::vector<int>& lp_variables, int64_t offset,
764 std::vector<int64_t>* lp_values)
const;
766 void SetResourceIndices(
768 std::vector<std::vector<int>>* resource_indices_per_group)
const;
778 const glop::GlopParameters& packing_parameters);
780 std::unique_ptr<CumulBoundsPropagator> propagator_;
781 std::vector<int64_t> current_route_min_cumuls_;
782 std::vector<int64_t> current_route_max_cumuls_;
785 std::vector<int> current_route_cumul_variables_;
786 std::vector<int> index_to_cumul_variable_;
791 std::vector<int> current_route_break_variables_;
795 std::vector<int> all_break_variables_;
799 std::vector<int> vehicle_to_all_break_variables_offset_;
804 std::vector<std::vector<int>>
805 resource_group_to_resource_to_vehicle_assignment_variables_;
808 int min_start_cumul_;
809 std::vector<std::pair<int64_t, int64_t>>
810 visited_pickup_delivery_indices_for_pair_;
822 RoutingSearchParameters::SchedulingSolver solver_type);
829 int vehicle,
const std::function<int64_t(int64_t)>& next_accessor,
830 int64_t* optimal_cost);
835 int vehicle,
const std::function<int64_t(int64_t)>& next_accessor,
836 int64_t* optimal_cost_without_transits);
838 std::vector<DimensionSchedulingStatus>
840 int vehicle,
const std::function<int64_t(int64_t)>& next_accessor,
841 const std::function<int64_t(int64_t, int64_t)>& transit_accessor,
842 const std::vector<RoutingModel::ResourceGroup::Resource>& resources,
843 const std::vector<int>& resource_indices,
bool optimize_vehicle_costs,
844 std::vector<int64_t>* optimal_costs_without_transits,
845 std::vector<std::vector<int64_t>>* optimal_cumuls,
846 std::vector<std::vector<int64_t>>* optimal_breaks);
854 int vehicle,
const std::function<int64_t(int64_t)>& next_accessor,
856 std::vector<int64_t>* optimal_cumuls,
857 std::vector<int64_t>* optimal_breaks);
861 int vehicle,
const std::function<int64_t(int64_t)>& next_accessor,
863 std::vector<int64_t>* optimal_cumuls,
864 std::vector<int64_t>* optimal_breaks, int64_t* optimal_cost);
869 int vehicle,
const std::function<int64_t(int64_t)>& next_accessor,
871 const std::vector<int64_t>& solution_cumul_values,
872 const std::vector<int64_t>& solution_break_values, int64_t* solution_cost,
873 int64_t* cost_offset =
nullptr,
874 bool reuse_previous_model_if_possible =
false,
bool clear_lp =
true,
875 absl::Duration* solve_duration =
nullptr);
883 int vehicle,
const std::function<int64_t(int64_t)>& next_accessor,
886 std::vector<int64_t>* packed_cumuls, std::vector<int64_t>* packed_breaks);
893 std::vector<std::unique_ptr<RoutingLinearSolverWrapper>> solver_;
901 RoutingSearchParameters::SchedulingSolver solver_type);
908 const std::function<int64_t(int64_t)>& next_accessor,
909 int64_t* optimal_cost_without_transits);
916 const std::function<int64_t(int64_t)>& next_accessor,
917 const std::vector<RoutingModel::RouteDimensionTravelInfo>&
918 dimension_travel_info_per_route,
919 std::vector<int64_t>* optimal_cumuls,
920 std::vector<int64_t>* optimal_breaks,
921 std::vector<std::vector<int>>* optimal_resource_indices_per_group);
927 const std::function<int64_t(int64_t)>& next_accessor,
928 const std::vector<RoutingModel::RouteDimensionTravelInfo>&
929 dimension_travel_info_per_route,
930 std::vector<int64_t>* packed_cumuls, std::vector<int64_t>* packed_breaks,
931 std::vector<std::vector<int>>* resource_indices_per_group);
938 std::unique_ptr<RoutingLinearSolverWrapper> solver_;
961 std::vector<int> vehicles,
int num_resources,
962 std::function<
const std::vector<int64_t>*(
int)>
963 vehicle_to_resource_assignment_costs,
964 std::vector<int>* resource_indices);
976 int v,
const RoutingModel::ResourceGroup& resource_group,
977 const std::function<int64_t(int64_t)>& next_accessor,
978 const std::function<int64_t(int64_t, int64_t)>& transit_accessor,
979 bool optimize_vehicle_costs, LocalDimensionCumulOptimizer* lp_optimizer,
980 LocalDimensionCumulOptimizer* mp_optimizer,
981 std::vector<int64_t>* assignment_costs,
982 std::vector<std::vector<int64_t>>* cumul_values,
983 std::vector<std::vector<int64_t>>* break_values);
999 const RoutingModel::RouteDimensionTravelInfo::TransitionInfo::
1000 PiecewiseLinearFormulation& pwl,
1001 int64_t x, int64_t*
value,
double delta = 0);
1009 const RoutingModel::RouteDimensionTravelInfo::TransitionInfo::
1010 PiecewiseLinearFormulation& pwl,
1011 int64_t x,
double delta = 0);
1031 const std::vector<SlopeAndYIntercept>& slope_and_y_intercept);
1037 const RoutingModel::RouteDimensionTravelInfo::TransitionInfo::
1038 PiecewiseLinearFormulation& pwl_function,
1039 int index_start = 0,
int index_end = -1);
const RoutingDimension & dimension() const
bool PropagateCumulBounds(const std::function< int64_t(int64_t)> &next_accessor, int64_t cumul_offset, const std::vector< RoutingModel::RouteDimensionTravelInfo > *dimension_travel_info_per_route=nullptr)
int64_t CumulMax(int index) const
int64_t CumulMin(int index) const
CumulBoundsPropagator(const RoutingDimension *dimension)
DimensionSchedulingStatus OptimizeSingleRoute(int vehicle, const std::function< int64_t(int64_t)> &next_accessor, const RouteDimensionTravelInfo &dimension_travel_info, RoutingLinearSolverWrapper *solver, std::vector< int64_t > *cumul_values, std::vector< int64_t > *break_values, int64_t *cost, int64_t *transit_cost, bool clear_lp=true)
std::vector< DimensionSchedulingStatus > OptimizeSingleRouteWithResources(int vehicle, const std::function< int64_t(int64_t)> &next_accessor, const std::function< int64_t(int64_t, int64_t)> &transit_accessor, const RouteDimensionTravelInfo &dimension_travel_info, const std::vector< RoutingModel::ResourceGroup::Resource > &resources, const std::vector< int > &resource_indices, bool optimize_vehicle_costs, RoutingLinearSolverWrapper *solver, std::vector< int64_t > *costs_without_transits, std::vector< std::vector< int64_t >> *cumul_values, std::vector< std::vector< int64_t >> *break_values, bool clear_lp=true)
DimensionCumulOptimizerCore(const RoutingDimension *dimension, bool use_precedence_propagator)
const RoutingDimension * dimension() const
DimensionSchedulingStatus ComputeSingleRouteSolutionCost(int vehicle, const std::function< int64_t(int64_t)> &next_accessor, const RouteDimensionTravelInfo &dimension_travel_info, RoutingLinearSolverWrapper *solver, const std::vector< int64_t > &solution_cumul_values, const std::vector< int64_t > &solution_break_values, int64_t *cost, int64_t *transit_cost, int64_t *cost_offset=nullptr, bool reuse_previous_model_if_possible=true, bool clear_lp=false, bool clear_solution_constraints=true, absl::Duration *const solve_duration=nullptr)
DimensionSchedulingStatus Optimize(const std::function< int64_t(int64_t)> &next_accessor, const std::vector< RouteDimensionTravelInfo > &dimension_travel_info_per_route, RoutingLinearSolverWrapper *solver, std::vector< int64_t > *cumul_values, std::vector< int64_t > *break_values, std::vector< std::vector< int >> *resource_indices_per_group, int64_t *cost, int64_t *transit_cost, bool clear_lp=true)
DimensionSchedulingStatus OptimizeAndPackSingleRoute(int vehicle, const std::function< int64_t(int64_t)> &next_accessor, const RouteDimensionTravelInfo &dimension_travel_info, const RoutingModel::ResourceGroup::Resource *resource, RoutingLinearSolverWrapper *solver, std::vector< int64_t > *cumul_values, std::vector< int64_t > *break_values)
DimensionSchedulingStatus OptimizeAndPack(const std::function< int64_t(int64_t)> &next_accessor, const std::vector< RouteDimensionTravelInfo > &dimension_travel_info_per_route, RoutingLinearSolverWrapper *solver, std::vector< int64_t > *cumul_values, std::vector< int64_t > *break_values, std::vector< std::vector< int >> *resource_indices_per_group)
GlobalDimensionCumulOptimizer(const RoutingDimension *dimension, RoutingSearchParameters::SchedulingSolver solver_type)
DimensionSchedulingStatus ComputePackedCumuls(const std::function< int64_t(int64_t)> &next_accessor, const std::vector< RoutingModel::RouteDimensionTravelInfo > &dimension_travel_info_per_route, std::vector< int64_t > *packed_cumuls, std::vector< int64_t > *packed_breaks, std::vector< std::vector< int >> *resource_indices_per_group)
DimensionSchedulingStatus ComputeCumulCostWithoutFixedTransits(const std::function< int64_t(int64_t)> &next_accessor, int64_t *optimal_cost_without_transits)
DimensionSchedulingStatus ComputeCumuls(const std::function< int64_t(int64_t)> &next_accessor, const std::vector< RoutingModel::RouteDimensionTravelInfo > &dimension_travel_info_per_route, std::vector< int64_t > *optimal_cumuls, std::vector< int64_t > *optimal_breaks, std::vector< std::vector< int >> *optimal_resource_indices_per_group)
const RoutingDimension * dimension() const
std::vector< DimensionSchedulingStatus > ComputeRouteCumulCostsForResourcesWithoutFixedTransits(int vehicle, const std::function< int64_t(int64_t)> &next_accessor, const std::function< int64_t(int64_t, int64_t)> &transit_accessor, const std::vector< RoutingModel::ResourceGroup::Resource > &resources, const std::vector< int > &resource_indices, bool optimize_vehicle_costs, std::vector< int64_t > *optimal_costs_without_transits, std::vector< std::vector< int64_t >> *optimal_cumuls, std::vector< std::vector< int64_t >> *optimal_breaks)
DimensionSchedulingStatus ComputeRouteCumulCost(int vehicle, const std::function< int64_t(int64_t)> &next_accessor, int64_t *optimal_cost)
DimensionSchedulingStatus ComputeRouteCumulCostWithoutFixedTransits(int vehicle, const std::function< int64_t(int64_t)> &next_accessor, int64_t *optimal_cost_without_transits)
LocalDimensionCumulOptimizer(const RoutingDimension *dimension, RoutingSearchParameters::SchedulingSolver solver_type)
const RoutingDimension * dimension() const
DimensionSchedulingStatus ComputeRouteSolutionCost(int vehicle, const std::function< int64_t(int64_t)> &next_accessor, const RoutingModel::RouteDimensionTravelInfo &dimension_travel_info, const std::vector< int64_t > &solution_cumul_values, const std::vector< int64_t > &solution_break_values, int64_t *solution_cost, int64_t *cost_offset=nullptr, bool reuse_previous_model_if_possible=false, bool clear_lp=true, absl::Duration *solve_duration=nullptr)
DimensionSchedulingStatus ComputePackedRouteCumuls(int vehicle, const std::function< int64_t(int64_t)> &next_accessor, const RoutingModel::RouteDimensionTravelInfo &dimension_travel_info, const RoutingModel::ResourceGroup::Resource *resource, std::vector< int64_t > *packed_cumuls, std::vector< int64_t > *packed_breaks)
DimensionSchedulingStatus ComputeRouteCumulsAndCost(int vehicle, const std::function< int64_t(int64_t)> &next_accessor, const RoutingModel::RouteDimensionTravelInfo &dimension_travel_info, std::vector< int64_t > *optimal_cumuls, std::vector< int64_t > *optimal_breaks, int64_t *optimal_cost)
DimensionSchedulingStatus ComputeRouteCumuls(int vehicle, const std::function< int64_t(int64_t)> &next_accessor, const RoutingModel::RouteDimensionTravelInfo &dimension_travel_info, std::vector< int64_t > *optimal_cumuls, std::vector< int64_t > *optimal_breaks)
static int64_t FastInt64Round(double x)
void SetCoefficient(int ct_index, int index, double coefficient) override
int NumVariables() const override
bool IsCPSATSolver() override
int CreateNewPositiveVariable() override
bool SetVariableBounds(int index, int64_t lower_bound, int64_t upper_bound) override
double GetValue(int index) const override
int64_t GetObjectiveValue() const override
DimensionSchedulingStatus Solve(absl::Duration duration_limit) override
~RoutingCPSatWrapper() override
void AddMaximumConstraint(int max_var, std::vector< int > vars) override
void AddProductConstraint(int product_var, std::vector< int > vars) override
std::string PrintModel() const override
void SetEnforcementLiteral(int ct, int condition) override
double GetObjectiveCoefficient(int index) const override
int64_t GetVariableUpperBound(int index) const override
void AddObjectiveConstraint() override
void SetVariableDisjointBounds(int index, const std::vector< int64_t > &starts, const std::vector< int64_t > &ends) override
bool SolutionIsInteger() const override
int CreateNewConstraint(int64_t lower_bound, int64_t upper_bound) override
bool ModelIsEmpty() const override
void SetVariableName(int index, absl::string_view name) override
void SetParameters(const std::string &) override
void SetObjectiveCoefficient(int index, double coefficient) override
int64_t GetVariableLowerBound(int index) const override
void ClearObjective() override
Dimensions represent quantities accumulated at nodes along the routes.
int NumVariables() const override
bool IsCPSATSolver() override
void AddProductConstraint(int, std::vector< int >) override
RoutingGlopWrapper(bool is_relaxation, const glop::GlopParameters ¶meters)
int CreateNewPositiveVariable() override
bool SetVariableBounds(int index, int64_t lower_bound, int64_t upper_bound) override
double GetValue(int index) const override
void SetEnforcementLiteral(int, int) override
int64_t GetObjectiveValue() const override
DimensionSchedulingStatus Solve(absl::Duration duration_limit) override
void SetCoefficient(int ct, int index, double coefficient) override
std::string PrintModel() const override
double GetObjectiveCoefficient(int index) const override
int64_t GetVariableUpperBound(int index) const override
void AddObjectiveConstraint() override
void SetVariableDisjointBounds(int index, const std::vector< int64_t > &starts, const std::vector< int64_t > &ends) override
bool SolutionIsInteger() const override
int CreateNewConstraint(int64_t lower_bound, int64_t upper_bound) override
void SetVariableName(int index, absl::string_view name) override
void SetParameters(const std::string ¶meters) override
void AddMaximumConstraint(int, std::vector< int >) override
void SetObjectiveCoefficient(int index, double coefficient) override
int64_t GetVariableLowerBound(int index) const override
void ClearObjective() override
virtual void SetCoefficient(int ct, int index, double coefficient)=0
virtual int NumVariables() const =0
virtual void SetParameters(const std::string ¶meters)=0
virtual bool ModelIsEmpty() const
virtual double GetObjectiveCoefficient(int index) const =0
virtual void AddProductConstraint(int product_var, std::vector< int > vars)=0
virtual int CreateNewPositiveVariable()=0
int AddLinearConstraint(int64_t lower_bound, int64_t upper_bound, const std::vector< std::pair< int, double >> &variable_coeffs)
int AddVariable(int64_t lower_bound, int64_t upper_bound)
virtual bool IsCPSATSolver()=0
virtual int64_t GetObjectiveValue() const =0
int AddReifiedLinearConstraint(int64_t lower_bound, int64_t upper_bound, const std::vector< std::pair< int, double >> &weighted_variables)
virtual void SetVariableName(int index, absl::string_view name)=0
virtual void AddObjectiveConstraint()=0
virtual void ClearObjective()=0
virtual int CreateNewConstraint(int64_t lower_bound, int64_t upper_bound)=0
virtual double GetValue(int index) const =0
virtual DimensionSchedulingStatus Solve(absl::Duration duration_limit)=0
virtual void SetVariableDisjointBounds(int index, const std::vector< int64_t > &starts, const std::vector< int64_t > &ends)=0
virtual bool SetVariableBounds(int index, int64_t lower_bound, int64_t upper_bound)=0
virtual void SetObjectiveCoefficient(int index, double coefficient)=0
virtual void SetEnforcementLiteral(int ct, int condition)=0
virtual std::string PrintModel() const =0
virtual int64_t GetVariableUpperBound(int index) const =0
virtual bool SolutionIsInteger() const =0
virtual ~RoutingLinearSolverWrapper()
virtual int64_t GetVariableLowerBound(int index) const =0
virtual void AddMaximumConstraint(int max_var, std::vector< int > vars)=0
A Resource sets attributes (costs/constraints) for a set of dimensions.
This class represents a sorted list of disjoint, closed intervals.
ConstIterator end() const
Iterator FirstIntervalGreaterOrEqual(int64_t value) const
Returns an iterator to either:
GlopParameters * GetMutableParameters()
const DenseRow & variable_values() const
Fractional GetObjectiveValue() const
ABSL_MUST_USE_RESULT ProblemStatus Solve(const LinearProgram &lp)
void SetParameters(const GlopParameters ¶meters)
void SetVariableBounds(ColIndex col, Fractional lower_bound, Fractional upper_bound)
void SetCoefficient(RowIndex row, ColIndex col, Fractional value)
void SetVariableName(ColIndex col, absl::string_view name)
const DenseRow & variable_lower_bounds() const
const DenseRow & objective_coefficients() const
void SetConstraintBounds(RowIndex row, Fractional lower_bound, Fractional upper_bound)
ColIndex CreateNewVariable()
bool SolutionIsInteger(const DenseRow &solution, Fractional absolute_tolerance) const
void NotifyThatColumnsAreClean()
void SetObjectiveCoefficient(ColIndex col, Fractional value)
const DenseRow & variable_upper_bounds() const
ColIndex num_variables() const
RowIndex CreateNewConstraint()
void SetMaximizationProblem(bool maximize)
Class that owns everything related to a particular optimization model.
constexpr double kInfinity
std::function< SatParameters(Model *)> NewSatParameters(const std::string ¶ms)
Creates parameters for the solver, which you can add to the model with.
CpSolverResponse SolveCpModel(const CpModelProto &model_proto, Model *model)
Solves the given CpModelProto.
Collection of objects used to extend the Constraint Solver library.
std::vector< SlopeAndYIntercept > PiecewiseLinearFormulationToSlopeAndYIntercept(const RoutingModel::RouteDimensionTravelInfo::TransitionInfo::PiecewiseLinearFormulation &pwl_function, int index_start, int index_end)
int64_t ComputeBestVehicleToResourceAssignment(std::vector< int > vehicles, int num_resources, std::function< const std::vector< int64_t > *(int)> vehicle_to_resource_assignment_costs, std::vector< int > *resource_indices)
int64_t ComputeConvexPiecewiseLinearFormulationValue(const RoutingModel::RouteDimensionTravelInfo::TransitionInfo::PiecewiseLinearFormulation &pwl, int64_t x, double delta)
PiecewiseEvaluationStatus
@ SMALLER_THAN_LOWER_BOUND
@ LARGER_THAN_UPPER_BOUND
DimensionSchedulingStatus
std::vector< bool > SlopeAndYInterceptToConvexityRegions(const std::vector< SlopeAndYIntercept > &slope_and_y_intercept)
bool ComputeVehicleToResourcesAssignmentCosts(int v, const RoutingModel::ResourceGroup &resource_group, const std::function< int64_t(int64_t)> &next_accessor, const std::function< int64_t(int64_t, int64_t)> &transit_accessor, bool optimize_vehicle_costs, LocalDimensionCumulOptimizer *lp_optimizer, LocalDimensionCumulOptimizer *mp_optimizer, std::vector< int64_t > *assignment_costs, std::vector< std::vector< int64_t >> *cumul_values, std::vector< std::vector< int64_t >> *break_values)
PiecewiseEvaluationStatus ComputePiecewiseLinearFormulationValue(const RoutingModel::RouteDimensionTravelInfo::TransitionInfo::PiecewiseLinearFormulation &pwl, int64_t x, int64_t *value, double delta)
Contains the information needed by the solver to optimize a dimension's cumuls with travel-start depe...
friend ::std::ostream & operator<<(::std::ostream &os, const SlopeAndYIntercept &it)
#define VLOG(verboselevel)