Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
267 changes: 74 additions & 193 deletions docs/notebooks/ops/AIDA.ipynb

Large diffs are not rendered by default.

2 changes: 1 addition & 1 deletion ext/gudhi-devel
Submodule gudhi-devel updated 53 files
+4 −1 .github/next_release.md
+0 −1 .github/workflows/pip-build-osx.yml
+0 −1 .github/workflows/pip-packaging-osx.yml
+0 −3 azure-pipelines.yml
+6 −7 src/Alpha_complex/test/Weighted_alpha_complex_unit_test.cpp
+5 −6 src/Alpha_complex/test/Zero_weighted_alpha_complex_unit_test.h
+6 −16 src/Bitmap_cubical_complex/benchmark/bitmap_cubical_complex_benchmark.cpp
+3 −12 src/Bitmap_cubical_complex/example/Random_bitmap_cubical_complex.cpp
+9 −8 src/Bottleneck_distance/benchmark/bottleneck_chrono.cpp
+20 −21 src/Bottleneck_distance/test/bottleneck_unit_test.cpp
+4 −5 src/Coxeter_triangulation/include/gudhi/Functions/random_orthogonal_matrix.h
+4 −2 src/Multi_filtration/include/gudhi/Dynamic_multi_parameter_filtration.h
+1 −4 src/Multi_filtration/include/gudhi/Multi_filtration/multi_filtration_products.h
+3 −3 src/Multi_persistence/include/gudhi/Multi_persistence/Box.h
+98 −68 src/Multi_persistence/include/gudhi/Multi_persistence/Module.h
+5 −5 src/Multi_persistence/include/gudhi/Multi_persistence/Point.h
+3 −28 src/Multi_persistence/include/gudhi/Multi_persistence/Summand.h
+87 −65 src/Multi_persistence/include/gudhi/Multi_persistence/module_helpers.h
+28 −33 src/Multi_persistence/include/gudhi/Multi_persistence/summand_helpers.h
+2 −0 src/Multi_persistence/test/multipersistence_box_unit_test.cpp
+331 −7 src/Multi_persistence/test/multipersistence_module_unit_test.cpp
+2 −5 src/Multi_persistence/test/multipersistence_summand_unit_test.cpp
+4 −10 src/Nerve_GIC/include/gudhi/GIC.h
+3 −5 src/Persistence_representations/include/gudhi/Sliced_Wasserstein.h
+4 −18 src/Persistent_cohomology/benchmark/line.cpp
+3 −5 src/Persistent_cohomology/benchmark/persistence_2d.cpp
+0 −46 src/Simplex_tree/benchmark/random_simplices.h
+7 −5 src/Simplex_tree/benchmark/simplex_tree_cofaces_benchmark.cpp
+6 −4 src/Simplex_tree/benchmark/simplex_tree_dimension_simplex_range_benchmark.cpp
+20 −2 src/Simplex_tree/include/gudhi/Simplex_tree.h
+6 −7 src/Simplex_tree/test/simplex_tree_edge_expansion_unit_test.cpp
+37 −15 src/Simplex_tree/test/simplex_tree_serialization_unit_test.cpp
+4 −9 src/Subsampling/include/gudhi/choose_n_farthest_points.h
+5 −27 src/Subsampling/include/gudhi/pick_n_random_points.h
+4 −6 src/Subsampling/test/test_choose_n_farthest_points.cpp
+4 −8 src/Toplex_map/benchmark/benchmark_tm.cpp
+130 −0 src/common/include/gudhi/random.h
+19 −18 src/common/include/gudhi/random_point_generators.h
+2 −0 src/common/test/CMakeLists.txt
+187 −0 src/common/test/test_random.cpp
+15 −7 src/common/utilities/off_file_from_shape_generator.cpp
+3 −2 src/common/utilities/pointsetgenerator.md
+2 −2 src/python/doc/tangential_complex_user.rst
+2 −2 src/python/example/tangential_complex_plain_homology_from_off_file_example.py
+7 −7 src/python/gudhi/_tangential_complex.cc
+4 −2 src/python/gudhi/clustering/tomato.py
+15 −6 src/python/gudhi/tangential_complex.py
+12 −0 src/python/include/python_interfaces/Persistent_cohomology_interface.h
+11 −2 src/python/include/python_interfaces/numpy_utils.h
+1 −1 src/python/include/python_interfaces/points_utils.h
+42 −0 src/python/test/test_rips_complex.py
+16 −0 src/python/test/test_simplex_generators.py
+4 −4 src/python/test/test_tangential_complex.py
1,445 changes: 213 additions & 1,232 deletions multipers/_mma_nanobind.cpp

Large diffs are not rendered by default.

16 changes: 9 additions & 7 deletions multipers/_slicer_nanobind.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -32,8 +32,10 @@
#include "ext_interface/nanobind_registry_helpers.hpp"
#include "ext_interface/nanobind_registry_runtime.hpp"
#include "gudhi/Multi_parameter_filtered_complex.h"
#include "gudhi/Multi_persistence/Box.h"
#include "gudhi/slicer_conversion_core.hpp"
#include "gudhi/slicer_helpers.h"
#include "gudhi/Module_interface.h"
#include <python_interfaces/numpy_utils.h>
#include "multi_parameter_rank_invariant/hilbert_function.h"
#include "multi_parameter_rank_invariant/rank_invariant.h"
Expand Down Expand Up @@ -306,7 +308,7 @@ nb::tuple dim_barcode_to_tuple(const Barcode& barcode) {

template <typename Desc, typename Wrapper, typename Value>
nb::tuple compute_persistence_on_slices(Wrapper& self,
const nb::ndarray<const Value, nb::ndim<2>, nb::any_contig>& values,
const nb::ndarray<const Value, nb::ndim<2> >& values,
bool ignore_infinite_filtration_values) {
using Barcode = decltype(self.truc.template get_flat_barcode<true, Value, false>());
using Concrete = std::remove_reference_t<decltype(self.truc)>;
Expand All @@ -316,7 +318,7 @@ nb::tuple compute_persistence_on_slices(Wrapper& self,
throw nb::value_error("Expected one filtration value per generator.");
}
std::vector<Barcode> barcodes(num_slices);
Numpy_2d_span<Value> view(values);
Numpy_2d_span view(values);
{
nb::gil_scoped_release release;
if constexpr (Desc::is_vine) {
Expand Down Expand Up @@ -1900,7 +1902,7 @@ void bind_slicer_class(nb::module_& m, nb::list& available_slicers) {
.def(
"_compute_persistence_on_slices",
[](Wrapper& self,
nb::ndarray<const Value, nb::ndim<2>, nb::any_contig> values,
nb::ndarray<const Value, nb::ndim<2> > values,
bool ignore_infinite_filtration_values) -> nb::tuple {
return compute_persistence_on_slices<Desc>(self, values, ignore_infinite_filtration_values);
},
Expand Down Expand Up @@ -2112,7 +2114,7 @@ nb::tuple compute_rank_signed_measure_sparse(type_list<Ds...>,
}

template <typename Desc>
nb::object module_approximation_from_desc(typename Desc::wrapper& wrapper,
Gudhi::multi_persistence::Module_interface<double> module_approximation_from_desc(typename Desc::wrapper& wrapper,
const std::vector<double>& direction,
double max_error,
Gudhi::multi_persistence::Box<double> box,
Expand All @@ -2129,12 +2131,12 @@ nb::object module_approximation_from_desc(typename Desc::wrapper& wrapper,
mod = Gudhi::multiparameter::mma::multiparameter_module_approximation(
wrapper.truc, direction, max_error, box, threshold, complete, verbose, n_jobs);
}
return nb::cast(std::move(mod));
return {std::move(mod), box};
}
}

template <typename... Ds>
nb::object compute_module_approximation_from_slicer(type_list<Ds...>,
Gudhi::multi_persistence::Module_interface<double> compute_module_approximation_from_slicer(type_list<Ds...>,
nb::handle slicer,
const std::vector<double>& direction,
double max_error,
Expand All @@ -2146,7 +2148,7 @@ nb::object compute_module_approximation_from_slicer(type_list<Ds...>,
if (!has_slicer_template_id(slicer)) {
throw std::runtime_error("Unsupported slicer type for module approximation.");
}
return dispatch_slicer_by_template_id(template_id_of(slicer), [&]<typename D>() -> nb::object {
return dispatch_slicer_by_template_id(template_id_of(slicer), [&]<typename D>() -> Gudhi::multi_persistence::Module_interface<double> {
auto& wrapper = nb::cast<typename D::wrapper&>(slicer);
return module_approximation_from_desc<D>(wrapper, direction, max_error, box, threshold, complete, verbose, n_jobs);
});
Expand Down
50 changes: 25 additions & 25 deletions multipers/grids.py
Original file line number Diff line number Diff line change
Expand Up @@ -667,28 +667,28 @@ def _push_pts_to_lines(pts, basepoints, directions=None, api=None, return_coordi
return out, coordinates


def evaluate_mod_in_grid(mod, grid, box=None):
"""Given an MMA module, pushes it into the specified grid.
Useful for e.g., make it differentiable.

Input
-----
- mod: PyModule
- grid: Iterable of 1d array, for num_parameters
Ouput
-----
torch-compatible module in the format:
(num_degrees) x (num_interval of degree) x ((num_birth, num_parameter), (num_death, num_parameters))

"""
(birth_sizes, death_sizes), births, deaths = mod.to_flat_idx(grid)
births = evaluate_in_grid(births, grid)
deaths = evaluate_in_grid(deaths, grid)
api = api_from_tensors(births, deaths)
diff_mod = tuple(
zip(
api.split_with_sizes(births, birth_sizes.tolist()),
api.split_with_sizes(deaths, death_sizes.tolist()),
)
)
return diff_mod
# def evaluate_mod_in_grid(mod, grid, box=None):
# """Given an MMA module, pushes it into the specified grid.
# Useful for e.g., make it differentiable.

# Input
# -----
# - mod: PyModule
# - grid: Iterable of 1d array, for num_parameters
# Ouput
# -----
# torch-compatible module in the format:
# (num_degrees) x (num_interval of degree) x ((num_birth, num_parameter), (num_death, num_parameters))

# """
# (birth_sizes, death_sizes), births, deaths = mod.to_flat_idx(grid)
# births = evaluate_in_grid(births, grid)
# deaths = evaluate_in_grid(deaths, grid)
# api = api_from_tensors(births, deaths)
# diff_mod = tuple(
# zip(
# api.split_with_sizes(births, birth_sizes.tolist()),
# api.split_with_sizes(deaths, death_sizes.tolist()),
# )
# )
# return diff_mod
Loading
Loading