multipers 2.3.2b1__tar.gz → 2.3.3b2__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.

Potentially problematic release.


This version of multipers might be problematic. Click here for more details.

Files changed (191) hide show
  1. {multipers-2.3.2b1/multipers.egg-info → multipers-2.3.3b2}/PKG-INFO +1 -1
  2. {multipers-2.3.2b1 → multipers-2.3.3b2}/multipers/array_api/__init__.py +4 -0
  3. {multipers-2.3.2b1 → multipers-2.3.3b2}/multipers/ml/mma.py +1 -1
  4. {multipers-2.3.2b1 → multipers-2.3.3b2}/multipers/multiparameter_module_approximation.pyx +2 -1
  5. {multipers-2.3.2b1 → multipers-2.3.3b2}/multipers/plots.py +107 -26
  6. {multipers-2.3.2b1 → multipers-2.3.3b2}/multipers/simplex_tree_multi.pyx +72 -28
  7. {multipers-2.3.2b1 → multipers-2.3.3b2}/multipers/simplex_tree_multi.pyx.tp +15 -4
  8. {multipers-2.3.2b1 → multipers-2.3.3b2}/multipers/slicer.pyx +26 -23
  9. {multipers-2.3.2b1 → multipers-2.3.3b2}/multipers/slicer.pyx.tp +6 -3
  10. {multipers-2.3.2b1 → multipers-2.3.3b2/multipers.egg-info}/PKG-INFO +1 -1
  11. {multipers-2.3.2b1 → multipers-2.3.3b2}/pyproject.toml +1 -1
  12. {multipers-2.3.2b1 → multipers-2.3.3b2}/setup.py +2 -0
  13. {multipers-2.3.2b1 → multipers-2.3.3b2}/tests/test_slicer.py +3 -2
  14. {multipers-2.3.2b1 → multipers-2.3.3b2}/LICENSE +0 -0
  15. {multipers-2.3.2b1 → multipers-2.3.3b2}/MANIFEST.in +0 -0
  16. {multipers-2.3.2b1 → multipers-2.3.3b2}/README.md +0 -0
  17. {multipers-2.3.2b1 → multipers-2.3.3b2}/_tempita_grid_gen.py +0 -0
  18. {multipers-2.3.2b1 → multipers-2.3.3b2}/multipers/__init__.py +0 -0
  19. {multipers-2.3.2b1 → multipers-2.3.3b2}/multipers/_signed_measure_meta.py +0 -0
  20. {multipers-2.3.2b1 → multipers-2.3.3b2}/multipers/_slicer_meta.py +0 -0
  21. {multipers-2.3.2b1 → multipers-2.3.3b2}/multipers/array_api/numpy.py +0 -0
  22. {multipers-2.3.2b1 → multipers-2.3.3b2}/multipers/array_api/torch.py +0 -0
  23. {multipers-2.3.2b1 → multipers-2.3.3b2}/multipers/data/MOL2.py +0 -0
  24. {multipers-2.3.2b1 → multipers-2.3.3b2}/multipers/data/UCR.py +0 -0
  25. {multipers-2.3.2b1 → multipers-2.3.3b2}/multipers/data/__init__.py +0 -0
  26. {multipers-2.3.2b1 → multipers-2.3.3b2}/multipers/data/graphs.py +0 -0
  27. {multipers-2.3.2b1 → multipers-2.3.3b2}/multipers/data/immuno_regions.py +0 -0
  28. {multipers-2.3.2b1 → multipers-2.3.3b2}/multipers/data/minimal_presentation_to_st_bf.py +0 -0
  29. {multipers-2.3.2b1 → multipers-2.3.3b2}/multipers/data/pytorch2simplextree.py +0 -0
  30. {multipers-2.3.2b1 → multipers-2.3.3b2}/multipers/data/shape3d.py +0 -0
  31. {multipers-2.3.2b1 → multipers-2.3.3b2}/multipers/data/synthetic.py +0 -0
  32. {multipers-2.3.2b1 → multipers-2.3.3b2}/multipers/distances.py +0 -0
  33. {multipers-2.3.2b1 → multipers-2.3.3b2}/multipers/filtration_conversions.pxd +0 -0
  34. {multipers-2.3.2b1 → multipers-2.3.3b2}/multipers/filtration_conversions.pxd.tp +0 -0
  35. {multipers-2.3.2b1 → multipers-2.3.3b2}/multipers/filtrations/__init__.py +0 -0
  36. {multipers-2.3.2b1 → multipers-2.3.3b2}/multipers/filtrations/density.py +0 -0
  37. {multipers-2.3.2b1 → multipers-2.3.3b2}/multipers/filtrations/filtrations.py +0 -0
  38. {multipers-2.3.2b1 → multipers-2.3.3b2}/multipers/filtrations.pxd +0 -0
  39. {multipers-2.3.2b1 → multipers-2.3.3b2}/multipers/function_rips.pyx +0 -0
  40. {multipers-2.3.2b1 → multipers-2.3.3b2}/multipers/grids.pyx +0 -0
  41. {multipers-2.3.2b1 → multipers-2.3.3b2}/multipers/gudhi/Persistence_slices_interface.h +0 -0
  42. {multipers-2.3.2b1 → multipers-2.3.3b2}/multipers/gudhi/Simplex_tree_interface.h +0 -0
  43. {multipers-2.3.2b1 → multipers-2.3.3b2}/multipers/gudhi/Simplex_tree_multi_interface.h +0 -0
  44. {multipers-2.3.2b1 → multipers-2.3.3b2}/multipers/gudhi/cubical_to_boundary.h +0 -0
  45. {multipers-2.3.2b1 → multipers-2.3.3b2}/multipers/gudhi/gudhi/Bitmap_cubical_complex.h +0 -0
  46. {multipers-2.3.2b1 → multipers-2.3.3b2}/multipers/gudhi/gudhi/Bitmap_cubical_complex_base.h +0 -0
  47. {multipers-2.3.2b1 → multipers-2.3.3b2}/multipers/gudhi/gudhi/Bitmap_cubical_complex_periodic_boundary_conditions_base.h +0 -0
  48. {multipers-2.3.2b1 → multipers-2.3.3b2}/multipers/gudhi/gudhi/Debug_utils.h +0 -0
  49. {multipers-2.3.2b1 → multipers-2.3.3b2}/multipers/gudhi/gudhi/Fields/Multi_field.h +0 -0
  50. {multipers-2.3.2b1 → multipers-2.3.3b2}/multipers/gudhi/gudhi/Fields/Multi_field_operators.h +0 -0
  51. {multipers-2.3.2b1 → multipers-2.3.3b2}/multipers/gudhi/gudhi/Fields/Multi_field_shared.h +0 -0
  52. {multipers-2.3.2b1 → multipers-2.3.3b2}/multipers/gudhi/gudhi/Fields/Multi_field_small.h +0 -0
  53. {multipers-2.3.2b1 → multipers-2.3.3b2}/multipers/gudhi/gudhi/Fields/Multi_field_small_operators.h +0 -0
  54. {multipers-2.3.2b1 → multipers-2.3.3b2}/multipers/gudhi/gudhi/Fields/Multi_field_small_shared.h +0 -0
  55. {multipers-2.3.2b1 → multipers-2.3.3b2}/multipers/gudhi/gudhi/Fields/Z2_field.h +0 -0
  56. {multipers-2.3.2b1 → multipers-2.3.3b2}/multipers/gudhi/gudhi/Fields/Z2_field_operators.h +0 -0
  57. {multipers-2.3.2b1 → multipers-2.3.3b2}/multipers/gudhi/gudhi/Fields/Zp_field.h +0 -0
  58. {multipers-2.3.2b1 → multipers-2.3.3b2}/multipers/gudhi/gudhi/Fields/Zp_field_operators.h +0 -0
  59. {multipers-2.3.2b1 → multipers-2.3.3b2}/multipers/gudhi/gudhi/Fields/Zp_field_shared.h +0 -0
  60. {multipers-2.3.2b1 → multipers-2.3.3b2}/multipers/gudhi/gudhi/Flag_complex_edge_collapser.h +0 -0
  61. {multipers-2.3.2b1 → multipers-2.3.3b2}/multipers/gudhi/gudhi/Matrix.h +0 -0
  62. {multipers-2.3.2b1 → multipers-2.3.3b2}/multipers/gudhi/gudhi/Multi_critical_filtration.h +0 -0
  63. {multipers-2.3.2b1 → multipers-2.3.3b2}/multipers/gudhi/gudhi/Multi_persistence/Box.h +0 -0
  64. {multipers-2.3.2b1 → multipers-2.3.3b2}/multipers/gudhi/gudhi/Multi_persistence/Line.h +0 -0
  65. {multipers-2.3.2b1 → multipers-2.3.3b2}/multipers/gudhi/gudhi/Off_reader.h +0 -0
  66. {multipers-2.3.2b1 → multipers-2.3.3b2}/multipers/gudhi/gudhi/One_critical_filtration.h +0 -0
  67. {multipers-2.3.2b1 → multipers-2.3.3b2}/multipers/gudhi/gudhi/Persistence_matrix/Base_matrix.h +0 -0
  68. {multipers-2.3.2b1 → multipers-2.3.3b2}/multipers/gudhi/gudhi/Persistence_matrix/Base_matrix_with_column_compression.h +0 -0
  69. {multipers-2.3.2b1 → multipers-2.3.3b2}/multipers/gudhi/gudhi/Persistence_matrix/Boundary_matrix.h +0 -0
  70. {multipers-2.3.2b1 → multipers-2.3.3b2}/multipers/gudhi/gudhi/Persistence_matrix/Chain_matrix.h +0 -0
  71. {multipers-2.3.2b1 → multipers-2.3.3b2}/multipers/gudhi/gudhi/Persistence_matrix/Id_to_index_overlay.h +0 -0
  72. {multipers-2.3.2b1 → multipers-2.3.3b2}/multipers/gudhi/gudhi/Persistence_matrix/Position_to_index_overlay.h +0 -0
  73. {multipers-2.3.2b1 → multipers-2.3.3b2}/multipers/gudhi/gudhi/Persistence_matrix/RU_matrix.h +0 -0
  74. {multipers-2.3.2b1 → multipers-2.3.3b2}/multipers/gudhi/gudhi/Persistence_matrix/allocators/entry_constructors.h +0 -0
  75. {multipers-2.3.2b1 → multipers-2.3.3b2}/multipers/gudhi/gudhi/Persistence_matrix/base_pairing.h +0 -0
  76. {multipers-2.3.2b1 → multipers-2.3.3b2}/multipers/gudhi/gudhi/Persistence_matrix/base_swap.h +0 -0
  77. {multipers-2.3.2b1 → multipers-2.3.3b2}/multipers/gudhi/gudhi/Persistence_matrix/boundary_cell_position_to_id_mapper.h +0 -0
  78. {multipers-2.3.2b1 → multipers-2.3.3b2}/multipers/gudhi/gudhi/Persistence_matrix/boundary_face_position_to_id_mapper.h +0 -0
  79. {multipers-2.3.2b1 → multipers-2.3.3b2}/multipers/gudhi/gudhi/Persistence_matrix/chain_pairing.h +0 -0
  80. {multipers-2.3.2b1 → multipers-2.3.3b2}/multipers/gudhi/gudhi/Persistence_matrix/chain_rep_cycles.h +0 -0
  81. {multipers-2.3.2b1 → multipers-2.3.3b2}/multipers/gudhi/gudhi/Persistence_matrix/chain_vine_swap.h +0 -0
  82. {multipers-2.3.2b1 → multipers-2.3.3b2}/multipers/gudhi/gudhi/Persistence_matrix/columns/chain_column_extra_properties.h +0 -0
  83. {multipers-2.3.2b1 → multipers-2.3.3b2}/multipers/gudhi/gudhi/Persistence_matrix/columns/column_dimension_holder.h +0 -0
  84. {multipers-2.3.2b1 → multipers-2.3.3b2}/multipers/gudhi/gudhi/Persistence_matrix/columns/column_utilities.h +0 -0
  85. {multipers-2.3.2b1 → multipers-2.3.3b2}/multipers/gudhi/gudhi/Persistence_matrix/columns/entry_types.h +0 -0
  86. {multipers-2.3.2b1 → multipers-2.3.3b2}/multipers/gudhi/gudhi/Persistence_matrix/columns/heap_column.h +0 -0
  87. {multipers-2.3.2b1 → multipers-2.3.3b2}/multipers/gudhi/gudhi/Persistence_matrix/columns/intrusive_list_column.h +0 -0
  88. {multipers-2.3.2b1 → multipers-2.3.3b2}/multipers/gudhi/gudhi/Persistence_matrix/columns/intrusive_set_column.h +0 -0
  89. {multipers-2.3.2b1 → multipers-2.3.3b2}/multipers/gudhi/gudhi/Persistence_matrix/columns/list_column.h +0 -0
  90. {multipers-2.3.2b1 → multipers-2.3.3b2}/multipers/gudhi/gudhi/Persistence_matrix/columns/naive_vector_column.h +0 -0
  91. {multipers-2.3.2b1 → multipers-2.3.3b2}/multipers/gudhi/gudhi/Persistence_matrix/columns/row_access.h +0 -0
  92. {multipers-2.3.2b1 → multipers-2.3.3b2}/multipers/gudhi/gudhi/Persistence_matrix/columns/set_column.h +0 -0
  93. {multipers-2.3.2b1 → multipers-2.3.3b2}/multipers/gudhi/gudhi/Persistence_matrix/columns/small_vector_column.h +0 -0
  94. {multipers-2.3.2b1 → multipers-2.3.3b2}/multipers/gudhi/gudhi/Persistence_matrix/columns/unordered_set_column.h +0 -0
  95. {multipers-2.3.2b1 → multipers-2.3.3b2}/multipers/gudhi/gudhi/Persistence_matrix/columns/vector_column.h +0 -0
  96. {multipers-2.3.2b1 → multipers-2.3.3b2}/multipers/gudhi/gudhi/Persistence_matrix/matrix_dimension_holders.h +0 -0
  97. {multipers-2.3.2b1 → multipers-2.3.3b2}/multipers/gudhi/gudhi/Persistence_matrix/matrix_row_access.h +0 -0
  98. {multipers-2.3.2b1 → multipers-2.3.3b2}/multipers/gudhi/gudhi/Persistence_matrix/ru_pairing.h +0 -0
  99. {multipers-2.3.2b1 → multipers-2.3.3b2}/multipers/gudhi/gudhi/Persistence_matrix/ru_rep_cycles.h +0 -0
  100. {multipers-2.3.2b1 → multipers-2.3.3b2}/multipers/gudhi/gudhi/Persistence_matrix/ru_vine_swap.h +0 -0
  101. {multipers-2.3.2b1 → multipers-2.3.3b2}/multipers/gudhi/gudhi/Persistent_cohomology/Field_Zp.h +0 -0
  102. {multipers-2.3.2b1 → multipers-2.3.3b2}/multipers/gudhi/gudhi/Persistent_cohomology/Multi_field.h +0 -0
  103. {multipers-2.3.2b1 → multipers-2.3.3b2}/multipers/gudhi/gudhi/Persistent_cohomology/Persistent_cohomology_column.h +0 -0
  104. {multipers-2.3.2b1 → multipers-2.3.3b2}/multipers/gudhi/gudhi/Persistent_cohomology.h +0 -0
  105. {multipers-2.3.2b1 → multipers-2.3.3b2}/multipers/gudhi/gudhi/Points_off_io.h +0 -0
  106. {multipers-2.3.2b1 → multipers-2.3.3b2}/multipers/gudhi/gudhi/Simple_object_pool.h +0 -0
  107. {multipers-2.3.2b1 → multipers-2.3.3b2}/multipers/gudhi/gudhi/Simplex_tree/Simplex_tree_iterators.h +0 -0
  108. {multipers-2.3.2b1 → multipers-2.3.3b2}/multipers/gudhi/gudhi/Simplex_tree/Simplex_tree_node_explicit_storage.h +0 -0
  109. {multipers-2.3.2b1 → multipers-2.3.3b2}/multipers/gudhi/gudhi/Simplex_tree/Simplex_tree_siblings.h +0 -0
  110. {multipers-2.3.2b1 → multipers-2.3.3b2}/multipers/gudhi/gudhi/Simplex_tree/Simplex_tree_star_simplex_iterators.h +0 -0
  111. {multipers-2.3.2b1 → multipers-2.3.3b2}/multipers/gudhi/gudhi/Simplex_tree/hooks_simplex_base.h +0 -0
  112. {multipers-2.3.2b1 → multipers-2.3.3b2}/multipers/gudhi/gudhi/Simplex_tree/indexing_tag.h +0 -0
  113. {multipers-2.3.2b1 → multipers-2.3.3b2}/multipers/gudhi/gudhi/Simplex_tree/serialization_utils.h +0 -0
  114. {multipers-2.3.2b1 → multipers-2.3.3b2}/multipers/gudhi/gudhi/Simplex_tree/simplex_tree_options.h +0 -0
  115. {multipers-2.3.2b1 → multipers-2.3.3b2}/multipers/gudhi/gudhi/Simplex_tree.h +0 -0
  116. {multipers-2.3.2b1 → multipers-2.3.3b2}/multipers/gudhi/gudhi/Simplex_tree_multi.h +0 -0
  117. {multipers-2.3.2b1 → multipers-2.3.3b2}/multipers/gudhi/gudhi/distance_functions.h +0 -0
  118. {multipers-2.3.2b1 → multipers-2.3.3b2}/multipers/gudhi/gudhi/graph_simplicial_complex.h +0 -0
  119. {multipers-2.3.2b1 → multipers-2.3.3b2}/multipers/gudhi/gudhi/persistence_interval.h +0 -0
  120. {multipers-2.3.2b1 → multipers-2.3.3b2}/multipers/gudhi/gudhi/persistence_matrix_options.h +0 -0
  121. {multipers-2.3.2b1 → multipers-2.3.3b2}/multipers/gudhi/gudhi/reader_utils.h +0 -0
  122. {multipers-2.3.2b1 → multipers-2.3.3b2}/multipers/gudhi/mma_interface_coh.h +0 -0
  123. {multipers-2.3.2b1 → multipers-2.3.3b2}/multipers/gudhi/mma_interface_h0.h +0 -0
  124. {multipers-2.3.2b1 → multipers-2.3.3b2}/multipers/gudhi/mma_interface_matrix.h +0 -0
  125. {multipers-2.3.2b1 → multipers-2.3.3b2}/multipers/gudhi/naive_merge_tree.h +0 -0
  126. {multipers-2.3.2b1 → multipers-2.3.3b2}/multipers/gudhi/scc_io.h +0 -0
  127. {multipers-2.3.2b1 → multipers-2.3.3b2}/multipers/gudhi/truc.h +0 -0
  128. {multipers-2.3.2b1 → multipers-2.3.3b2}/multipers/io.pyx +0 -0
  129. {multipers-2.3.2b1 → multipers-2.3.3b2}/multipers/ml/__init__.py +0 -0
  130. {multipers-2.3.2b1 → multipers-2.3.3b2}/multipers/ml/accuracies.py +0 -0
  131. {multipers-2.3.2b1 → multipers-2.3.3b2}/multipers/ml/invariants_with_persistable.py +0 -0
  132. {multipers-2.3.2b1 → multipers-2.3.3b2}/multipers/ml/kernels.py +0 -0
  133. {multipers-2.3.2b1 → multipers-2.3.3b2}/multipers/ml/one.py +0 -0
  134. {multipers-2.3.2b1 → multipers-2.3.3b2}/multipers/ml/point_clouds.py +0 -0
  135. {multipers-2.3.2b1 → multipers-2.3.3b2}/multipers/ml/signed_measures.py +0 -0
  136. {multipers-2.3.2b1 → multipers-2.3.3b2}/multipers/ml/sliced_wasserstein.py +0 -0
  137. {multipers-2.3.2b1 → multipers-2.3.3b2}/multipers/ml/tools.py +0 -0
  138. {multipers-2.3.2b1 → multipers-2.3.3b2}/multipers/mma_structures.pxd +0 -0
  139. {multipers-2.3.2b1 → multipers-2.3.3b2}/multipers/mma_structures.pyx +0 -0
  140. {multipers-2.3.2b1 → multipers-2.3.3b2}/multipers/mma_structures.pyx.tp +0 -0
  141. {multipers-2.3.2b1 → multipers-2.3.3b2}/multipers/multi_parameter_rank_invariant/diff_helpers.h +0 -0
  142. {multipers-2.3.2b1 → multipers-2.3.3b2}/multipers/multi_parameter_rank_invariant/euler_characteristic.h +0 -0
  143. {multipers-2.3.2b1 → multipers-2.3.3b2}/multipers/multi_parameter_rank_invariant/function_rips.h +0 -0
  144. {multipers-2.3.2b1 → multipers-2.3.3b2}/multipers/multi_parameter_rank_invariant/hilbert_function.h +0 -0
  145. {multipers-2.3.2b1 → multipers-2.3.3b2}/multipers/multi_parameter_rank_invariant/persistence_slices.h +0 -0
  146. {multipers-2.3.2b1 → multipers-2.3.3b2}/multipers/multi_parameter_rank_invariant/rank_invariant.h +0 -0
  147. {multipers-2.3.2b1 → multipers-2.3.3b2}/multipers/multiparameter_edge_collapse.py +0 -0
  148. {multipers-2.3.2b1 → multipers-2.3.3b2}/multipers/multiparameter_module_approximation/approximation.h +0 -0
  149. {multipers-2.3.2b1 → multipers-2.3.3b2}/multipers/multiparameter_module_approximation/combinatory.h +0 -0
  150. {multipers-2.3.2b1 → multipers-2.3.3b2}/multipers/multiparameter_module_approximation/debug.h +0 -0
  151. {multipers-2.3.2b1 → multipers-2.3.3b2}/multipers/multiparameter_module_approximation/euler_curves.h +0 -0
  152. {multipers-2.3.2b1 → multipers-2.3.3b2}/multipers/multiparameter_module_approximation/format_python-cpp.h +0 -0
  153. {multipers-2.3.2b1 → multipers-2.3.3b2}/multipers/multiparameter_module_approximation/heap_column.h +0 -0
  154. {multipers-2.3.2b1 → multipers-2.3.3b2}/multipers/multiparameter_module_approximation/images.h +0 -0
  155. {multipers-2.3.2b1 → multipers-2.3.3b2}/multipers/multiparameter_module_approximation/list_column.h +0 -0
  156. {multipers-2.3.2b1 → multipers-2.3.3b2}/multipers/multiparameter_module_approximation/list_column_2.h +0 -0
  157. {multipers-2.3.2b1 → multipers-2.3.3b2}/multipers/multiparameter_module_approximation/ru_matrix.h +0 -0
  158. {multipers-2.3.2b1 → multipers-2.3.3b2}/multipers/multiparameter_module_approximation/set_column.h +0 -0
  159. {multipers-2.3.2b1 → multipers-2.3.3b2}/multipers/multiparameter_module_approximation/structure_higher_dim_barcode.h +0 -0
  160. {multipers-2.3.2b1 → multipers-2.3.3b2}/multipers/multiparameter_module_approximation/unordered_set_column.h +0 -0
  161. {multipers-2.3.2b1 → multipers-2.3.3b2}/multipers/multiparameter_module_approximation/utilities.h +0 -0
  162. {multipers-2.3.2b1 → multipers-2.3.3b2}/multipers/multiparameter_module_approximation/vector_column.h +0 -0
  163. {multipers-2.3.2b1 → multipers-2.3.3b2}/multipers/multiparameter_module_approximation/vector_matrix.h +0 -0
  164. {multipers-2.3.2b1 → multipers-2.3.3b2}/multipers/multiparameter_module_approximation/vineyards.h +0 -0
  165. {multipers-2.3.2b1 → multipers-2.3.3b2}/multipers/multiparameter_module_approximation/vineyards_trajectories.h +0 -0
  166. {multipers-2.3.2b1 → multipers-2.3.3b2}/multipers/pickle.py +0 -0
  167. {multipers-2.3.2b1 → multipers-2.3.3b2}/multipers/point_measure.pyx +0 -0
  168. {multipers-2.3.2b1 → multipers-2.3.3b2}/multipers/simplex_tree_multi.pxd +0 -0
  169. {multipers-2.3.2b1 → multipers-2.3.3b2}/multipers/slicer.pxd +0 -0
  170. {multipers-2.3.2b1 → multipers-2.3.3b2}/multipers/slicer.pxd.tp +0 -0
  171. {multipers-2.3.2b1 → multipers-2.3.3b2}/multipers/tensor/tensor.h +0 -0
  172. {multipers-2.3.2b1 → multipers-2.3.3b2}/multipers/tensor.pxd +0 -0
  173. {multipers-2.3.2b1 → multipers-2.3.3b2}/multipers/test.pyx +0 -0
  174. {multipers-2.3.2b1 → multipers-2.3.3b2}/multipers/tests/__init__.py +0 -0
  175. {multipers-2.3.2b1 → multipers-2.3.3b2}/multipers/torch/__init__.py +0 -0
  176. {multipers-2.3.2b1 → multipers-2.3.3b2}/multipers/torch/diff_grids.py +0 -0
  177. {multipers-2.3.2b1 → multipers-2.3.3b2}/multipers/torch/rips_density.py +0 -0
  178. {multipers-2.3.2b1 → multipers-2.3.3b2}/multipers.egg-info/SOURCES.txt +0 -0
  179. {multipers-2.3.2b1 → multipers-2.3.3b2}/multipers.egg-info/dependency_links.txt +0 -0
  180. {multipers-2.3.2b1 → multipers-2.3.3b2}/multipers.egg-info/requires.txt +0 -0
  181. {multipers-2.3.2b1 → multipers-2.3.3b2}/multipers.egg-info/top_level.txt +0 -0
  182. {multipers-2.3.2b1 → multipers-2.3.3b2}/setup.cfg +0 -0
  183. {multipers-2.3.2b1 → multipers-2.3.3b2}/tests/test_diff_helper.py +0 -0
  184. {multipers-2.3.2b1 → multipers-2.3.3b2}/tests/test_filtrations.py +0 -0
  185. {multipers-2.3.2b1 → multipers-2.3.3b2}/tests/test_hilbert_function.py +0 -0
  186. {multipers-2.3.2b1 → multipers-2.3.3b2}/tests/test_mma.py +0 -0
  187. {multipers-2.3.2b1 → multipers-2.3.3b2}/tests/test_point_clouds.py +0 -0
  188. {multipers-2.3.2b1 → multipers-2.3.3b2}/tests/test_python-cpp_conversion.py +0 -0
  189. {multipers-2.3.2b1 → multipers-2.3.3b2}/tests/test_signed_betti.py +0 -0
  190. {multipers-2.3.2b1 → multipers-2.3.3b2}/tests/test_signed_measure.py +0 -0
  191. {multipers-2.3.2b1 → multipers-2.3.3b2}/tests/test_simplextreemulti.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: multipers
3
- Version: 2.3.2b1
3
+ Version: 2.3.3b2
4
4
  Summary: Multiparameter Topological Persistence for Machine Learning
5
5
  Author-email: David Loiseaux <david.lapous@proton.me>, Hannah Schreiber <hannah.schreiber@inria.fr>
6
6
  Maintainer-email: David Loiseaux <david.lapous@proton.me>
@@ -37,3 +37,7 @@ def api_from_tensors(*args):
37
37
  if is_torch:
38
38
  return torchapi
39
39
  raise ValueError(f"Incompatible types got {[type(x) for x in args]=}.")
40
+
41
+ def to_numpy(x):
42
+ api = api_from_tensor(x)
43
+ return api.asnumpy(x)
@@ -478,7 +478,7 @@ class MMAFormatter(BaseEstimator, TransformerMixin):
478
478
  if self.weights is None
479
479
  else np.asarray(self.weights)
480
480
  )
481
- standard_box = PyBox_f64([0] * self._num_parameters, w)
481
+ standard_box = np.array([[0] * self._num_parameters, w])
482
482
 
483
483
  X_copy = [
484
484
  [
@@ -168,7 +168,8 @@ def module_approximation(
168
168
  delayed(module_approximation)(slicer, box, max_error, nlines, slicer_backend, minpres, degree, complete, threshold, verbose, ignore_warnings, id, direction, swap_box_coords)
169
169
  for slicer in input
170
170
  ))
171
- mod = PyModule_f64().set_box(PyBox_f64(*modules[0].get_box()))
171
+ box = modules[0].get_box()
172
+ mod = PyModule_f64().set_box(box)
172
173
  for i,m in enumerate(modules):
173
174
  mod.merge(m, input[i].minpres_degree)
174
175
  return mod
@@ -2,12 +2,11 @@ from typing import Optional
2
2
 
3
3
  import matplotlib.pyplot as plt
4
4
  import numpy as np
5
+ from numpy.typing import ArrayLike
6
+ from warnings import warn
7
+ from multipers.array_api import to_numpy
8
+
5
9
 
6
- try:
7
- import torch
8
- istensor = torch.is_tensor
9
- except ImportError:
10
- istensor = lambda x: False
11
10
 
12
11
  def _plot_rectangle(rectangle: np.ndarray, weight, **plt_kwargs):
13
12
  rectangle = np.asarray(rectangle)
@@ -121,11 +120,8 @@ def plot_signed_measure(signed_measure, threshold=None, ax=None, **plt_kwargs):
121
120
  else:
122
121
  plt.sca(ax)
123
122
  pts, weights = signed_measure
124
- if istensor(pts):
125
- pts = pts.detach().numpy()
126
- if istensor(weights):
127
- weights = weights.detach().numpy()
128
- pts = np.asarray(pts)
123
+ pts = to_numpy(pts)
124
+ weights = to_numpy(weights)
129
125
  num_pts = pts.shape[0]
130
126
  num_parameters = pts.shape[1]
131
127
  if threshold is None:
@@ -137,16 +133,9 @@ def plot_signed_measure(signed_measure, threshold=None, ax=None, **plt_kwargs):
137
133
  else:
138
134
  pts_ = pts
139
135
  threshold = np.max(np.ma.masked_invalid(pts_), axis=0)
140
- threshold = np.max([threshold, [plt.gca().get_xlim()[1], plt.gca().get_ylim()[1]]], axis=0)
141
- if isinstance(pts, np.ndarray):
142
- pass
143
- else:
144
- import torch
145
-
146
- if isinstance(pts, torch.Tensor):
147
- pts = pts.detach().numpy()
148
- else:
149
- raise Exception("Invalid measure type.")
136
+ threshold = np.max(
137
+ [threshold, [plt.gca().get_xlim()[1], plt.gca().get_ylim()[1]]], axis=0
138
+ )
150
139
 
151
140
  assert num_parameters in (2, 4)
152
141
  if num_parameters == 2:
@@ -217,9 +206,9 @@ def plot_surface(
217
206
 
218
207
  def plot_surfaces(HF, size=4, **plt_args):
219
208
  grid, hf = HF
220
- assert (
221
- hf.ndim == 3
222
- ), f"Found hf.shape = {hf.shape}, expected ndim = 3 : degree, 2-parameter surface."
209
+ assert hf.ndim == 3, (
210
+ f"Found hf.shape = {hf.shape}, expected ndim = 3 : degree, 2-parameter surface."
211
+ )
223
212
  num_degrees = hf.shape[0]
224
213
  fig, axes = plt.subplots(
225
214
  nrows=1, ncols=num_degrees, figsize=(num_degrees * size, size)
@@ -255,7 +244,7 @@ def plot2d_PyModule(
255
244
  dimension=-1,
256
245
  separated=False,
257
246
  min_persistence=0,
258
- alpha=.8,
247
+ alpha=None,
259
248
  verbose=False,
260
249
  save=False,
261
250
  dpi=200,
@@ -273,12 +262,14 @@ def plot2d_PyModule(
273
262
 
274
263
  shapely = True and shapely
275
264
  except ImportError:
276
- from warnings import warn
277
-
278
265
  shapely = False
279
266
  warn(
280
267
  "Shapely not installed. Fallbacking to matplotlib. The plots may be inacurate."
281
268
  )
269
+ if alpha is None:
270
+ alpha = 0.8 if shapely else 1
271
+ if not shapely and alpha != 1:
272
+ warn("Opacity without shapely will lead to incorect plots.")
282
273
  cmap = (
283
274
  matplotlib.colormaps["Spectral"] if cmap is None else matplotlib.colormaps[cmap]
284
275
  )
@@ -341,3 +332,93 @@ def plot2d_PyModule(
341
332
  if dimension >= 0:
342
333
  plt.title(rf"$H_{dimension}$ $2$-persistence")
343
334
  return
335
+
336
+
337
+ def plot_simplicial_complex(
338
+ st, pts: ArrayLike, x: float, y: float, mma=None, degree=None
339
+ ):
340
+ """
341
+ Scatters the points, with the simplices in the filtration at coordinates (x,y).
342
+ if an mma module is given, plots it in a second axis
343
+ """
344
+ if mma is not None:
345
+ fig, (a, b) = plt.subplots(ncols=2, figsize=(15, 5))
346
+ plt.sca(a)
347
+ plot_simplicial_complex(st, pts, x, y)
348
+ plt.sca(b)
349
+ mma.plot(degree=degree)
350
+ box = mma.get_box()
351
+ a, b, c, d = box.ravel()
352
+ mma.plot(degree=1, min_persistence=0.01)
353
+ plt.vlines(x, b, d, color="k", linestyle="--")
354
+ plt.hlines(y, a, c, color="k", linestyle="--")
355
+ plt.scatter([x], [y], c="r", zorder=10)
356
+ plt.text(x + 0.01 * (b - a), y + 0.01 * (d - c), f"({x},{y})")
357
+ return
358
+
359
+ pts = np.asarray(pts)
360
+ values = np.array([-f[1] for s, f in st.get_skeleton(0)])
361
+ qs = np.quantile(values, np.linspace(0, 1, 100))
362
+
363
+ def color_idx(d):
364
+ return np.searchsorted(qs, d) / 100
365
+
366
+ from matplotlib.pyplot import get_cmap
367
+
368
+ def color(d):
369
+ return get_cmap("viridis")([0, color_idx(d), 1])[1]
370
+
371
+ cols_pc = np.asarray([color(v) for v in values])
372
+ ax = plt.gca()
373
+ for s, f in st: # simplexe, filtration
374
+ density = -f[1]
375
+ if len(s) <= 1 or f[0] > x or density < -y: # simplexe = point
376
+ continue
377
+ if len(s) == 2: # simplexe = segment
378
+ xx = np.array([pts[a, 0] for a in s])
379
+ yy = np.array([pts[a, 1] for a in s])
380
+ plt.plot(xx, yy, c=color(density), alpha=1, zorder=10 * density, lw=1.5)
381
+ if len(s) == 3: # simplexe = triangle
382
+ xx = np.array([pts[a, 0] for a in s])
383
+ yy = np.array([pts[a, 1] for a in s])
384
+ _c = color(density)
385
+ ax.fill(xx, yy, c=_c, alpha=0.3, zorder=0)
386
+ out = plt.scatter(pts[:, 0], pts[:, 1], c=cols_pc, zorder=10, s=10)
387
+ ax.set_aspect(1)
388
+ return out
389
+
390
+
391
+ def plot_point_cloud(pts, function, x, y, mma=None, degree=None):
392
+ if mma is not None:
393
+ fig, (a, b) = plt.subplots(ncols=2, figsize=(15, 5))
394
+ plt.sca(a)
395
+ plot_point_cloud(pts, function, x, y)
396
+ plt.sca(b)
397
+ mma.plot(degree=degree)
398
+ box = mma.get_box()
399
+ a, b, c, d = box.ravel()
400
+ mma.plot(degree=1, min_persistence=0.01)
401
+ plt.vlines(x, b, d, color="k", linestyle="--")
402
+ plt.hlines(y, a, c, color="k", linestyle="--")
403
+ plt.scatter([x], [y], c="r", zorder=10)
404
+ plt.text(x + 0.01 * (b - a), y + 0.01 * (d - c), f"({x},{y})")
405
+ return
406
+ values = 1 - function
407
+ qs = np.quantile(values, np.linspace(0, 1, 100))
408
+
409
+ def color_idx(d):
410
+ return np.searchsorted(qs, d) / 100
411
+
412
+ from matplotlib.pyplot import get_cmap
413
+ from matplotlib.collections import PatchCollection
414
+
415
+ def color(d):
416
+ return get_cmap("viridis")([0, color_idx(d), 1])[1]
417
+
418
+ ax = plt.gca()
419
+ idx = function <= y
420
+ circles = [plt.Circle(pt, x, color=color(c)) for pt, c in zip(pts[idx], function)]
421
+ pc = PatchCollection(circles, alpha=0.3)
422
+ ax.add_collection(pc)
423
+ plt.scatter(*pts.T, c=-function, s=20)
424
+ ax.set_aspect(1)
@@ -881,10 +881,10 @@ cdef class SimplexTreeMulti_KFi32:
881
881
  self,
882
882
  filtration_grid:np.ndarray|list|None=None,
883
883
  bool coordinate_values=True,
884
- force=False,
885
- strategy:_available_strategies = "exact",
884
+ bool force=False,
885
+ str strategy:_available_strategies = "exact",
886
886
  grid_strategy=None,
887
- inplace=False,
887
+ bool inplace=False,
888
888
  **filtration_grid_kwargs
889
889
  )->SimplexTreeMulti_KFi32 | SimplexTreeMulti_KFi32:
890
890
  """
@@ -1982,7 +1982,16 @@ cdef class SimplexTreeMulti_Fi32:
1982
1982
  out = self.get_ptr().get_edge_list()
1983
1983
  return out
1984
1984
 
1985
- def collapse_edges(self, int num=1, int max_dimension = 0, bool progress=False, bool strong=True, bool full=False, bool ignore_warning=False)->SimplexTreeMulti_Fi32:
1985
+ def collapse_edges(
1986
+ self,
1987
+ int num=1,
1988
+ int max_dimension = 0,
1989
+ bool progress=False,
1990
+ bool strong=True,
1991
+ bool full=False,
1992
+ bool ignore_warning=False,
1993
+ bool auto_clean=True,
1994
+ )->SimplexTreeMulti_Fi32:
1986
1995
  """Edge collapse for 1-critical 2-parameter clique complex (see https://arxiv.org/abs/2211.05574).
1987
1996
  It uses the code from the github repository https://github.com/aj-alonso/filtration_domination .
1988
1997
 
@@ -2032,6 +2041,8 @@ cdef class SimplexTreeMulti_Fi32:
2032
2041
  edges = _collapse_edge_list(edges, num=num, full=full, strong=strong, progress=progress)
2033
2042
  # Retrieves the collapsed simplicial complex
2034
2043
  self._reconstruct_from_edge_list(edges, swap=True, expand_dimension=max_dimension)
2044
+ if self.is_squeezed and auto_clean:
2045
+ self._clean_filtration_grid()
2035
2046
  return self
2036
2047
 
2037
2048
  @cython.inline
@@ -2309,10 +2320,10 @@ cdef class SimplexTreeMulti_Fi32:
2309
2320
  self,
2310
2321
  filtration_grid:np.ndarray|list|None=None,
2311
2322
  bool coordinate_values=True,
2312
- force=False,
2313
- strategy:_available_strategies = "exact",
2323
+ bool force=False,
2324
+ str strategy:_available_strategies = "exact",
2314
2325
  grid_strategy=None,
2315
- inplace=False,
2326
+ bool inplace=False,
2316
2327
  **filtration_grid_kwargs
2317
2328
  )->SimplexTreeMulti_Fi32 | SimplexTreeMulti_Fi32:
2318
2329
  """
@@ -3458,10 +3469,10 @@ cdef class SimplexTreeMulti_KFi64:
3458
3469
  self,
3459
3470
  filtration_grid:np.ndarray|list|None=None,
3460
3471
  bool coordinate_values=True,
3461
- force=False,
3462
- strategy:_available_strategies = "exact",
3472
+ bool force=False,
3473
+ str strategy:_available_strategies = "exact",
3463
3474
  grid_strategy=None,
3464
- inplace=False,
3475
+ bool inplace=False,
3465
3476
  **filtration_grid_kwargs
3466
3477
  )->SimplexTreeMulti_KFi32 | SimplexTreeMulti_KFi64:
3467
3478
  """
@@ -4559,7 +4570,16 @@ cdef class SimplexTreeMulti_Fi64:
4559
4570
  out = self.get_ptr().get_edge_list()
4560
4571
  return out
4561
4572
 
4562
- def collapse_edges(self, int num=1, int max_dimension = 0, bool progress=False, bool strong=True, bool full=False, bool ignore_warning=False)->SimplexTreeMulti_Fi64:
4573
+ def collapse_edges(
4574
+ self,
4575
+ int num=1,
4576
+ int max_dimension = 0,
4577
+ bool progress=False,
4578
+ bool strong=True,
4579
+ bool full=False,
4580
+ bool ignore_warning=False,
4581
+ bool auto_clean=True,
4582
+ )->SimplexTreeMulti_Fi64:
4563
4583
  """Edge collapse for 1-critical 2-parameter clique complex (see https://arxiv.org/abs/2211.05574).
4564
4584
  It uses the code from the github repository https://github.com/aj-alonso/filtration_domination .
4565
4585
 
@@ -4609,6 +4629,8 @@ cdef class SimplexTreeMulti_Fi64:
4609
4629
  edges = _collapse_edge_list(edges, num=num, full=full, strong=strong, progress=progress)
4610
4630
  # Retrieves the collapsed simplicial complex
4611
4631
  self._reconstruct_from_edge_list(edges, swap=True, expand_dimension=max_dimension)
4632
+ if self.is_squeezed and auto_clean:
4633
+ self._clean_filtration_grid()
4612
4634
  return self
4613
4635
 
4614
4636
  @cython.inline
@@ -4886,10 +4908,10 @@ cdef class SimplexTreeMulti_Fi64:
4886
4908
  self,
4887
4909
  filtration_grid:np.ndarray|list|None=None,
4888
4910
  bool coordinate_values=True,
4889
- force=False,
4890
- strategy:_available_strategies = "exact",
4911
+ bool force=False,
4912
+ str strategy:_available_strategies = "exact",
4891
4913
  grid_strategy=None,
4892
- inplace=False,
4914
+ bool inplace=False,
4893
4915
  **filtration_grid_kwargs
4894
4916
  )->SimplexTreeMulti_Fi32 | SimplexTreeMulti_Fi64:
4895
4917
  """
@@ -6035,10 +6057,10 @@ cdef class SimplexTreeMulti_KFf32:
6035
6057
  self,
6036
6058
  filtration_grid:np.ndarray|list|None=None,
6037
6059
  bool coordinate_values=True,
6038
- force=False,
6039
- strategy:_available_strategies = "exact",
6060
+ bool force=False,
6061
+ str strategy:_available_strategies = "exact",
6040
6062
  grid_strategy=None,
6041
- inplace=False,
6063
+ bool inplace=False,
6042
6064
  **filtration_grid_kwargs
6043
6065
  )->SimplexTreeMulti_KFi32 | SimplexTreeMulti_KFf32:
6044
6066
  """
@@ -7136,7 +7158,16 @@ cdef class SimplexTreeMulti_Ff32:
7136
7158
  out = self.get_ptr().get_edge_list()
7137
7159
  return out
7138
7160
 
7139
- def collapse_edges(self, int num=1, int max_dimension = 0, bool progress=False, bool strong=True, bool full=False, bool ignore_warning=False)->SimplexTreeMulti_Ff32:
7161
+ def collapse_edges(
7162
+ self,
7163
+ int num=1,
7164
+ int max_dimension = 0,
7165
+ bool progress=False,
7166
+ bool strong=True,
7167
+ bool full=False,
7168
+ bool ignore_warning=False,
7169
+ bool auto_clean=True,
7170
+ )->SimplexTreeMulti_Ff32:
7140
7171
  """Edge collapse for 1-critical 2-parameter clique complex (see https://arxiv.org/abs/2211.05574).
7141
7172
  It uses the code from the github repository https://github.com/aj-alonso/filtration_domination .
7142
7173
 
@@ -7186,6 +7217,8 @@ cdef class SimplexTreeMulti_Ff32:
7186
7217
  edges = _collapse_edge_list(edges, num=num, full=full, strong=strong, progress=progress)
7187
7218
  # Retrieves the collapsed simplicial complex
7188
7219
  self._reconstruct_from_edge_list(edges, swap=True, expand_dimension=max_dimension)
7220
+ if self.is_squeezed and auto_clean:
7221
+ self._clean_filtration_grid()
7189
7222
  return self
7190
7223
 
7191
7224
  @cython.inline
@@ -7463,10 +7496,10 @@ cdef class SimplexTreeMulti_Ff32:
7463
7496
  self,
7464
7497
  filtration_grid:np.ndarray|list|None=None,
7465
7498
  bool coordinate_values=True,
7466
- force=False,
7467
- strategy:_available_strategies = "exact",
7499
+ bool force=False,
7500
+ str strategy:_available_strategies = "exact",
7468
7501
  grid_strategy=None,
7469
- inplace=False,
7502
+ bool inplace=False,
7470
7503
  **filtration_grid_kwargs
7471
7504
  )->SimplexTreeMulti_Fi32 | SimplexTreeMulti_Ff32:
7472
7505
  """
@@ -8612,10 +8645,10 @@ cdef class SimplexTreeMulti_KFf64:
8612
8645
  self,
8613
8646
  filtration_grid:np.ndarray|list|None=None,
8614
8647
  bool coordinate_values=True,
8615
- force=False,
8616
- strategy:_available_strategies = "exact",
8648
+ bool force=False,
8649
+ str strategy:_available_strategies = "exact",
8617
8650
  grid_strategy=None,
8618
- inplace=False,
8651
+ bool inplace=False,
8619
8652
  **filtration_grid_kwargs
8620
8653
  )->SimplexTreeMulti_KFi32 | SimplexTreeMulti_KFf64:
8621
8654
  """
@@ -9713,7 +9746,16 @@ cdef class SimplexTreeMulti_Ff64:
9713
9746
  out = self.get_ptr().get_edge_list()
9714
9747
  return out
9715
9748
 
9716
- def collapse_edges(self, int num=1, int max_dimension = 0, bool progress=False, bool strong=True, bool full=False, bool ignore_warning=False)->SimplexTreeMulti_Ff64:
9749
+ def collapse_edges(
9750
+ self,
9751
+ int num=1,
9752
+ int max_dimension = 0,
9753
+ bool progress=False,
9754
+ bool strong=True,
9755
+ bool full=False,
9756
+ bool ignore_warning=False,
9757
+ bool auto_clean=True,
9758
+ )->SimplexTreeMulti_Ff64:
9717
9759
  """Edge collapse for 1-critical 2-parameter clique complex (see https://arxiv.org/abs/2211.05574).
9718
9760
  It uses the code from the github repository https://github.com/aj-alonso/filtration_domination .
9719
9761
 
@@ -9763,6 +9805,8 @@ cdef class SimplexTreeMulti_Ff64:
9763
9805
  edges = _collapse_edge_list(edges, num=num, full=full, strong=strong, progress=progress)
9764
9806
  # Retrieves the collapsed simplicial complex
9765
9807
  self._reconstruct_from_edge_list(edges, swap=True, expand_dimension=max_dimension)
9808
+ if self.is_squeezed and auto_clean:
9809
+ self._clean_filtration_grid()
9766
9810
  return self
9767
9811
 
9768
9812
  @cython.inline
@@ -10040,10 +10084,10 @@ cdef class SimplexTreeMulti_Ff64:
10040
10084
  self,
10041
10085
  filtration_grid:np.ndarray|list|None=None,
10042
10086
  bool coordinate_values=True,
10043
- force=False,
10044
- strategy:_available_strategies = "exact",
10087
+ bool force=False,
10088
+ str strategy:_available_strategies = "exact",
10045
10089
  grid_strategy=None,
10046
- inplace=False,
10090
+ bool inplace=False,
10047
10091
  **filtration_grid_kwargs
10048
10092
  )->SimplexTreeMulti_Fi32 | SimplexTreeMulti_Ff64:
10049
10093
  """
@@ -972,7 +972,16 @@ cdef class SimplexTreeMulti_{{FSHORT}}:
972
972
  out = self.get_ptr().get_edge_list()
973
973
  return out
974
974
 
975
- def collapse_edges(self, int num=1, int max_dimension = 0, bool progress=False, bool strong=True, bool full=False, bool ignore_warning=False)->SimplexTreeMulti_{{FSHORT}}:
975
+ def collapse_edges(
976
+ self,
977
+ int num=1,
978
+ int max_dimension = 0,
979
+ bool progress=False,
980
+ bool strong=True,
981
+ bool full=False,
982
+ bool ignore_warning=False,
983
+ bool auto_clean=True,
984
+ )->SimplexTreeMulti_{{FSHORT}}:
976
985
  """Edge collapse for 1-critical 2-parameter clique complex (see https://arxiv.org/abs/2211.05574).
977
986
  It uses the code from the github repository https://github.com/aj-alonso/filtration_domination .
978
987
 
@@ -1022,6 +1031,8 @@ cdef class SimplexTreeMulti_{{FSHORT}}:
1022
1031
  edges = _collapse_edge_list(edges, num=num, full=full, strong=strong, progress=progress)
1023
1032
  # Retrieves the collapsed simplicial complex
1024
1033
  self._reconstruct_from_edge_list(edges, swap=True, expand_dimension=max_dimension)
1034
+ if self.is_squeezed and auto_clean:
1035
+ self._clean_filtration_grid()
1025
1036
  return self
1026
1037
 
1027
1038
  @cython.inline
@@ -1317,10 +1328,10 @@ cdef class SimplexTreeMulti_{{FSHORT}}:
1317
1328
  self,
1318
1329
  filtration_grid:np.ndarray|list|None=None,
1319
1330
  bool coordinate_values=True,
1320
- force=False,
1321
- strategy:_available_strategies = "exact",
1331
+ bool force=False,
1332
+ str strategy:_available_strategies = "exact",
1322
1333
  grid_strategy=None,
1323
- inplace=False,
1334
+ bool inplace=False,
1324
1335
  **filtration_grid_kwargs
1325
1336
  )->SimplexTreeMulti_{{FSHORT[:-3] + "i32"}} | SimplexTreeMulti_{{FSHORT}}:
1326
1337
  """
@@ -19876,7 +19876,7 @@ cdef extern from "gudhi/cubical_to_boundary.h" namespace "":
19876
19876
  void _to_boundary(const vector[unsigned int]&, vector[vector[unsigned int]]&, vector[int]&) except + nogil
19877
19877
  void get_vertices(unsigned int, cset[unsigned int]&, const vector[vector[unsigned int]]&) nogil
19878
19878
 
19879
- def _from_bitmapi32(image, **slicer_kwargs):
19879
+ def _from_bitmapi64(image, **slicer_kwargs):
19880
19880
  from multipers import Slicer
19881
19881
  dtype = slicer_kwargs.get("dtype", image.dtype)
19882
19882
  slicer_kwargs["dtype"] = dtype
@@ -19894,9 +19894,9 @@ def _from_bitmapi32(image, **slicer_kwargs):
19894
19894
  cdef cset[unsigned int] vertices
19895
19895
 
19896
19896
  cdef unsigned int num_gens = gen_dims.size()
19897
- filtration_values = np.zeros(shape=(num_gens, num_parameters), dtype = np.int32) - _Slicer._inf_value()
19898
- cdef int32_t[:,:] F = filtration_values
19899
- cdef int32_t[:,:] c_img = image.reshape(-1,num_parameters)
19897
+ filtration_values = np.zeros(shape=(num_gens, num_parameters), dtype = np.int64) - _Slicer._inf_value()
19898
+ cdef int64_t[:,:] F = filtration_values
19899
+ cdef int64_t[:,:] c_img = image.reshape(-1,num_parameters)
19900
19900
  with nogil:
19901
19901
  for i in range(num_gens):
19902
19902
  # with gil:
@@ -19914,7 +19914,7 @@ def _from_bitmapi32(image, **slicer_kwargs):
19914
19914
  # print(f"F = {np.asarray(F[i])}")
19915
19915
  slicer = _Slicer(gen_maps, gen_dims, filtration_values)
19916
19916
  return slicer
19917
- def _from_bitmapf64(image, **slicer_kwargs):
19917
+ def _from_bitmapf32(image, **slicer_kwargs):
19918
19918
  from multipers import Slicer
19919
19919
  dtype = slicer_kwargs.get("dtype", image.dtype)
19920
19920
  slicer_kwargs["dtype"] = dtype
@@ -19932,9 +19932,9 @@ def _from_bitmapf64(image, **slicer_kwargs):
19932
19932
  cdef cset[unsigned int] vertices
19933
19933
 
19934
19934
  cdef unsigned int num_gens = gen_dims.size()
19935
- filtration_values = np.zeros(shape=(num_gens, num_parameters), dtype = np.float64) - _Slicer._inf_value()
19936
- cdef double[:,:] F = filtration_values
19937
- cdef double[:,:] c_img = image.reshape(-1,num_parameters)
19935
+ filtration_values = np.zeros(shape=(num_gens, num_parameters), dtype = np.float32) - _Slicer._inf_value()
19936
+ cdef float[:,:] F = filtration_values
19937
+ cdef float[:,:] c_img = image.reshape(-1,num_parameters)
19938
19938
  with nogil:
19939
19939
  for i in range(num_gens):
19940
19940
  # with gil:
@@ -19952,7 +19952,7 @@ def _from_bitmapf64(image, **slicer_kwargs):
19952
19952
  # print(f"F = {np.asarray(F[i])}")
19953
19953
  slicer = _Slicer(gen_maps, gen_dims, filtration_values)
19954
19954
  return slicer
19955
- def _from_bitmapi64(image, **slicer_kwargs):
19955
+ def _from_bitmapf64(image, **slicer_kwargs):
19956
19956
  from multipers import Slicer
19957
19957
  dtype = slicer_kwargs.get("dtype", image.dtype)
19958
19958
  slicer_kwargs["dtype"] = dtype
@@ -19970,9 +19970,9 @@ def _from_bitmapi64(image, **slicer_kwargs):
19970
19970
  cdef cset[unsigned int] vertices
19971
19971
 
19972
19972
  cdef unsigned int num_gens = gen_dims.size()
19973
- filtration_values = np.zeros(shape=(num_gens, num_parameters), dtype = np.int64) - _Slicer._inf_value()
19974
- cdef int64_t[:,:] F = filtration_values
19975
- cdef int64_t[:,:] c_img = image.reshape(-1,num_parameters)
19973
+ filtration_values = np.zeros(shape=(num_gens, num_parameters), dtype = np.float64) - _Slicer._inf_value()
19974
+ cdef double[:,:] F = filtration_values
19975
+ cdef double[:,:] c_img = image.reshape(-1,num_parameters)
19976
19976
  with nogil:
19977
19977
  for i in range(num_gens):
19978
19978
  # with gil:
@@ -19990,7 +19990,7 @@ def _from_bitmapi64(image, **slicer_kwargs):
19990
19990
  # print(f"F = {np.asarray(F[i])}")
19991
19991
  slicer = _Slicer(gen_maps, gen_dims, filtration_values)
19992
19992
  return slicer
19993
- def _from_bitmapf32(image, **slicer_kwargs):
19993
+ def _from_bitmapi32(image, **slicer_kwargs):
19994
19994
  from multipers import Slicer
19995
19995
  dtype = slicer_kwargs.get("dtype", image.dtype)
19996
19996
  slicer_kwargs["dtype"] = dtype
@@ -20008,9 +20008,9 @@ def _from_bitmapf32(image, **slicer_kwargs):
20008
20008
  cdef cset[unsigned int] vertices
20009
20009
 
20010
20010
  cdef unsigned int num_gens = gen_dims.size()
20011
- filtration_values = np.zeros(shape=(num_gens, num_parameters), dtype = np.float32) - _Slicer._inf_value()
20012
- cdef float[:,:] F = filtration_values
20013
- cdef float[:,:] c_img = image.reshape(-1,num_parameters)
20011
+ filtration_values = np.zeros(shape=(num_gens, num_parameters), dtype = np.int32) - _Slicer._inf_value()
20012
+ cdef int32_t[:,:] F = filtration_values
20013
+ cdef int32_t[:,:] c_img = image.reshape(-1,num_parameters)
20014
20014
  with nogil:
20015
20015
  for i in range(num_gens):
20016
20016
  # with gil:
@@ -20031,14 +20031,14 @@ def _from_bitmapf32(image, **slicer_kwargs):
20031
20031
 
20032
20032
  def from_bitmap(img, **kwargs):
20033
20033
  img = np.asarray(img)
20034
- if img.dtype == np.int32:
20035
- return _from_bitmapi32(img, **kwargs)
20036
- if img.dtype == np.float64:
20037
- return _from_bitmapf64(img, **kwargs)
20038
20034
  if img.dtype == np.int64:
20039
20035
  return _from_bitmapi64(img, **kwargs)
20040
20036
  if img.dtype == np.float32:
20041
20037
  return _from_bitmapf32(img, **kwargs)
20038
+ if img.dtype == np.float64:
20039
+ return _from_bitmapf64(img, **kwargs)
20040
+ if img.dtype == np.int32:
20041
+ return _from_bitmapi32(img, **kwargs)
20042
20042
  raise ValueError(f"Invalid dtype. Got {img.dtype=}, was expecting {available_dtype=}.")
20043
20043
 
20044
20044
  def from_function_delaunay(
@@ -20046,7 +20046,7 @@ def from_function_delaunay(
20046
20046
  grades,
20047
20047
  int degree=-1,
20048
20048
  backend:Optional[_valid_pers_backend]=None,
20049
- vineyard=None, # TODO : Optional[bool] when cython fixes it
20049
+ vineyard=None, # Optionmal[bool], wait for cython
20050
20050
  dtype=np.float64,
20051
20051
  bool verbose = False,
20052
20052
  bool clear = True,
@@ -20061,9 +20061,9 @@ def from_function_delaunay(
20061
20061
  backend : slicer backend, e.g. "matrix", "clement"
20062
20062
  vineyard : bool, use a vineyard-compatible backend
20063
20063
  """
20064
- from multipers.io import _check_available, function_delaunay_presentation_to_slicer
20064
+ from multipers.io import function_delaunay_presentation_to_slicer, _init_external_softwares
20065
20065
  s = multipers.Slicer(None, backend=backend, vineyard=vineyard, dtype=dtype)
20066
- assert _check_available("function_delaunay"), f"Could not find function_delaunay"
20066
+ _init_external_softwares(requires=["function_delaunay"])
20067
20067
  function_delaunay_presentation_to_slicer(s, points, grades, degree=degree, verbose=verbose,clear=clear)
20068
20068
  if degree >= 0:
20069
20069
  s.minpres_degree = degree
@@ -20100,6 +20100,7 @@ def minimal_presentation(
20100
20100
  dtype:type|_valid_dtypes=None,
20101
20101
  int n_jobs = -1,
20102
20102
  bool force=False,
20103
+ bool auto_clean = True,
20103
20104
  **minpres_kwargs
20104
20105
  ):
20105
20106
  """
@@ -20138,6 +20139,8 @@ def minimal_presentation(
20138
20139
 
20139
20140
  new_slicer.minpres_degree = degree
20140
20141
  new_slicer.filtration_grid = slicer.filtration_grid if slicer.is_squeezed else None
20142
+ if new_slicer.is_squeezed and auto_clean:
20143
+ new_slicer = new_slicer._clean_filtration_grid()
20141
20144
  return new_slicer
20142
20145
 
20143
20146
 
@@ -764,7 +764,7 @@ def from_function_delaunay(
764
764
  grades,
765
765
  int degree=-1,
766
766
  backend:Optional[_valid_pers_backend]=None,
767
- vineyard=None, # TODO : Optional[bool] when cython fixes it
767
+ vineyard=None, # Optionmal[bool], wait for cython
768
768
  dtype=np.float64,
769
769
  bool verbose = False,
770
770
  bool clear = True,
@@ -779,9 +779,9 @@ def from_function_delaunay(
779
779
  backend : slicer backend, e.g. "matrix", "clement"
780
780
  vineyard : bool, use a vineyard-compatible backend
781
781
  """
782
- from multipers.io import _check_available, function_delaunay_presentation_to_slicer
782
+ from multipers.io import function_delaunay_presentation_to_slicer, _init_external_softwares
783
783
  s = multipers.Slicer(None, backend=backend, vineyard=vineyard, dtype=dtype)
784
- assert _check_available("function_delaunay"), f"Could not find function_delaunay"
784
+ _init_external_softwares(requires=["function_delaunay"])
785
785
  function_delaunay_presentation_to_slicer(s, points, grades, degree=degree, verbose=verbose,clear=clear)
786
786
  if degree >= 0:
787
787
  s.minpres_degree = degree
@@ -818,6 +818,7 @@ def minimal_presentation(
818
818
  dtype:type|_valid_dtypes=None,
819
819
  int n_jobs = -1,
820
820
  bool force=False,
821
+ bool auto_clean = True,
821
822
  **minpres_kwargs
822
823
  ):
823
824
  """
@@ -856,6 +857,8 @@ def minimal_presentation(
856
857
 
857
858
  new_slicer.minpres_degree = degree
858
859
  new_slicer.filtration_grid = slicer.filtration_grid if slicer.is_squeezed else None
860
+ if new_slicer.is_squeezed and auto_clean:
861
+ new_slicer = new_slicer._clean_filtration_grid()
859
862
  return new_slicer
860
863
 
861
864
 
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: multipers
3
- Version: 2.3.2b1
3
+ Version: 2.3.3b2
4
4
  Summary: Multiparameter Topological Persistence for Machine Learning
5
5
  Author-email: David Loiseaux <david.lapous@proton.me>, Hannah Schreiber <hannah.schreiber@inria.fr>
6
6
  Maintainer-email: David Loiseaux <david.lapous@proton.me>
@@ -9,7 +9,7 @@ build-backend = "setuptools.build_meta"
9
9
 
10
10
  [project]
11
11
  name = "multipers"
12
- version = "2.3.2b1"
12
+ version = "2.3.3b2"
13
13
  description = "Multiparameter Topological Persistence for Machine Learning"
14
14
  readme = "README.md"
15
15
  authors = [