diff --git a/.github/workflows/main_push.yml b/.github/workflows/main_push.yml index 1772efd..a300a5e 100644 --- a/.github/workflows/main_push.yml +++ b/.github/workflows/main_push.yml @@ -15,15 +15,15 @@ jobs: include: - image: ubuntu-latest platform: linux - - image: macos-13 + - image: macos-15-intel platform: macos-intel - - image: macos-14 + - image: macos-latest platform: macos-arm - image: windows-latest platform: windows steps: - - uses: actions/checkout@v4 + - uses: actions/checkout@v6 with: submodules: recursive @@ -62,19 +62,19 @@ jobs: - name: Build wheels if: matrix.platform != 'macos-arm' - uses: pypa/cibuildwheel@v2.19.2 + uses: pypa/cibuildwheel@v3.3.1 env: - MACOSX_DEPLOYMENT_TARGET: 13.0 - CC: gcc-13 - CXX: g++-13 + MACOSX_DEPLOYMENT_TARGET: 15.0 + CC: gcc-15 + CXX: g++-15 - name: Build wheels if: matrix.platform == 'macos-arm' - uses: pypa/cibuildwheel@v2.19.2 + uses: pypa/cibuildwheel@v3.3.1 env: - MACOSX_DEPLOYMENT_TARGET: 14.0 - CC: gcc-13 - CXX: g++-13 + MACOSX_DEPLOYMENT_TARGET: 15.0 + CC: gcc-15 + CXX: g++-15 - name: Verify clean directory run: git diff --exit-code diff --git a/.github/workflows/pull_request.yml b/.github/workflows/pull_request.yml index f6c9a0c..581f82e 100644 --- a/.github/workflows/pull_request.yml +++ b/.github/workflows/pull_request.yml @@ -20,7 +20,7 @@ jobs: - uses: actions/setup-python@v5 with: - python-version: "3.9" + python-version: "3.10" - name: "Install system dependencies" run: sudo apt update -y && sudo apt install -y libssl-dev libasio-dev diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index d6c4cf1..4b9e956 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -12,7 +12,7 @@ jobs: name: sdist runs-on: ubuntu-latest steps: - - uses: actions/checkout@v4 + - uses: actions/checkout@v6 - name: Build sdist run: pipx run build --sdist @@ -20,8 +20,9 @@ jobs: - name: Check metadata run: pipx run twine check dist/* - - uses: actions/upload-artifact@v4 + - uses: actions/upload-artifact@v6 with: + overwrite: true path: dist/*.tar.gz build_wheels: @@ -33,15 +34,15 @@ jobs: include: - image: ubuntu-latest platform: linux - - image: macos-13 + - image: macos-15-intel platform: macos-intel - - image: macos-14 + - image: macos-15 platform: macos-arm - image: windows-latest platform: windows steps: - - uses: actions/checkout@v4 + - uses: actions/checkout@v6 with: submodules: recursive @@ -73,10 +74,10 @@ jobs: conan install --build=openssl --install-folder conan_build . - name: Set up QEMU - if: matrix.platform == 'linux' + if: matrix.platform == 'linux' && runner.arch == 'X64' uses: docker/setup-qemu-action@v3 - with: - platforms: all + env: + CIBW_ARCHS_LINUX: ${{ runner.arch == 'X64' && 'auto ppc64le s390x' || 'auto' }} - name: Set version if: matrix.platform != 'macos-arm' && matrix.platform != 'macos-intel' @@ -90,24 +91,25 @@ jobs: - name: Build wheels if: matrix.platform != 'macos-arm' - uses: pypa/cibuildwheel@v2.19.2 + uses: pypa/cibuildwheel@v3.3.1 env: - MACOSX_DEPLOYMENT_TARGET: 13.0 - CC: gcc-14 - CXX: g++-14 + MACOSX_DEPLOYMENT_TARGET: 15.0 + CC: gcc-15 + CXX: g++-15 - name: Build wheels if: matrix.platform == 'macos-arm' - uses: pypa/cibuildwheel@v2.19.2 + uses: pypa/cibuildwheel@v3.3.1 env: - MACOSX_DEPLOYMENT_TARGET: 14.0 - CC: gcc-14 - CXX: g++-14 + MACOSX_DEPLOYMENT_TARGET: 15.0 + CC: gcc-15 + CXX: g++-15 - name: Upload wheels - uses: actions/upload-artifact@v4 + uses: actions/upload-artifact@v6 with: - path: wheelhouse/*.whl + overwrite: true + path: '*/pyvroom-*.whl' upload: name: upload @@ -117,7 +119,7 @@ jobs: steps: - uses: actions/setup-python@v5 - - uses: actions/download-artifact@v4 + - uses: actions/download-artifact@v5 with: name: artifact path: dist diff --git a/pyproject.toml b/pyproject.toml index 6a4d67a..8865e8b 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -21,11 +21,11 @@ exclude = ''' [tool.cibuildwheel] test-command = 'python -c "import vroom"' -build = "cp3{9,10,11,12}-*" +build = "cp3{10,11,12,13,14}-*" skip = "*musllinux*" archs = "native" -manylinux-x86_64-image = "quay.io/pypa/manylinux_2_28_x86_64" -manylinux-aarch64-image = "quay.io/pypa/manylinux_2_28_aarch64" +manylinux-x86_64-image = "quay.io/pypa/manylinux_2_34_x86_64" +manylinux-aarch64-image = "quay.io/pypa/manylinux_2_34_aarch64" [tool.cibuildwheel.linux] before-all = """ diff --git a/src/bind/input/input.cpp b/src/bind/input/input.cpp index 53552cb..a66f0b9 100644 --- a/src/bind/input/input.cpp +++ b/src/bind/input/input.cpp @@ -23,6 +23,10 @@ void init_input(py::module_ &m) { py::arg("apply_TSPFix") = false) .def_readonly("jobs", &vroom::Input::jobs) .def_readonly("vehicles", &vroom::Input::vehicles) + .def_readonly("job_id_to_rank", &vroom::Input::job_id_to_rank) + .def_readonly("pickup_id_to_rank", &vroom::Input::pickup_id_to_rank) + .def_readonly("delivery_id_to_rank", &vroom::Input::delivery_id_to_rank) + .def_readonly("compatible_vehicles_for_job", &vroom::Input::compatible_vehicles_for_job) .def("_from_json", &vroom::io::parse, py::arg("json_string"), py::arg("geometry")) .def("_set_geometry", &vroom::Input::set_geometry) @@ -44,20 +48,36 @@ void init_input(py::module_ &m) { vroom::Matrix &m) { self.set_costs_matrix(profile, std::move(m)); }) + .def("zero_amount", &vroom::Input::zero_amount) + .def("apply_TSPFix", &vroom::Input::apply_TSPFix) + .def("is_used_several_times", &vroom::Input::is_used_several_times) .def("has_skills", &vroom::Input::has_skills) .def("has_jobs", &vroom::Input::has_jobs) .def("has_shipments", &vroom::Input::has_shipments) + .def("report_distances", &vroom::Input::report_distances) .def("get_cost_upper_bound", &vroom::Input::get_cost_upper_bound) + .def("all_locations_have_coords", &vroom::Input::all_locations_have_coords) + .def("jobs_vehicles_evals", &vroom::Input::jobs_vehicles_evals) .def("has_homogeneous_locations", &vroom::Input::has_homogeneous_locations) .def("has_homogeneous_profiles", &vroom::Input::has_homogeneous_profiles) .def("has_homogeneous_costs", &vroom::Input::has_homogeneous_costs) + .def("has_initial_routes", &vroom::Input::has_initial_routes) + .def("vehicle_ok_with_job", &vroom::Input::has_initial_routes) + .def("vehicle_ok_with_vehicle", &vroom::Input::has_initial_routes) .def("_solve", - [](vroom::Input &self, unsigned exploration_level, unsigned nb_threads, const vroom::Timeout& timeout, const std::vector h_param) { - return self.solve(exploration_level, nb_threads, timeout, h_param); + [](vroom::Input &self, unsigned exploration_level, unsigned nb_threads, const vroom::Timeout& timeout) { + return self.solve(exploration_level, nb_threads, timeout); }, "Solve routing problem", - py::arg("exploration_level"), py::arg("nb_threads"), py::arg("timeout"), py::arg("h_param") + py::arg("exploration_level"), py::arg("nb_threads"), py::arg("timeout") + ) + .def("_solve", + [](vroom::Input &self, unsigned nb_searches, unsigned depth, unsigned nb_threads, const vroom::Timeout& timeout) { + return self.solve(nb_searches, depth, nb_threads, timeout); + }, + "Solve routing problem", + py::arg("nb_searches"), py::arg("depth"), py::arg("nb_threads"), py::arg("timeout") ) .def("check", &vroom::Input::check); } diff --git a/src/bind/job.cpp b/src/bind/job.cpp index d5f63f2..5e341c2 100644 --- a/src/bind/job.cpp +++ b/src/bind/job.cpp @@ -9,40 +9,48 @@ namespace py = pybind11; void init_job(py::module_ &m) { py::class_(m, "Job") - .def(py::init &, std::string &>(), + std::vector &, std::string &, vroom::TypeToUserDurationMap &, vroom::TypeToUserDurationMap>(), "Regular one-stop job.", py::arg("id"), py::arg("location"), - py::arg("setup") = 0, py::arg("service") = 0, + py::arg("default_setup") = 0, py::arg("default_service") = 0, py::arg("delivery") = vroom::Amount(0), py::arg("pickup") = vroom::Amount(0), py::arg("skills") = vroom::Skills(), py::arg("priority") = 0, py::arg("tws") = std::vector(1, vroom::TimeWindow()), - py::arg("description") = "") + py::arg("description") = "", + py::arg("setup_per_type") = vroom::TypeToUserDurationMap(), + py::arg("service_per_type") = vroom::TypeToUserDurationMap()) .def(py::init &, std::string &>(), + std::vector &, std::string &, vroom::TypeToUserDurationMap &, vroom::TypeToUserDurationMap &>(), "Pickup and delivery job.", py::arg("id"), py::arg("type"), - py::arg("location"), py::arg("setup") = 0, py::arg("service") = 0, + py::arg("location"), py::arg("default_setup") = 0, py::arg("default_service") = 0, py::arg("amount") = vroom::Amount(0), py::arg("skills") = vroom::Skills(), py::arg("priority") = 0, py::arg("tws") = std::vector(1, vroom::TimeWindow()), - py::arg("description") = "") + py::arg("description") = "", + py::arg("setup_per_type") = vroom::TypeToUserDurationMap(), + py::arg("service_per_type") = vroom::TypeToUserDurationMap()) .def("index", &vroom::Job::index) .def("is_valid_start", &vroom::Job::is_valid_start) .def_readonly("_id", &vroom::Job::id) .def_readwrite("_location", &vroom::Job::location) .def_readonly("_type", &vroom::Job::type) - .def_readonly("_setup", &vroom::Job::setup) - .def_readonly("_service", &vroom::Job::service) + .def_readonly("_default_setup", &vroom::Job::default_setup) + .def_readonly("_default_service", &vroom::Job::default_service) .def_readonly("_delivery", &vroom::Job::delivery) .def_readonly("_pickup", &vroom::Job::pickup) .def_readonly("_skills", &vroom::Job::skills) .def_readonly("_priority", &vroom::Job::priority) .def_readonly("_time_windows", &vroom::Job::tws) - .def_readonly("_description", &vroom::Job::description); + .def_readonly("_description", &vroom::Job::description) + .def_readonly("_setup_per_type", &vroom::Job::setup_per_type) + .def_readonly("_service_per_type", &vroom::Job::service_per_type) + .def_readonly("_setups", &vroom::Job::setups) + .def_readonly("_services", &vroom::Job::services); } diff --git a/src/bind/solution/step.cpp b/src/bind/solution/step.cpp index 1b9d6aa..28b3b2a 100644 --- a/src/bind/solution/step.cpp +++ b/src/bind/solution/step.cpp @@ -8,8 +8,9 @@ void init_step(py::module_ &m) { py::class_(m, "Step") .def(py::init()) - .def(py::init()) + .def(py::init()) .def(py::init()) + .def("_departure", &vroom::Step::departure) .def_readonly("_step_type", &vroom::Step::step_type) .def_readonly("_job_type", &vroom::Step::job_type) .def_readonly("_location", &vroom::Step::location) diff --git a/src/bind/utils.cpp b/src/bind/utils.cpp index 23c2742..e0a190b 100644 --- a/src/bind/utils.cpp +++ b/src/bind/utils.cpp @@ -4,10 +4,16 @@ void init_utils(py::module_ &m) { - m.def("scale_from_user_duration", &vroom::utils::scale_from_user_duration, - py::arg("duration")); + m.def("scale_from_user_duration", [](vroom::UserDuration d) { + return vroom::utils::scale_from_user_duration(d); + }, py::arg("user_duration")); + m.def("scale_from_user_duration", [](vroom::TypeToUserDurationMap& d) { + return vroom::utils::scale_from_user_duration(d); + }, py::arg("duration_per_type")); m.def("scale_to_user_duration", &vroom::utils::scale_to_user_duration, py::arg("duration")); + m.def("scale_from_user_cost", &vroom::utils::scale_from_user_cost, + py::arg("user_cost")); m.def("scale_to_user_cost", &vroom::utils::scale_to_user_cost, py::arg("cost")); } diff --git a/vroom b/vroom index 9905815..004faa4 160000 --- a/vroom +++ b/vroom @@ -1 +1 @@ -Subproject commit 9905815687607d675b49fc7faf09a309f69460f9 +Subproject commit 004faa4b89d769f51cb1f0227cd53be41f5d4586