pyroutingkit 0.2.0__tar.gz → 0.2.1__tar.gz

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (129) hide show
  1. {pyroutingkit-0.2.0 → pyroutingkit-0.2.1}/.github/workflows/publish.yml +4 -1
  2. {pyroutingkit-0.2.0 → pyroutingkit-0.2.1}/PKG-INFO +1 -1
  3. {pyroutingkit-0.2.0 → pyroutingkit-0.2.1}/pyproject.toml +1 -1
  4. {pyroutingkit-0.2.0 → pyroutingkit-0.2.1}/src/routingkit_module.cpp +12 -2
  5. {pyroutingkit-0.2.0 → pyroutingkit-0.2.1}/tests/test_topology_metric.py +26 -0
  6. {pyroutingkit-0.2.0 → pyroutingkit-0.2.1}/uv.lock +1 -1
  7. {pyroutingkit-0.2.0 → pyroutingkit-0.2.1}/.gitignore +0 -0
  8. {pyroutingkit-0.2.0 → pyroutingkit-0.2.1}/.gitmodules +0 -0
  9. {pyroutingkit-0.2.0 → pyroutingkit-0.2.1}/CMakeLists.txt +0 -0
  10. {pyroutingkit-0.2.0 → pyroutingkit-0.2.1}/README.md +0 -0
  11. {pyroutingkit-0.2.0 → pyroutingkit-0.2.1}/src/pyroutingkit/__init__.py +0 -0
  12. {pyroutingkit-0.2.0 → pyroutingkit-0.2.1}/tests/test_cch.py +0 -0
  13. {pyroutingkit-0.2.0 → pyroutingkit-0.2.1}/vendor/RoutingKit/.gitignore +0 -0
  14. {pyroutingkit-0.2.0 → pyroutingkit-0.2.1}/vendor/RoutingKit/.travis.yml +0 -0
  15. {pyroutingkit-0.2.0 → pyroutingkit-0.2.1}/vendor/RoutingKit/LICENSE +0 -0
  16. {pyroutingkit-0.2.0 → pyroutingkit-0.2.1}/vendor/RoutingKit/Makefile +0 -0
  17. {pyroutingkit-0.2.0 → pyroutingkit-0.2.1}/vendor/RoutingKit/README.md +0 -0
  18. {pyroutingkit-0.2.0 → pyroutingkit-0.2.1}/vendor/RoutingKit/doc/ContractionHierarchy.md +0 -0
  19. {pyroutingkit-0.2.0 → pyroutingkit-0.2.1}/vendor/RoutingKit/doc/CoordinatesToNodeID.md +0 -0
  20. {pyroutingkit-0.2.0 → pyroutingkit-0.2.1}/vendor/RoutingKit/doc/CustomizableContractionHierarchy.md +0 -0
  21. {pyroutingkit-0.2.0 → pyroutingkit-0.2.1}/vendor/RoutingKit/doc/OpenStreetMap.md +0 -0
  22. {pyroutingkit-0.2.0 → pyroutingkit-0.2.1}/vendor/RoutingKit/doc/Setup.md +0 -0
  23. {pyroutingkit-0.2.0 → pyroutingkit-0.2.1}/vendor/RoutingKit/doc/SupportFunctions.md +0 -0
  24. {pyroutingkit-0.2.0 → pyroutingkit-0.2.1}/vendor/RoutingKit/generate_make_file +0 -0
  25. {pyroutingkit-0.2.0 → pyroutingkit-0.2.1}/vendor/RoutingKit/include/routingkit/all.h +0 -0
  26. {pyroutingkit-0.2.0 → pyroutingkit-0.2.1}/vendor/RoutingKit/include/routingkit/bit_vector.h +0 -0
  27. {pyroutingkit-0.2.0 → pyroutingkit-0.2.1}/vendor/RoutingKit/include/routingkit/constants.h +0 -0
  28. {pyroutingkit-0.2.0 → pyroutingkit-0.2.1}/vendor/RoutingKit/include/routingkit/contraction_hierarchy.h +0 -0
  29. {pyroutingkit-0.2.0 → pyroutingkit-0.2.1}/vendor/RoutingKit/include/routingkit/customizable_contraction_hierarchy.h +0 -0
  30. {pyroutingkit-0.2.0 → pyroutingkit-0.2.1}/vendor/RoutingKit/include/routingkit/dijkstra.h +0 -0
  31. {pyroutingkit-0.2.0 → pyroutingkit-0.2.1}/vendor/RoutingKit/include/routingkit/filter.h +0 -0
  32. {pyroutingkit-0.2.0 → pyroutingkit-0.2.1}/vendor/RoutingKit/include/routingkit/geo_dist.h +0 -0
  33. {pyroutingkit-0.2.0 → pyroutingkit-0.2.1}/vendor/RoutingKit/include/routingkit/geo_position_to_node.h +0 -0
  34. {pyroutingkit-0.2.0 → pyroutingkit-0.2.1}/vendor/RoutingKit/include/routingkit/google_polyline.h +0 -0
  35. {pyroutingkit-0.2.0 → pyroutingkit-0.2.1}/vendor/RoutingKit/include/routingkit/graph_util.h +0 -0
  36. {pyroutingkit-0.2.0 → pyroutingkit-0.2.1}/vendor/RoutingKit/include/routingkit/id_mapper.h +0 -0
  37. {pyroutingkit-0.2.0 → pyroutingkit-0.2.1}/vendor/RoutingKit/include/routingkit/id_queue.h +0 -0
  38. {pyroutingkit-0.2.0 → pyroutingkit-0.2.1}/vendor/RoutingKit/include/routingkit/id_set_queue.h +0 -0
  39. {pyroutingkit-0.2.0 → pyroutingkit-0.2.1}/vendor/RoutingKit/include/routingkit/inverse_vector.h +0 -0
  40. {pyroutingkit-0.2.0 → pyroutingkit-0.2.1}/vendor/RoutingKit/include/routingkit/min_max.h +0 -0
  41. {pyroutingkit-0.2.0 → pyroutingkit-0.2.1}/vendor/RoutingKit/include/routingkit/nested_dissection.h +0 -0
  42. {pyroutingkit-0.2.0 → pyroutingkit-0.2.1}/vendor/RoutingKit/include/routingkit/osm_decoder.h +0 -0
  43. {pyroutingkit-0.2.0 → pyroutingkit-0.2.1}/vendor/RoutingKit/include/routingkit/osm_graph_builder.h +0 -0
  44. {pyroutingkit-0.2.0 → pyroutingkit-0.2.1}/vendor/RoutingKit/include/routingkit/osm_profile.h +0 -0
  45. {pyroutingkit-0.2.0 → pyroutingkit-0.2.1}/vendor/RoutingKit/include/routingkit/osm_simple.h +0 -0
  46. {pyroutingkit-0.2.0 → pyroutingkit-0.2.1}/vendor/RoutingKit/include/routingkit/permutation.h +0 -0
  47. {pyroutingkit-0.2.0 → pyroutingkit-0.2.1}/vendor/RoutingKit/include/routingkit/sort.h +0 -0
  48. {pyroutingkit-0.2.0 → pyroutingkit-0.2.1}/vendor/RoutingKit/include/routingkit/strongly_connected_component.h +0 -0
  49. {pyroutingkit-0.2.0 → pyroutingkit-0.2.1}/vendor/RoutingKit/include/routingkit/tag_map.h +0 -0
  50. {pyroutingkit-0.2.0 → pyroutingkit-0.2.1}/vendor/RoutingKit/include/routingkit/timer.h +0 -0
  51. {pyroutingkit-0.2.0 → pyroutingkit-0.2.1}/vendor/RoutingKit/include/routingkit/timestamp_flag.h +0 -0
  52. {pyroutingkit-0.2.0 → pyroutingkit-0.2.1}/vendor/RoutingKit/include/routingkit/vector_io.h +0 -0
  53. {pyroutingkit-0.2.0 → pyroutingkit-0.2.1}/vendor/RoutingKit/src/bit_select.cpp +0 -0
  54. {pyroutingkit-0.2.0 → pyroutingkit-0.2.1}/vendor/RoutingKit/src/bit_select.h +0 -0
  55. {pyroutingkit-0.2.0 → pyroutingkit-0.2.1}/vendor/RoutingKit/src/bit_vector.cpp +0 -0
  56. {pyroutingkit-0.2.0 → pyroutingkit-0.2.1}/vendor/RoutingKit/src/buffered_asynchronous_reader.cpp +0 -0
  57. {pyroutingkit-0.2.0 → pyroutingkit-0.2.1}/vendor/RoutingKit/src/buffered_asynchronous_reader.h +0 -0
  58. {pyroutingkit-0.2.0 → pyroutingkit-0.2.1}/vendor/RoutingKit/src/compare_vector.cpp +0 -0
  59. {pyroutingkit-0.2.0 → pyroutingkit-0.2.1}/vendor/RoutingKit/src/compute_contraction_hierarchy.cpp +0 -0
  60. {pyroutingkit-0.2.0 → pyroutingkit-0.2.1}/vendor/RoutingKit/src/compute_geographic_distance_weights.cpp +0 -0
  61. {pyroutingkit-0.2.0 → pyroutingkit-0.2.1}/vendor/RoutingKit/src/compute_nested_dissection_order.cpp +0 -0
  62. {pyroutingkit-0.2.0 → pyroutingkit-0.2.1}/vendor/RoutingKit/src/contraction_hierarchy.cpp +0 -0
  63. {pyroutingkit-0.2.0 → pyroutingkit-0.2.1}/vendor/RoutingKit/src/convert_road_dimacs_coordinates.cpp +0 -0
  64. {pyroutingkit-0.2.0 → pyroutingkit-0.2.1}/vendor/RoutingKit/src/convert_road_dimacs_graph.cpp +0 -0
  65. {pyroutingkit-0.2.0 → pyroutingkit-0.2.1}/vendor/RoutingKit/src/customizable_contraction_hierarchy.cpp +0 -0
  66. {pyroutingkit-0.2.0 → pyroutingkit-0.2.1}/vendor/RoutingKit/src/decode_vector.cpp +0 -0
  67. {pyroutingkit-0.2.0 → pyroutingkit-0.2.1}/vendor/RoutingKit/src/emulate_gcc_builtin.h +0 -0
  68. {pyroutingkit-0.2.0 → pyroutingkit-0.2.1}/vendor/RoutingKit/src/encode_vector.cpp +0 -0
  69. {pyroutingkit-0.2.0 → pyroutingkit-0.2.1}/vendor/RoutingKit/src/examine_ch.cpp +0 -0
  70. {pyroutingkit-0.2.0 → pyroutingkit-0.2.1}/vendor/RoutingKit/src/expect.cpp +0 -0
  71. {pyroutingkit-0.2.0 → pyroutingkit-0.2.1}/vendor/RoutingKit/src/expect.h +0 -0
  72. {pyroutingkit-0.2.0 → pyroutingkit-0.2.1}/vendor/RoutingKit/src/export_road_dimacs_graph.cpp +0 -0
  73. {pyroutingkit-0.2.0 → pyroutingkit-0.2.1}/vendor/RoutingKit/src/file_data_source.cpp +0 -0
  74. {pyroutingkit-0.2.0 → pyroutingkit-0.2.1}/vendor/RoutingKit/src/file_data_source.h +0 -0
  75. {pyroutingkit-0.2.0 → pyroutingkit-0.2.1}/vendor/RoutingKit/src/generate_constant_vector.cpp +0 -0
  76. {pyroutingkit-0.2.0 → pyroutingkit-0.2.1}/vendor/RoutingKit/src/generate_dijkstra_rank_test_queries.cpp +0 -0
  77. {pyroutingkit-0.2.0 → pyroutingkit-0.2.1}/vendor/RoutingKit/src/generate_random_node_list.cpp +0 -0
  78. {pyroutingkit-0.2.0 → pyroutingkit-0.2.1}/vendor/RoutingKit/src/generate_random_source_times.cpp +0 -0
  79. {pyroutingkit-0.2.0 → pyroutingkit-0.2.1}/vendor/RoutingKit/src/generate_test_queries.cpp +0 -0
  80. {pyroutingkit-0.2.0 → pyroutingkit-0.2.1}/vendor/RoutingKit/src/geo_position_to_node.cpp +0 -0
  81. {pyroutingkit-0.2.0 → pyroutingkit-0.2.1}/vendor/RoutingKit/src/google_polyline.cpp +0 -0
  82. {pyroutingkit-0.2.0 → pyroutingkit-0.2.1}/vendor/RoutingKit/src/graph_to_dot.cpp +0 -0
  83. {pyroutingkit-0.2.0 → pyroutingkit-0.2.1}/vendor/RoutingKit/src/graph_to_svg.cpp +0 -0
  84. {pyroutingkit-0.2.0 → pyroutingkit-0.2.1}/vendor/RoutingKit/src/graph_util.cpp +0 -0
  85. {pyroutingkit-0.2.0 → pyroutingkit-0.2.1}/vendor/RoutingKit/src/id_mapper.cpp +0 -0
  86. {pyroutingkit-0.2.0 → pyroutingkit-0.2.1}/vendor/RoutingKit/src/nested_dissection.cpp +0 -0
  87. {pyroutingkit-0.2.0 → pyroutingkit-0.2.1}/vendor/RoutingKit/src/osm_decoder.cpp +0 -0
  88. {pyroutingkit-0.2.0 → pyroutingkit-0.2.1}/vendor/RoutingKit/src/osm_extract.cpp +0 -0
  89. {pyroutingkit-0.2.0 → pyroutingkit-0.2.1}/vendor/RoutingKit/src/osm_graph_builder.cpp +0 -0
  90. {pyroutingkit-0.2.0 → pyroutingkit-0.2.1}/vendor/RoutingKit/src/osm_profile.cpp +0 -0
  91. {pyroutingkit-0.2.0 → pyroutingkit-0.2.1}/vendor/RoutingKit/src/osm_simple.cpp +0 -0
  92. {pyroutingkit-0.2.0 → pyroutingkit-0.2.1}/vendor/RoutingKit/src/osmpbfformat.proto +0 -0
  93. {pyroutingkit-0.2.0 → pyroutingkit-0.2.1}/vendor/RoutingKit/src/protobuf.cpp +0 -0
  94. {pyroutingkit-0.2.0 → pyroutingkit-0.2.1}/vendor/RoutingKit/src/protobuf.h +0 -0
  95. {pyroutingkit-0.2.0 → pyroutingkit-0.2.1}/vendor/RoutingKit/src/randomly_permute_nodes.cpp +0 -0
  96. {pyroutingkit-0.2.0 → pyroutingkit-0.2.1}/vendor/RoutingKit/src/run_contraction_hierarchy_query.cpp +0 -0
  97. {pyroutingkit-0.2.0 → pyroutingkit-0.2.1}/vendor/RoutingKit/src/run_dijkstra.cpp +0 -0
  98. {pyroutingkit-0.2.0 → pyroutingkit-0.2.1}/vendor/RoutingKit/src/show_path.cpp +0 -0
  99. {pyroutingkit-0.2.0 → pyroutingkit-0.2.1}/vendor/RoutingKit/src/strongly_connected_component.cpp +0 -0
  100. {pyroutingkit-0.2.0 → pyroutingkit-0.2.1}/vendor/RoutingKit/src/test_basic_features.cpp +0 -0
  101. {pyroutingkit-0.2.0 → pyroutingkit-0.2.1}/vendor/RoutingKit/src/test_bit_vector.cpp +0 -0
  102. {pyroutingkit-0.2.0 → pyroutingkit-0.2.1}/vendor/RoutingKit/src/test_buffered_asynchronous_reader.cpp +0 -0
  103. {pyroutingkit-0.2.0 → pyroutingkit-0.2.1}/vendor/RoutingKit/src/test_contraction_hierarchy_extra_weight.cpp +0 -0
  104. {pyroutingkit-0.2.0 → pyroutingkit-0.2.1}/vendor/RoutingKit/src/test_contraction_hierarchy_path_query.cpp +0 -0
  105. {pyroutingkit-0.2.0 → pyroutingkit-0.2.1}/vendor/RoutingKit/src/test_contraction_hierarchy_pinned_query.cpp +0 -0
  106. {pyroutingkit-0.2.0 → pyroutingkit-0.2.1}/vendor/RoutingKit/src/test_customizable_contraction_hierarchy.cpp +0 -0
  107. {pyroutingkit-0.2.0 → pyroutingkit-0.2.1}/vendor/RoutingKit/src/test_customizable_contraction_hierarchy_customization.cpp +0 -0
  108. {pyroutingkit-0.2.0 → pyroutingkit-0.2.1}/vendor/RoutingKit/src/test_customizable_contraction_hierarchy_path_query.cpp +0 -0
  109. {pyroutingkit-0.2.0 → pyroutingkit-0.2.1}/vendor/RoutingKit/src/test_customizable_contraction_hierarchy_perfect_customization.cpp +0 -0
  110. {pyroutingkit-0.2.0 → pyroutingkit-0.2.1}/vendor/RoutingKit/src/test_customizable_contraction_hierarchy_pinned_query.cpp +0 -0
  111. {pyroutingkit-0.2.0 → pyroutingkit-0.2.1}/vendor/RoutingKit/src/test_customizable_contraction_hierarchy_reset.cpp +0 -0
  112. {pyroutingkit-0.2.0 → pyroutingkit-0.2.1}/vendor/RoutingKit/src/test_dijkstra.cpp +0 -0
  113. {pyroutingkit-0.2.0 → pyroutingkit-0.2.1}/vendor/RoutingKit/src/test_geo_dist.cpp +0 -0
  114. {pyroutingkit-0.2.0 → pyroutingkit-0.2.1}/vendor/RoutingKit/src/test_google_polyline.cpp +0 -0
  115. {pyroutingkit-0.2.0 → pyroutingkit-0.2.1}/vendor/RoutingKit/src/test_id_mapper.cpp +0 -0
  116. {pyroutingkit-0.2.0 → pyroutingkit-0.2.1}/vendor/RoutingKit/src/test_id_set_queue.cpp +0 -0
  117. {pyroutingkit-0.2.0 → pyroutingkit-0.2.1}/vendor/RoutingKit/src/test_inverse_vector.cpp +0 -0
  118. {pyroutingkit-0.2.0 → pyroutingkit-0.2.1}/vendor/RoutingKit/src/test_nearest_neighbor.cpp +0 -0
  119. {pyroutingkit-0.2.0 → pyroutingkit-0.2.1}/vendor/RoutingKit/src/test_nested_dissection.cpp +0 -0
  120. {pyroutingkit-0.2.0 → pyroutingkit-0.2.1}/vendor/RoutingKit/src/test_osm_simple.cpp +0 -0
  121. {pyroutingkit-0.2.0 → pyroutingkit-0.2.1}/vendor/RoutingKit/src/test_permutation.cpp +0 -0
  122. {pyroutingkit-0.2.0 → pyroutingkit-0.2.1}/vendor/RoutingKit/src/test_protobuf.cpp +0 -0
  123. {pyroutingkit-0.2.0 → pyroutingkit-0.2.1}/vendor/RoutingKit/src/test_sort.cpp +0 -0
  124. {pyroutingkit-0.2.0 → pyroutingkit-0.2.1}/vendor/RoutingKit/src/test_strongly_connected_component.cpp +0 -0
  125. {pyroutingkit-0.2.0 → pyroutingkit-0.2.1}/vendor/RoutingKit/src/test_tag_map.cpp +0 -0
  126. {pyroutingkit-0.2.0 → pyroutingkit-0.2.1}/vendor/RoutingKit/src/timer.cpp +0 -0
  127. {pyroutingkit-0.2.0 → pyroutingkit-0.2.1}/vendor/RoutingKit/src/vector_io.cpp +0 -0
  128. {pyroutingkit-0.2.0 → pyroutingkit-0.2.1}/vendor/RoutingKit/src/verify.cpp +0 -0
  129. {pyroutingkit-0.2.0 → pyroutingkit-0.2.1}/vendor/RoutingKit/src/verify.h +0 -0
@@ -24,7 +24,10 @@ jobs:
24
24
  CIBW_BUILD: cp310-* cp311-* cp312-* cp313-*
25
25
  CIBW_SKIP: "*-win32 *-manylinux_i686 *musllinux* pp*"
26
26
  CIBW_MANYLINUX_X86_64_IMAGE: manylinux2014
27
- CIBW_TEST_COMMAND: python -c "from pyroutingkit import CCH, CCHMetric, CCHTopology, HAS_OPENMP, INF_WEIGHT; print('OK, OpenMP:', HAS_OPENMP)"
27
+ # Run the full suite against every built wheel the 0.2.0
28
+ # use-after-free only manifested on Linux release builds.
29
+ CIBW_TEST_REQUIRES: pytest
30
+ CIBW_TEST_COMMAND: pytest {project}/tests -q
28
31
 
29
32
  - uses: actions/upload-artifact@v4
30
33
  with:
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: pyroutingkit
3
- Version: 0.2.0
3
+ Version: 0.2.1
4
4
  Summary: Python bindings for RoutingKit Customizable Contraction Hierarchies (CCH)
5
5
  Author: Ryan Fisk
6
6
  License-Expression: MIT
@@ -1,6 +1,6 @@
1
1
  [project]
2
2
  name = "pyroutingkit"
3
- version = "0.2.0"
3
+ version = "0.2.1"
4
4
  description = "Python bindings for RoutingKit Customizable Contraction Hierarchies (CCH)"
5
5
  readme = "README.md"
6
6
  requires-python = ">=3.10"
@@ -198,7 +198,11 @@ public:
198
198
  (void)thread_count;
199
199
  metric_.customize();
200
200
  #endif
201
- query_.reset(metric_);
201
+ // Construct, don't reset(): reset(metric) on a default-
202
+ // constructed query compares an UNINITIALIZED cch pointer; if
203
+ // freed memory is reused it can match and skip allocation of
204
+ // the query's internal arrays (out-of-bounds on first query).
205
+ query_ = RoutingKit::CustomizableContractionHierarchyQuery(metric_);
202
206
  }
203
207
  customized_ = true;
204
208
  }
@@ -238,7 +242,13 @@ public:
238
242
  {
239
243
  py::gil_scoped_release release;
240
244
  if (!partial_ready_) {
241
- partial_.reset(topology_->cch());
245
+ // Construct, don't reset(): reset(cch) on a default-
246
+ // constructed object compares an UNINITIALIZED queue size;
247
+ // recycled heap memory can make it falsely match and skip
248
+ // allocating the queue (out-of-bounds on update_arc).
249
+ partial_ = RoutingKit::
250
+ CustomizableContractionHierarchyPartialCustomization(
251
+ topology_->cch());
242
252
  partial_ready_ = true;
243
253
  }
244
254
  for (size_t i = 0; i < n; i++) {
@@ -226,3 +226,29 @@ def test_parallel_customize_matches_serial(topology):
226
226
  ds, _, _ = serial.query(s, t)
227
227
  dp, _, _ = parallel.query(s, t)
228
228
  assert ds == dp
229
+
230
+
231
+ def test_metric_churn_with_partial_updates(topology):
232
+ """Regression: creating/destroying many metrics over one topology.
233
+
234
+ RoutingKit's X::reset(...) 'reuse' helpers compare possibly
235
+ UNINITIALIZED state of default-constructed objects (Query::reset
236
+ checks this->cch, PartialCustomization::reset checks q.id_count());
237
+ when the allocator recycles a destroyed wrapper's memory the check
238
+ can falsely match and skip allocating internal arrays — segfault on
239
+ first use. The wrapper must construct, not reset. Crashed ~100% on
240
+ Linux within a few iterations before the fix.
241
+ """
242
+ w = np.array([10] * 10, dtype=np.uint32)
243
+ for _ in range(50):
244
+ for tc in (0, 2, 4):
245
+ m = CCHMetric(topology)
246
+ m.customize(w, thread_count=tc)
247
+ d, _, _ = m.query(0, 3)
248
+ assert d == 10
249
+ m.update_weights(
250
+ np.array([8], dtype=np.uint32),
251
+ np.array([INF_WEIGHT], dtype=np.uint32),
252
+ )
253
+ d2, _, arcs = m.query(0, 3)
254
+ assert d2 == 20 and 8 not in arcs
@@ -212,7 +212,7 @@ wheels = [
212
212
 
213
213
  [[package]]
214
214
  name = "pyroutingkit"
215
- version = "0.2.0"
215
+ version = "0.2.1"
216
216
  source = { editable = "." }
217
217
  dependencies = [
218
218
  { name = "numpy", version = "2.2.6", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.11'" },
File without changes
File without changes
File without changes