Skip to content

Commit 46b6414

Browse files
authored
Merge pull request #54 from hschreiber/update_from_gudhi
C++ files update
2 parents 7b12bb2 + 3314a61 commit 46b6414

File tree

63 files changed

+1282
-998
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

63 files changed

+1282
-998
lines changed

multipers/gudhi/Persistence_slices_interface.h

Lines changed: 62 additions & 51 deletions
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,8 @@
77
#include "gudhi/multi_simplex_tree_helpers.h"
88
#include "gudhi/persistence_matrix_options.h"
99
#include "gudhi/Multi_parameter_filtered_complex.h"
10-
#include "gudhi/Multi_persistence/Persistence_interface_matrix.h"
10+
#include "gudhi/Multi_persistence/Persistence_interface_vineyard.h"
11+
#include "gudhi/Multi_persistence/Persistence_interface_homology.h"
1112
#include "gudhi/Multi_persistence/Persistence_interface_cohomology.h"
1213
#include "gudhi/Dynamic_multi_parameter_filtration.h"
1314
#include "gudhi/Degree_rips_bifiltration.h"
@@ -39,26 +40,26 @@ enum Filtration_containers_strs : std::uint8_t {
3940

4041
using Available_columns = Gudhi::persistence_matrix::Column_types;
4142

42-
template <Gudhi::persistence_matrix::Column_types column_type = Gudhi::persistence_matrix::Column_types::INTRUSIVE_SET>
43-
struct Multi_persistence_options : Gudhi::persistence_matrix::Default_options<column_type, true> {
44-
using Index = std::uint32_t;
45-
static const bool has_matrix_maximal_dimension_access = false;
46-
static const bool has_column_pairings = true;
47-
static const bool has_vine_update = true;
48-
static const bool can_retrieve_representative_cycles = true;
49-
};
50-
51-
template <Gudhi::persistence_matrix::Column_types column_type = Gudhi::persistence_matrix::Column_types::INTRUSIVE_SET>
52-
struct Multi_persistence_Clement_options : Gudhi::persistence_matrix::Default_options<column_type, true> {
53-
using Index = std::uint32_t;
54-
static const bool has_matrix_maximal_dimension_access = false;
55-
static const bool has_column_pairings = true;
56-
static const bool has_vine_update = true;
57-
static const bool is_of_boundary_type = false;
58-
static const Gudhi::persistence_matrix::Column_indexation_types column_indexation_type =
59-
Gudhi::persistence_matrix::Column_indexation_types::POSITION;
60-
static const bool can_retrieve_representative_cycles = true;
61-
};
43+
// template <Gudhi::persistence_matrix::Column_types column_type = Gudhi::persistence_matrix::Column_types::INTRUSIVE_SET>
44+
// struct Multi_persistence_options : Gudhi::persistence_matrix::Default_options<column_type, true> {
45+
// using Index = std::uint32_t;
46+
// static const bool has_matrix_maximal_dimension_access = false;
47+
// static const bool has_column_pairings = true;
48+
// static const bool has_vine_update = true;
49+
// static const bool can_retrieve_representative_cycles = true;
50+
// };
51+
52+
// template <Gudhi::persistence_matrix::Column_types column_type = Gudhi::persistence_matrix::Column_types::INTRUSIVE_SET>
53+
// struct Multi_persistence_Clement_options : Gudhi::persistence_matrix::Default_options<column_type, true> {
54+
// using Index = std::uint32_t;
55+
// static const bool has_matrix_maximal_dimension_access = false;
56+
// static const bool has_column_pairings = true;
57+
// static const bool has_vine_update = true;
58+
// static const bool is_of_boundary_type = false;
59+
// static const Gudhi::persistence_matrix::Column_indexation_types column_indexation_type =
60+
// Gudhi::persistence_matrix::Column_indexation_types::POSITION;
61+
// static const bool can_retrieve_representative_cycles = true;
62+
// };
6263

6364
template <Gudhi::persistence_matrix::Column_types column_type = Gudhi::persistence_matrix::Column_types::INTRUSIVE_SET>
6465
struct No_vine_multi_persistence_options : Gudhi::persistence_matrix::Default_options<column_type, true> {
@@ -68,50 +69,61 @@ struct No_vine_multi_persistence_options : Gudhi::persistence_matrix::Default_op
6869
static const bool has_vine_update = false;
6970
};
7071

71-
template <Gudhi::persistence_matrix::Column_types column_type = Gudhi::persistence_matrix::Column_types::INTRUSIVE_SET,
72-
bool row_access = true>
73-
struct fix_presentation_options : Gudhi::persistence_matrix::Default_options<column_type, true> {
74-
using Index = std::uint32_t;
75-
static const bool has_row_access = row_access;
76-
static const bool has_map_column_container = false;
77-
static const bool has_removable_columns = false; // WARN : idx will change if map is not true
72+
// template <Gudhi::persistence_matrix::Column_types column_type = Gudhi::persistence_matrix::Column_types::INTRUSIVE_SET,
73+
// bool row_access = true>
74+
// struct fix_presentation_options : Gudhi::persistence_matrix::Default_options<column_type, true> {
75+
// using Index = std::uint32_t;
76+
// static const bool has_row_access = row_access;
77+
// static const bool has_map_column_container = false;
78+
// static const bool has_removable_columns = false; // WARN : idx will change if map is not true
79+
// };
80+
81+
template <Gudhi::persistence_matrix::Column_types col = Gudhi::persistence_matrix::Column_types::INTRUSIVE_SET>
82+
struct Multi_persistence_vineyard_ru_options : Gudhi::vineyard::Default_vineyard_options {
83+
static constexpr bool is_RU = true;
84+
static const Gudhi::persistence_matrix::Column_types column_type = col;
7885
};
7986

80-
template <Available_columns col>
81-
using BackendOptionsWithVine = Multi_persistence_options<col>;
87+
template <Gudhi::persistence_matrix::Column_types col = Gudhi::persistence_matrix::Column_types::INTRUSIVE_SET>
88+
struct Multi_persistence_vineyard_chain_options : Gudhi::vineyard::Default_vineyard_options {
89+
static constexpr bool is_RU = false;
90+
static const Gudhi::persistence_matrix::Column_types column_type = col;
91+
};
92+
93+
// template <Available_columns col>
94+
// using BackendOptionsWithVine = Multi_persistence_options<col>;
8295
template <Available_columns col>
8396
using BackendOptionsWithoutVine = No_vine_multi_persistence_options<col>;
8497

85-
template <Available_columns col>
86-
using ClementBackendOptionsWithVine = Multi_persistence_Clement_options<col>;
98+
// template <Available_columns col>
99+
// using ClementBackendOptionsWithVine = Multi_persistence_Clement_options<col>;
87100

88101
// using SimplicialStructure = Gudhi::multiparameter::truc_interface::SimplicialStructure;
89102
template <typename Filtration>
90103
using StructureStuff = Gudhi::multi_persistence::Multi_parameter_filtered_complex<Filtration>;
91104

92-
template <Available_columns col>
93-
using MatrixBackendNoVine = Gudhi::multi_persistence::Persistence_interface_matrix<BackendOptionsWithoutVine<col>>;
105+
template <Available_columns col, class Filtration>
106+
using MatrixBackendNoVine = Gudhi::multi_persistence::Persistence_interface_homology<BackendOptionsWithoutVine<col>, Filtration>;
94107

95108
template <Available_columns col>
96-
using MatrixBackendVine = Gudhi::multi_persistence::Persistence_interface_matrix<BackendOptionsWithVine<col>>;
109+
using MatrixBackendVine = Gudhi::multi_persistence::Persistence_interface_vineyard<Multi_persistence_vineyard_ru_options<col>>;
97110

98111
template <Available_columns col>
99-
using ClementMatrixBackendVine =
100-
Gudhi::multi_persistence::Persistence_interface_matrix<ClementBackendOptionsWithVine<col>>;
112+
using ClementMatrixBackendVine = Gudhi::multi_persistence::Persistence_interface_vineyard<Multi_persistence_vineyard_chain_options<col>>;
101113
template <typename Filtration>
102114
using GraphBackendVine = Gudhi::multiparameter::truc_interface::Persistence_backend_h0<StructureStuff<Filtration>>;
103115

104116
template <typename value_type = float>
105117
using Filtration_value = Gudhi::multi_filtration::Multi_parameter_filtration<value_type, false, true>;
106118

107-
template <Available_columns col = Available_columns::INTRUSIVE_SET>
108-
using SimplicialNoVineMatrixTruc = Gudhi::multi_persistence::Slicer<Filtration_value<>, MatrixBackendNoVine<col>>;
119+
template <class Filtration, Available_columns col = Available_columns::INTRUSIVE_SET>
120+
using SimplicialNoVineMatrixTruc = Gudhi::multi_persistence::Slicer<Filtration_value<>, MatrixBackendNoVine<col, Filtration>>;
109121

110122
template <Available_columns col = Available_columns::INTRUSIVE_SET>
111123
using GeneralVineTruc = Gudhi::multi_persistence::Slicer<Filtration_value<>, MatrixBackendVine<col>>;
112124

113-
template <Available_columns col = Available_columns::INTRUSIVE_SET>
114-
using GeneralNoVineTruc = Gudhi::multi_persistence::Slicer<Filtration_value<>, MatrixBackendNoVine<col>>;
125+
template <class Filtration, Available_columns col = Available_columns::INTRUSIVE_SET>
126+
using GeneralNoVineTruc = Gudhi::multi_persistence::Slicer<Filtration_value<>, MatrixBackendNoVine<col, Filtration>>;
115127

116128
template <Available_columns col = Available_columns::INTRUSIVE_SET>
117129
using GeneralVineClementTruc = Gudhi::multi_persistence::Slicer<Filtration_value<>, ClementMatrixBackendVine<col>>;
@@ -128,8 +140,8 @@ using Multi_critical_filtration_value = Gudhi::multi_filtration::Multi_parameter
128140
template <Available_columns col = Available_columns::INTRUSIVE_SET>
129141
using KCriticalVineTruc = Gudhi::multi_persistence::Slicer<Multi_critical_filtration_value<>, MatrixBackendVine<col>>;
130142

131-
template <bool is_vine, Available_columns col = Available_columns::INTRUSIVE_SET>
132-
using Matrix_interface = std::conditional_t<is_vine, MatrixBackendVine<col>, MatrixBackendNoVine<col>>;
143+
template <bool is_vine, class Filtration, Available_columns col = Available_columns::INTRUSIVE_SET>
144+
using Matrix_interface = std::conditional_t<is_vine, MatrixBackendVine<col>, MatrixBackendNoVine<col, Filtration>>;
133145

134146
template <Filtration_containers_strs fil_container, bool is_k_critical, typename value_type>
135147
using filtration_options = std::conditional_t<fil_container == Filtration_containers_strs::Dynamic_multi_parameter_filtration,
@@ -138,13 +150,12 @@ using filtration_options = std::conditional_t<fil_container == Filtration_contai
138150
Gudhi::multi_filtration::Multi_parameter_filtration<value_type, false, !is_k_critical>,
139151
Gudhi::multi_filtration::Degree_rips_bifiltration<value_type, false, !is_k_critical>>>;
140152

141-
template <bool is_vine,
142-
bool is_k_critical,
143-
typename value_type,
144-
Available_columns col = Available_columns::INTRUSIVE_SET,
145-
Filtration_containers_strs filt_cont = Filtration_containers_strs::Multi_parameter_filtration>
146-
using MatrixTrucPythonInterface =
147-
Gudhi::multi_persistence::Slicer<filtration_options<filt_cont,is_k_critical, value_type>, Matrix_interface<is_vine, col>>;
153+
// template <bool is_vine,
154+
// bool is_k_critical,
155+
// typename value_type,
156+
// Available_columns col = Available_columns::INTRUSIVE_SET,
157+
// Filtration_containers_strs filt_cont = Filtration_containers_strs::Multi_parameter_filtration>
158+
// using MatrixTrucPythonInterface = Gudhi::multi_persistence::Slicer<filtration_options<filt_cont,is_k_critical, value_type>, Matrix_interface<is_vine, Filtration, col>>;
148159

149160
enum class BackendsEnum : std::uint8_t { Matrix, Graph, Clement, GudhiCohomology };
150161

@@ -154,7 +165,7 @@ struct PersBackendOptsImpl;
154165

155166
template <bool is_vine, Available_columns col, typename Filtration>
156167
struct PersBackendOptsImpl<BackendsEnum::Matrix, is_vine, col, Filtration> {
157-
using type = Matrix_interface<is_vine, col>;
168+
using type = Matrix_interface<is_vine, Filtration, col>;
158169
};
159170

160171
template <bool is_vine, Available_columns col, typename Filtration>

multipers/gudhi/gudhi/Degree_rips_bifiltration.h

Lines changed: 10 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -31,13 +31,16 @@
3131
#include <vector>
3232
#include <initializer_list>
3333

34+
#ifdef GUDHI_USE_TBB
35+
#include <oneapi/tbb/parallel_for.h>
36+
#endif
37+
3438
#include <gudhi/Debug_utils.h>
3539
#include <gudhi/simple_mdspan.h>
3640
#include <gudhi/Multi_filtration/multi_filtration_utils.h>
3741
#include <gudhi/Simplex_tree/filtration_value_utils.h>
3842
#include <gudhi/Multi_parameter_filtration.h>
3943
#include <gudhi/Dynamic_multi_parameter_filtration.h>
40-
#include <oneapi/tbb/concurrent_vector.h>
4144

4245
namespace Gudhi::multi_filtration {
4346

@@ -1708,7 +1711,8 @@ class Degree_rips_bifiltration
17081711

17091712
GUDHI_CHECK_code(const OneDimArray &indices = grid[1]);
17101713
const OneDimArray &values = grid[0];
1711-
auto todo = [&](size_type g) {
1714+
1715+
auto project_generator = [&](size_type g) {
17121716
GUDHI_CHECK_code(GUDHI_CHECK(static_cast<size_type>(indices[g]) == g, std::invalid_argument("Unvalid grid.")));
17131717

17141718
auto v = static_cast<typename OneDimArray::value_type>(generators_[g]);
@@ -1718,11 +1722,12 @@ class Degree_rips_bifiltration
17181722
}
17191723
generators_[g] = coordinate ? static_cast<T>(d) : static_cast<T>(values[d]);
17201724
};
1725+
17211726
#ifdef GUDHI_USE_TBB
1722-
tbb::parallel_for(size_type{0}, num_generators(), [&](size_type g) { todo(g); });
1727+
tbb::parallel_for(size_type(0), num_generators(), project_generator);
17231728
#else
17241729
for (size_type g = 0; g < num_generators(); ++g) {
1725-
todo(g);
1730+
project_generator(g);
17261731
}
17271732
#endif
17281733
}
@@ -1842,9 +1847,7 @@ class Degree_rips_bifiltration
18421847

18431848
#ifdef GUDHI_USE_TBB
18441849
std::vector<U> projections(f.num_generators());
1845-
tbb::parallel_for(size_type{0}, f.num_generators(), [&](size_type g) {
1846-
projections[g] = project_generator(g);
1847-
});
1850+
tbb::parallel_for(size_type{0}, f.num_generators(), [&](size_type g) { projections[g] = project_generator(g); });
18481851
if constexpr (Co) {
18491852
return *std::max_element(projections.begin(), projections.end());
18501853
} else {

multipers/gudhi/gudhi/Dynamic_multi_parameter_filtration.h

Lines changed: 18 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -31,10 +31,13 @@
3131
#include <vector>
3232
#include <initializer_list>
3333

34+
#ifdef GUDHI_USE_TBB
35+
#include <oneapi/tbb/parallel_for.h>
36+
#endif
37+
3438
#include <gudhi/Debug_utils.h>
3539
#include <gudhi/Multi_filtration/Multi_parameter_generator.h>
3640
#include <gudhi/Multi_filtration/multi_filtration_utils.h>
37-
#include <oneapi/tbb/parallel_for.h>
3841

3942
namespace Gudhi::multi_filtration {
4043

@@ -1856,9 +1859,8 @@ class Dynamic_multi_parameter_filtration
18561859
std::invalid_argument("The grid should not be smaller than the number of parameters in the filtration value."));
18571860

18581861
#ifdef GUDHI_USE_TBB
1859-
tbb::parallel_for(size_type(0), num_generators(), [&](size_type i){
1860-
generators_[i].project_onto_grid(grid, coordinate);
1861-
});
1862+
tbb::parallel_for(
1863+
size_type(0), num_generators(), [&](size_type i) { generators_[i].project_onto_grid(grid, coordinate); });
18621864
#else
18631865
for (Generator &g : generators_) {
18641866
g.project_onto_grid(grid, coordinate);
@@ -1946,6 +1948,17 @@ class Dynamic_multi_parameter_filtration
19461948
{
19471949
if (f.num_generators() == 1) return compute_linear_projection(f.generators_[0], x);
19481950

1951+
#ifdef GUDHI_USE_TBB
1952+
std::vector<U> projections(f.num_generators());
1953+
tbb::parallel_for(size_type{0}, f.num_generators(), [&](size_type g) {
1954+
projections[g] = compute_linear_projection(f.generators_[g], x);
1955+
});
1956+
if constexpr (Co) {
1957+
return *std::max_element(projections.begin(), projections.end());
1958+
} else {
1959+
return *std::min_element(projections.begin(), projections.end());
1960+
}
1961+
#else
19491962
if constexpr (Co) {
19501963
U projection = std::numeric_limits<U>::lowest();
19511964
for (const Generator &g : f.generators_) {
@@ -1961,6 +1974,7 @@ class Dynamic_multi_parameter_filtration
19611974
}
19621975
return projection;
19631976
}
1977+
#endif
19641978
}
19651979

19661980
/**

multipers/gudhi/gudhi/Fields/Multi_field.h

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@
22
* See file LICENSE or go to https://gudhi.inria.fr/licensing/ for full license details.
33
* Author(s): Hannah Schreiber, Clément Maria
44
*
5-
* Copyright (C) 2022-24 Inria
5+
* Copyright (C) 2022 Inria
66
*
77
* Modification(s):
88
* - YYYY/MM Author: Description of the modification
@@ -305,7 +305,8 @@ class Multi_field_element
305305
const Characteristic& productOfCharacteristics) const
306306
{
307307
GUDHI_CHECK(productOfCharacteristics >= 0 && productOfCharacteristics <= productOfAllCharacteristics_,
308-
"The given product is not the product of a subset of the current Multi-field characteristics.");
308+
std::invalid_argument(
309+
"The given product is not the product of a subset of the current Multi-field characteristics."));
309310

310311
Characteristic QR;
311312
mpz_gcd(QR.get_mpz_t(), element_.get_mpz_t(), productOfCharacteristics.get_mpz_t()); // QR <- gcd(x,QS)
@@ -350,7 +351,8 @@ class Multi_field_element
350351
static Multi_field_element get_partial_multiplicative_identity(const Characteristic& productOfCharacteristics)
351352
{
352353
GUDHI_CHECK(productOfCharacteristics >= 0 && productOfCharacteristics <= productOfAllCharacteristics_,
353-
"The given product is not the product of a subset of the current Multi-field characteristics.");
354+
std::invalid_argument(
355+
"The given product is not the product of a subset of the current Multi-field characteristics."));
354356

355357
if (productOfCharacteristics == 0 || productOfCharacteristics == productOfAllCharacteristics_) {
356358
return get_multiplicative_identity();

multipers/gudhi/gudhi/Fields/Multi_field_operators.h

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@
22
* See file LICENSE or go to https://gudhi.inria.fr/licensing/ for full license details.
33
* Author(s): Hannah Schreiber, Clément Maria
44
*
5-
* Copyright (C) 2022-24 Inria
5+
* Copyright (C) 2022 Inria
66
*
77
* Modification(s):
88
* - YYYY/MM Author: Description of the modification
@@ -366,7 +366,8 @@ class Multi_field_operators
366366
const Characteristic& productOfCharacteristics) const
367367
{
368368
GUDHI_CHECK(productOfCharacteristics >= 0 && productOfCharacteristics <= productOfAllCharacteristics_,
369-
"The given product is not the product of a subset of the current Multi-field characteristics.");
369+
std::invalid_argument(
370+
"The given product is not the product of a subset of the current Multi-field characteristics."));
370371

371372
Characteristic QR;
372373
mpz_gcd(QR.get_mpz_t(), e.get_mpz_t(), productOfCharacteristics.get_mpz_t()); // QR <- gcd(x,QS)
@@ -409,7 +410,8 @@ class Multi_field_operators
409410
[[nodiscard]] Element get_partial_multiplicative_identity(const Characteristic& productOfCharacteristics) const
410411
{
411412
GUDHI_CHECK(productOfCharacteristics >= 0 && productOfCharacteristics <= productOfAllCharacteristics_,
412-
"The given product is not the product of a subset of the current Multi-field characteristics.");
413+
std::invalid_argument(
414+
"The given product is not the product of a subset of the current Multi-field characteristics."));
413415

414416
if (productOfCharacteristics == nullCharacteristic || productOfCharacteristics == productOfAllCharacteristics_) {
415417
return get_multiplicative_identity();

multipers/gudhi/gudhi/Fields/Multi_field_shared.h

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@
22
* See file LICENSE or go to https://gudhi.inria.fr/licensing/ for full license details.
33
* Author(s): Hannah Schreiber, Clément Maria
44
*
5-
* Copyright (C) 2022-24 Inria
5+
* Copyright (C) 2022 Inria
66
*
77
* Modification(s):
88
* - YYYY/MM Author: Description of the modification
@@ -347,7 +347,8 @@ class Shared_multi_field_element
347347
const Characteristic& productOfCharacteristics) const
348348
{
349349
GUDHI_CHECK(productOfCharacteristics >= 0 && productOfCharacteristics <= productOfAllCharacteristics_,
350-
"The given product is not the product of a subset of the current Multi-field characteristics.");
350+
std::invalid_argument(
351+
"The given product is not the product of a subset of the current Multi-field characteristics."));
351352

352353
Element QR;
353354
mpz_gcd(QR.get_mpz_t(), element_.get_mpz_t(), productOfCharacteristics.get_mpz_t()); // QR <- gcd(x,QS)
@@ -390,7 +391,8 @@ class Shared_multi_field_element
390391
static Shared_multi_field_element get_partial_multiplicative_identity(const Characteristic& productOfCharacteristics)
391392
{
392393
GUDHI_CHECK(productOfCharacteristics >= 0 && productOfCharacteristics <= productOfAllCharacteristics_,
393-
"The given product is not the product of a subset of the current Multi-field characteristics.");
394+
std::invalid_argument(
395+
"The given product is not the product of a subset of the current Multi-field characteristics."));
394396

395397
if (productOfCharacteristics == 0 || productOfCharacteristics == productOfAllCharacteristics_) {
396398
return get_multiplicative_identity();

0 commit comments

Comments
 (0)