multipers 2.3.5b1__tar.gz → 2.3.5b3__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 (194) hide show
  1. {multipers-2.3.5b1/multipers.egg-info → multipers-2.3.5b3}/PKG-INFO +1 -1
  2. {multipers-2.3.5b1 → multipers-2.3.5b3}/multipers/array_api/numpy.py +9 -0
  3. {multipers-2.3.5b1 → multipers-2.3.5b3}/multipers/array_api/torch.py +5 -0
  4. {multipers-2.3.5b1 → multipers-2.3.5b3}/multipers/grids.pyx +24 -0
  5. multipers-2.3.5b3/multipers/io.pyx +419 -0
  6. {multipers-2.3.5b1 → multipers-2.3.5b3}/multipers/plots.py +2 -1
  7. {multipers-2.3.5b1 → multipers-2.3.5b3}/multipers/slicer.pyx +69 -109
  8. {multipers-2.3.5b1 → multipers-2.3.5b3}/multipers/slicer.pyx.tp +18 -19
  9. {multipers-2.3.5b1 → multipers-2.3.5b3/multipers.egg-info}/PKG-INFO +1 -1
  10. {multipers-2.3.5b1 → multipers-2.3.5b3}/multipers.egg-info/SOURCES.txt +1 -0
  11. {multipers-2.3.5b1 → multipers-2.3.5b3}/pyproject.toml +1 -1
  12. multipers-2.3.5b3/tests/test_parallel.py +35 -0
  13. multipers-2.3.5b1/multipers/io.pyx +0 -644
  14. {multipers-2.3.5b1 → multipers-2.3.5b3}/LICENSE +0 -0
  15. {multipers-2.3.5b1 → multipers-2.3.5b3}/MANIFEST.in +0 -0
  16. {multipers-2.3.5b1 → multipers-2.3.5b3}/README.md +0 -0
  17. {multipers-2.3.5b1 → multipers-2.3.5b3}/_tempita_grid_gen.py +0 -0
  18. {multipers-2.3.5b1 → multipers-2.3.5b3}/multipers/__init__.py +0 -0
  19. {multipers-2.3.5b1 → multipers-2.3.5b3}/multipers/_signed_measure_meta.py +0 -0
  20. {multipers-2.3.5b1 → multipers-2.3.5b3}/multipers/_slicer_meta.py +0 -0
  21. {multipers-2.3.5b1 → multipers-2.3.5b3}/multipers/array_api/__init__.py +0 -0
  22. {multipers-2.3.5b1 → multipers-2.3.5b3}/multipers/data/MOL2.py +0 -0
  23. {multipers-2.3.5b1 → multipers-2.3.5b3}/multipers/data/UCR.py +0 -0
  24. {multipers-2.3.5b1 → multipers-2.3.5b3}/multipers/data/__init__.py +0 -0
  25. {multipers-2.3.5b1 → multipers-2.3.5b3}/multipers/data/graphs.py +0 -0
  26. {multipers-2.3.5b1 → multipers-2.3.5b3}/multipers/data/immuno_regions.py +0 -0
  27. {multipers-2.3.5b1 → multipers-2.3.5b3}/multipers/data/minimal_presentation_to_st_bf.py +0 -0
  28. {multipers-2.3.5b1 → multipers-2.3.5b3}/multipers/data/pytorch2simplextree.py +0 -0
  29. {multipers-2.3.5b1 → multipers-2.3.5b3}/multipers/data/shape3d.py +0 -0
  30. {multipers-2.3.5b1 → multipers-2.3.5b3}/multipers/data/synthetic.py +0 -0
  31. {multipers-2.3.5b1 → multipers-2.3.5b3}/multipers/distances.py +0 -0
  32. {multipers-2.3.5b1 → multipers-2.3.5b3}/multipers/filtration_conversions.pxd +0 -0
  33. {multipers-2.3.5b1 → multipers-2.3.5b3}/multipers/filtration_conversions.pxd.tp +0 -0
  34. {multipers-2.3.5b1 → multipers-2.3.5b3}/multipers/filtrations/__init__.py +0 -0
  35. {multipers-2.3.5b1 → multipers-2.3.5b3}/multipers/filtrations/density.py +0 -0
  36. {multipers-2.3.5b1 → multipers-2.3.5b3}/multipers/filtrations/filtrations.py +0 -0
  37. {multipers-2.3.5b1 → multipers-2.3.5b3}/multipers/filtrations.pxd +0 -0
  38. {multipers-2.3.5b1 → multipers-2.3.5b3}/multipers/function_rips.pyx +0 -0
  39. {multipers-2.3.5b1 → multipers-2.3.5b3}/multipers/gudhi/Persistence_slices_interface.h +0 -0
  40. {multipers-2.3.5b1 → multipers-2.3.5b3}/multipers/gudhi/Simplex_tree_interface.h +0 -0
  41. {multipers-2.3.5b1 → multipers-2.3.5b3}/multipers/gudhi/Simplex_tree_multi_interface.h +0 -0
  42. {multipers-2.3.5b1 → multipers-2.3.5b3}/multipers/gudhi/cubical_to_boundary.h +0 -0
  43. {multipers-2.3.5b1 → multipers-2.3.5b3}/multipers/gudhi/gudhi/Bitmap_cubical_complex.h +0 -0
  44. {multipers-2.3.5b1 → multipers-2.3.5b3}/multipers/gudhi/gudhi/Bitmap_cubical_complex_base.h +0 -0
  45. {multipers-2.3.5b1 → multipers-2.3.5b3}/multipers/gudhi/gudhi/Bitmap_cubical_complex_periodic_boundary_conditions_base.h +0 -0
  46. {multipers-2.3.5b1 → multipers-2.3.5b3}/multipers/gudhi/gudhi/Debug_utils.h +0 -0
  47. {multipers-2.3.5b1 → multipers-2.3.5b3}/multipers/gudhi/gudhi/Fields/Multi_field.h +0 -0
  48. {multipers-2.3.5b1 → multipers-2.3.5b3}/multipers/gudhi/gudhi/Fields/Multi_field_operators.h +0 -0
  49. {multipers-2.3.5b1 → multipers-2.3.5b3}/multipers/gudhi/gudhi/Fields/Multi_field_shared.h +0 -0
  50. {multipers-2.3.5b1 → multipers-2.3.5b3}/multipers/gudhi/gudhi/Fields/Multi_field_small.h +0 -0
  51. {multipers-2.3.5b1 → multipers-2.3.5b3}/multipers/gudhi/gudhi/Fields/Multi_field_small_operators.h +0 -0
  52. {multipers-2.3.5b1 → multipers-2.3.5b3}/multipers/gudhi/gudhi/Fields/Multi_field_small_shared.h +0 -0
  53. {multipers-2.3.5b1 → multipers-2.3.5b3}/multipers/gudhi/gudhi/Fields/Z2_field.h +0 -0
  54. {multipers-2.3.5b1 → multipers-2.3.5b3}/multipers/gudhi/gudhi/Fields/Z2_field_operators.h +0 -0
  55. {multipers-2.3.5b1 → multipers-2.3.5b3}/multipers/gudhi/gudhi/Fields/Zp_field.h +0 -0
  56. {multipers-2.3.5b1 → multipers-2.3.5b3}/multipers/gudhi/gudhi/Fields/Zp_field_operators.h +0 -0
  57. {multipers-2.3.5b1 → multipers-2.3.5b3}/multipers/gudhi/gudhi/Fields/Zp_field_shared.h +0 -0
  58. {multipers-2.3.5b1 → multipers-2.3.5b3}/multipers/gudhi/gudhi/Flag_complex_edge_collapser.h +0 -0
  59. {multipers-2.3.5b1 → multipers-2.3.5b3}/multipers/gudhi/gudhi/Matrix.h +0 -0
  60. {multipers-2.3.5b1 → multipers-2.3.5b3}/multipers/gudhi/gudhi/Multi_critical_filtration.h +0 -0
  61. {multipers-2.3.5b1 → multipers-2.3.5b3}/multipers/gudhi/gudhi/Multi_persistence/Box.h +0 -0
  62. {multipers-2.3.5b1 → multipers-2.3.5b3}/multipers/gudhi/gudhi/Multi_persistence/Line.h +0 -0
  63. {multipers-2.3.5b1 → multipers-2.3.5b3}/multipers/gudhi/gudhi/Off_reader.h +0 -0
  64. {multipers-2.3.5b1 → multipers-2.3.5b3}/multipers/gudhi/gudhi/One_critical_filtration.h +0 -0
  65. {multipers-2.3.5b1 → multipers-2.3.5b3}/multipers/gudhi/gudhi/Persistence_matrix/Base_matrix.h +0 -0
  66. {multipers-2.3.5b1 → multipers-2.3.5b3}/multipers/gudhi/gudhi/Persistence_matrix/Base_matrix_with_column_compression.h +0 -0
  67. {multipers-2.3.5b1 → multipers-2.3.5b3}/multipers/gudhi/gudhi/Persistence_matrix/Boundary_matrix.h +0 -0
  68. {multipers-2.3.5b1 → multipers-2.3.5b3}/multipers/gudhi/gudhi/Persistence_matrix/Chain_matrix.h +0 -0
  69. {multipers-2.3.5b1 → multipers-2.3.5b3}/multipers/gudhi/gudhi/Persistence_matrix/Id_to_index_overlay.h +0 -0
  70. {multipers-2.3.5b1 → multipers-2.3.5b3}/multipers/gudhi/gudhi/Persistence_matrix/Position_to_index_overlay.h +0 -0
  71. {multipers-2.3.5b1 → multipers-2.3.5b3}/multipers/gudhi/gudhi/Persistence_matrix/RU_matrix.h +0 -0
  72. {multipers-2.3.5b1 → multipers-2.3.5b3}/multipers/gudhi/gudhi/Persistence_matrix/allocators/entry_constructors.h +0 -0
  73. {multipers-2.3.5b1 → multipers-2.3.5b3}/multipers/gudhi/gudhi/Persistence_matrix/base_pairing.h +0 -0
  74. {multipers-2.3.5b1 → multipers-2.3.5b3}/multipers/gudhi/gudhi/Persistence_matrix/base_swap.h +0 -0
  75. {multipers-2.3.5b1 → multipers-2.3.5b3}/multipers/gudhi/gudhi/Persistence_matrix/boundary_cell_position_to_id_mapper.h +0 -0
  76. {multipers-2.3.5b1 → multipers-2.3.5b3}/multipers/gudhi/gudhi/Persistence_matrix/boundary_face_position_to_id_mapper.h +0 -0
  77. {multipers-2.3.5b1 → multipers-2.3.5b3}/multipers/gudhi/gudhi/Persistence_matrix/chain_pairing.h +0 -0
  78. {multipers-2.3.5b1 → multipers-2.3.5b3}/multipers/gudhi/gudhi/Persistence_matrix/chain_rep_cycles.h +0 -0
  79. {multipers-2.3.5b1 → multipers-2.3.5b3}/multipers/gudhi/gudhi/Persistence_matrix/chain_vine_swap.h +0 -0
  80. {multipers-2.3.5b1 → multipers-2.3.5b3}/multipers/gudhi/gudhi/Persistence_matrix/columns/chain_column_extra_properties.h +0 -0
  81. {multipers-2.3.5b1 → multipers-2.3.5b3}/multipers/gudhi/gudhi/Persistence_matrix/columns/column_dimension_holder.h +0 -0
  82. {multipers-2.3.5b1 → multipers-2.3.5b3}/multipers/gudhi/gudhi/Persistence_matrix/columns/column_utilities.h +0 -0
  83. {multipers-2.3.5b1 → multipers-2.3.5b3}/multipers/gudhi/gudhi/Persistence_matrix/columns/entry_types.h +0 -0
  84. {multipers-2.3.5b1 → multipers-2.3.5b3}/multipers/gudhi/gudhi/Persistence_matrix/columns/heap_column.h +0 -0
  85. {multipers-2.3.5b1 → multipers-2.3.5b3}/multipers/gudhi/gudhi/Persistence_matrix/columns/intrusive_list_column.h +0 -0
  86. {multipers-2.3.5b1 → multipers-2.3.5b3}/multipers/gudhi/gudhi/Persistence_matrix/columns/intrusive_set_column.h +0 -0
  87. {multipers-2.3.5b1 → multipers-2.3.5b3}/multipers/gudhi/gudhi/Persistence_matrix/columns/list_column.h +0 -0
  88. {multipers-2.3.5b1 → multipers-2.3.5b3}/multipers/gudhi/gudhi/Persistence_matrix/columns/naive_vector_column.h +0 -0
  89. {multipers-2.3.5b1 → multipers-2.3.5b3}/multipers/gudhi/gudhi/Persistence_matrix/columns/row_access.h +0 -0
  90. {multipers-2.3.5b1 → multipers-2.3.5b3}/multipers/gudhi/gudhi/Persistence_matrix/columns/set_column.h +0 -0
  91. {multipers-2.3.5b1 → multipers-2.3.5b3}/multipers/gudhi/gudhi/Persistence_matrix/columns/small_vector_column.h +0 -0
  92. {multipers-2.3.5b1 → multipers-2.3.5b3}/multipers/gudhi/gudhi/Persistence_matrix/columns/unordered_set_column.h +0 -0
  93. {multipers-2.3.5b1 → multipers-2.3.5b3}/multipers/gudhi/gudhi/Persistence_matrix/columns/vector_column.h +0 -0
  94. {multipers-2.3.5b1 → multipers-2.3.5b3}/multipers/gudhi/gudhi/Persistence_matrix/matrix_dimension_holders.h +0 -0
  95. {multipers-2.3.5b1 → multipers-2.3.5b3}/multipers/gudhi/gudhi/Persistence_matrix/matrix_row_access.h +0 -0
  96. {multipers-2.3.5b1 → multipers-2.3.5b3}/multipers/gudhi/gudhi/Persistence_matrix/ru_pairing.h +0 -0
  97. {multipers-2.3.5b1 → multipers-2.3.5b3}/multipers/gudhi/gudhi/Persistence_matrix/ru_rep_cycles.h +0 -0
  98. {multipers-2.3.5b1 → multipers-2.3.5b3}/multipers/gudhi/gudhi/Persistence_matrix/ru_vine_swap.h +0 -0
  99. {multipers-2.3.5b1 → multipers-2.3.5b3}/multipers/gudhi/gudhi/Persistent_cohomology/Field_Zp.h +0 -0
  100. {multipers-2.3.5b1 → multipers-2.3.5b3}/multipers/gudhi/gudhi/Persistent_cohomology/Multi_field.h +0 -0
  101. {multipers-2.3.5b1 → multipers-2.3.5b3}/multipers/gudhi/gudhi/Persistent_cohomology/Persistent_cohomology_column.h +0 -0
  102. {multipers-2.3.5b1 → multipers-2.3.5b3}/multipers/gudhi/gudhi/Persistent_cohomology.h +0 -0
  103. {multipers-2.3.5b1 → multipers-2.3.5b3}/multipers/gudhi/gudhi/Points_off_io.h +0 -0
  104. {multipers-2.3.5b1 → multipers-2.3.5b3}/multipers/gudhi/gudhi/Simple_object_pool.h +0 -0
  105. {multipers-2.3.5b1 → multipers-2.3.5b3}/multipers/gudhi/gudhi/Simplex_tree/Simplex_tree_iterators.h +0 -0
  106. {multipers-2.3.5b1 → multipers-2.3.5b3}/multipers/gudhi/gudhi/Simplex_tree/Simplex_tree_node_explicit_storage.h +0 -0
  107. {multipers-2.3.5b1 → multipers-2.3.5b3}/multipers/gudhi/gudhi/Simplex_tree/Simplex_tree_siblings.h +0 -0
  108. {multipers-2.3.5b1 → multipers-2.3.5b3}/multipers/gudhi/gudhi/Simplex_tree/Simplex_tree_star_simplex_iterators.h +0 -0
  109. {multipers-2.3.5b1 → multipers-2.3.5b3}/multipers/gudhi/gudhi/Simplex_tree/hooks_simplex_base.h +0 -0
  110. {multipers-2.3.5b1 → multipers-2.3.5b3}/multipers/gudhi/gudhi/Simplex_tree/indexing_tag.h +0 -0
  111. {multipers-2.3.5b1 → multipers-2.3.5b3}/multipers/gudhi/gudhi/Simplex_tree/serialization_utils.h +0 -0
  112. {multipers-2.3.5b1 → multipers-2.3.5b3}/multipers/gudhi/gudhi/Simplex_tree/simplex_tree_options.h +0 -0
  113. {multipers-2.3.5b1 → multipers-2.3.5b3}/multipers/gudhi/gudhi/Simplex_tree.h +0 -0
  114. {multipers-2.3.5b1 → multipers-2.3.5b3}/multipers/gudhi/gudhi/Simplex_tree_multi.h +0 -0
  115. {multipers-2.3.5b1 → multipers-2.3.5b3}/multipers/gudhi/gudhi/distance_functions.h +0 -0
  116. {multipers-2.3.5b1 → multipers-2.3.5b3}/multipers/gudhi/gudhi/graph_simplicial_complex.h +0 -0
  117. {multipers-2.3.5b1 → multipers-2.3.5b3}/multipers/gudhi/gudhi/persistence_interval.h +0 -0
  118. {multipers-2.3.5b1 → multipers-2.3.5b3}/multipers/gudhi/gudhi/persistence_matrix_options.h +0 -0
  119. {multipers-2.3.5b1 → multipers-2.3.5b3}/multipers/gudhi/gudhi/reader_utils.h +0 -0
  120. {multipers-2.3.5b1 → multipers-2.3.5b3}/multipers/gudhi/mma_interface_coh.h +0 -0
  121. {multipers-2.3.5b1 → multipers-2.3.5b3}/multipers/gudhi/mma_interface_h0.h +0 -0
  122. {multipers-2.3.5b1 → multipers-2.3.5b3}/multipers/gudhi/mma_interface_matrix.h +0 -0
  123. {multipers-2.3.5b1 → multipers-2.3.5b3}/multipers/gudhi/naive_merge_tree.h +0 -0
  124. {multipers-2.3.5b1 → multipers-2.3.5b3}/multipers/gudhi/scc_io.h +0 -0
  125. {multipers-2.3.5b1 → multipers-2.3.5b3}/multipers/gudhi/truc.h +0 -0
  126. {multipers-2.3.5b1 → multipers-2.3.5b3}/multipers/ml/__init__.py +0 -0
  127. {multipers-2.3.5b1 → multipers-2.3.5b3}/multipers/ml/accuracies.py +0 -0
  128. {multipers-2.3.5b1 → multipers-2.3.5b3}/multipers/ml/invariants_with_persistable.py +0 -0
  129. {multipers-2.3.5b1 → multipers-2.3.5b3}/multipers/ml/kernels.py +0 -0
  130. {multipers-2.3.5b1 → multipers-2.3.5b3}/multipers/ml/mma.py +0 -0
  131. {multipers-2.3.5b1 → multipers-2.3.5b3}/multipers/ml/one.py +0 -0
  132. {multipers-2.3.5b1 → multipers-2.3.5b3}/multipers/ml/point_clouds.py +0 -0
  133. {multipers-2.3.5b1 → multipers-2.3.5b3}/multipers/ml/signed_measures.py +0 -0
  134. {multipers-2.3.5b1 → multipers-2.3.5b3}/multipers/ml/sliced_wasserstein.py +0 -0
  135. {multipers-2.3.5b1 → multipers-2.3.5b3}/multipers/ml/tools.py +0 -0
  136. {multipers-2.3.5b1 → multipers-2.3.5b3}/multipers/mma_structures.pxd +0 -0
  137. {multipers-2.3.5b1 → multipers-2.3.5b3}/multipers/mma_structures.pyx +0 -0
  138. {multipers-2.3.5b1 → multipers-2.3.5b3}/multipers/mma_structures.pyx.tp +0 -0
  139. {multipers-2.3.5b1 → multipers-2.3.5b3}/multipers/multi_parameter_rank_invariant/diff_helpers.h +0 -0
  140. {multipers-2.3.5b1 → multipers-2.3.5b3}/multipers/multi_parameter_rank_invariant/euler_characteristic.h +0 -0
  141. {multipers-2.3.5b1 → multipers-2.3.5b3}/multipers/multi_parameter_rank_invariant/function_rips.h +0 -0
  142. {multipers-2.3.5b1 → multipers-2.3.5b3}/multipers/multi_parameter_rank_invariant/hilbert_function.h +0 -0
  143. {multipers-2.3.5b1 → multipers-2.3.5b3}/multipers/multi_parameter_rank_invariant/persistence_slices.h +0 -0
  144. {multipers-2.3.5b1 → multipers-2.3.5b3}/multipers/multi_parameter_rank_invariant/rank_invariant.h +0 -0
  145. {multipers-2.3.5b1 → multipers-2.3.5b3}/multipers/multiparameter_edge_collapse.py +0 -0
  146. {multipers-2.3.5b1 → multipers-2.3.5b3}/multipers/multiparameter_module_approximation/approximation.h +0 -0
  147. {multipers-2.3.5b1 → multipers-2.3.5b3}/multipers/multiparameter_module_approximation/combinatory.h +0 -0
  148. {multipers-2.3.5b1 → multipers-2.3.5b3}/multipers/multiparameter_module_approximation/debug.h +0 -0
  149. {multipers-2.3.5b1 → multipers-2.3.5b3}/multipers/multiparameter_module_approximation/euler_curves.h +0 -0
  150. {multipers-2.3.5b1 → multipers-2.3.5b3}/multipers/multiparameter_module_approximation/format_python-cpp.h +0 -0
  151. {multipers-2.3.5b1 → multipers-2.3.5b3}/multipers/multiparameter_module_approximation/heap_column.h +0 -0
  152. {multipers-2.3.5b1 → multipers-2.3.5b3}/multipers/multiparameter_module_approximation/images.h +0 -0
  153. {multipers-2.3.5b1 → multipers-2.3.5b3}/multipers/multiparameter_module_approximation/list_column.h +0 -0
  154. {multipers-2.3.5b1 → multipers-2.3.5b3}/multipers/multiparameter_module_approximation/list_column_2.h +0 -0
  155. {multipers-2.3.5b1 → multipers-2.3.5b3}/multipers/multiparameter_module_approximation/ru_matrix.h +0 -0
  156. {multipers-2.3.5b1 → multipers-2.3.5b3}/multipers/multiparameter_module_approximation/set_column.h +0 -0
  157. {multipers-2.3.5b1 → multipers-2.3.5b3}/multipers/multiparameter_module_approximation/structure_higher_dim_barcode.h +0 -0
  158. {multipers-2.3.5b1 → multipers-2.3.5b3}/multipers/multiparameter_module_approximation/unordered_set_column.h +0 -0
  159. {multipers-2.3.5b1 → multipers-2.3.5b3}/multipers/multiparameter_module_approximation/utilities.h +0 -0
  160. {multipers-2.3.5b1 → multipers-2.3.5b3}/multipers/multiparameter_module_approximation/vector_column.h +0 -0
  161. {multipers-2.3.5b1 → multipers-2.3.5b3}/multipers/multiparameter_module_approximation/vector_matrix.h +0 -0
  162. {multipers-2.3.5b1 → multipers-2.3.5b3}/multipers/multiparameter_module_approximation/vineyards.h +0 -0
  163. {multipers-2.3.5b1 → multipers-2.3.5b3}/multipers/multiparameter_module_approximation/vineyards_trajectories.h +0 -0
  164. {multipers-2.3.5b1 → multipers-2.3.5b3}/multipers/multiparameter_module_approximation.pyx +0 -0
  165. {multipers-2.3.5b1 → multipers-2.3.5b3}/multipers/pickle.py +0 -0
  166. {multipers-2.3.5b1 → multipers-2.3.5b3}/multipers/point_measure.pyx +0 -0
  167. {multipers-2.3.5b1 → multipers-2.3.5b3}/multipers/simplex_tree_multi.pxd +0 -0
  168. {multipers-2.3.5b1 → multipers-2.3.5b3}/multipers/simplex_tree_multi.pyx +0 -0
  169. {multipers-2.3.5b1 → multipers-2.3.5b3}/multipers/simplex_tree_multi.pyx.tp +0 -0
  170. {multipers-2.3.5b1 → multipers-2.3.5b3}/multipers/slicer.pxd +0 -0
  171. {multipers-2.3.5b1 → multipers-2.3.5b3}/multipers/slicer.pxd.tp +0 -0
  172. {multipers-2.3.5b1 → multipers-2.3.5b3}/multipers/tensor/tensor.h +0 -0
  173. {multipers-2.3.5b1 → multipers-2.3.5b3}/multipers/tensor.pxd +0 -0
  174. {multipers-2.3.5b1 → multipers-2.3.5b3}/multipers/test.pyx +0 -0
  175. {multipers-2.3.5b1 → multipers-2.3.5b3}/multipers/tests/__init__.py +0 -0
  176. {multipers-2.3.5b1 → multipers-2.3.5b3}/multipers/torch/__init__.py +0 -0
  177. {multipers-2.3.5b1 → multipers-2.3.5b3}/multipers/torch/diff_grids.py +0 -0
  178. {multipers-2.3.5b1 → multipers-2.3.5b3}/multipers/torch/rips_density.py +0 -0
  179. {multipers-2.3.5b1 → multipers-2.3.5b3}/multipers.egg-info/dependency_links.txt +0 -0
  180. {multipers-2.3.5b1 → multipers-2.3.5b3}/multipers.egg-info/requires.txt +0 -0
  181. {multipers-2.3.5b1 → multipers-2.3.5b3}/multipers.egg-info/top_level.txt +0 -0
  182. {multipers-2.3.5b1 → multipers-2.3.5b3}/setup.cfg +0 -0
  183. {multipers-2.3.5b1 → multipers-2.3.5b3}/setup.py +0 -0
  184. {multipers-2.3.5b1 → multipers-2.3.5b3}/tests/test_diff_helper.py +0 -0
  185. {multipers-2.3.5b1 → multipers-2.3.5b3}/tests/test_filtrations.py +0 -0
  186. {multipers-2.3.5b1 → multipers-2.3.5b3}/tests/test_grids.py +0 -0
  187. {multipers-2.3.5b1 → multipers-2.3.5b3}/tests/test_hilbert_function.py +0 -0
  188. {multipers-2.3.5b1 → multipers-2.3.5b3}/tests/test_mma.py +0 -0
  189. {multipers-2.3.5b1 → multipers-2.3.5b3}/tests/test_point_clouds.py +0 -0
  190. {multipers-2.3.5b1 → multipers-2.3.5b3}/tests/test_python-cpp_conversion.py +0 -0
  191. {multipers-2.3.5b1 → multipers-2.3.5b3}/tests/test_signed_betti.py +0 -0
  192. {multipers-2.3.5b1 → multipers-2.3.5b3}/tests/test_signed_measure.py +0 -0
  193. {multipers-2.3.5b1 → multipers-2.3.5b3}/tests/test_simplextreemulti.py +0 -0
  194. {multipers-2.3.5b1 → multipers-2.3.5b3}/tests/test_slicer.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: multipers
3
- Version: 2.3.5b1
3
+ Version: 2.3.5b3
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>
@@ -22,6 +22,15 @@ unique = _np.unique
22
22
  inf = _np.inf
23
23
  searchsorted = _np.searchsorted
24
24
  LazyTensor = None
25
+ abs = _np.abs
26
+ exp = _np.exp
27
+ sin = _np.sin
28
+ cos = _np.cos
29
+
30
+
31
+ def relu(x):
32
+ return _np.where(x >= 0, x, 0)
33
+
25
34
 
26
35
  # Test keops
27
36
  _is_keops_available = None
@@ -20,6 +20,11 @@ cartesian_product = _t.cartesian_prod
20
20
  inf = _t.inf
21
21
  searchsorted = _t.searchsorted
22
22
  LazyTensor = None
23
+ relu = _t.relu
24
+ abs = _t.abs
25
+ exp = _t.exp
26
+ sin = _t.sin
27
+ cos = _t.cos
23
28
 
24
29
 
25
30
  _is_keops_available = None
@@ -493,3 +493,27 @@ def _push_pts_to_lines(pts, basepoints, directions=None, api=None):
493
493
  return out
494
494
 
495
495
 
496
+ def evaluate_mod_in_grid(mod, grid, box=None):
497
+ """Given an MMA module, pushes it into the specified grid.
498
+ Useful for e.g., make it differentiable.
499
+
500
+ Input
501
+ -----
502
+ - mod: PyModule
503
+ - grid: Iterable of 1d array, for num_parameters
504
+ Ouput
505
+ -----
506
+ torch-compatible module in the format:
507
+ (num_degrees) x (num_interval of degree) x ((num_birth, num_parameter), (num_death, num_parameters))
508
+
509
+ """
510
+ (birth_sizes, death_sizes), births, deaths = mod.to_flat_idx(grid)
511
+ births = evaluate_in_grid(births, grid)
512
+ deaths = evaluate_in_grid(deaths, grid)
513
+ diff_mod = tuple(
514
+ zip(
515
+ births.split_with_sizes(birth_sizes.tolist()),
516
+ deaths.split_with_sizes(death_sizes.tolist()),
517
+ )
518
+ )
519
+ return diff_mod
@@ -0,0 +1,419 @@
1
+ import re
2
+ import tempfile
3
+ from gudhi import SimplexTree
4
+ import gudhi as gd
5
+ import numpy as np
6
+ import os
7
+ from shutil import which
8
+ from libcpp cimport bool
9
+ from typing import Optional, Literal
10
+ from collections import defaultdict
11
+ import itertools
12
+ import threading
13
+ import cython
14
+ cimport cython
15
+
16
+ current_doc_url = "https://davidlapous.github.io/multipers/"
17
+ doc_soft_urls = {
18
+ "mpfree":"https://bitbucket.org/mkerber/mpfree/",
19
+ "multi_chunk":"https://bitbucket.org/mkerber/multi_chunk/",
20
+ "function_delaunay":"https://bitbucket.org/mkerber/function_delaunay/",
21
+ "2pac":"https://gitlab.com/flenzen/2pac",
22
+ "rhomboid_tiling":"https://github.com/odinhg/rhomboidtiling_newer_cgal_version",
23
+ }
24
+ doc_soft_easy_install = {
25
+ "mpfree":f"""
26
+ ```sh
27
+ git clone {doc_soft_urls["mpfree"]}
28
+ cd mpfree
29
+ cmake . --fresh
30
+ make
31
+ cp mpfree $CONDA_PREFIX/bin/
32
+ cd ..
33
+ rm -rf mpfree
34
+ ```
35
+ """,
36
+ "multi_chunk":f"""
37
+ ```sh
38
+ git clone {doc_soft_urls["multi_chunk"]}
39
+ cd multi_chunk
40
+ cmake . --fresh
41
+ make
42
+ cp multi_chunk $CONDA_PREFIX/bin/
43
+ cd ..
44
+ rm -rf multi_chunk
45
+ ```
46
+ """,
47
+ "function_delaunay":f"""
48
+ ```sh
49
+ git clone {doc_soft_urls["function_delaunay"]}
50
+ cd function_delaunay
51
+ cmake . --fresh
52
+ make
53
+ cp main $CONDA_PREFIX/bin/function_delaunay
54
+ cd ..
55
+ rm -rf function_delaunay
56
+ ```
57
+ """,
58
+ "2pac":f"""
59
+ ```sh
60
+ git clone {doc_soft_urls["2pac"]} 2pac
61
+ cd 2pac && mkdir build && cd build
62
+ cmake ..
63
+ make
64
+ cp 2pac $CONDA_PREFIX/bin
65
+ ```
66
+ """,
67
+ "rhomboid_tiling":f"""
68
+ git clone {doc_soft_urls["rhomboid_tiling"]} rhomboid_tiling
69
+ sh build.sh
70
+ cp orderk $CONDA_PREFIX/bin/rhomboid_tiling
71
+ """
72
+ }
73
+ doc_soft_urls = defaultdict(lambda:"<Unknown url>", doc_soft_urls)
74
+ doc_soft_easy_install = defaultdict(lambda:"<Unknown>", doc_soft_easy_install)
75
+
76
+ available_reduce_softs = Literal["mpfree","multi_chunk","2pac"]
77
+
78
+ def _path_init(soft:str|os.PathLike):
79
+ a = which(f"./{soft}")
80
+ b = which(f"{soft}")
81
+ if a:
82
+ pathes[soft] = a
83
+ elif b:
84
+ pathes[soft] = b
85
+
86
+ if pathes[soft] is not None:
87
+ verbose_arg = "> /dev/null 2>&1"
88
+ test = os.system(pathes[soft] + " --help " + verbose_arg)
89
+ if test:
90
+ from warnings import warn
91
+ warn(f"""
92
+ Found external software {soft} at {pathes[soft]}
93
+ but may not behave well.
94
+ """)
95
+
96
+
97
+
98
+ cdef dict[str,str|None] pathes = {
99
+ "mpfree":None,
100
+ "2pac":None,
101
+ "function_delaunay":None,
102
+ "multi_chunk":None,
103
+ }
104
+
105
+
106
+
107
+ ## TODO : optimize with Python.h ?
108
+ def scc_parser(path: str| os.PathLike):
109
+ """
110
+ Parse an scc file into the scc python format, aka blocks.
111
+ """
112
+ pass_line_regex = re.compile(r"^\s*$|^#|^scc2020$")
113
+ def valid_line(line):
114
+ return pass_line_regex.match(line) is None
115
+ parse_line_regex = re.compile(r"^(?P<filtration>[^;]+);(?P<boundary>[^;]*)$")
116
+ cdef tuple[tuple[str,str]] clines
117
+ with open(path, "r") as f:
118
+ lines =(x.strip() for x in f if valid_line(x))
119
+ num_parameters = int(next(lines))
120
+ sizes = np.cumsum(np.asarray([0] + next(lines).split(), dtype=np.int32))
121
+ lines = (parse_line_regex.match(a) for a in lines)
122
+ clines = tuple((a.group("filtration"),a.group("boundary")) for a in lines)
123
+ # F = np.fromiter((a[0].split() for a in clines), dtype=np.dtype((np.float64,2)), count = sizes[-1])
124
+ F = np.fromiter((np.fromstring(a[0], sep=r' ', dtype=np.float64) for a in clines), dtype=np.dtype((np.float64,num_parameters)), count = sizes[-1])
125
+
126
+ # B = tuple(np.asarray(a[1].split(), dtype=np.int32) if len(a[1])>0 else np.empty(0, dtype=np.int32) for a in clines) ## TODO : this is very slow : optimize
127
+ B = tuple(np.fromstring(a[1], sep=' ', dtype=np.int32) for a in clines)
128
+ # block_lines = (tuple(get_bf(x, num_parameters) for x in lines[sizes[i]:sizes[i+1]]) for i in range(len(sizes)-1))
129
+
130
+ # blocks = [(np.asarray([x[0] for x in b if len(x)>0], dtype=float),tuple(x[1] for x in b)) for b in block_lines]
131
+ blocks = [(F[sizes[i]:sizes[i+1]], B[sizes[i]:sizes[i+1]]) for i in range(len(sizes)-1)]
132
+
133
+ return blocks
134
+
135
+
136
+
137
+
138
+ def _init_external_softwares(requires=[]):
139
+ global pathes
140
+ cdef bool any = False
141
+ for soft,soft_path in pathes.items():
142
+ if soft_path is None:
143
+ _path_init(soft)
144
+ any = any or (soft in requires)
145
+
146
+ if any:
147
+ for soft in requires:
148
+ if pathes[soft] is None:
149
+ global doc_soft_urls
150
+ raise ValueError(f"""
151
+ Did not find {soft}.
152
+ Install it from {doc_soft_urls[soft]}, and put it in your current directory,
153
+ or in you $PATH.
154
+ Documentation is available here: {current_doc_url}compilation.html#external-libraries
155
+ For instance:
156
+ {doc_soft_easy_install[soft]}
157
+ """)
158
+ _init_external_softwares()
159
+ def _check_available(soft:str):
160
+ _init_external_softwares()
161
+ return pathes.get(soft,None) is not None
162
+
163
+
164
+
165
+ def scc_reduce_from_str_to_slicer(
166
+ path:str|os.PathLike,
167
+ slicer,
168
+ bool full_resolution=True,
169
+ int dimension: int | np.int64 = 1,
170
+ bool clear: bool = True,
171
+ bool verbose:bool=False,
172
+ backend:Literal["mpfree","multi_chunk","twopac"]="mpfree",
173
+ shift_dimension=0
174
+ ):
175
+ """
176
+ Computes a minimal presentation of the file in path,
177
+ using mpfree.
178
+
179
+ path:PathLike
180
+ slicer: empty slicer to fill
181
+ full_resolution: bool
182
+ dimension: int, presentation dimension to consider
183
+ clear: bool, removes temporary files if True
184
+ id: str, temporary files are of this id, allowing for multiprocessing
185
+ verbose: bool
186
+ backend: "mpfree", "multi_chunk" or "2pac"
187
+ """
188
+ global pathes
189
+ _init_external_softwares(requires=[backend])
190
+
191
+ with tempfile.TemporaryDirectory(prefix="multipers", delete=clear) as tmpdir:
192
+ output_path = os.path.join(tmpdir, "multipers_output.scc")
193
+
194
+ resolution_str = "--resolution" if full_resolution else ""
195
+
196
+ if not os.path.exists(path):
197
+ raise ValueError(f"No file found at {path}.")
198
+
199
+ verbose_arg = "> /dev/null 2>&1" if not verbose else ""
200
+ if backend == "mpfree":
201
+ more_verbose = "-v" if verbose else ""
202
+ command = (
203
+ f"{pathes[backend]} {more_verbose} {resolution_str} --dim={dimension} {path} {output_path} {verbose_arg}"
204
+ )
205
+ elif backend == "multi_chunk":
206
+ command = (
207
+ f"{pathes[backend]} {path} {output_path} {verbose_arg}"
208
+ )
209
+ elif backend in ["twopac", "2pac"]:
210
+ command = (
211
+ f"{pathes[backend]} -f {path} --scc-input -n{dimension} --save-resolution-scc {output_path} {verbose_arg}"
212
+ )
213
+ else:
214
+ raise ValueError(f"Unsupported backend {backend}.")
215
+ if verbose:
216
+ print(f"Calling :\n\n {command}")
217
+ os.system(command)
218
+
219
+ slicer._build_from_scc_file(path=output_path, shift_dimension=shift_dimension)
220
+
221
+
222
+
223
+
224
+
225
+ def function_delaunay_presentation_to_slicer(
226
+ slicer,
227
+ point_cloud:np.ndarray,
228
+ function_values:np.ndarray,
229
+ bool clear:bool = True,
230
+ bool verbose:bool=False,
231
+ int degree = -1,
232
+ bool multi_chunk = False,
233
+ ):
234
+ """
235
+ Computes a function delaunay presentation, and returns it as a slicer.
236
+
237
+ slicer: empty slicer to fill
238
+ points : (num_pts, n) float array
239
+ grades : (num_pts,) float array
240
+ degree (opt) : if given, computes a minimal presentation of this homological degree first
241
+ clear:bool, removes temporary files if true
242
+ degree: computes minimal presentation of this degree if given
243
+ verbose : bool
244
+ """
245
+ global pathes
246
+
247
+ with tempfile.TemporaryDirectory(prefix="multipers", delete=clear) as tmpdir:
248
+ input_path = os.path.join(tmpdir, "multipers_input.scc")
249
+ output_path = os.path.join(tmpdir, "multipers_output.scc")
250
+
251
+ backend = "function_delaunay"
252
+ _init_external_softwares(requires=[backend])
253
+
254
+ to_write = np.concatenate([point_cloud, function_values.reshape(-1,1)], axis=1)
255
+ np.savetxt(input_path,to_write,delimiter=' ')
256
+ verbose_arg = "> /dev/null 2>&1" if not verbose else ""
257
+ degree_arg = f"--minpres {degree}" if degree >= 0 else ""
258
+ multi_chunk_arg = "--multi-chunk" if multi_chunk else ""
259
+ command = f"{pathes[backend]} {degree_arg} {multi_chunk_arg} {input_path} {output_path} {verbose_arg} --no-delaunay-compare"
260
+ if verbose:
261
+ print(command)
262
+ os.system(command)
263
+
264
+ slicer._build_from_scc_file(path=output_path, shift_dimension=-1 if degree <= 0 else degree-1 )
265
+
266
+
267
+ def rhomboid_tiling_to_slicer(
268
+ slicer,
269
+ point_cloud:np.ndarray,
270
+ int k_max,
271
+ int degree = -1,
272
+ bool reduce=True,
273
+ id:Optional[str] = None,
274
+ bool clear:bool = True,
275
+ bool verbose:bool=False,
276
+ bool multi_chunk = False,
277
+ ):
278
+ """TODO"""
279
+ if id is None:
280
+ id = str(threading.get_native_id())
281
+ global input_path, output_path, pathes
282
+ backend = "rhomboid_tiling"
283
+ _init_external_softwares(requires=[backend])
284
+ if point_cloud.ndim != 2 or not point_cloud.shape[1] in [2,3]:
285
+ raise ValueError("point_cloud should be a 2d array of shape (-,2) or (-,3). Got {point_cloud.shape=}")
286
+ with tempfile.TemporaryDirectory(prefix="multipers", delete=clear) as tmpdir:
287
+ input_path = os.path.join(tmpdir, "point_cloud.txt")
288
+ output_path = os.path.join(tmpdir, "multipers_output.scc")
289
+ np.savetxt(input_path,point_cloud,delimiter=' ')
290
+
291
+ verbose_arg = "> /dev/null 2>&1" if not verbose else ""
292
+ degree_arg = f"--minpres {degree}" if degree >= 0 else ""
293
+ multi_chunk_arg = "--multi-chunk" if multi_chunk else ""
294
+ command = f"{pathes[backend]} {input_path} {output_path} {point_cloud.shape[1]} {k_max} scc {degree}"
295
+ if verbose:
296
+ print(command)
297
+ os.system(command)
298
+ slicer._build_from_scc_file(path=output_path+id, shift_dimension=-1 if degree <= 0 else degree-1 )
299
+
300
+
301
+
302
+
303
+
304
+ @cython.boundscheck(False)
305
+ @cython.wraparound(False)
306
+ def scc2disk(
307
+ stuff,
308
+ path:str|os.PathLike,
309
+ int num_parameters = -1,
310
+ bool reverse_block = False,
311
+ bool rivet_compatible = False,
312
+ bool ignore_last_generators = False,
313
+ bool strip_comments = False,
314
+ ):
315
+ """
316
+ Writes a scc python format / blocks into a file.
317
+ """
318
+ if num_parameters == -1:
319
+ for block in stuff:
320
+ if len(block[0]) == 0:
321
+ continue
322
+ num_gens, num_parameters_= np.asarray(block[0]).shape
323
+ num_parameters = num_parameters_
324
+ break
325
+ assert num_parameters > 0, f"Invalid number of parameters {num_parameters}"
326
+
327
+ if reverse_block: stuff.reverse()
328
+ with open(path, "w") as f:
329
+ f.write("scc2020\n") if not rivet_compatible else f.write("firep\n")
330
+ if not strip_comments and not rivet_compatible: f.write("# Number of parameters\n")
331
+ if rivet_compatible:
332
+ assert num_parameters == 2
333
+ f.write("Filtration 1\n")
334
+ f.write("Filtration 2\n")
335
+ else:
336
+ f.write(f"{num_parameters}\n")
337
+
338
+ if not strip_comments: f.write("# Sizes of generating sets\n")
339
+ for block in stuff: f.write(f"{len(block[0])} ")
340
+ f.write("\n")
341
+ for i,block in enumerate(stuff):
342
+ if (rivet_compatible or ignore_last_generators) and i == len(stuff)-1: continue
343
+ if not strip_comments: f.write(f"# Block of dimension {len(stuff)-1-i}\n")
344
+ filtration, boundary = block
345
+ filtration = np.asarray(filtration).astype(str)
346
+ # boundary = tuple(x.astype(str) for x in boundary)
347
+ f.write(" ".join(itertools.chain.from_iterable(
348
+ ((*(f.tolist()), ";", *(np.asarray(b).astype(str).tolist()), "\n")
349
+ for f,b in zip(filtration, boundary))
350
+ )
351
+ ))
352
+ # for j in range(<int>len(filtration)):
353
+ # line = " ".join((
354
+ # *filtration[j],
355
+ # ";",
356
+ # *boundary[j],
357
+ # "\n",
358
+ # ))
359
+ # f.write(line)
360
+
361
+ def scc2disk_old(
362
+ stuff,
363
+ path:str|os.PathLike,
364
+ num_parameters = -1,
365
+ reverse_block = False,
366
+ rivet_compatible = False,
367
+ ignore_last_generators = False,
368
+ strip_comments = False,
369
+ ):
370
+ """
371
+ Writes a scc python format / blocks into a file.
372
+ """
373
+ if num_parameters == -1:
374
+ for block in stuff:
375
+ if len(block[0]) == 0:
376
+ continue
377
+ num_gens, num_parameters_= np.asarray(block[0]).shape
378
+ num_parameters = num_parameters_
379
+ break
380
+ assert num_parameters > 0, f"Invalid number of parameters {num_parameters}"
381
+
382
+ if reverse_block: stuff.reverse()
383
+ out = []
384
+ if rivet_compatible:
385
+ out.append(r"firep")
386
+ else:
387
+ out.append(r"scc2020")
388
+ if not strip_comments and not rivet_compatible:
389
+ out.append(r"# Number of parameters")
390
+ if rivet_compatible:
391
+ out.append("Filtration 1")
392
+ out.append("Filtration 2\n")
393
+ else:
394
+ out.append(f"{num_parameters}")
395
+
396
+ if not strip_comments:
397
+ out.append("# Sizes of generating sets")
398
+
399
+ # for block in stuff:
400
+ # f.write(f"{len(block[0])} ")
401
+ out.append(" ".join(str(len(block[0])) for block in stuff))
402
+ str_blocks = [out]
403
+ for i,block in enumerate(stuff):
404
+ if (rivet_compatible or ignore_last_generators) and i == len(stuff)-1: continue
405
+ if not strip_comments:
406
+ str_blocks.append([f"# Block of dimension {len(stuff)-1-i}"])
407
+ filtration, boundary = block
408
+ if len(filtration) == 0:
409
+ continue
410
+ filtration = filtration.astype(str)
411
+ C = filtration[:,0]
412
+ for i in range(1,filtration.shape[1]):
413
+ C = np.char.add(C," ")
414
+ C = np.char.add(C,filtration[:,i])
415
+ C = np.char.add(C, ";")
416
+ D = np.fromiter((" ".join(b.astype(str).tolist()) for b in boundary), dtype="<U11") #int32-> str is "<U11" #check np.array(1, dtype=np.int32).astype(str)
417
+ str_blocks.append(np.char.add(C,D))
418
+
419
+ np.savetxt("test.scc", np.concatenate(str_blocks), delimiter="", fmt="%s")
@@ -189,7 +189,8 @@ def plot_surface(
189
189
  **plt_args,
190
190
  ):
191
191
  import matplotlib
192
-
192
+ grid = [to_numpy(g) for g in grid]
193
+ hf = to_numpy(hf)
193
194
  if ax is None:
194
195
  ax = plt.gca()
195
196
  else: