Skip to content

Commit d16015a

Browse files
committed
WIP routing: Improve pybind11 binding
1 parent 56b4c83 commit d16015a

File tree

3 files changed

+691
-5
lines changed

3 files changed

+691
-5
lines changed

cmake/python.cmake

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -540,7 +540,7 @@ add_custom_command(
540540
COMMAND ${stubgen_EXECUTABLE} -p ortools.math_opt.core.python.solver --output .
541541
COMMAND ${stubgen_EXECUTABLE} -p ortools.pdlp.python.pdlp --output .
542542
COMMAND ${stubgen_EXECUTABLE} -p ortools.routing.pywraprouting --output .
543-
COMMAND ${stubgen_EXECUTABLE} -p ortools.routing.python.routing --output .
543+
COMMAND ${stubgen_EXECUTABLE} -p ortools.routing.python.model --output .
544544
COMMAND ${stubgen_EXECUTABLE} -p ortools.sat.python.swig_helper --output .
545545
COMMAND ${stubgen_EXECUTABLE} -p ortools.scheduling.python.rcpsp --output .
546546
COMMAND ${stubgen_EXECUTABLE} -p ortools.util.python.sorted_interval_list --output .

ortools/routing/python/model.cc

Lines changed: 92 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -11,8 +11,10 @@
1111
// See the License for the specific language governing permissions and
1212
// limitations under the License.
1313

14+
#include <algorithm>
1415
#include <cstdint>
1516
#include <functional>
17+
#include <iterator>
1618
#include <utility>
1719

1820
#include "ortools/constraint_solver/constraint_solver.h"
@@ -30,8 +32,10 @@
3032
#include "pybind11/stl.h"
3133
#include "pybind11_protobuf/native_proto_caster.h"
3234

35+
using ::operations_research::DefaultRoutingModelParameters;
3336
using ::operations_research::DefaultRoutingSearchParameters;
3437
using ::operations_research::RoutingIndexManager;
38+
using ::operations_research::RoutingDimension;
3539
using ::operations_research::RoutingModel;
3640
using ::pybind11::arg;
3741

@@ -41,7 +45,12 @@ PYBIND11_MODULE(model, m) {
4145
pybind11::module::import(
4246
"ortools.constraint_solver.python.constraint_solver");
4347

48+
m.def("default_routing_model_parameters", &DefaultRoutingModelParameters,
49+
pybind11::return_value_policy::reference_internal,
50+
DOC(operations_research, DefaultRoutingModelParameters));
51+
4452
m.def("default_routing_search_parameters", &DefaultRoutingSearchParameters,
53+
pybind11::return_value_policy::reference_internal,
4554
DOC(operations_research, DefaultRoutingSearchParameters));
4655

4756
pybind11::class_<RoutingIndexManager>(
@@ -52,6 +61,23 @@ PYBIND11_MODULE(model, m) {
5261
RoutingIndexManager::NodeIndex(depot));
5362
}),
5463
DOC(operations_research, RoutingIndexManager, RoutingIndexManager))
64+
.def(pybind11::init([](int num_nodes, int num_vehicles,
65+
const std::vector<int> starts,
66+
const std::vector<int> ends) {
67+
std::vector<RoutingIndexManager::NodeIndex> start_nodes;
68+
start_nodes.reserve(starts.size());
69+
std::transform(starts.cbegin(), starts.cend(), std::back_inserter(start_nodes),
70+
[](int node){return RoutingIndexManager::NodeIndex(node);});
71+
72+
std::vector<RoutingIndexManager::NodeIndex> end_nodes;
73+
end_nodes.reserve(ends.size());
74+
std::transform(ends.cbegin(), ends.cend(), std::back_inserter(end_nodes),
75+
[](int node){return RoutingIndexManager::NodeIndex(node);});
76+
77+
return new RoutingIndexManager(
78+
num_nodes, num_vehicles, start_nodes, end_nodes);
79+
}),
80+
DOC(operations_research, RoutingIndexManager, RoutingIndexManager))
5581
.def("num_nodes", &RoutingIndexManager::num_nodes,
5682
DOC(operations_research, RoutingIndexManager, num_nodes))
5783
.def("num_vehicles", &RoutingIndexManager::num_vehicles,
@@ -76,10 +102,34 @@ PYBIND11_MODULE(model, m) {
76102
.def("get_end_index", &RoutingIndexManager::GetEndIndex,
77103
DOC(operations_research, RoutingIndexManager, GetEndIndex));
78104

105+
pybind11::class_<RoutingDimension>(m, "RoutingDimension")
106+
.def("model", &RoutingDimension::model,
107+
pybind11::return_value_policy::reference_internal)
108+
.def("get_transit_value", &RoutingDimension::GetTransitValue,
109+
arg("from_index"), arg("to_index"), arg("vehicle"));
110+
79111
pybind11::class_<RoutingModel>(m, "RoutingModel")
80112
.def(pybind11::init([](const RoutingIndexManager& routing_index_manager) {
81113
return new RoutingModel(routing_index_manager);
82114
}))
115+
.def("register_transit_matrix",
116+
[](RoutingModel* routing_model,
117+
std::vector<std::vector<int64_t>> transit_matrix) {
118+
return routing_model->RegisterTransitMatrix(
119+
std::move(transit_matrix));
120+
})
121+
.def("register_unary_transit_vector",
122+
[](RoutingModel* routing_model,
123+
std::vector<int64_t> transit_vector) {
124+
return routing_model->RegisterUnaryTransitVector(
125+
std::move(transit_vector));
126+
})
127+
.def("register_unary_transit_callback",
128+
[](RoutingModel* routing_model,
129+
std::function<int64_t(int64_t)> transit_callback) {
130+
return routing_model->RegisterUnaryTransitCallback(
131+
std::move(transit_callback));
132+
})
83133
.def("register_transit_callback",
84134
[](RoutingModel* routing_model,
85135
std::function<int64_t(int64_t, int64_t)> transit_callback) {
@@ -89,6 +139,48 @@ PYBIND11_MODULE(model, m) {
89139
.def("set_arc_cost_evaluator_of_all_vehicles",
90140
&RoutingModel::SetArcCostEvaluatorOfAllVehicles,
91141
arg("transit_callback_index"))
142+
.def("add_dimension", &RoutingModel::AddDimension,
143+
arg("evaluator_index"),
144+
arg("slack_max"),
145+
arg("capacity"),
146+
arg("fix_start_cumul_to_zero"),
147+
arg("name"))
148+
.def("add_dimension_with_vehicle_capacity", &RoutingModel::AddDimensionWithVehicleCapacity,
149+
arg("evaluator_index"),
150+
arg("slack_max"),
151+
arg("vehicle_capacities"),
152+
arg("fix_start_cumul_to_zero"),
153+
arg("name"))
154+
.def("add_dimension_with_vehicle_transits", &RoutingModel::AddDimensionWithVehicleTransits,
155+
arg("evaluator_indices"),
156+
arg("slack_max"),
157+
arg("capacity"),
158+
arg("fix_start_cumul_to_zero"),
159+
arg("name"))
160+
.def("add_dimension_with_vehicle_transit_and_capacity", &RoutingModel::AddDimensionWithVehicleTransitAndCapacity,
161+
arg("evaluator_indices"),
162+
arg("slack_max"),
163+
arg("vehicle_capacities"),
164+
arg("fix_start_cumul_to_zero"),
165+
arg("name"))
166+
.def("add_constant_dimension", &RoutingModel::AddConstantDimension,
167+
arg("value"),
168+
arg("capacity"),
169+
arg("fix_start_cumul_to_zero"),
170+
arg("name"))
171+
.def("add_vector_dimension", &RoutingModel::AddVectorDimension,
172+
arg("values"),
173+
arg("capacity"),
174+
arg("fix_start_cumul_to_zero"),
175+
arg("name"))
176+
.def("add_matrix_dimension", &RoutingModel::AddMatrixDimension,
177+
arg("values"),
178+
arg("capacity"),
179+
arg("fix_start_cumul_to_zero"),
180+
arg("name"))
181+
.def("get_dimension_or_die", &RoutingModel::GetDimensionOrDie,
182+
pybind11::return_value_policy::reference_internal,
183+
arg("dimension_name"))
92184
.def("solve", &RoutingModel::Solve,
93185
pybind11::return_value_policy::reference_internal,
94186
arg("assignment") = nullptr)

0 commit comments

Comments
 (0)