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.
- {multipers-2.3.5b1/multipers.egg-info → multipers-2.3.5b3}/PKG-INFO +1 -1
- {multipers-2.3.5b1 → multipers-2.3.5b3}/multipers/array_api/numpy.py +9 -0
- {multipers-2.3.5b1 → multipers-2.3.5b3}/multipers/array_api/torch.py +5 -0
- {multipers-2.3.5b1 → multipers-2.3.5b3}/multipers/grids.pyx +24 -0
- multipers-2.3.5b3/multipers/io.pyx +419 -0
- {multipers-2.3.5b1 → multipers-2.3.5b3}/multipers/plots.py +2 -1
- {multipers-2.3.5b1 → multipers-2.3.5b3}/multipers/slicer.pyx +69 -109
- {multipers-2.3.5b1 → multipers-2.3.5b3}/multipers/slicer.pyx.tp +18 -19
- {multipers-2.3.5b1 → multipers-2.3.5b3/multipers.egg-info}/PKG-INFO +1 -1
- {multipers-2.3.5b1 → multipers-2.3.5b3}/multipers.egg-info/SOURCES.txt +1 -0
- {multipers-2.3.5b1 → multipers-2.3.5b3}/pyproject.toml +1 -1
- multipers-2.3.5b3/tests/test_parallel.py +35 -0
- multipers-2.3.5b1/multipers/io.pyx +0 -644
- {multipers-2.3.5b1 → multipers-2.3.5b3}/LICENSE +0 -0
- {multipers-2.3.5b1 → multipers-2.3.5b3}/MANIFEST.in +0 -0
- {multipers-2.3.5b1 → multipers-2.3.5b3}/README.md +0 -0
- {multipers-2.3.5b1 → multipers-2.3.5b3}/_tempita_grid_gen.py +0 -0
- {multipers-2.3.5b1 → multipers-2.3.5b3}/multipers/__init__.py +0 -0
- {multipers-2.3.5b1 → multipers-2.3.5b3}/multipers/_signed_measure_meta.py +0 -0
- {multipers-2.3.5b1 → multipers-2.3.5b3}/multipers/_slicer_meta.py +0 -0
- {multipers-2.3.5b1 → multipers-2.3.5b3}/multipers/array_api/__init__.py +0 -0
- {multipers-2.3.5b1 → multipers-2.3.5b3}/multipers/data/MOL2.py +0 -0
- {multipers-2.3.5b1 → multipers-2.3.5b3}/multipers/data/UCR.py +0 -0
- {multipers-2.3.5b1 → multipers-2.3.5b3}/multipers/data/__init__.py +0 -0
- {multipers-2.3.5b1 → multipers-2.3.5b3}/multipers/data/graphs.py +0 -0
- {multipers-2.3.5b1 → multipers-2.3.5b3}/multipers/data/immuno_regions.py +0 -0
- {multipers-2.3.5b1 → multipers-2.3.5b3}/multipers/data/minimal_presentation_to_st_bf.py +0 -0
- {multipers-2.3.5b1 → multipers-2.3.5b3}/multipers/data/pytorch2simplextree.py +0 -0
- {multipers-2.3.5b1 → multipers-2.3.5b3}/multipers/data/shape3d.py +0 -0
- {multipers-2.3.5b1 → multipers-2.3.5b3}/multipers/data/synthetic.py +0 -0
- {multipers-2.3.5b1 → multipers-2.3.5b3}/multipers/distances.py +0 -0
- {multipers-2.3.5b1 → multipers-2.3.5b3}/multipers/filtration_conversions.pxd +0 -0
- {multipers-2.3.5b1 → multipers-2.3.5b3}/multipers/filtration_conversions.pxd.tp +0 -0
- {multipers-2.3.5b1 → multipers-2.3.5b3}/multipers/filtrations/__init__.py +0 -0
- {multipers-2.3.5b1 → multipers-2.3.5b3}/multipers/filtrations/density.py +0 -0
- {multipers-2.3.5b1 → multipers-2.3.5b3}/multipers/filtrations/filtrations.py +0 -0
- {multipers-2.3.5b1 → multipers-2.3.5b3}/multipers/filtrations.pxd +0 -0
- {multipers-2.3.5b1 → multipers-2.3.5b3}/multipers/function_rips.pyx +0 -0
- {multipers-2.3.5b1 → multipers-2.3.5b3}/multipers/gudhi/Persistence_slices_interface.h +0 -0
- {multipers-2.3.5b1 → multipers-2.3.5b3}/multipers/gudhi/Simplex_tree_interface.h +0 -0
- {multipers-2.3.5b1 → multipers-2.3.5b3}/multipers/gudhi/Simplex_tree_multi_interface.h +0 -0
- {multipers-2.3.5b1 → multipers-2.3.5b3}/multipers/gudhi/cubical_to_boundary.h +0 -0
- {multipers-2.3.5b1 → multipers-2.3.5b3}/multipers/gudhi/gudhi/Bitmap_cubical_complex.h +0 -0
- {multipers-2.3.5b1 → multipers-2.3.5b3}/multipers/gudhi/gudhi/Bitmap_cubical_complex_base.h +0 -0
- {multipers-2.3.5b1 → multipers-2.3.5b3}/multipers/gudhi/gudhi/Bitmap_cubical_complex_periodic_boundary_conditions_base.h +0 -0
- {multipers-2.3.5b1 → multipers-2.3.5b3}/multipers/gudhi/gudhi/Debug_utils.h +0 -0
- {multipers-2.3.5b1 → multipers-2.3.5b3}/multipers/gudhi/gudhi/Fields/Multi_field.h +0 -0
- {multipers-2.3.5b1 → multipers-2.3.5b3}/multipers/gudhi/gudhi/Fields/Multi_field_operators.h +0 -0
- {multipers-2.3.5b1 → multipers-2.3.5b3}/multipers/gudhi/gudhi/Fields/Multi_field_shared.h +0 -0
- {multipers-2.3.5b1 → multipers-2.3.5b3}/multipers/gudhi/gudhi/Fields/Multi_field_small.h +0 -0
- {multipers-2.3.5b1 → multipers-2.3.5b3}/multipers/gudhi/gudhi/Fields/Multi_field_small_operators.h +0 -0
- {multipers-2.3.5b1 → multipers-2.3.5b3}/multipers/gudhi/gudhi/Fields/Multi_field_small_shared.h +0 -0
- {multipers-2.3.5b1 → multipers-2.3.5b3}/multipers/gudhi/gudhi/Fields/Z2_field.h +0 -0
- {multipers-2.3.5b1 → multipers-2.3.5b3}/multipers/gudhi/gudhi/Fields/Z2_field_operators.h +0 -0
- {multipers-2.3.5b1 → multipers-2.3.5b3}/multipers/gudhi/gudhi/Fields/Zp_field.h +0 -0
- {multipers-2.3.5b1 → multipers-2.3.5b3}/multipers/gudhi/gudhi/Fields/Zp_field_operators.h +0 -0
- {multipers-2.3.5b1 → multipers-2.3.5b3}/multipers/gudhi/gudhi/Fields/Zp_field_shared.h +0 -0
- {multipers-2.3.5b1 → multipers-2.3.5b3}/multipers/gudhi/gudhi/Flag_complex_edge_collapser.h +0 -0
- {multipers-2.3.5b1 → multipers-2.3.5b3}/multipers/gudhi/gudhi/Matrix.h +0 -0
- {multipers-2.3.5b1 → multipers-2.3.5b3}/multipers/gudhi/gudhi/Multi_critical_filtration.h +0 -0
- {multipers-2.3.5b1 → multipers-2.3.5b3}/multipers/gudhi/gudhi/Multi_persistence/Box.h +0 -0
- {multipers-2.3.5b1 → multipers-2.3.5b3}/multipers/gudhi/gudhi/Multi_persistence/Line.h +0 -0
- {multipers-2.3.5b1 → multipers-2.3.5b3}/multipers/gudhi/gudhi/Off_reader.h +0 -0
- {multipers-2.3.5b1 → multipers-2.3.5b3}/multipers/gudhi/gudhi/One_critical_filtration.h +0 -0
- {multipers-2.3.5b1 → multipers-2.3.5b3}/multipers/gudhi/gudhi/Persistence_matrix/Base_matrix.h +0 -0
- {multipers-2.3.5b1 → multipers-2.3.5b3}/multipers/gudhi/gudhi/Persistence_matrix/Base_matrix_with_column_compression.h +0 -0
- {multipers-2.3.5b1 → multipers-2.3.5b3}/multipers/gudhi/gudhi/Persistence_matrix/Boundary_matrix.h +0 -0
- {multipers-2.3.5b1 → multipers-2.3.5b3}/multipers/gudhi/gudhi/Persistence_matrix/Chain_matrix.h +0 -0
- {multipers-2.3.5b1 → multipers-2.3.5b3}/multipers/gudhi/gudhi/Persistence_matrix/Id_to_index_overlay.h +0 -0
- {multipers-2.3.5b1 → multipers-2.3.5b3}/multipers/gudhi/gudhi/Persistence_matrix/Position_to_index_overlay.h +0 -0
- {multipers-2.3.5b1 → multipers-2.3.5b3}/multipers/gudhi/gudhi/Persistence_matrix/RU_matrix.h +0 -0
- {multipers-2.3.5b1 → multipers-2.3.5b3}/multipers/gudhi/gudhi/Persistence_matrix/allocators/entry_constructors.h +0 -0
- {multipers-2.3.5b1 → multipers-2.3.5b3}/multipers/gudhi/gudhi/Persistence_matrix/base_pairing.h +0 -0
- {multipers-2.3.5b1 → multipers-2.3.5b3}/multipers/gudhi/gudhi/Persistence_matrix/base_swap.h +0 -0
- {multipers-2.3.5b1 → multipers-2.3.5b3}/multipers/gudhi/gudhi/Persistence_matrix/boundary_cell_position_to_id_mapper.h +0 -0
- {multipers-2.3.5b1 → multipers-2.3.5b3}/multipers/gudhi/gudhi/Persistence_matrix/boundary_face_position_to_id_mapper.h +0 -0
- {multipers-2.3.5b1 → multipers-2.3.5b3}/multipers/gudhi/gudhi/Persistence_matrix/chain_pairing.h +0 -0
- {multipers-2.3.5b1 → multipers-2.3.5b3}/multipers/gudhi/gudhi/Persistence_matrix/chain_rep_cycles.h +0 -0
- {multipers-2.3.5b1 → multipers-2.3.5b3}/multipers/gudhi/gudhi/Persistence_matrix/chain_vine_swap.h +0 -0
- {multipers-2.3.5b1 → multipers-2.3.5b3}/multipers/gudhi/gudhi/Persistence_matrix/columns/chain_column_extra_properties.h +0 -0
- {multipers-2.3.5b1 → multipers-2.3.5b3}/multipers/gudhi/gudhi/Persistence_matrix/columns/column_dimension_holder.h +0 -0
- {multipers-2.3.5b1 → multipers-2.3.5b3}/multipers/gudhi/gudhi/Persistence_matrix/columns/column_utilities.h +0 -0
- {multipers-2.3.5b1 → multipers-2.3.5b3}/multipers/gudhi/gudhi/Persistence_matrix/columns/entry_types.h +0 -0
- {multipers-2.3.5b1 → multipers-2.3.5b3}/multipers/gudhi/gudhi/Persistence_matrix/columns/heap_column.h +0 -0
- {multipers-2.3.5b1 → multipers-2.3.5b3}/multipers/gudhi/gudhi/Persistence_matrix/columns/intrusive_list_column.h +0 -0
- {multipers-2.3.5b1 → multipers-2.3.5b3}/multipers/gudhi/gudhi/Persistence_matrix/columns/intrusive_set_column.h +0 -0
- {multipers-2.3.5b1 → multipers-2.3.5b3}/multipers/gudhi/gudhi/Persistence_matrix/columns/list_column.h +0 -0
- {multipers-2.3.5b1 → multipers-2.3.5b3}/multipers/gudhi/gudhi/Persistence_matrix/columns/naive_vector_column.h +0 -0
- {multipers-2.3.5b1 → multipers-2.3.5b3}/multipers/gudhi/gudhi/Persistence_matrix/columns/row_access.h +0 -0
- {multipers-2.3.5b1 → multipers-2.3.5b3}/multipers/gudhi/gudhi/Persistence_matrix/columns/set_column.h +0 -0
- {multipers-2.3.5b1 → multipers-2.3.5b3}/multipers/gudhi/gudhi/Persistence_matrix/columns/small_vector_column.h +0 -0
- {multipers-2.3.5b1 → multipers-2.3.5b3}/multipers/gudhi/gudhi/Persistence_matrix/columns/unordered_set_column.h +0 -0
- {multipers-2.3.5b1 → multipers-2.3.5b3}/multipers/gudhi/gudhi/Persistence_matrix/columns/vector_column.h +0 -0
- {multipers-2.3.5b1 → multipers-2.3.5b3}/multipers/gudhi/gudhi/Persistence_matrix/matrix_dimension_holders.h +0 -0
- {multipers-2.3.5b1 → multipers-2.3.5b3}/multipers/gudhi/gudhi/Persistence_matrix/matrix_row_access.h +0 -0
- {multipers-2.3.5b1 → multipers-2.3.5b3}/multipers/gudhi/gudhi/Persistence_matrix/ru_pairing.h +0 -0
- {multipers-2.3.5b1 → multipers-2.3.5b3}/multipers/gudhi/gudhi/Persistence_matrix/ru_rep_cycles.h +0 -0
- {multipers-2.3.5b1 → multipers-2.3.5b3}/multipers/gudhi/gudhi/Persistence_matrix/ru_vine_swap.h +0 -0
- {multipers-2.3.5b1 → multipers-2.3.5b3}/multipers/gudhi/gudhi/Persistent_cohomology/Field_Zp.h +0 -0
- {multipers-2.3.5b1 → multipers-2.3.5b3}/multipers/gudhi/gudhi/Persistent_cohomology/Multi_field.h +0 -0
- {multipers-2.3.5b1 → multipers-2.3.5b3}/multipers/gudhi/gudhi/Persistent_cohomology/Persistent_cohomology_column.h +0 -0
- {multipers-2.3.5b1 → multipers-2.3.5b3}/multipers/gudhi/gudhi/Persistent_cohomology.h +0 -0
- {multipers-2.3.5b1 → multipers-2.3.5b3}/multipers/gudhi/gudhi/Points_off_io.h +0 -0
- {multipers-2.3.5b1 → multipers-2.3.5b3}/multipers/gudhi/gudhi/Simple_object_pool.h +0 -0
- {multipers-2.3.5b1 → multipers-2.3.5b3}/multipers/gudhi/gudhi/Simplex_tree/Simplex_tree_iterators.h +0 -0
- {multipers-2.3.5b1 → multipers-2.3.5b3}/multipers/gudhi/gudhi/Simplex_tree/Simplex_tree_node_explicit_storage.h +0 -0
- {multipers-2.3.5b1 → multipers-2.3.5b3}/multipers/gudhi/gudhi/Simplex_tree/Simplex_tree_siblings.h +0 -0
- {multipers-2.3.5b1 → multipers-2.3.5b3}/multipers/gudhi/gudhi/Simplex_tree/Simplex_tree_star_simplex_iterators.h +0 -0
- {multipers-2.3.5b1 → multipers-2.3.5b3}/multipers/gudhi/gudhi/Simplex_tree/hooks_simplex_base.h +0 -0
- {multipers-2.3.5b1 → multipers-2.3.5b3}/multipers/gudhi/gudhi/Simplex_tree/indexing_tag.h +0 -0
- {multipers-2.3.5b1 → multipers-2.3.5b3}/multipers/gudhi/gudhi/Simplex_tree/serialization_utils.h +0 -0
- {multipers-2.3.5b1 → multipers-2.3.5b3}/multipers/gudhi/gudhi/Simplex_tree/simplex_tree_options.h +0 -0
- {multipers-2.3.5b1 → multipers-2.3.5b3}/multipers/gudhi/gudhi/Simplex_tree.h +0 -0
- {multipers-2.3.5b1 → multipers-2.3.5b3}/multipers/gudhi/gudhi/Simplex_tree_multi.h +0 -0
- {multipers-2.3.5b1 → multipers-2.3.5b3}/multipers/gudhi/gudhi/distance_functions.h +0 -0
- {multipers-2.3.5b1 → multipers-2.3.5b3}/multipers/gudhi/gudhi/graph_simplicial_complex.h +0 -0
- {multipers-2.3.5b1 → multipers-2.3.5b3}/multipers/gudhi/gudhi/persistence_interval.h +0 -0
- {multipers-2.3.5b1 → multipers-2.3.5b3}/multipers/gudhi/gudhi/persistence_matrix_options.h +0 -0
- {multipers-2.3.5b1 → multipers-2.3.5b3}/multipers/gudhi/gudhi/reader_utils.h +0 -0
- {multipers-2.3.5b1 → multipers-2.3.5b3}/multipers/gudhi/mma_interface_coh.h +0 -0
- {multipers-2.3.5b1 → multipers-2.3.5b3}/multipers/gudhi/mma_interface_h0.h +0 -0
- {multipers-2.3.5b1 → multipers-2.3.5b3}/multipers/gudhi/mma_interface_matrix.h +0 -0
- {multipers-2.3.5b1 → multipers-2.3.5b3}/multipers/gudhi/naive_merge_tree.h +0 -0
- {multipers-2.3.5b1 → multipers-2.3.5b3}/multipers/gudhi/scc_io.h +0 -0
- {multipers-2.3.5b1 → multipers-2.3.5b3}/multipers/gudhi/truc.h +0 -0
- {multipers-2.3.5b1 → multipers-2.3.5b3}/multipers/ml/__init__.py +0 -0
- {multipers-2.3.5b1 → multipers-2.3.5b3}/multipers/ml/accuracies.py +0 -0
- {multipers-2.3.5b1 → multipers-2.3.5b3}/multipers/ml/invariants_with_persistable.py +0 -0
- {multipers-2.3.5b1 → multipers-2.3.5b3}/multipers/ml/kernels.py +0 -0
- {multipers-2.3.5b1 → multipers-2.3.5b3}/multipers/ml/mma.py +0 -0
- {multipers-2.3.5b1 → multipers-2.3.5b3}/multipers/ml/one.py +0 -0
- {multipers-2.3.5b1 → multipers-2.3.5b3}/multipers/ml/point_clouds.py +0 -0
- {multipers-2.3.5b1 → multipers-2.3.5b3}/multipers/ml/signed_measures.py +0 -0
- {multipers-2.3.5b1 → multipers-2.3.5b3}/multipers/ml/sliced_wasserstein.py +0 -0
- {multipers-2.3.5b1 → multipers-2.3.5b3}/multipers/ml/tools.py +0 -0
- {multipers-2.3.5b1 → multipers-2.3.5b3}/multipers/mma_structures.pxd +0 -0
- {multipers-2.3.5b1 → multipers-2.3.5b3}/multipers/mma_structures.pyx +0 -0
- {multipers-2.3.5b1 → multipers-2.3.5b3}/multipers/mma_structures.pyx.tp +0 -0
- {multipers-2.3.5b1 → multipers-2.3.5b3}/multipers/multi_parameter_rank_invariant/diff_helpers.h +0 -0
- {multipers-2.3.5b1 → multipers-2.3.5b3}/multipers/multi_parameter_rank_invariant/euler_characteristic.h +0 -0
- {multipers-2.3.5b1 → multipers-2.3.5b3}/multipers/multi_parameter_rank_invariant/function_rips.h +0 -0
- {multipers-2.3.5b1 → multipers-2.3.5b3}/multipers/multi_parameter_rank_invariant/hilbert_function.h +0 -0
- {multipers-2.3.5b1 → multipers-2.3.5b3}/multipers/multi_parameter_rank_invariant/persistence_slices.h +0 -0
- {multipers-2.3.5b1 → multipers-2.3.5b3}/multipers/multi_parameter_rank_invariant/rank_invariant.h +0 -0
- {multipers-2.3.5b1 → multipers-2.3.5b3}/multipers/multiparameter_edge_collapse.py +0 -0
- {multipers-2.3.5b1 → multipers-2.3.5b3}/multipers/multiparameter_module_approximation/approximation.h +0 -0
- {multipers-2.3.5b1 → multipers-2.3.5b3}/multipers/multiparameter_module_approximation/combinatory.h +0 -0
- {multipers-2.3.5b1 → multipers-2.3.5b3}/multipers/multiparameter_module_approximation/debug.h +0 -0
- {multipers-2.3.5b1 → multipers-2.3.5b3}/multipers/multiparameter_module_approximation/euler_curves.h +0 -0
- {multipers-2.3.5b1 → multipers-2.3.5b3}/multipers/multiparameter_module_approximation/format_python-cpp.h +0 -0
- {multipers-2.3.5b1 → multipers-2.3.5b3}/multipers/multiparameter_module_approximation/heap_column.h +0 -0
- {multipers-2.3.5b1 → multipers-2.3.5b3}/multipers/multiparameter_module_approximation/images.h +0 -0
- {multipers-2.3.5b1 → multipers-2.3.5b3}/multipers/multiparameter_module_approximation/list_column.h +0 -0
- {multipers-2.3.5b1 → multipers-2.3.5b3}/multipers/multiparameter_module_approximation/list_column_2.h +0 -0
- {multipers-2.3.5b1 → multipers-2.3.5b3}/multipers/multiparameter_module_approximation/ru_matrix.h +0 -0
- {multipers-2.3.5b1 → multipers-2.3.5b3}/multipers/multiparameter_module_approximation/set_column.h +0 -0
- {multipers-2.3.5b1 → multipers-2.3.5b3}/multipers/multiparameter_module_approximation/structure_higher_dim_barcode.h +0 -0
- {multipers-2.3.5b1 → multipers-2.3.5b3}/multipers/multiparameter_module_approximation/unordered_set_column.h +0 -0
- {multipers-2.3.5b1 → multipers-2.3.5b3}/multipers/multiparameter_module_approximation/utilities.h +0 -0
- {multipers-2.3.5b1 → multipers-2.3.5b3}/multipers/multiparameter_module_approximation/vector_column.h +0 -0
- {multipers-2.3.5b1 → multipers-2.3.5b3}/multipers/multiparameter_module_approximation/vector_matrix.h +0 -0
- {multipers-2.3.5b1 → multipers-2.3.5b3}/multipers/multiparameter_module_approximation/vineyards.h +0 -0
- {multipers-2.3.5b1 → multipers-2.3.5b3}/multipers/multiparameter_module_approximation/vineyards_trajectories.h +0 -0
- {multipers-2.3.5b1 → multipers-2.3.5b3}/multipers/multiparameter_module_approximation.pyx +0 -0
- {multipers-2.3.5b1 → multipers-2.3.5b3}/multipers/pickle.py +0 -0
- {multipers-2.3.5b1 → multipers-2.3.5b3}/multipers/point_measure.pyx +0 -0
- {multipers-2.3.5b1 → multipers-2.3.5b3}/multipers/simplex_tree_multi.pxd +0 -0
- {multipers-2.3.5b1 → multipers-2.3.5b3}/multipers/simplex_tree_multi.pyx +0 -0
- {multipers-2.3.5b1 → multipers-2.3.5b3}/multipers/simplex_tree_multi.pyx.tp +0 -0
- {multipers-2.3.5b1 → multipers-2.3.5b3}/multipers/slicer.pxd +0 -0
- {multipers-2.3.5b1 → multipers-2.3.5b3}/multipers/slicer.pxd.tp +0 -0
- {multipers-2.3.5b1 → multipers-2.3.5b3}/multipers/tensor/tensor.h +0 -0
- {multipers-2.3.5b1 → multipers-2.3.5b3}/multipers/tensor.pxd +0 -0
- {multipers-2.3.5b1 → multipers-2.3.5b3}/multipers/test.pyx +0 -0
- {multipers-2.3.5b1 → multipers-2.3.5b3}/multipers/tests/__init__.py +0 -0
- {multipers-2.3.5b1 → multipers-2.3.5b3}/multipers/torch/__init__.py +0 -0
- {multipers-2.3.5b1 → multipers-2.3.5b3}/multipers/torch/diff_grids.py +0 -0
- {multipers-2.3.5b1 → multipers-2.3.5b3}/multipers/torch/rips_density.py +0 -0
- {multipers-2.3.5b1 → multipers-2.3.5b3}/multipers.egg-info/dependency_links.txt +0 -0
- {multipers-2.3.5b1 → multipers-2.3.5b3}/multipers.egg-info/requires.txt +0 -0
- {multipers-2.3.5b1 → multipers-2.3.5b3}/multipers.egg-info/top_level.txt +0 -0
- {multipers-2.3.5b1 → multipers-2.3.5b3}/setup.cfg +0 -0
- {multipers-2.3.5b1 → multipers-2.3.5b3}/setup.py +0 -0
- {multipers-2.3.5b1 → multipers-2.3.5b3}/tests/test_diff_helper.py +0 -0
- {multipers-2.3.5b1 → multipers-2.3.5b3}/tests/test_filtrations.py +0 -0
- {multipers-2.3.5b1 → multipers-2.3.5b3}/tests/test_grids.py +0 -0
- {multipers-2.3.5b1 → multipers-2.3.5b3}/tests/test_hilbert_function.py +0 -0
- {multipers-2.3.5b1 → multipers-2.3.5b3}/tests/test_mma.py +0 -0
- {multipers-2.3.5b1 → multipers-2.3.5b3}/tests/test_point_clouds.py +0 -0
- {multipers-2.3.5b1 → multipers-2.3.5b3}/tests/test_python-cpp_conversion.py +0 -0
- {multipers-2.3.5b1 → multipers-2.3.5b3}/tests/test_signed_betti.py +0 -0
- {multipers-2.3.5b1 → multipers-2.3.5b3}/tests/test_signed_measure.py +0 -0
- {multipers-2.3.5b1 → multipers-2.3.5b3}/tests/test_simplextreemulti.py +0 -0
- {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.
|
|
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
|
|
@@ -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")
|