multipers 2.2.3__cp310-cp310-win_amd64.whl → 2.3.1__cp310-cp310-win_amd64.whl
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/__init__.py +33 -31
- multipers/_signed_measure_meta.py +430 -430
- multipers/_slicer_meta.py +211 -212
- multipers/data/MOL2.py +458 -458
- multipers/data/UCR.py +18 -18
- multipers/data/graphs.py +466 -466
- multipers/data/immuno_regions.py +27 -27
- multipers/data/pytorch2simplextree.py +90 -90
- multipers/data/shape3d.py +101 -101
- multipers/data/synthetic.py +113 -111
- multipers/distances.py +198 -198
- multipers/filtration_conversions.pxd.tp +84 -84
- multipers/filtrations/__init__.py +18 -0
- multipers/{ml/convolutions.py → filtrations/density.py} +563 -520
- multipers/filtrations/filtrations.py +289 -0
- multipers/filtrations.pxd +224 -224
- multipers/function_rips.cp310-win_amd64.pyd +0 -0
- multipers/function_rips.pyx +105 -105
- multipers/grids.cp310-win_amd64.pyd +0 -0
- multipers/grids.pyx +350 -350
- multipers/gudhi/Persistence_slices_interface.h +132 -132
- multipers/gudhi/Simplex_tree_interface.h +239 -245
- multipers/gudhi/Simplex_tree_multi_interface.h +516 -561
- multipers/gudhi/cubical_to_boundary.h +59 -59
- multipers/gudhi/gudhi/Bitmap_cubical_complex.h +450 -450
- multipers/gudhi/gudhi/Bitmap_cubical_complex_base.h +1070 -1070
- multipers/gudhi/gudhi/Bitmap_cubical_complex_periodic_boundary_conditions_base.h +579 -579
- multipers/gudhi/gudhi/Debug_utils.h +45 -45
- multipers/gudhi/gudhi/Fields/Multi_field.h +484 -484
- multipers/gudhi/gudhi/Fields/Multi_field_operators.h +455 -455
- multipers/gudhi/gudhi/Fields/Multi_field_shared.h +450 -450
- multipers/gudhi/gudhi/Fields/Multi_field_small.h +531 -531
- multipers/gudhi/gudhi/Fields/Multi_field_small_operators.h +507 -507
- multipers/gudhi/gudhi/Fields/Multi_field_small_shared.h +531 -531
- multipers/gudhi/gudhi/Fields/Z2_field.h +355 -355
- multipers/gudhi/gudhi/Fields/Z2_field_operators.h +376 -376
- multipers/gudhi/gudhi/Fields/Zp_field.h +420 -420
- multipers/gudhi/gudhi/Fields/Zp_field_operators.h +400 -400
- multipers/gudhi/gudhi/Fields/Zp_field_shared.h +418 -418
- multipers/gudhi/gudhi/Flag_complex_edge_collapser.h +337 -337
- multipers/gudhi/gudhi/Matrix.h +2107 -2107
- multipers/gudhi/gudhi/Multi_critical_filtration.h +1038 -1038
- multipers/gudhi/gudhi/Multi_persistence/Box.h +171 -171
- multipers/gudhi/gudhi/Multi_persistence/Line.h +282 -282
- multipers/gudhi/gudhi/Off_reader.h +173 -173
- multipers/gudhi/gudhi/One_critical_filtration.h +1433 -1431
- multipers/gudhi/gudhi/Persistence_matrix/Base_matrix.h +769 -769
- multipers/gudhi/gudhi/Persistence_matrix/Base_matrix_with_column_compression.h +686 -686
- multipers/gudhi/gudhi/Persistence_matrix/Boundary_matrix.h +842 -842
- multipers/gudhi/gudhi/Persistence_matrix/Chain_matrix.h +1350 -1350
- multipers/gudhi/gudhi/Persistence_matrix/Id_to_index_overlay.h +1105 -1105
- multipers/gudhi/gudhi/Persistence_matrix/Position_to_index_overlay.h +859 -859
- multipers/gudhi/gudhi/Persistence_matrix/RU_matrix.h +910 -910
- multipers/gudhi/gudhi/Persistence_matrix/allocators/entry_constructors.h +139 -139
- multipers/gudhi/gudhi/Persistence_matrix/base_pairing.h +230 -230
- multipers/gudhi/gudhi/Persistence_matrix/base_swap.h +211 -211
- multipers/gudhi/gudhi/Persistence_matrix/boundary_cell_position_to_id_mapper.h +60 -60
- multipers/gudhi/gudhi/Persistence_matrix/boundary_face_position_to_id_mapper.h +60 -60
- multipers/gudhi/gudhi/Persistence_matrix/chain_pairing.h +136 -136
- multipers/gudhi/gudhi/Persistence_matrix/chain_rep_cycles.h +190 -190
- multipers/gudhi/gudhi/Persistence_matrix/chain_vine_swap.h +616 -616
- multipers/gudhi/gudhi/Persistence_matrix/columns/chain_column_extra_properties.h +150 -150
- multipers/gudhi/gudhi/Persistence_matrix/columns/column_dimension_holder.h +106 -106
- multipers/gudhi/gudhi/Persistence_matrix/columns/column_utilities.h +219 -219
- multipers/gudhi/gudhi/Persistence_matrix/columns/entry_types.h +327 -327
- multipers/gudhi/gudhi/Persistence_matrix/columns/heap_column.h +1140 -1140
- multipers/gudhi/gudhi/Persistence_matrix/columns/intrusive_list_column.h +934 -934
- multipers/gudhi/gudhi/Persistence_matrix/columns/intrusive_set_column.h +934 -934
- multipers/gudhi/gudhi/Persistence_matrix/columns/list_column.h +980 -980
- multipers/gudhi/gudhi/Persistence_matrix/columns/naive_vector_column.h +1092 -1092
- multipers/gudhi/gudhi/Persistence_matrix/columns/row_access.h +192 -192
- multipers/gudhi/gudhi/Persistence_matrix/columns/set_column.h +921 -921
- multipers/gudhi/gudhi/Persistence_matrix/columns/small_vector_column.h +1093 -1093
- multipers/gudhi/gudhi/Persistence_matrix/columns/unordered_set_column.h +1012 -1012
- multipers/gudhi/gudhi/Persistence_matrix/columns/vector_column.h +1244 -1244
- multipers/gudhi/gudhi/Persistence_matrix/matrix_dimension_holders.h +186 -186
- multipers/gudhi/gudhi/Persistence_matrix/matrix_row_access.h +164 -164
- multipers/gudhi/gudhi/Persistence_matrix/ru_pairing.h +156 -156
- multipers/gudhi/gudhi/Persistence_matrix/ru_rep_cycles.h +376 -376
- multipers/gudhi/gudhi/Persistence_matrix/ru_vine_swap.h +540 -540
- multipers/gudhi/gudhi/Persistent_cohomology/Field_Zp.h +118 -118
- multipers/gudhi/gudhi/Persistent_cohomology/Multi_field.h +173 -173
- multipers/gudhi/gudhi/Persistent_cohomology/Persistent_cohomology_column.h +128 -128
- multipers/gudhi/gudhi/Persistent_cohomology.h +745 -745
- multipers/gudhi/gudhi/Points_off_io.h +171 -171
- multipers/gudhi/gudhi/Simple_object_pool.h +69 -69
- multipers/gudhi/gudhi/Simplex_tree/Simplex_tree_iterators.h +463 -463
- multipers/gudhi/gudhi/Simplex_tree/Simplex_tree_node_explicit_storage.h +83 -83
- multipers/gudhi/gudhi/Simplex_tree/Simplex_tree_siblings.h +106 -106
- multipers/gudhi/gudhi/Simplex_tree/Simplex_tree_star_simplex_iterators.h +277 -277
- multipers/gudhi/gudhi/Simplex_tree/hooks_simplex_base.h +62 -62
- multipers/gudhi/gudhi/Simplex_tree/indexing_tag.h +27 -27
- multipers/gudhi/gudhi/Simplex_tree/serialization_utils.h +62 -62
- multipers/gudhi/gudhi/Simplex_tree/simplex_tree_options.h +157 -157
- multipers/gudhi/gudhi/Simplex_tree.h +2794 -2794
- multipers/gudhi/gudhi/Simplex_tree_multi.h +152 -163
- multipers/gudhi/gudhi/distance_functions.h +62 -62
- multipers/gudhi/gudhi/graph_simplicial_complex.h +104 -104
- multipers/gudhi/gudhi/persistence_interval.h +253 -253
- multipers/gudhi/gudhi/persistence_matrix_options.h +170 -170
- multipers/gudhi/gudhi/reader_utils.h +367 -367
- multipers/gudhi/mma_interface_coh.h +256 -255
- multipers/gudhi/mma_interface_h0.h +223 -231
- multipers/gudhi/mma_interface_matrix.h +291 -282
- multipers/gudhi/naive_merge_tree.h +536 -575
- multipers/gudhi/scc_io.h +310 -289
- multipers/gudhi/truc.h +957 -888
- multipers/io.cp310-win_amd64.pyd +0 -0
- multipers/io.pyx +714 -711
- multipers/ml/accuracies.py +90 -90
- multipers/ml/invariants_with_persistable.py +79 -79
- multipers/ml/kernels.py +176 -176
- multipers/ml/mma.py +713 -714
- multipers/ml/one.py +472 -472
- multipers/ml/point_clouds.py +352 -346
- multipers/ml/signed_measures.py +1589 -1589
- multipers/ml/sliced_wasserstein.py +461 -461
- multipers/ml/tools.py +113 -113
- multipers/mma_structures.cp310-win_amd64.pyd +0 -0
- multipers/mma_structures.pxd +127 -127
- multipers/mma_structures.pyx +4 -8
- multipers/mma_structures.pyx.tp +1083 -1085
- multipers/multi_parameter_rank_invariant/diff_helpers.h +84 -93
- multipers/multi_parameter_rank_invariant/euler_characteristic.h +97 -97
- multipers/multi_parameter_rank_invariant/function_rips.h +322 -322
- multipers/multi_parameter_rank_invariant/hilbert_function.h +769 -769
- multipers/multi_parameter_rank_invariant/persistence_slices.h +148 -148
- multipers/multi_parameter_rank_invariant/rank_invariant.h +369 -369
- multipers/multiparameter_edge_collapse.py +41 -41
- multipers/multiparameter_module_approximation/approximation.h +2298 -2295
- multipers/multiparameter_module_approximation/combinatory.h +129 -129
- multipers/multiparameter_module_approximation/debug.h +107 -107
- multipers/multiparameter_module_approximation/format_python-cpp.h +286 -286
- multipers/multiparameter_module_approximation/heap_column.h +238 -238
- multipers/multiparameter_module_approximation/images.h +79 -79
- multipers/multiparameter_module_approximation/list_column.h +174 -174
- multipers/multiparameter_module_approximation/list_column_2.h +232 -232
- multipers/multiparameter_module_approximation/ru_matrix.h +347 -347
- multipers/multiparameter_module_approximation/set_column.h +135 -135
- multipers/multiparameter_module_approximation/structure_higher_dim_barcode.h +36 -36
- multipers/multiparameter_module_approximation/unordered_set_column.h +166 -166
- multipers/multiparameter_module_approximation/utilities.h +403 -419
- multipers/multiparameter_module_approximation/vector_column.h +223 -223
- multipers/multiparameter_module_approximation/vector_matrix.h +331 -331
- multipers/multiparameter_module_approximation/vineyards.h +464 -464
- multipers/multiparameter_module_approximation/vineyards_trajectories.h +649 -649
- multipers/multiparameter_module_approximation.cp310-win_amd64.pyd +0 -0
- multipers/multiparameter_module_approximation.pyx +218 -217
- multipers/pickle.py +90 -53
- multipers/plots.py +342 -334
- multipers/point_measure.cp310-win_amd64.pyd +0 -0
- multipers/point_measure.pyx +322 -320
- multipers/simplex_tree_multi.cp310-win_amd64.pyd +0 -0
- multipers/simplex_tree_multi.pxd +133 -133
- multipers/simplex_tree_multi.pyx +115 -48
- multipers/simplex_tree_multi.pyx.tp +1947 -1935
- multipers/slicer.cp310-win_amd64.pyd +0 -0
- multipers/slicer.pxd +301 -120
- multipers/slicer.pxd.tp +218 -214
- multipers/slicer.pyx +1570 -507
- multipers/slicer.pyx.tp +931 -914
- multipers/tensor/tensor.h +672 -672
- multipers/tensor.pxd +13 -13
- multipers/test.pyx +44 -44
- multipers/tests/__init__.py +57 -57
- multipers/torch/diff_grids.py +217 -217
- multipers/torch/rips_density.py +310 -304
- {multipers-2.2.3.dist-info → multipers-2.3.1.dist-info}/LICENSE +21 -21
- {multipers-2.2.3.dist-info → multipers-2.3.1.dist-info}/METADATA +21 -11
- multipers-2.3.1.dist-info/RECORD +182 -0
- {multipers-2.2.3.dist-info → multipers-2.3.1.dist-info}/WHEEL +1 -1
- multipers/tests/test_diff_helper.py +0 -73
- multipers/tests/test_hilbert_function.py +0 -82
- multipers/tests/test_mma.py +0 -83
- multipers/tests/test_point_clouds.py +0 -49
- multipers/tests/test_python-cpp_conversion.py +0 -82
- multipers/tests/test_signed_betti.py +0 -181
- multipers/tests/test_signed_measure.py +0 -89
- multipers/tests/test_simplextreemulti.py +0 -221
- multipers/tests/test_slicer.py +0 -221
- multipers-2.2.3.dist-info/RECORD +0 -189
- {multipers-2.2.3.dist-info → multipers-2.3.1.dist-info}/top_level.txt +0 -0
|
@@ -1,118 +1,118 @@
|
|
|
1
|
-
/* This file is part of the Gudhi Library - https://gudhi.inria.fr/ - which is released under MIT.
|
|
2
|
-
* See file LICENSE or go to https://gudhi.inria.fr/licensing/ for full license details.
|
|
3
|
-
* Author(s): Clément Maria
|
|
4
|
-
*
|
|
5
|
-
* Copyright (C) 2014 Inria
|
|
6
|
-
*
|
|
7
|
-
* Modification(s):
|
|
8
|
-
* - YYYY/MM Author: Description of the modification
|
|
9
|
-
*/
|
|
10
|
-
|
|
11
|
-
#ifndef PERSISTENT_COHOMOLOGY_FIELD_ZP_H_
|
|
12
|
-
#define PERSISTENT_COHOMOLOGY_FIELD_ZP_H_
|
|
13
|
-
|
|
14
|
-
#include <utility>
|
|
15
|
-
#include <vector>
|
|
16
|
-
#include <stdexcept>
|
|
17
|
-
|
|
18
|
-
namespace Gudhi {
|
|
19
|
-
|
|
20
|
-
namespace persistent_cohomology {
|
|
21
|
-
|
|
22
|
-
/** \brief Structure representing the coefficient field \f$\mathbb{Z}/p\mathbb{Z}\f$
|
|
23
|
-
*
|
|
24
|
-
* \implements CoefficientField
|
|
25
|
-
* \ingroup persistent_cohomology
|
|
26
|
-
*/
|
|
27
|
-
class Field_Zp {
|
|
28
|
-
public:
|
|
29
|
-
typedef int Element;
|
|
30
|
-
|
|
31
|
-
Field_Zp()
|
|
32
|
-
: Prime(0),
|
|
33
|
-
inverse_() {
|
|
34
|
-
}
|
|
35
|
-
|
|
36
|
-
void init(int charac) {
|
|
37
|
-
Prime = charac;
|
|
38
|
-
|
|
39
|
-
// Check that the provided prime is less than the maximum allowed as int, calculation below, and 'plus_times_equal' function : 46337 ; i.e (max_prime-1)*max_prime <= INT_MAX
|
|
40
|
-
if(Prime > 46337)
|
|
41
|
-
throw std::invalid_argument("Maximum homology_coeff_field allowed value is 46337");
|
|
42
|
-
|
|
43
|
-
// Check for primality
|
|
44
|
-
if (Prime <= 1)
|
|
45
|
-
throw std::invalid_argument("homology_coeff_field must be a prime number");
|
|
46
|
-
|
|
47
|
-
inverse_.clear();
|
|
48
|
-
inverse_.reserve(charac);
|
|
49
|
-
inverse_.push_back(0);
|
|
50
|
-
for (int i = 1; i < Prime; ++i) {
|
|
51
|
-
int inv = 1;
|
|
52
|
-
int mult = inv * i;
|
|
53
|
-
while ( (mult % Prime) != 1) {
|
|
54
|
-
++inv;
|
|
55
|
-
if(mult == Prime)
|
|
56
|
-
throw std::invalid_argument("homology_coeff_field must be a prime number");
|
|
57
|
-
mult = inv * i;
|
|
58
|
-
}
|
|
59
|
-
inverse_.push_back(inv);
|
|
60
|
-
}
|
|
61
|
-
}
|
|
62
|
-
|
|
63
|
-
/** Set x <- x + w * y*/
|
|
64
|
-
Element plus_times_equal(const Element& x, const Element& y, const Element& w) {
|
|
65
|
-
assert(Prime > 0); // division by zero + non negative values
|
|
66
|
-
Element result = (x + w * y) % Prime;
|
|
67
|
-
if (result < 0)
|
|
68
|
-
result += Prime;
|
|
69
|
-
return result;
|
|
70
|
-
}
|
|
71
|
-
|
|
72
|
-
// operator= defined on Element
|
|
73
|
-
|
|
74
|
-
/** Returns y * w */
|
|
75
|
-
Element times(const Element& y, const Element& w) {
|
|
76
|
-
return plus_times_equal(0, y, (Element)w);
|
|
77
|
-
}
|
|
78
|
-
|
|
79
|
-
Element plus_equal(const Element& x, const Element& y) {
|
|
80
|
-
return plus_times_equal(x, y, (Element)1);
|
|
81
|
-
}
|
|
82
|
-
|
|
83
|
-
/** \brief Returns the additive idendity \f$0_{\Bbbk}\f$ of the field.*/
|
|
84
|
-
Element additive_identity() const {
|
|
85
|
-
return 0;
|
|
86
|
-
}
|
|
87
|
-
/** \brief Returns the multiplicative identity \f$1_{\Bbbk}\f$ of the field.*/
|
|
88
|
-
Element multiplicative_identity(Element = 0) const {
|
|
89
|
-
return 1;
|
|
90
|
-
}
|
|
91
|
-
/** Returns the inverse in the field. Modifies P. ??? */
|
|
92
|
-
std::pair<Element, Element> inverse(Element x, Element P) {
|
|
93
|
-
return std::pair<Element, Element>(inverse_[x], P);
|
|
94
|
-
} // <------ return the product of field characteristic for which x is invertible
|
|
95
|
-
|
|
96
|
-
/** Returns -x * y.*/
|
|
97
|
-
Element times_minus(Element x, Element y) {
|
|
98
|
-
assert(Prime > 0); // division by zero + non negative values
|
|
99
|
-
Element out = (-x * y) % Prime;
|
|
100
|
-
return (out < 0) ? out + Prime : out;
|
|
101
|
-
}
|
|
102
|
-
|
|
103
|
-
/** \brief Returns the characteristic \f$p\f$ of the field.*/
|
|
104
|
-
int characteristic() const {
|
|
105
|
-
return Prime;
|
|
106
|
-
}
|
|
107
|
-
|
|
108
|
-
private:
|
|
109
|
-
int Prime;
|
|
110
|
-
/** Property map Element -> Element, which associate to an element its inverse in the field.*/
|
|
111
|
-
std::vector<Element> inverse_;
|
|
112
|
-
};
|
|
113
|
-
|
|
114
|
-
} // namespace persistent_cohomology
|
|
115
|
-
|
|
116
|
-
} // namespace Gudhi
|
|
117
|
-
|
|
118
|
-
#endif // PERSISTENT_COHOMOLOGY_FIELD_ZP_H_
|
|
1
|
+
/* This file is part of the Gudhi Library - https://gudhi.inria.fr/ - which is released under MIT.
|
|
2
|
+
* See file LICENSE or go to https://gudhi.inria.fr/licensing/ for full license details.
|
|
3
|
+
* Author(s): Clément Maria
|
|
4
|
+
*
|
|
5
|
+
* Copyright (C) 2014 Inria
|
|
6
|
+
*
|
|
7
|
+
* Modification(s):
|
|
8
|
+
* - YYYY/MM Author: Description of the modification
|
|
9
|
+
*/
|
|
10
|
+
|
|
11
|
+
#ifndef PERSISTENT_COHOMOLOGY_FIELD_ZP_H_
|
|
12
|
+
#define PERSISTENT_COHOMOLOGY_FIELD_ZP_H_
|
|
13
|
+
|
|
14
|
+
#include <utility>
|
|
15
|
+
#include <vector>
|
|
16
|
+
#include <stdexcept>
|
|
17
|
+
|
|
18
|
+
namespace Gudhi {
|
|
19
|
+
|
|
20
|
+
namespace persistent_cohomology {
|
|
21
|
+
|
|
22
|
+
/** \brief Structure representing the coefficient field \f$\mathbb{Z}/p\mathbb{Z}\f$
|
|
23
|
+
*
|
|
24
|
+
* \implements CoefficientField
|
|
25
|
+
* \ingroup persistent_cohomology
|
|
26
|
+
*/
|
|
27
|
+
class Field_Zp {
|
|
28
|
+
public:
|
|
29
|
+
typedef int Element;
|
|
30
|
+
|
|
31
|
+
Field_Zp()
|
|
32
|
+
: Prime(0),
|
|
33
|
+
inverse_() {
|
|
34
|
+
}
|
|
35
|
+
|
|
36
|
+
void init(int charac) {
|
|
37
|
+
Prime = charac;
|
|
38
|
+
|
|
39
|
+
// Check that the provided prime is less than the maximum allowed as int, calculation below, and 'plus_times_equal' function : 46337 ; i.e (max_prime-1)*max_prime <= INT_MAX
|
|
40
|
+
if(Prime > 46337)
|
|
41
|
+
throw std::invalid_argument("Maximum homology_coeff_field allowed value is 46337");
|
|
42
|
+
|
|
43
|
+
// Check for primality
|
|
44
|
+
if (Prime <= 1)
|
|
45
|
+
throw std::invalid_argument("homology_coeff_field must be a prime number");
|
|
46
|
+
|
|
47
|
+
inverse_.clear();
|
|
48
|
+
inverse_.reserve(charac);
|
|
49
|
+
inverse_.push_back(0);
|
|
50
|
+
for (int i = 1; i < Prime; ++i) {
|
|
51
|
+
int inv = 1;
|
|
52
|
+
int mult = inv * i;
|
|
53
|
+
while ( (mult % Prime) != 1) {
|
|
54
|
+
++inv;
|
|
55
|
+
if(mult == Prime)
|
|
56
|
+
throw std::invalid_argument("homology_coeff_field must be a prime number");
|
|
57
|
+
mult = inv * i;
|
|
58
|
+
}
|
|
59
|
+
inverse_.push_back(inv);
|
|
60
|
+
}
|
|
61
|
+
}
|
|
62
|
+
|
|
63
|
+
/** Set x <- x + w * y*/
|
|
64
|
+
Element plus_times_equal(const Element& x, const Element& y, const Element& w) {
|
|
65
|
+
assert(Prime > 0); // division by zero + non negative values
|
|
66
|
+
Element result = (x + w * y) % Prime;
|
|
67
|
+
if (result < 0)
|
|
68
|
+
result += Prime;
|
|
69
|
+
return result;
|
|
70
|
+
}
|
|
71
|
+
|
|
72
|
+
// operator= defined on Element
|
|
73
|
+
|
|
74
|
+
/** Returns y * w */
|
|
75
|
+
Element times(const Element& y, const Element& w) {
|
|
76
|
+
return plus_times_equal(0, y, (Element)w);
|
|
77
|
+
}
|
|
78
|
+
|
|
79
|
+
Element plus_equal(const Element& x, const Element& y) {
|
|
80
|
+
return plus_times_equal(x, y, (Element)1);
|
|
81
|
+
}
|
|
82
|
+
|
|
83
|
+
/** \brief Returns the additive idendity \f$0_{\Bbbk}\f$ of the field.*/
|
|
84
|
+
Element additive_identity() const {
|
|
85
|
+
return 0;
|
|
86
|
+
}
|
|
87
|
+
/** \brief Returns the multiplicative identity \f$1_{\Bbbk}\f$ of the field.*/
|
|
88
|
+
Element multiplicative_identity(Element = 0) const {
|
|
89
|
+
return 1;
|
|
90
|
+
}
|
|
91
|
+
/** Returns the inverse in the field. Modifies P. ??? */
|
|
92
|
+
std::pair<Element, Element> inverse(Element x, Element P) {
|
|
93
|
+
return std::pair<Element, Element>(inverse_[x], P);
|
|
94
|
+
} // <------ return the product of field characteristic for which x is invertible
|
|
95
|
+
|
|
96
|
+
/** Returns -x * y.*/
|
|
97
|
+
Element times_minus(Element x, Element y) {
|
|
98
|
+
assert(Prime > 0); // division by zero + non negative values
|
|
99
|
+
Element out = (-x * y) % Prime;
|
|
100
|
+
return (out < 0) ? out + Prime : out;
|
|
101
|
+
}
|
|
102
|
+
|
|
103
|
+
/** \brief Returns the characteristic \f$p\f$ of the field.*/
|
|
104
|
+
int characteristic() const {
|
|
105
|
+
return Prime;
|
|
106
|
+
}
|
|
107
|
+
|
|
108
|
+
private:
|
|
109
|
+
int Prime;
|
|
110
|
+
/** Property map Element -> Element, which associate to an element its inverse in the field.*/
|
|
111
|
+
std::vector<Element> inverse_;
|
|
112
|
+
};
|
|
113
|
+
|
|
114
|
+
} // namespace persistent_cohomology
|
|
115
|
+
|
|
116
|
+
} // namespace Gudhi
|
|
117
|
+
|
|
118
|
+
#endif // PERSISTENT_COHOMOLOGY_FIELD_ZP_H_
|
|
@@ -1,173 +1,173 @@
|
|
|
1
|
-
/* This file is part of the Gudhi Library - https://gudhi.inria.fr/ - which is released under MIT.
|
|
2
|
-
* See file LICENSE or go to https://gudhi.inria.fr/licensing/ for full license details.
|
|
3
|
-
* Author(s): Clément Maria
|
|
4
|
-
*
|
|
5
|
-
* Copyright (C) 2014 Inria
|
|
6
|
-
*
|
|
7
|
-
* Modification(s):
|
|
8
|
-
* - YYYY/MM Author: Description of the modification
|
|
9
|
-
*/
|
|
10
|
-
|
|
11
|
-
#ifndef PERSISTENT_COHOMOLOGY_MULTI_FIELD_H_
|
|
12
|
-
#define PERSISTENT_COHOMOLOGY_MULTI_FIELD_H_
|
|
13
|
-
|
|
14
|
-
#include <gmpxx.h>
|
|
15
|
-
|
|
16
|
-
#include <vector>
|
|
17
|
-
#include <utility>
|
|
18
|
-
|
|
19
|
-
namespace Gudhi {
|
|
20
|
-
|
|
21
|
-
namespace persistent_cohomology {
|
|
22
|
-
|
|
23
|
-
/** \brief Structure representing coefficients in a set of finite fields simultaneously
|
|
24
|
-
* using the chinese remainder theorem.
|
|
25
|
-
*
|
|
26
|
-
* \implements CoefficientField
|
|
27
|
-
* \ingroup persistent_cohomology
|
|
28
|
-
|
|
29
|
-
* Details on the algorithms may be found in \cite boissonnat:hal-00922572
|
|
30
|
-
*/
|
|
31
|
-
class Multi_field {
|
|
32
|
-
public:
|
|
33
|
-
typedef mpz_class Element;
|
|
34
|
-
|
|
35
|
-
Multi_field()
|
|
36
|
-
: prod_characteristics_(0),
|
|
37
|
-
mult_id_all(0),
|
|
38
|
-
add_id_all(0) {
|
|
39
|
-
}
|
|
40
|
-
|
|
41
|
-
/* Initialize the multi-field. The generation of prime numbers might fail with
|
|
42
|
-
* a very small probability.*/
|
|
43
|
-
void init(int min_prime, int max_prime) {
|
|
44
|
-
if (max_prime < 2) {
|
|
45
|
-
std::cerr << "There is no prime less than " << max_prime << std::endl;
|
|
46
|
-
}
|
|
47
|
-
if (min_prime > max_prime) {
|
|
48
|
-
std::cerr << "No prime in [" << min_prime << ":" << max_prime << "]"
|
|
49
|
-
<< std::endl;
|
|
50
|
-
}
|
|
51
|
-
// fill the list of prime numbers
|
|
52
|
-
int curr_prime = min_prime;
|
|
53
|
-
mpz_t tmp_prime;
|
|
54
|
-
mpz_init_set_ui(tmp_prime, min_prime);
|
|
55
|
-
// test if min_prime is prime
|
|
56
|
-
int is_prime = mpz_probab_prime_p(tmp_prime, 25); // probabilistic primality test
|
|
57
|
-
|
|
58
|
-
if (is_prime == 0) { // min_prime is composite
|
|
59
|
-
mpz_nextprime(tmp_prime, tmp_prime);
|
|
60
|
-
curr_prime = mpz_get_ui(tmp_prime);
|
|
61
|
-
}
|
|
62
|
-
|
|
63
|
-
while (curr_prime <= max_prime) {
|
|
64
|
-
primes_.push_back(curr_prime);
|
|
65
|
-
mpz_nextprime(tmp_prime, tmp_prime);
|
|
66
|
-
curr_prime = mpz_get_ui(tmp_prime);
|
|
67
|
-
}
|
|
68
|
-
mpz_clear(tmp_prime);
|
|
69
|
-
// set m to primorial(bound_prime)
|
|
70
|
-
prod_characteristics_ = 1;
|
|
71
|
-
for (auto p : primes_) {
|
|
72
|
-
prod_characteristics_ *= p;
|
|
73
|
-
}
|
|
74
|
-
|
|
75
|
-
// Uvect_
|
|
76
|
-
Element Ui;
|
|
77
|
-
Element tmp_elem;
|
|
78
|
-
for (auto p : primes_) {
|
|
79
|
-
assert(p > 0); // division by zero + non negative values
|
|
80
|
-
tmp_elem = prod_characteristics_ / p;
|
|
81
|
-
// Element tmp_elem_bis = 10;
|
|
82
|
-
mpz_powm_ui(tmp_elem.get_mpz_t(), tmp_elem.get_mpz_t(), p - 1,
|
|
83
|
-
prod_characteristics_.get_mpz_t());
|
|
84
|
-
Uvect_.push_back(tmp_elem);
|
|
85
|
-
}
|
|
86
|
-
mult_id_all = 0;
|
|
87
|
-
for (auto uvect : Uvect_) {
|
|
88
|
-
assert(prod_characteristics_ > 0); // division by zero + non negative values
|
|
89
|
-
mult_id_all = (mult_id_all + uvect) % prod_characteristics_;
|
|
90
|
-
}
|
|
91
|
-
}
|
|
92
|
-
|
|
93
|
-
/** \brief Returns the additive idendity \f$0_{\Bbbk}\f$ of the field.*/
|
|
94
|
-
const Element& additive_identity() const {
|
|
95
|
-
return add_id_all;
|
|
96
|
-
}
|
|
97
|
-
/** \brief Returns the multiplicative identity \f$1_{\Bbbk}\f$ of the field.*/
|
|
98
|
-
const Element& multiplicative_identity() const {
|
|
99
|
-
return mult_id_all;
|
|
100
|
-
} // 1 everywhere
|
|
101
|
-
|
|
102
|
-
Element multiplicative_identity(Element Q) {
|
|
103
|
-
if (Q == prod_characteristics_) {
|
|
104
|
-
return multiplicative_identity();
|
|
105
|
-
}
|
|
106
|
-
|
|
107
|
-
assert(prod_characteristics_ > 0); // division by zero + non negative values
|
|
108
|
-
Element mult_id = 0;
|
|
109
|
-
for (unsigned int idx = 0; idx < primes_.size(); ++idx) {
|
|
110
|
-
assert(primes_[idx] > 0); // division by zero + non negative values
|
|
111
|
-
if ((Q % primes_[idx]) == 0) {
|
|
112
|
-
mult_id = (mult_id + Uvect_[idx]) % prod_characteristics_;
|
|
113
|
-
}
|
|
114
|
-
}
|
|
115
|
-
return mult_id;
|
|
116
|
-
}
|
|
117
|
-
|
|
118
|
-
/** Returns y * w */
|
|
119
|
-
Element times(const Element& y, const Element& w) {
|
|
120
|
-
return plus_times_equal(0, y, w);
|
|
121
|
-
}
|
|
122
|
-
|
|
123
|
-
Element plus_equal(const Element& x, const Element& y) {
|
|
124
|
-
return plus_times_equal(x, y, (Element)1);
|
|
125
|
-
}
|
|
126
|
-
|
|
127
|
-
/** \brief Returns the characteristic \f$p\f$ of the field.*/
|
|
128
|
-
const Element& characteristic() const {
|
|
129
|
-
return prod_characteristics_;
|
|
130
|
-
}
|
|
131
|
-
|
|
132
|
-
/** Returns the inverse in the field. Modifies P. ??? */
|
|
133
|
-
std::pair<Element, Element> inverse(Element x, Element QS) {
|
|
134
|
-
Element QR;
|
|
135
|
-
mpz_gcd(QR.get_mpz_t(), x.get_mpz_t(), QS.get_mpz_t()); // QR <- gcd(x,QS)
|
|
136
|
-
if (QR == QS)
|
|
137
|
-
return std::pair<Element, Element>(additive_identity(), multiplicative_identity()); // partial inverse is 0
|
|
138
|
-
Element QT = QS / QR;
|
|
139
|
-
Element inv_qt;
|
|
140
|
-
mpz_invert(inv_qt.get_mpz_t(), x.get_mpz_t(), QT.get_mpz_t());
|
|
141
|
-
|
|
142
|
-
assert(prod_characteristics_ > 0); // division by zero + non negative values
|
|
143
|
-
return { (inv_qt * multiplicative_identity(QT)) % prod_characteristics_, QT };
|
|
144
|
-
}
|
|
145
|
-
/** Returns -x * y.*/
|
|
146
|
-
Element times_minus(const Element& x, const Element& y) {
|
|
147
|
-
assert(prod_characteristics_ > 0); // division by zero + non negative values
|
|
148
|
-
/* This assumes that (x*y)%pc cannot be zero, but Field_Zp has specific code for the 0 case ??? */
|
|
149
|
-
return prod_characteristics_ - ((x * y) % prod_characteristics_);
|
|
150
|
-
}
|
|
151
|
-
|
|
152
|
-
/** Set x <- x + w * y*/
|
|
153
|
-
Element plus_times_equal(const Element& x, const Element& y, const Element& w) {
|
|
154
|
-
assert(prod_characteristics_ > 0); // division by zero + non negative values
|
|
155
|
-
Element result = (x + w * y) % prod_characteristics_;
|
|
156
|
-
if (result < 0)
|
|
157
|
-
result += prod_characteristics_;
|
|
158
|
-
return result;
|
|
159
|
-
}
|
|
160
|
-
|
|
161
|
-
Element prod_characteristics_; // product of characteristics of the fields
|
|
162
|
-
// represented by the multi-field class
|
|
163
|
-
std::vector<int> primes_; // all the characteristics of the fields
|
|
164
|
-
std::vector<Element> Uvect_;
|
|
165
|
-
Element mult_id_all;
|
|
166
|
-
const Element add_id_all;
|
|
167
|
-
};
|
|
168
|
-
|
|
169
|
-
} // namespace persistent_cohomology
|
|
170
|
-
|
|
171
|
-
} // namespace Gudhi
|
|
172
|
-
|
|
173
|
-
#endif // PERSISTENT_COHOMOLOGY_MULTI_FIELD_H_
|
|
1
|
+
/* This file is part of the Gudhi Library - https://gudhi.inria.fr/ - which is released under MIT.
|
|
2
|
+
* See file LICENSE or go to https://gudhi.inria.fr/licensing/ for full license details.
|
|
3
|
+
* Author(s): Clément Maria
|
|
4
|
+
*
|
|
5
|
+
* Copyright (C) 2014 Inria
|
|
6
|
+
*
|
|
7
|
+
* Modification(s):
|
|
8
|
+
* - YYYY/MM Author: Description of the modification
|
|
9
|
+
*/
|
|
10
|
+
|
|
11
|
+
#ifndef PERSISTENT_COHOMOLOGY_MULTI_FIELD_H_
|
|
12
|
+
#define PERSISTENT_COHOMOLOGY_MULTI_FIELD_H_
|
|
13
|
+
|
|
14
|
+
#include <gmpxx.h>
|
|
15
|
+
|
|
16
|
+
#include <vector>
|
|
17
|
+
#include <utility>
|
|
18
|
+
|
|
19
|
+
namespace Gudhi {
|
|
20
|
+
|
|
21
|
+
namespace persistent_cohomology {
|
|
22
|
+
|
|
23
|
+
/** \brief Structure representing coefficients in a set of finite fields simultaneously
|
|
24
|
+
* using the chinese remainder theorem.
|
|
25
|
+
*
|
|
26
|
+
* \implements CoefficientField
|
|
27
|
+
* \ingroup persistent_cohomology
|
|
28
|
+
|
|
29
|
+
* Details on the algorithms may be found in \cite boissonnat:hal-00922572
|
|
30
|
+
*/
|
|
31
|
+
class Multi_field {
|
|
32
|
+
public:
|
|
33
|
+
typedef mpz_class Element;
|
|
34
|
+
|
|
35
|
+
Multi_field()
|
|
36
|
+
: prod_characteristics_(0),
|
|
37
|
+
mult_id_all(0),
|
|
38
|
+
add_id_all(0) {
|
|
39
|
+
}
|
|
40
|
+
|
|
41
|
+
/* Initialize the multi-field. The generation of prime numbers might fail with
|
|
42
|
+
* a very small probability.*/
|
|
43
|
+
void init(int min_prime, int max_prime) {
|
|
44
|
+
if (max_prime < 2) {
|
|
45
|
+
std::cerr << "There is no prime less than " << max_prime << std::endl;
|
|
46
|
+
}
|
|
47
|
+
if (min_prime > max_prime) {
|
|
48
|
+
std::cerr << "No prime in [" << min_prime << ":" << max_prime << "]"
|
|
49
|
+
<< std::endl;
|
|
50
|
+
}
|
|
51
|
+
// fill the list of prime numbers
|
|
52
|
+
int curr_prime = min_prime;
|
|
53
|
+
mpz_t tmp_prime;
|
|
54
|
+
mpz_init_set_ui(tmp_prime, min_prime);
|
|
55
|
+
// test if min_prime is prime
|
|
56
|
+
int is_prime = mpz_probab_prime_p(tmp_prime, 25); // probabilistic primality test
|
|
57
|
+
|
|
58
|
+
if (is_prime == 0) { // min_prime is composite
|
|
59
|
+
mpz_nextprime(tmp_prime, tmp_prime);
|
|
60
|
+
curr_prime = mpz_get_ui(tmp_prime);
|
|
61
|
+
}
|
|
62
|
+
|
|
63
|
+
while (curr_prime <= max_prime) {
|
|
64
|
+
primes_.push_back(curr_prime);
|
|
65
|
+
mpz_nextprime(tmp_prime, tmp_prime);
|
|
66
|
+
curr_prime = mpz_get_ui(tmp_prime);
|
|
67
|
+
}
|
|
68
|
+
mpz_clear(tmp_prime);
|
|
69
|
+
// set m to primorial(bound_prime)
|
|
70
|
+
prod_characteristics_ = 1;
|
|
71
|
+
for (auto p : primes_) {
|
|
72
|
+
prod_characteristics_ *= p;
|
|
73
|
+
}
|
|
74
|
+
|
|
75
|
+
// Uvect_
|
|
76
|
+
Element Ui;
|
|
77
|
+
Element tmp_elem;
|
|
78
|
+
for (auto p : primes_) {
|
|
79
|
+
assert(p > 0); // division by zero + non negative values
|
|
80
|
+
tmp_elem = prod_characteristics_ / p;
|
|
81
|
+
// Element tmp_elem_bis = 10;
|
|
82
|
+
mpz_powm_ui(tmp_elem.get_mpz_t(), tmp_elem.get_mpz_t(), p - 1,
|
|
83
|
+
prod_characteristics_.get_mpz_t());
|
|
84
|
+
Uvect_.push_back(tmp_elem);
|
|
85
|
+
}
|
|
86
|
+
mult_id_all = 0;
|
|
87
|
+
for (auto uvect : Uvect_) {
|
|
88
|
+
assert(prod_characteristics_ > 0); // division by zero + non negative values
|
|
89
|
+
mult_id_all = (mult_id_all + uvect) % prod_characteristics_;
|
|
90
|
+
}
|
|
91
|
+
}
|
|
92
|
+
|
|
93
|
+
/** \brief Returns the additive idendity \f$0_{\Bbbk}\f$ of the field.*/
|
|
94
|
+
const Element& additive_identity() const {
|
|
95
|
+
return add_id_all;
|
|
96
|
+
}
|
|
97
|
+
/** \brief Returns the multiplicative identity \f$1_{\Bbbk}\f$ of the field.*/
|
|
98
|
+
const Element& multiplicative_identity() const {
|
|
99
|
+
return mult_id_all;
|
|
100
|
+
} // 1 everywhere
|
|
101
|
+
|
|
102
|
+
Element multiplicative_identity(Element Q) {
|
|
103
|
+
if (Q == prod_characteristics_) {
|
|
104
|
+
return multiplicative_identity();
|
|
105
|
+
}
|
|
106
|
+
|
|
107
|
+
assert(prod_characteristics_ > 0); // division by zero + non negative values
|
|
108
|
+
Element mult_id = 0;
|
|
109
|
+
for (unsigned int idx = 0; idx < primes_.size(); ++idx) {
|
|
110
|
+
assert(primes_[idx] > 0); // division by zero + non negative values
|
|
111
|
+
if ((Q % primes_[idx]) == 0) {
|
|
112
|
+
mult_id = (mult_id + Uvect_[idx]) % prod_characteristics_;
|
|
113
|
+
}
|
|
114
|
+
}
|
|
115
|
+
return mult_id;
|
|
116
|
+
}
|
|
117
|
+
|
|
118
|
+
/** Returns y * w */
|
|
119
|
+
Element times(const Element& y, const Element& w) {
|
|
120
|
+
return plus_times_equal(0, y, w);
|
|
121
|
+
}
|
|
122
|
+
|
|
123
|
+
Element plus_equal(const Element& x, const Element& y) {
|
|
124
|
+
return plus_times_equal(x, y, (Element)1);
|
|
125
|
+
}
|
|
126
|
+
|
|
127
|
+
/** \brief Returns the characteristic \f$p\f$ of the field.*/
|
|
128
|
+
const Element& characteristic() const {
|
|
129
|
+
return prod_characteristics_;
|
|
130
|
+
}
|
|
131
|
+
|
|
132
|
+
/** Returns the inverse in the field. Modifies P. ??? */
|
|
133
|
+
std::pair<Element, Element> inverse(Element x, Element QS) {
|
|
134
|
+
Element QR;
|
|
135
|
+
mpz_gcd(QR.get_mpz_t(), x.get_mpz_t(), QS.get_mpz_t()); // QR <- gcd(x,QS)
|
|
136
|
+
if (QR == QS)
|
|
137
|
+
return std::pair<Element, Element>(additive_identity(), multiplicative_identity()); // partial inverse is 0
|
|
138
|
+
Element QT = QS / QR;
|
|
139
|
+
Element inv_qt;
|
|
140
|
+
mpz_invert(inv_qt.get_mpz_t(), x.get_mpz_t(), QT.get_mpz_t());
|
|
141
|
+
|
|
142
|
+
assert(prod_characteristics_ > 0); // division by zero + non negative values
|
|
143
|
+
return { (inv_qt * multiplicative_identity(QT)) % prod_characteristics_, QT };
|
|
144
|
+
}
|
|
145
|
+
/** Returns -x * y.*/
|
|
146
|
+
Element times_minus(const Element& x, const Element& y) {
|
|
147
|
+
assert(prod_characteristics_ > 0); // division by zero + non negative values
|
|
148
|
+
/* This assumes that (x*y)%pc cannot be zero, but Field_Zp has specific code for the 0 case ??? */
|
|
149
|
+
return prod_characteristics_ - ((x * y) % prod_characteristics_);
|
|
150
|
+
}
|
|
151
|
+
|
|
152
|
+
/** Set x <- x + w * y*/
|
|
153
|
+
Element plus_times_equal(const Element& x, const Element& y, const Element& w) {
|
|
154
|
+
assert(prod_characteristics_ > 0); // division by zero + non negative values
|
|
155
|
+
Element result = (x + w * y) % prod_characteristics_;
|
|
156
|
+
if (result < 0)
|
|
157
|
+
result += prod_characteristics_;
|
|
158
|
+
return result;
|
|
159
|
+
}
|
|
160
|
+
|
|
161
|
+
Element prod_characteristics_; // product of characteristics of the fields
|
|
162
|
+
// represented by the multi-field class
|
|
163
|
+
std::vector<int> primes_; // all the characteristics of the fields
|
|
164
|
+
std::vector<Element> Uvect_;
|
|
165
|
+
Element mult_id_all;
|
|
166
|
+
const Element add_id_all;
|
|
167
|
+
};
|
|
168
|
+
|
|
169
|
+
} // namespace persistent_cohomology
|
|
170
|
+
|
|
171
|
+
} // namespace Gudhi
|
|
172
|
+
|
|
173
|
+
#endif // PERSISTENT_COHOMOLOGY_MULTI_FIELD_H_
|