bioimage-cpp 0.1.1__tar.gz → 0.3.0__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 (291) hide show
  1. {bioimage_cpp-0.1.1 → bioimage_cpp-0.3.0}/AGENTS.md +26 -0
  2. {bioimage_cpp-0.1.1 → bioimage_cpp-0.3.0}/CMakeLists.txt +3 -0
  3. {bioimage_cpp-0.1.1 → bioimage_cpp-0.3.0}/MIGRATION_GUIDE.md +673 -47
  4. {bioimage_cpp-0.1.1 → bioimage_cpp-0.3.0}/PKG-INFO +6 -1
  5. {bioimage_cpp-0.1.1 → bioimage_cpp-0.3.0}/README.md +5 -0
  6. bioimage_cpp-0.3.0/development/affinities/check_compute_embedding_distances.py +220 -0
  7. bioimage_cpp-0.3.0/development/distance/benchmark.py +580 -0
  8. bioimage_cpp-0.3.0/development/distance/check_non_maximum_distance_suppression.py +140 -0
  9. bioimage_cpp-0.3.0/development/flow/PERFORMANCE_NOTES.md +260 -0
  10. bioimage_cpp-0.3.0/development/flow/_reference_impl.py +85 -0
  11. bioimage_cpp-0.3.0/development/flow/benchmark.py +167 -0
  12. bioimage_cpp-0.3.0/development/flow/check_flow_density.py +141 -0
  13. bioimage_cpp-0.3.0/development/flow/create_test_data.py +40 -0
  14. {bioimage_cpp-0.1.1 → bioimage_cpp-0.3.0}/development/graph/_grid_affinity_compatibility.py +7 -7
  15. {bioimage_cpp-0.1.1 → bioimage_cpp-0.3.0}/development/graph/_rag_compatibility.py +2 -2
  16. bioimage_cpp-0.3.0/development/graph/agglomeration/PERFORMANCE_NOTES.md +307 -0
  17. bioimage_cpp-0.3.0/development/graph/agglomeration/_compatibility.py +171 -0
  18. bioimage_cpp-0.3.0/development/graph/agglomeration/check_edge_weighted.py +65 -0
  19. bioimage_cpp-0.3.0/development/graph/agglomeration/check_gasp.py +86 -0
  20. bioimage_cpp-0.3.0/development/graph/agglomeration/check_mala.py +61 -0
  21. bioimage_cpp-0.3.0/development/graph/agglomeration/check_node_and_edge_weighted.py +74 -0
  22. bioimage_cpp-0.3.0/development/graph/agglomeration/diagnose.py +173 -0
  23. {bioimage_cpp-0.1.1 → bioimage_cpp-0.3.0}/development/graph/lifted_multicut/_compatibility.py +3 -3
  24. {bioimage_cpp-0.1.1 → bioimage_cpp-0.3.0}/development/graph/lifted_multicut/check_fusion_move.py +2 -2
  25. {bioimage_cpp-0.1.1 → bioimage_cpp-0.3.0}/development/graph/lifted_multicut/check_greedy_additive.py +1 -1
  26. {bioimage_cpp-0.1.1 → bioimage_cpp-0.3.0}/development/graph/lifted_multicut/check_kernighan_lin.py +1 -1
  27. {bioimage_cpp-0.1.1 → bioimage_cpp-0.3.0}/development/graph/lifted_multicut/evaluate_solvers.py +6 -6
  28. bioimage_cpp-0.3.0/development/graph/lifted_multicut/repro_lifted_edges_segfault.py +154 -0
  29. {bioimage_cpp-0.1.1 → bioimage_cpp-0.3.0}/development/graph/multicut/_compatibility.py +3 -3
  30. {bioimage_cpp-0.1.1 → bioimage_cpp-0.3.0}/development/graph/multicut/check_chained.py +3 -3
  31. {bioimage_cpp-0.1.1 → bioimage_cpp-0.3.0}/development/graph/multicut/check_decomposer.py +1 -1
  32. {bioimage_cpp-0.1.1 → bioimage_cpp-0.3.0}/development/graph/multicut/check_fusion_move.py +2 -2
  33. {bioimage_cpp-0.1.1 → bioimage_cpp-0.3.0}/development/graph/multicut/check_greedy_additive.py +1 -1
  34. {bioimage_cpp-0.1.1 → bioimage_cpp-0.3.0}/development/graph/multicut/check_greedy_fixation.py +1 -1
  35. {bioimage_cpp-0.1.1 → bioimage_cpp-0.3.0}/development/graph/multicut/check_kernighan_lin.py +1 -1
  36. {bioimage_cpp-0.1.1 → bioimage_cpp-0.3.0}/development/graph/multicut/evaluate_solvers.py +13 -13
  37. {bioimage_cpp-0.1.1 → bioimage_cpp-0.3.0}/development/graph/mutex_watershed/check_mutex_clustering.py +2 -2
  38. {bioimage_cpp-0.1.1 → bioimage_cpp-0.3.0}/development/graph/mutex_watershed/check_semantic_mutex_clustering.py +7 -7
  39. bioimage_cpp-0.3.0/development/label_multiset/benchmark.py +229 -0
  40. bioimage_cpp-0.3.0/development/local_maxima/benchmark.py +513 -0
  41. bioimage_cpp-0.3.0/development/segmentation/_label_equivalence.py +281 -0
  42. bioimage_cpp-0.3.0/development/segmentation/check_label_2d.py +47 -0
  43. bioimage_cpp-0.3.0/development/segmentation/check_label_3d.py +47 -0
  44. bioimage_cpp-0.3.0/development/segmentation/check_relabel_sequential.py +165 -0
  45. bioimage_cpp-0.3.0/development/utils/_mesh_smoothing_reference.py +42 -0
  46. bioimage_cpp-0.3.0/development/utils/benchmark_mesh_smoothing.py +177 -0
  47. {bioimage_cpp-0.1.1 → bioimage_cpp-0.3.0}/examples/segmentation/_lifted_problem.py +3 -3
  48. {bioimage_cpp-0.1.1 → bioimage_cpp-0.3.0}/examples/segmentation/lifted_multicut_from_affinities.py +4 -4
  49. {bioimage_cpp-0.1.1 → bioimage_cpp-0.3.0}/examples/segmentation/multicut_from_affinities.py +5 -5
  50. {bioimage_cpp-0.1.1 → bioimage_cpp-0.3.0}/examples/segmentation/serialize_grid_lifted_problem.py +1 -1
  51. bioimage_cpp-0.3.0/include/bioimage_cpp/affinities/compute_embedding_distances.hxx +228 -0
  52. bioimage_cpp-0.3.0/include/bioimage_cpp/distance_transform.hxx +447 -0
  53. bioimage_cpp-0.3.0/include/bioimage_cpp/flow/flow_density.hxx +320 -0
  54. bioimage_cpp-0.3.0/include/bioimage_cpp/graph/agglomeration/agglomerative_clustering.hxx +52 -0
  55. bioimage_cpp-0.3.0/include/bioimage_cpp/graph/agglomeration/cluster_policy_base.hxx +116 -0
  56. bioimage_cpp-0.3.0/include/bioimage_cpp/graph/agglomeration/detail.hxx +132 -0
  57. bioimage_cpp-0.3.0/include/bioimage_cpp/graph/agglomeration/edge_weighted.hxx +181 -0
  58. bioimage_cpp-0.3.0/include/bioimage_cpp/graph/agglomeration/gasp.hxx +237 -0
  59. bioimage_cpp-0.3.0/include/bioimage_cpp/graph/agglomeration/mala.hxx +241 -0
  60. bioimage_cpp-0.3.0/include/bioimage_cpp/graph/agglomeration/node_and_edge_weighted.hxx +235 -0
  61. bioimage_cpp-0.3.0/include/bioimage_cpp/graph/agglomeration.hxx +8 -0
  62. bioimage_cpp-0.3.0/include/bioimage_cpp/graph/grid_edge_projection.hxx +276 -0
  63. bioimage_cpp-0.3.0/include/bioimage_cpp/graph/label_accumulation.hxx +139 -0
  64. {bioimage_cpp-0.1.1 → bioimage_cpp-0.3.0}/include/bioimage_cpp/graph/lifted_multicut/fusion_move.hxx +8 -0
  65. bioimage_cpp-0.3.0/include/bioimage_cpp/graph/lifted_multicut/lifted_from_node_labels.hxx +150 -0
  66. {bioimage_cpp-0.1.1 → bioimage_cpp-0.3.0}/include/bioimage_cpp/graph/multicut/fusion_move.hxx +7 -0
  67. bioimage_cpp-0.3.0/include/bioimage_cpp/graph/rag_coordinates.hxx +381 -0
  68. {bioimage_cpp-0.1.1 → bioimage_cpp-0.3.0}/include/bioimage_cpp/graph/undirected_graph.hxx +20 -6
  69. bioimage_cpp-0.3.0/include/bioimage_cpp/label_multiset/downsample.hxx +124 -0
  70. bioimage_cpp-0.3.0/include/bioimage_cpp/label_multiset/from_labels.hxx +147 -0
  71. bioimage_cpp-0.3.0/include/bioimage_cpp/label_multiset/merger.hxx +143 -0
  72. bioimage_cpp-0.3.0/include/bioimage_cpp/label_multiset/multiset.hxx +66 -0
  73. bioimage_cpp-0.3.0/include/bioimage_cpp/label_multiset/read_subset.hxx +136 -0
  74. bioimage_cpp-0.3.0/include/bioimage_cpp/mesh_smoothing.hxx +187 -0
  75. bioimage_cpp-0.3.0/include/bioimage_cpp/non_maximum_distance_suppression.hxx +143 -0
  76. bioimage_cpp-0.3.0/include/bioimage_cpp/run_length.hxx +48 -0
  77. bioimage_cpp-0.3.0/include/bioimage_cpp/segmentation/connected_components.hxx +509 -0
  78. bioimage_cpp-0.3.0/include/bioimage_cpp/segmentation/relabel_sequential.hxx +86 -0
  79. {bioimage_cpp-0.1.1 → bioimage_cpp-0.3.0}/src/bindings/affinities.cxx +99 -0
  80. bioimage_cpp-0.3.0/src/bindings/distance.cxx +316 -0
  81. bioimage_cpp-0.3.0/src/bindings/distance.hxx +9 -0
  82. bioimage_cpp-0.3.0/src/bindings/flow.cxx +180 -0
  83. bioimage_cpp-0.3.0/src/bindings/flow.hxx +9 -0
  84. {bioimage_cpp-0.1.1 → bioimage_cpp-0.3.0}/src/bindings/graph.cxx +738 -1
  85. bioimage_cpp-0.3.0/src/bindings/label_multiset.cxx +335 -0
  86. bioimage_cpp-0.3.0/src/bindings/label_multiset.hxx +9 -0
  87. {bioimage_cpp-0.1.1 → bioimage_cpp-0.3.0}/src/bindings/module.cxx +6 -0
  88. {bioimage_cpp-0.1.1 → bioimage_cpp-0.3.0}/src/bindings/segmentation.cxx +212 -0
  89. bioimage_cpp-0.3.0/src/bindings/utils.cxx +252 -0
  90. {bioimage_cpp-0.1.1 → bioimage_cpp-0.3.0}/src/bioimage_cpp/__init__.py +22 -1
  91. {bioimage_cpp-0.1.1 → bioimage_cpp-0.3.0}/src/bioimage_cpp/_data.py +64 -0
  92. bioimage_cpp-0.3.0/src/bioimage_cpp/_version.py +1 -0
  93. bioimage_cpp-0.3.0/src/bioimage_cpp/affinities/__init__.py +6 -0
  94. bioimage_cpp-0.3.0/src/bioimage_cpp/affinities/compute_embedding_distances.py +93 -0
  95. bioimage_cpp-0.3.0/src/bioimage_cpp/distance/__init__.py +13 -0
  96. bioimage_cpp-0.3.0/src/bioimage_cpp/distance/_distance.py +294 -0
  97. bioimage_cpp-0.3.0/src/bioimage_cpp/flow/__init__.py +5 -0
  98. bioimage_cpp-0.3.0/src/bioimage_cpp/flow/_flow.py +164 -0
  99. bioimage_cpp-0.3.0/src/bioimage_cpp/graph/__init__.py +691 -0
  100. bioimage_cpp-0.3.0/src/bioimage_cpp/graph/_shared.py +235 -0
  101. bioimage_cpp-0.3.0/src/bioimage_cpp/graph/agglomeration.py +348 -0
  102. bioimage_cpp-0.3.0/src/bioimage_cpp/graph/features/__init__.py +594 -0
  103. bioimage_cpp-0.3.0/src/bioimage_cpp/graph/lifted_multicut/__init__.py +668 -0
  104. bioimage_cpp-0.3.0/src/bioimage_cpp/graph/multicut/__init__.py +511 -0
  105. bioimage_cpp-0.3.0/src/bioimage_cpp/graph/mutex_watershed.py +207 -0
  106. bioimage_cpp-0.3.0/src/bioimage_cpp/label_multiset/__init__.py +260 -0
  107. {bioimage_cpp-0.1.1 → bioimage_cpp-0.3.0}/src/bioimage_cpp/segmentation/__init__.py +4 -0
  108. bioimage_cpp-0.3.0/src/bioimage_cpp/segmentation/label.py +88 -0
  109. {bioimage_cpp-0.1.1 → bioimage_cpp-0.3.0}/src/bioimage_cpp/segmentation/mutex_watershed.py +8 -0
  110. bioimage_cpp-0.3.0/src/bioimage_cpp/segmentation/relabel_sequential.py +89 -0
  111. {bioimage_cpp-0.1.1 → bioimage_cpp-0.3.0}/src/bioimage_cpp/utils.py +163 -0
  112. bioimage_cpp-0.3.0/tests/affinities/test_compute_embedding_distances.py +139 -0
  113. bioimage_cpp-0.3.0/tests/distance/test_distance_transform.py +202 -0
  114. bioimage_cpp-0.3.0/tests/distance/test_non_maximum_distance_suppression.py +144 -0
  115. bioimage_cpp-0.3.0/tests/graph/agglomeration/_helpers.py +49 -0
  116. bioimage_cpp-0.3.0/tests/graph/agglomeration/test_edge_weighted.py +111 -0
  117. bioimage_cpp-0.3.0/tests/graph/agglomeration/test_gasp.py +155 -0
  118. bioimage_cpp-0.3.0/tests/graph/agglomeration/test_mala.py +118 -0
  119. bioimage_cpp-0.3.0/tests/graph/agglomeration/test_node_and_edge_weighted.py +96 -0
  120. bioimage_cpp-0.3.0/tests/graph/lifted_multicut/__init__.py +0 -0
  121. {bioimage_cpp-0.1.1 → bioimage_cpp-0.3.0}/tests/graph/lifted_multicut/test_external_problem.py +7 -7
  122. {bioimage_cpp-0.1.1 → bioimage_cpp-0.3.0}/tests/graph/lifted_multicut/test_fusion_move.py +103 -59
  123. {bioimage_cpp-0.1.1 → bioimage_cpp-0.3.0}/tests/graph/lifted_multicut/test_greedy_additive.py +12 -12
  124. {bioimage_cpp-0.1.1 → bioimage_cpp-0.3.0}/tests/graph/lifted_multicut/test_kernighan_lin.py +12 -12
  125. bioimage_cpp-0.3.0/tests/graph/lifted_multicut/test_lifted_edges_from_node_labels.py +278 -0
  126. {bioimage_cpp-0.1.1 → bioimage_cpp-0.3.0}/tests/graph/lifted_multicut/test_objective.py +15 -15
  127. {bioimage_cpp-0.1.1 → bioimage_cpp-0.3.0}/tests/graph/multicut/test_chain_decomposer.py +18 -18
  128. bioimage_cpp-0.3.0/tests/graph/multicut/test_external_problem.py +29 -0
  129. bioimage_cpp-0.3.0/tests/graph/multicut/test_fusion_move.py +306 -0
  130. {bioimage_cpp-0.1.1 → bioimage_cpp-0.3.0}/tests/graph/multicut/test_greedy_additive.py +8 -8
  131. {bioimage_cpp-0.1.1 → bioimage_cpp-0.3.0}/tests/graph/multicut/test_greedy_fixation.py +8 -8
  132. {bioimage_cpp-0.1.1 → bioimage_cpp-0.3.0}/tests/graph/multicut/test_kernighan_lin.py +10 -10
  133. {bioimage_cpp-0.1.1 → bioimage_cpp-0.3.0}/tests/graph/multicut/test_objective.py +4 -4
  134. {bioimage_cpp-0.1.1 → bioimage_cpp-0.3.0}/tests/graph/multicut/test_proposal_generators.py +14 -14
  135. {bioimage_cpp-0.1.1 → bioimage_cpp-0.3.0}/tests/graph/test_grid_affinity_multicut_integration.py +10 -10
  136. {bioimage_cpp-0.1.1 → bioimage_cpp-0.3.0}/tests/graph/test_grid_features.py +16 -16
  137. {bioimage_cpp-0.1.1 → bioimage_cpp-0.3.0}/tests/graph/test_grid_graph.py +133 -0
  138. {bioimage_cpp-0.1.1 → bioimage_cpp-0.3.0}/tests/graph/test_mutex_watershed_graph.py +19 -19
  139. bioimage_cpp-0.3.0/tests/graph/test_rag_accumulate_labels.py +245 -0
  140. bioimage_cpp-0.3.0/tests/graph/test_rag_coordinates.py +231 -0
  141. {bioimage_cpp-0.1.1 → bioimage_cpp-0.3.0}/tests/graph/test_rag_features.py +12 -12
  142. {bioimage_cpp-0.1.1 → bioimage_cpp-0.3.0}/tests/graph/test_rag_lifted_features.py +26 -26
  143. {bioimage_cpp-0.1.1 → bioimage_cpp-0.3.0}/tests/graph/test_rag_multicut_integration.py +5 -5
  144. {bioimage_cpp-0.1.1 → bioimage_cpp-0.3.0}/tests/graph/test_semantic_mutex_watershed_graph.py +15 -15
  145. bioimage_cpp-0.3.0/tests/label_multiset/__init__.py +0 -0
  146. bioimage_cpp-0.3.0/tests/label_multiset/test_against_nifty.py +149 -0
  147. bioimage_cpp-0.3.0/tests/label_multiset/test_downsample.py +125 -0
  148. bioimage_cpp-0.3.0/tests/label_multiset/test_merger.py +129 -0
  149. bioimage_cpp-0.3.0/tests/label_multiset/test_read_subset.py +75 -0
  150. bioimage_cpp-0.3.0/tests/segmentation/test_label.py +416 -0
  151. bioimage_cpp-0.3.0/tests/segmentation/test_relabel_sequential.py +221 -0
  152. bioimage_cpp-0.3.0/tests/test_flow.py +180 -0
  153. bioimage_cpp-0.3.0/tests/test_utils_compute_rle.py +101 -0
  154. bioimage_cpp-0.3.0/tests/test_utils_mesh_smoothing.py +247 -0
  155. bioimage_cpp-0.1.1/src/bindings/utils.cxx +0 -113
  156. bioimage_cpp-0.1.1/src/bioimage_cpp/_version.py +0 -1
  157. bioimage_cpp-0.1.1/src/bioimage_cpp/affinities/__init__.py +0 -5
  158. bioimage_cpp-0.1.1/src/bioimage_cpp/graph/__init__.py +0 -2115
  159. bioimage_cpp-0.1.1/tests/graph/multicut/test_external_problem.py +0 -29
  160. bioimage_cpp-0.1.1/tests/graph/multicut/test_fusion_move.py +0 -267
  161. {bioimage_cpp-0.1.1 → bioimage_cpp-0.3.0}/.github/workflows/docs.yml +0 -0
  162. {bioimage_cpp-0.1.1 → bioimage_cpp-0.3.0}/.github/workflows/tests.yml +0 -0
  163. {bioimage_cpp-0.1.1 → bioimage_cpp-0.3.0}/.github/workflows/wheels.yml +0 -0
  164. {bioimage_cpp-0.1.1 → bioimage_cpp-0.3.0}/.gitignore +0 -0
  165. {bioimage_cpp-0.1.1 → bioimage_cpp-0.3.0}/LICENSE +0 -0
  166. {bioimage_cpp-0.1.1 → bioimage_cpp-0.3.0}/development/affinities/check_compute_affinities.py +0 -0
  167. {bioimage_cpp-0.1.1 → bioimage_cpp-0.3.0}/development/filters/PERFORMANCE_NOTES.md +0 -0
  168. {bioimage_cpp-0.1.1 → bioimage_cpp-0.3.0}/development/filters/_bench_utils.py +0 -0
  169. {bioimage_cpp-0.1.1 → bioimage_cpp-0.3.0}/development/filters/benchmark.py +0 -0
  170. {bioimage_cpp-0.1.1 → bioimage_cpp-0.3.0}/development/filters/check_parity.py +0 -0
  171. {bioimage_cpp-0.1.1 → bioimage_cpp-0.3.0}/development/graph/check_grid_affinity_edges.py +0 -0
  172. {bioimage_cpp-0.1.1 → bioimage_cpp-0.3.0}/development/graph/check_grid_affinity_lifted_edges.py +0 -0
  173. {bioimage_cpp-0.1.1 → bioimage_cpp-0.3.0}/development/graph/check_rag_2d.py +0 -0
  174. {bioimage_cpp-0.1.1 → bioimage_cpp-0.3.0}/development/graph/check_rag_3d.py +0 -0
  175. {bioimage_cpp-0.1.1 → bioimage_cpp-0.3.0}/development/graph/lifted_multicut/PERFORMANCE_NOTES.md +0 -0
  176. {bioimage_cpp-0.1.1 → bioimage_cpp-0.3.0}/development/graph/multicut/PERFORMANCE_NOTES.md +0 -0
  177. {bioimage_cpp-0.1.1 → bioimage_cpp-0.3.0}/development/segmentation/PERFORMANCE_NOTES.md +0 -0
  178. {bioimage_cpp-0.1.1 → bioimage_cpp-0.3.0}/development/segmentation/_mutex_watershed_equivalence.py +0 -0
  179. {bioimage_cpp-0.1.1 → bioimage_cpp-0.3.0}/development/segmentation/_semantic_mws_equivalence.py +0 -0
  180. {bioimage_cpp-0.1.1 → bioimage_cpp-0.3.0}/development/segmentation/_watershed_equivalence.py +0 -0
  181. {bioimage_cpp-0.1.1 → bioimage_cpp-0.3.0}/development/segmentation/_watershed_from_affinities_equivalence.py +0 -0
  182. {bioimage_cpp-0.1.1 → bioimage_cpp-0.3.0}/development/segmentation/check_mutex_watershed_2d.py +0 -0
  183. {bioimage_cpp-0.1.1 → bioimage_cpp-0.3.0}/development/segmentation/check_mutex_watershed_3d.py +0 -0
  184. {bioimage_cpp-0.1.1 → bioimage_cpp-0.3.0}/development/segmentation/check_semantic_mutex_watershed_2d.py +0 -0
  185. {bioimage_cpp-0.1.1 → bioimage_cpp-0.3.0}/development/segmentation/check_semantic_mutex_watershed_3d.py +0 -0
  186. {bioimage_cpp-0.1.1 → bioimage_cpp-0.3.0}/development/segmentation/check_watershed_2d.py +0 -0
  187. {bioimage_cpp-0.1.1 → bioimage_cpp-0.3.0}/development/segmentation/check_watershed_3d.py +0 -0
  188. {bioimage_cpp-0.1.1 → bioimage_cpp-0.3.0}/development/segmentation/check_watershed_from_affinities_2d.py +0 -0
  189. {bioimage_cpp-0.1.1 → bioimage_cpp-0.3.0}/development/segmentation/check_watershed_from_affinities_3d.py +0 -0
  190. {bioimage_cpp-0.1.1 → bioimage_cpp-0.3.0}/development/transformation/PERFORMANCE_NOTES.md +0 -0
  191. {bioimage_cpp-0.1.1 → bioimage_cpp-0.3.0}/development/transformation/check_affine.py +0 -0
  192. {bioimage_cpp-0.1.1 → bioimage_cpp-0.3.0}/examples/segmentation/mutex_watershed.py +0 -0
  193. {bioimage_cpp-0.1.1 → bioimage_cpp-0.3.0}/examples/segmentation/serialize_lifted_problem.py +0 -0
  194. {bioimage_cpp-0.1.1 → bioimage_cpp-0.3.0}/examples/segmentation/watershed.py +0 -0
  195. {bioimage_cpp-0.1.1 → bioimage_cpp-0.3.0}/include/bioimage_cpp/affinities/compute_affinities.hxx +0 -0
  196. {bioimage_cpp-0.1.1 → bioimage_cpp-0.3.0}/include/bioimage_cpp/array_view.hxx +0 -0
  197. {bioimage_cpp-0.1.1 → bioimage_cpp-0.3.0}/include/bioimage_cpp/blocking.hxx +0 -0
  198. {bioimage_cpp-0.1.1 → bioimage_cpp-0.3.0}/include/bioimage_cpp/detail/edge_hash.hxx +0 -0
  199. {bioimage_cpp-0.1.1 → bioimage_cpp-0.3.0}/include/bioimage_cpp/detail/grid.hxx +0 -0
  200. {bioimage_cpp-0.1.1 → bioimage_cpp-0.3.0}/include/bioimage_cpp/detail/indexed_heap.hxx +0 -0
  201. {bioimage_cpp-0.1.1 → bioimage_cpp-0.3.0}/include/bioimage_cpp/detail/mutex_storage.hxx +0 -0
  202. {bioimage_cpp-0.1.1 → bioimage_cpp-0.3.0}/include/bioimage_cpp/detail/profile.hxx +0 -0
  203. {bioimage_cpp-0.1.1 → bioimage_cpp-0.3.0}/include/bioimage_cpp/detail/relabel.hxx +0 -0
  204. {bioimage_cpp-0.1.1 → bioimage_cpp-0.3.0}/include/bioimage_cpp/detail/semantic_labels.hxx +0 -0
  205. {bioimage_cpp-0.1.1 → bioimage_cpp-0.3.0}/include/bioimage_cpp/detail/threading.hxx +0 -0
  206. {bioimage_cpp-0.1.1 → bioimage_cpp-0.3.0}/include/bioimage_cpp/filters/convolve.hxx +0 -0
  207. {bioimage_cpp-0.1.1 → bioimage_cpp-0.3.0}/include/bioimage_cpp/filters/eigenvalues.hxx +0 -0
  208. {bioimage_cpp-0.1.1 → bioimage_cpp-0.3.0}/include/bioimage_cpp/filters/gaussian.hxx +0 -0
  209. {bioimage_cpp-0.1.1 → bioimage_cpp-0.3.0}/include/bioimage_cpp/filters/kernel.hxx +0 -0
  210. {bioimage_cpp-0.1.1 → bioimage_cpp-0.3.0}/include/bioimage_cpp/graph/breadth_first_search.hxx +0 -0
  211. {bioimage_cpp-0.1.1 → bioimage_cpp-0.3.0}/include/bioimage_cpp/graph/connected_components.hxx +0 -0
  212. {bioimage_cpp-0.1.1 → bioimage_cpp-0.3.0}/include/bioimage_cpp/graph/detail/fusion_contract.hxx +0 -0
  213. {bioimage_cpp-0.1.1 → bioimage_cpp-0.3.0}/include/bioimage_cpp/graph/edge_weighted_watershed.hxx +0 -0
  214. {bioimage_cpp-0.1.1 → bioimage_cpp-0.3.0}/include/bioimage_cpp/graph/feature_accumulation.hxx +0 -0
  215. {bioimage_cpp-0.1.1 → bioimage_cpp-0.3.0}/include/bioimage_cpp/graph/grid_features.hxx +0 -0
  216. {bioimage_cpp-0.1.1 → bioimage_cpp-0.3.0}/include/bioimage_cpp/graph/grid_graph.hxx +0 -0
  217. {bioimage_cpp-0.1.1 → bioimage_cpp-0.3.0}/include/bioimage_cpp/graph/lifted_from_affinities.hxx +0 -0
  218. {bioimage_cpp-0.1.1 → bioimage_cpp-0.3.0}/include/bioimage_cpp/graph/lifted_multicut/detail.hxx +0 -0
  219. {bioimage_cpp-0.1.1 → bioimage_cpp-0.3.0}/include/bioimage_cpp/graph/lifted_multicut/greedy_additive.hxx +0 -0
  220. {bioimage_cpp-0.1.1 → bioimage_cpp-0.3.0}/include/bioimage_cpp/graph/lifted_multicut/kernighan_lin.hxx +0 -0
  221. {bioimage_cpp-0.1.1 → bioimage_cpp-0.3.0}/include/bioimage_cpp/graph/lifted_multicut/objective.hxx +0 -0
  222. {bioimage_cpp-0.1.1 → bioimage_cpp-0.3.0}/include/bioimage_cpp/graph/lifted_multicut.hxx +0 -0
  223. {bioimage_cpp-0.1.1 → bioimage_cpp-0.3.0}/include/bioimage_cpp/graph/multicut/detail.hxx +0 -0
  224. {bioimage_cpp-0.1.1 → bioimage_cpp-0.3.0}/include/bioimage_cpp/graph/multicut/greedy_additive.hxx +0 -0
  225. {bioimage_cpp-0.1.1 → bioimage_cpp-0.3.0}/include/bioimage_cpp/graph/multicut/greedy_fixation.hxx +0 -0
  226. {bioimage_cpp-0.1.1 → bioimage_cpp-0.3.0}/include/bioimage_cpp/graph/multicut/kernighan_lin.hxx +0 -0
  227. {bioimage_cpp-0.1.1 → bioimage_cpp-0.3.0}/include/bioimage_cpp/graph/multicut/objective.hxx +0 -0
  228. {bioimage_cpp-0.1.1 → bioimage_cpp-0.3.0}/include/bioimage_cpp/graph/multicut.hxx +0 -0
  229. {bioimage_cpp-0.1.1 → bioimage_cpp-0.3.0}/include/bioimage_cpp/graph/mutex_watershed/clustering.hxx +0 -0
  230. {bioimage_cpp-0.1.1 → bioimage_cpp-0.3.0}/include/bioimage_cpp/graph/mutex_watershed/semantic.hxx +0 -0
  231. {bioimage_cpp-0.1.1 → bioimage_cpp-0.3.0}/include/bioimage_cpp/graph/mutex_watershed.hxx +0 -0
  232. {bioimage_cpp-0.1.1 → bioimage_cpp-0.3.0}/include/bioimage_cpp/graph/node_label_projection.hxx +0 -0
  233. {bioimage_cpp-0.1.1 → bioimage_cpp-0.3.0}/include/bioimage_cpp/graph/proposal_generator.hxx +0 -0
  234. {bioimage_cpp-0.1.1 → bioimage_cpp-0.3.0}/include/bioimage_cpp/graph/proposal_generators/greedy_additive_multicut.hxx +0 -0
  235. {bioimage_cpp-0.1.1 → bioimage_cpp-0.3.0}/include/bioimage_cpp/graph/proposal_generators/watershed.hxx +0 -0
  236. {bioimage_cpp-0.1.1 → bioimage_cpp-0.3.0}/include/bioimage_cpp/graph/region_adjacency_graph.hxx +0 -0
  237. {bioimage_cpp-0.1.1 → bioimage_cpp-0.3.0}/include/bioimage_cpp/overlap.hxx +0 -0
  238. {bioimage_cpp-0.1.1 → bioimage_cpp-0.3.0}/include/bioimage_cpp/segmentation/mutex_watershed.hxx +0 -0
  239. {bioimage_cpp-0.1.1 → bioimage_cpp-0.3.0}/include/bioimage_cpp/segmentation/semantic_mutex_watershed.hxx +0 -0
  240. {bioimage_cpp-0.1.1 → bioimage_cpp-0.3.0}/include/bioimage_cpp/segmentation/watershed.hxx +0 -0
  241. {bioimage_cpp-0.1.1 → bioimage_cpp-0.3.0}/include/bioimage_cpp/take_dict.hxx +0 -0
  242. {bioimage_cpp-0.1.1 → bioimage_cpp-0.3.0}/include/bioimage_cpp/transformation/affine.hxx +0 -0
  243. {bioimage_cpp-0.1.1 → bioimage_cpp-0.3.0}/include/bioimage_cpp/util/union_find.hxx +0 -0
  244. {bioimage_cpp-0.1.1 → bioimage_cpp-0.3.0}/pyproject.toml +0 -0
  245. {bioimage_cpp-0.1.1 → bioimage_cpp-0.3.0}/src/bindings/affinities.hxx +0 -0
  246. {bioimage_cpp-0.1.1 → bioimage_cpp-0.3.0}/src/bindings/blocking.cxx +0 -0
  247. {bioimage_cpp-0.1.1 → bioimage_cpp-0.3.0}/src/bindings/blocking.hxx +0 -0
  248. {bioimage_cpp-0.1.1 → bioimage_cpp-0.3.0}/src/bindings/filters.cxx +0 -0
  249. {bioimage_cpp-0.1.1 → bioimage_cpp-0.3.0}/src/bindings/filters.hxx +0 -0
  250. {bioimage_cpp-0.1.1 → bioimage_cpp-0.3.0}/src/bindings/graph.hxx +0 -0
  251. {bioimage_cpp-0.1.1 → bioimage_cpp-0.3.0}/src/bindings/ground_truth.cxx +0 -0
  252. {bioimage_cpp-0.1.1 → bioimage_cpp-0.3.0}/src/bindings/ground_truth.hxx +0 -0
  253. {bioimage_cpp-0.1.1 → bioimage_cpp-0.3.0}/src/bindings/segmentation.hxx +0 -0
  254. {bioimage_cpp-0.1.1 → bioimage_cpp-0.3.0}/src/bindings/transformation.cxx +0 -0
  255. {bioimage_cpp-0.1.1 → bioimage_cpp-0.3.0}/src/bindings/transformation.hxx +0 -0
  256. {bioimage_cpp-0.1.1 → bioimage_cpp-0.3.0}/src/bindings/util.cxx +0 -0
  257. {bioimage_cpp-0.1.1 → bioimage_cpp-0.3.0}/src/bindings/util.hxx +0 -0
  258. {bioimage_cpp-0.1.1 → bioimage_cpp-0.3.0}/src/bindings/utils.hxx +0 -0
  259. {bioimage_cpp-0.1.1 → bioimage_cpp-0.3.0}/src/bioimage_cpp/affinities/compute_affinities.py +0 -0
  260. {bioimage_cpp-0.1.1 → bioimage_cpp-0.3.0}/src/bioimage_cpp/filters/__init__.py +0 -0
  261. {bioimage_cpp-0.1.1 → bioimage_cpp-0.3.0}/src/bioimage_cpp/filters/_filters.py +0 -0
  262. {bioimage_cpp-0.1.1 → bioimage_cpp-0.3.0}/src/bioimage_cpp/graph/_external.py +0 -0
  263. {bioimage_cpp-0.1.1 → bioimage_cpp-0.3.0}/src/bioimage_cpp/segmentation/watershed.py +0 -0
  264. {bioimage_cpp-0.1.1 → bioimage_cpp-0.3.0}/src/bioimage_cpp/transformation/__init__.py +0 -0
  265. {bioimage_cpp-0.1.1 → bioimage_cpp-0.3.0}/src/bioimage_cpp/transformation/_transformation.py +0 -0
  266. {bioimage_cpp-0.1.1 → bioimage_cpp-0.3.0}/src/cpp/segmentation/mutex_watershed.cxx +0 -0
  267. {bioimage_cpp-0.1.1 → bioimage_cpp-0.3.0}/src/cpp/segmentation/semantic_mutex_watershed.cxx +0 -0
  268. {bioimage_cpp-0.1.1 → bioimage_cpp-0.3.0}/src/cpp/take_dict.cxx +0 -0
  269. {bioimage_cpp-0.1.1 → bioimage_cpp-0.3.0}/tests/affinities/test_compute_affinities.py +0 -0
  270. {bioimage_cpp-0.1.1/tests/graph/lifted_multicut → bioimage_cpp-0.3.0/tests/graph/agglomeration}/__init__.py +0 -0
  271. {bioimage_cpp-0.1.1 → bioimage_cpp-0.3.0}/tests/graph/lifted_multicut/_helpers.py +0 -0
  272. {bioimage_cpp-0.1.1 → bioimage_cpp-0.3.0}/tests/graph/lifted_multicut/conftest.py +0 -0
  273. {bioimage_cpp-0.1.1 → bioimage_cpp-0.3.0}/tests/graph/multicut/__init__.py +0 -0
  274. {bioimage_cpp-0.1.1 → bioimage_cpp-0.3.0}/tests/graph/multicut/_helpers.py +0 -0
  275. {bioimage_cpp-0.1.1 → bioimage_cpp-0.3.0}/tests/graph/multicut/conftest.py +0 -0
  276. {bioimage_cpp-0.1.1 → bioimage_cpp-0.3.0}/tests/graph/test_breadth_first_search.py +0 -0
  277. {bioimage_cpp-0.1.1 → bioimage_cpp-0.3.0}/tests/graph/test_connected_components.py +0 -0
  278. {bioimage_cpp-0.1.1 → bioimage_cpp-0.3.0}/tests/graph/test_edge_weighted_watershed.py +0 -0
  279. {bioimage_cpp-0.1.1 → bioimage_cpp-0.3.0}/tests/graph/test_node_label_projection.py +0 -0
  280. {bioimage_cpp-0.1.1 → bioimage_cpp-0.3.0}/tests/graph/test_region_adjacency_graph.py +0 -0
  281. {bioimage_cpp-0.1.1 → bioimage_cpp-0.3.0}/tests/graph/test_undirected_graph.py +0 -0
  282. {bioimage_cpp-0.1.1 → bioimage_cpp-0.3.0}/tests/segmentation/test_mutex_watershed.py +0 -0
  283. {bioimage_cpp-0.1.1 → bioimage_cpp-0.3.0}/tests/segmentation/test_semantic_mutex_watershed.py +0 -0
  284. {bioimage_cpp-0.1.1 → bioimage_cpp-0.3.0}/tests/segmentation/test_watershed.py +0 -0
  285. {bioimage_cpp-0.1.1 → bioimage_cpp-0.3.0}/tests/segmentation/test_watershed_from_affinities.py +0 -0
  286. {bioimage_cpp-0.1.1 → bioimage_cpp-0.3.0}/tests/test_blocking.py +0 -0
  287. {bioimage_cpp-0.1.1 → bioimage_cpp-0.3.0}/tests/test_filters.py +0 -0
  288. {bioimage_cpp-0.1.1 → bioimage_cpp-0.3.0}/tests/test_ground_truth_overlap.py +0 -0
  289. {bioimage_cpp-0.1.1 → bioimage_cpp-0.3.0}/tests/test_transformation.py +0 -0
  290. {bioimage_cpp-0.1.1 → bioimage_cpp-0.3.0}/tests/test_util_union_find.py +0 -0
  291. {bioimage_cpp-0.1.1 → bioimage_cpp-0.3.0}/tests/test_utils_take_dict.py +0 -0
@@ -60,6 +60,32 @@ new fusion-move / proposal-based / contraction-based solver:
60
60
  - `detail/threading.hxx::parallel_for_chunks` — the only threading primitive
61
61
  we use. New parallel solvers should not introduce alternatives.
62
62
 
63
+ ### Freeze graphs before parallel fan-out (thread-safety contract)
64
+
65
+ `UndirectedGraph` (and its subclasses) build the CSR adjacency *lazily*: the
66
+ first `node_adjacency` read on a graph built incrementally rebuilds it through
67
+ a `mutable` write inside a `const` method, and that rebuild is **not
68
+ thread-safe**. Graphs are "dirty" (not yet built) after `insert_edge`-based
69
+ construction — this includes the `from_edges` binding, `region_adjacency_graph`,
70
+ and `GridGraph` (which defers the build on purpose). `from_sorted_unique_edges`
71
+ returns an already-frozen graph.
72
+
73
+ Rule: **any algorithm that reads `node_adjacency` from `parallel_for_chunks`
74
+ (or other threads) MUST call `graph.freeze()` on the calling thread before the
75
+ fan-out.** "Reads `node_adjacency`" includes the indirect readers
76
+ `breadth_first_search`, `extract_subgraph_from_nodes`, and the multicut
77
+ sub-solver `greedy_additive` (via `DynamicGraph::reset`, which sizes per-node
78
+ adjacency from `graph.node_adjacency(node)`). Edge-only iteration
79
+ (`uv`, `uv_ids`, `number_of_edges`) and `find_edge` (edge-lookup hashmap) do
80
+ *not* trigger the rebuild and need no freeze. Symptoms when this is missed:
81
+ nondeterministic results for fixed input and intermittent segfaults.
82
+
83
+ Canonical fixed call sites that already follow this (copy the pattern):
84
+ `lifted_multicut/lifted_from_node_labels.hxx` and both
85
+ `{multicut,lifted_multicut}/fusion_move.hxx::FusionMoveSolver::optimize`
86
+ (the lifted driver freezes the *base* graph — its proposal generators read base
87
+ adjacency, while its warm-start only touches the lifted graph).
88
+
63
89
  When porting fusion moves to a new objective (e.g. lifted multicut):
64
90
 
65
91
  1. The driver loop in `multicut/fusion_move.hxx::FusionMoveSolver::optimize`
@@ -13,10 +13,13 @@ nanobind_add_module(_core
13
13
  NB_STATIC
14
14
  src/bindings/affinities.cxx
15
15
  src/bindings/blocking.cxx
16
+ src/bindings/distance.cxx
16
17
  src/bindings/module.cxx
17
18
  src/bindings/filters.cxx
19
+ src/bindings/flow.cxx
18
20
  src/bindings/graph.cxx
19
21
  src/bindings/ground_truth.cxx
22
+ src/bindings/label_multiset.cxx
20
23
  src/bindings/segmentation.cxx
21
24
  src/bindings/transformation.cxx
22
25
  src/bindings/util.cxx