multipers 2.3.3b6__cp313-cp313-macosx_11_0_arm64.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.

Files changed (183) hide show
  1. multipers/.dylibs/libc++.1.0.dylib +0 -0
  2. multipers/.dylibs/libtbb.12.16.dylib +0 -0
  3. multipers/__init__.py +33 -0
  4. multipers/_signed_measure_meta.py +453 -0
  5. multipers/_slicer_meta.py +211 -0
  6. multipers/array_api/__init__.py +45 -0
  7. multipers/array_api/numpy.py +41 -0
  8. multipers/array_api/torch.py +58 -0
  9. multipers/data/MOL2.py +458 -0
  10. multipers/data/UCR.py +18 -0
  11. multipers/data/__init__.py +1 -0
  12. multipers/data/graphs.py +466 -0
  13. multipers/data/immuno_regions.py +27 -0
  14. multipers/data/minimal_presentation_to_st_bf.py +0 -0
  15. multipers/data/pytorch2simplextree.py +91 -0
  16. multipers/data/shape3d.py +101 -0
  17. multipers/data/synthetic.py +113 -0
  18. multipers/distances.py +202 -0
  19. multipers/filtration_conversions.pxd +229 -0
  20. multipers/filtration_conversions.pxd.tp +84 -0
  21. multipers/filtrations/__init__.py +18 -0
  22. multipers/filtrations/density.py +574 -0
  23. multipers/filtrations/filtrations.py +361 -0
  24. multipers/filtrations.pxd +224 -0
  25. multipers/function_rips.cpython-313-darwin.so +0 -0
  26. multipers/function_rips.pyx +105 -0
  27. multipers/grids.cpython-313-darwin.so +0 -0
  28. multipers/grids.pyx +433 -0
  29. multipers/gudhi/Persistence_slices_interface.h +132 -0
  30. multipers/gudhi/Simplex_tree_interface.h +239 -0
  31. multipers/gudhi/Simplex_tree_multi_interface.h +551 -0
  32. multipers/gudhi/cubical_to_boundary.h +59 -0
  33. multipers/gudhi/gudhi/Bitmap_cubical_complex.h +450 -0
  34. multipers/gudhi/gudhi/Bitmap_cubical_complex_base.h +1070 -0
  35. multipers/gudhi/gudhi/Bitmap_cubical_complex_periodic_boundary_conditions_base.h +579 -0
  36. multipers/gudhi/gudhi/Debug_utils.h +45 -0
  37. multipers/gudhi/gudhi/Fields/Multi_field.h +484 -0
  38. multipers/gudhi/gudhi/Fields/Multi_field_operators.h +455 -0
  39. multipers/gudhi/gudhi/Fields/Multi_field_shared.h +450 -0
  40. multipers/gudhi/gudhi/Fields/Multi_field_small.h +531 -0
  41. multipers/gudhi/gudhi/Fields/Multi_field_small_operators.h +507 -0
  42. multipers/gudhi/gudhi/Fields/Multi_field_small_shared.h +531 -0
  43. multipers/gudhi/gudhi/Fields/Z2_field.h +355 -0
  44. multipers/gudhi/gudhi/Fields/Z2_field_operators.h +376 -0
  45. multipers/gudhi/gudhi/Fields/Zp_field.h +420 -0
  46. multipers/gudhi/gudhi/Fields/Zp_field_operators.h +400 -0
  47. multipers/gudhi/gudhi/Fields/Zp_field_shared.h +418 -0
  48. multipers/gudhi/gudhi/Flag_complex_edge_collapser.h +337 -0
  49. multipers/gudhi/gudhi/Matrix.h +2107 -0
  50. multipers/gudhi/gudhi/Multi_critical_filtration.h +1038 -0
  51. multipers/gudhi/gudhi/Multi_persistence/Box.h +174 -0
  52. multipers/gudhi/gudhi/Multi_persistence/Line.h +282 -0
  53. multipers/gudhi/gudhi/Off_reader.h +173 -0
  54. multipers/gudhi/gudhi/One_critical_filtration.h +1441 -0
  55. multipers/gudhi/gudhi/Persistence_matrix/Base_matrix.h +769 -0
  56. multipers/gudhi/gudhi/Persistence_matrix/Base_matrix_with_column_compression.h +686 -0
  57. multipers/gudhi/gudhi/Persistence_matrix/Boundary_matrix.h +842 -0
  58. multipers/gudhi/gudhi/Persistence_matrix/Chain_matrix.h +1350 -0
  59. multipers/gudhi/gudhi/Persistence_matrix/Id_to_index_overlay.h +1105 -0
  60. multipers/gudhi/gudhi/Persistence_matrix/Position_to_index_overlay.h +859 -0
  61. multipers/gudhi/gudhi/Persistence_matrix/RU_matrix.h +910 -0
  62. multipers/gudhi/gudhi/Persistence_matrix/allocators/entry_constructors.h +139 -0
  63. multipers/gudhi/gudhi/Persistence_matrix/base_pairing.h +230 -0
  64. multipers/gudhi/gudhi/Persistence_matrix/base_swap.h +211 -0
  65. multipers/gudhi/gudhi/Persistence_matrix/boundary_cell_position_to_id_mapper.h +60 -0
  66. multipers/gudhi/gudhi/Persistence_matrix/boundary_face_position_to_id_mapper.h +60 -0
  67. multipers/gudhi/gudhi/Persistence_matrix/chain_pairing.h +136 -0
  68. multipers/gudhi/gudhi/Persistence_matrix/chain_rep_cycles.h +190 -0
  69. multipers/gudhi/gudhi/Persistence_matrix/chain_vine_swap.h +616 -0
  70. multipers/gudhi/gudhi/Persistence_matrix/columns/chain_column_extra_properties.h +150 -0
  71. multipers/gudhi/gudhi/Persistence_matrix/columns/column_dimension_holder.h +106 -0
  72. multipers/gudhi/gudhi/Persistence_matrix/columns/column_utilities.h +219 -0
  73. multipers/gudhi/gudhi/Persistence_matrix/columns/entry_types.h +327 -0
  74. multipers/gudhi/gudhi/Persistence_matrix/columns/heap_column.h +1140 -0
  75. multipers/gudhi/gudhi/Persistence_matrix/columns/intrusive_list_column.h +934 -0
  76. multipers/gudhi/gudhi/Persistence_matrix/columns/intrusive_set_column.h +934 -0
  77. multipers/gudhi/gudhi/Persistence_matrix/columns/list_column.h +980 -0
  78. multipers/gudhi/gudhi/Persistence_matrix/columns/naive_vector_column.h +1092 -0
  79. multipers/gudhi/gudhi/Persistence_matrix/columns/row_access.h +192 -0
  80. multipers/gudhi/gudhi/Persistence_matrix/columns/set_column.h +921 -0
  81. multipers/gudhi/gudhi/Persistence_matrix/columns/small_vector_column.h +1093 -0
  82. multipers/gudhi/gudhi/Persistence_matrix/columns/unordered_set_column.h +1012 -0
  83. multipers/gudhi/gudhi/Persistence_matrix/columns/vector_column.h +1244 -0
  84. multipers/gudhi/gudhi/Persistence_matrix/matrix_dimension_holders.h +186 -0
  85. multipers/gudhi/gudhi/Persistence_matrix/matrix_row_access.h +164 -0
  86. multipers/gudhi/gudhi/Persistence_matrix/ru_pairing.h +156 -0
  87. multipers/gudhi/gudhi/Persistence_matrix/ru_rep_cycles.h +376 -0
  88. multipers/gudhi/gudhi/Persistence_matrix/ru_vine_swap.h +540 -0
  89. multipers/gudhi/gudhi/Persistent_cohomology/Field_Zp.h +118 -0
  90. multipers/gudhi/gudhi/Persistent_cohomology/Multi_field.h +173 -0
  91. multipers/gudhi/gudhi/Persistent_cohomology/Persistent_cohomology_column.h +128 -0
  92. multipers/gudhi/gudhi/Persistent_cohomology.h +745 -0
  93. multipers/gudhi/gudhi/Points_off_io.h +171 -0
  94. multipers/gudhi/gudhi/Simple_object_pool.h +69 -0
  95. multipers/gudhi/gudhi/Simplex_tree/Simplex_tree_iterators.h +463 -0
  96. multipers/gudhi/gudhi/Simplex_tree/Simplex_tree_node_explicit_storage.h +83 -0
  97. multipers/gudhi/gudhi/Simplex_tree/Simplex_tree_siblings.h +106 -0
  98. multipers/gudhi/gudhi/Simplex_tree/Simplex_tree_star_simplex_iterators.h +277 -0
  99. multipers/gudhi/gudhi/Simplex_tree/hooks_simplex_base.h +62 -0
  100. multipers/gudhi/gudhi/Simplex_tree/indexing_tag.h +27 -0
  101. multipers/gudhi/gudhi/Simplex_tree/serialization_utils.h +62 -0
  102. multipers/gudhi/gudhi/Simplex_tree/simplex_tree_options.h +157 -0
  103. multipers/gudhi/gudhi/Simplex_tree.h +2794 -0
  104. multipers/gudhi/gudhi/Simplex_tree_multi.h +152 -0
  105. multipers/gudhi/gudhi/distance_functions.h +62 -0
  106. multipers/gudhi/gudhi/graph_simplicial_complex.h +104 -0
  107. multipers/gudhi/gudhi/persistence_interval.h +253 -0
  108. multipers/gudhi/gudhi/persistence_matrix_options.h +170 -0
  109. multipers/gudhi/gudhi/reader_utils.h +367 -0
  110. multipers/gudhi/mma_interface_coh.h +256 -0
  111. multipers/gudhi/mma_interface_h0.h +223 -0
  112. multipers/gudhi/mma_interface_matrix.h +293 -0
  113. multipers/gudhi/naive_merge_tree.h +536 -0
  114. multipers/gudhi/scc_io.h +310 -0
  115. multipers/gudhi/truc.h +1403 -0
  116. multipers/io.cpython-313-darwin.so +0 -0
  117. multipers/io.pyx +644 -0
  118. multipers/ml/__init__.py +0 -0
  119. multipers/ml/accuracies.py +90 -0
  120. multipers/ml/invariants_with_persistable.py +79 -0
  121. multipers/ml/kernels.py +176 -0
  122. multipers/ml/mma.py +713 -0
  123. multipers/ml/one.py +472 -0
  124. multipers/ml/point_clouds.py +352 -0
  125. multipers/ml/signed_measures.py +1589 -0
  126. multipers/ml/sliced_wasserstein.py +461 -0
  127. multipers/ml/tools.py +113 -0
  128. multipers/mma_structures.cpython-313-darwin.so +0 -0
  129. multipers/mma_structures.pxd +128 -0
  130. multipers/mma_structures.pyx +2786 -0
  131. multipers/mma_structures.pyx.tp +1094 -0
  132. multipers/multi_parameter_rank_invariant/diff_helpers.h +84 -0
  133. multipers/multi_parameter_rank_invariant/euler_characteristic.h +97 -0
  134. multipers/multi_parameter_rank_invariant/function_rips.h +322 -0
  135. multipers/multi_parameter_rank_invariant/hilbert_function.h +769 -0
  136. multipers/multi_parameter_rank_invariant/persistence_slices.h +148 -0
  137. multipers/multi_parameter_rank_invariant/rank_invariant.h +369 -0
  138. multipers/multiparameter_edge_collapse.py +41 -0
  139. multipers/multiparameter_module_approximation/approximation.h +2330 -0
  140. multipers/multiparameter_module_approximation/combinatory.h +129 -0
  141. multipers/multiparameter_module_approximation/debug.h +107 -0
  142. multipers/multiparameter_module_approximation/euler_curves.h +0 -0
  143. multipers/multiparameter_module_approximation/format_python-cpp.h +286 -0
  144. multipers/multiparameter_module_approximation/heap_column.h +238 -0
  145. multipers/multiparameter_module_approximation/images.h +79 -0
  146. multipers/multiparameter_module_approximation/list_column.h +174 -0
  147. multipers/multiparameter_module_approximation/list_column_2.h +232 -0
  148. multipers/multiparameter_module_approximation/ru_matrix.h +347 -0
  149. multipers/multiparameter_module_approximation/set_column.h +135 -0
  150. multipers/multiparameter_module_approximation/structure_higher_dim_barcode.h +36 -0
  151. multipers/multiparameter_module_approximation/unordered_set_column.h +166 -0
  152. multipers/multiparameter_module_approximation/utilities.h +403 -0
  153. multipers/multiparameter_module_approximation/vector_column.h +223 -0
  154. multipers/multiparameter_module_approximation/vector_matrix.h +331 -0
  155. multipers/multiparameter_module_approximation/vineyards.h +464 -0
  156. multipers/multiparameter_module_approximation/vineyards_trajectories.h +649 -0
  157. multipers/multiparameter_module_approximation.cpython-313-darwin.so +0 -0
  158. multipers/multiparameter_module_approximation.pyx +235 -0
  159. multipers/pickle.py +90 -0
  160. multipers/plots.py +456 -0
  161. multipers/point_measure.cpython-313-darwin.so +0 -0
  162. multipers/point_measure.pyx +395 -0
  163. multipers/simplex_tree_multi.cpython-313-darwin.so +0 -0
  164. multipers/simplex_tree_multi.pxd +134 -0
  165. multipers/simplex_tree_multi.pyx +10840 -0
  166. multipers/simplex_tree_multi.pyx.tp +2009 -0
  167. multipers/slicer.cpython-313-darwin.so +0 -0
  168. multipers/slicer.pxd +3034 -0
  169. multipers/slicer.pxd.tp +234 -0
  170. multipers/slicer.pyx +20481 -0
  171. multipers/slicer.pyx.tp +1088 -0
  172. multipers/tensor/tensor.h +672 -0
  173. multipers/tensor.pxd +13 -0
  174. multipers/test.pyx +44 -0
  175. multipers/tests/__init__.py +62 -0
  176. multipers/torch/__init__.py +1 -0
  177. multipers/torch/diff_grids.py +240 -0
  178. multipers/torch/rips_density.py +310 -0
  179. multipers-2.3.3b6.dist-info/METADATA +128 -0
  180. multipers-2.3.3b6.dist-info/RECORD +183 -0
  181. multipers-2.3.3b6.dist-info/WHEEL +6 -0
  182. multipers-2.3.3b6.dist-info/licenses/LICENSE +21 -0
  183. multipers-2.3.3b6.dist-info/top_level.txt +1 -0
@@ -0,0 +1,170 @@
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): Hannah Schreiber
4
+ *
5
+ * Copyright (C) 2022-24 Inria
6
+ *
7
+ * Modification(s):
8
+ * - YYYY/MM Author: Description of the modification
9
+ */
10
+
11
+ /**
12
+ * @file persistence_matrix_options.h
13
+ * @author Hannah Schreiber
14
+ * @brief Contains the options for the matrix template.
15
+ */
16
+
17
+ #ifndef PM_OPTIONS_INCLUDED
18
+ #define PM_OPTIONS_INCLUDED
19
+
20
+ #include "Fields/Zp_field_operators.h"
21
+
22
+ namespace Gudhi {
23
+ namespace persistence_matrix {
24
+
25
+ /**
26
+ * @ingroup persistence_matrix
27
+ *
28
+ * @brief List of column types.
29
+ */
30
+ enum class Column_types {
31
+ LIST, /**< @ref List_column "": Underlying container is a std::list<@ref Entry*>. */
32
+ SET, /**< @ref Set_column "": Underlying container is a std::set<@ref Entry*>. */
33
+ HEAP, /**< @ref Heap_column "": Underlying container is a std::vector<@ref Entry*> ordered as a heap.
34
+ Is not compatible with row access and column compression. */
35
+ VECTOR, /**< @ref Vector_column "": Underlying container is a std::vector<@ref Entry*>
36
+ with a lazy removal method. */
37
+ NAIVE_VECTOR, /**< @ref Naive_vector_column "": Underlying container is a std::vector<@ref Entry*>. */
38
+ UNORDERED_SET, /**< @ref Unordered_set_column "": Underlying container is a std::unordered_set<@ref Entry*>. */
39
+ INTRUSIVE_LIST, /**< @ref Intrusive_list_column "": Underlying container is a boost::intrusive::list<@ref Entry>. */
40
+ INTRUSIVE_SET, /**< @ref Intrusive_set_column "": Underlying container is a boost::intrusive::set<@ref Entry>. */
41
+ SMALL_VECTOR
42
+ };
43
+
44
+ /**
45
+ * @ingroup persistence_matrix
46
+ *
47
+ * @brief List if indexation schemes. See @ref mp_indexation "description of indexation schemes" for more details
48
+ * about the meaning of the indexation types.
49
+ */
50
+ enum class Column_indexation_types {
51
+ CONTAINER, /**< Default use of @ref MatIdx indices. */
52
+ POSITION, /**< All input and output @ref MatIdx indices are replaced with @ref PosIdx indices. */
53
+ IDENTIFIER /**< All input and output @ref MatIdx indices are replaced with @ref IDIdx indices. */
54
+ };
55
+
56
+ /**
57
+ * @struct Default_options persistence_matrix_options.h gudhi/persistence_matrix_options.h
58
+ * @ingroup persistence_matrix
59
+ *
60
+ * @brief Default option structure for @ref Matrix class.
61
+ * See the @ref PersistenceMatrixOptions concept for a more detailed description of the fields.
62
+ * Produces a @ref basematrix "base matrix" with no enabled option.
63
+ *
64
+ * To create other matrix types, the easiest is to simply inherit from this structure and overwrite only the options
65
+ * one is interested in.
66
+ *
67
+ * @tparam col_type Column type for the matrix. Default value: @ref Column_types::INTRUSIVE_SET
68
+ * @tparam is_z2_only Flag indicating if only \f$Z_2\f$ coefficient will be used with the matrix. Set to true if it
69
+ * is the case, false otherwise. Default value: true.
70
+ * @tparam FieldOperators Field operators used by the matrix, see FieldOperators concept.
71
+ * Only necessary if @p is_z2_only is false.
72
+ * Default value: @ref Gudhi::persistence_fields::Zp_field_operators<>.
73
+ */
74
+ template <Column_types col_type = Column_types::INTRUSIVE_SET,
75
+ bool is_z2_only = true,
76
+ class FieldOperators = persistence_fields::Zp_field_operators<> >
77
+ struct Default_options
78
+ {
79
+ using Field_coeff_operators = FieldOperators;
80
+ using Dimension = int;
81
+ using Index = unsigned int;
82
+
83
+ static const bool is_z2 = is_z2_only;
84
+ static const Column_types column_type = col_type;
85
+
86
+ static const Column_indexation_types column_indexation_type = Column_indexation_types::CONTAINER;
87
+
88
+ static const bool has_column_compression = false;
89
+ static const bool has_column_and_row_swaps = false;
90
+
91
+ static const bool has_map_column_container = false;
92
+ static const bool has_removable_columns = false;
93
+
94
+ static const bool has_row_access = false;
95
+ static const bool has_intrusive_rows = true;
96
+ static const bool has_removable_rows = false;
97
+
98
+ static const bool is_of_boundary_type = true;
99
+
100
+ static const bool has_matrix_maximal_dimension_access = false;
101
+ static const bool has_column_pairings = false;
102
+ static const bool has_vine_update = false;
103
+ static const bool can_retrieve_representative_cycles = false;
104
+ };
105
+
106
+ //TODO: The following structures are the one used by the other modules or debug tests.
107
+ // They will probably be removed once the module was properly integrated.
108
+
109
+ /**
110
+ * @brief Options used for the Zigzag persistence module.
111
+ *
112
+ * @tparam column_type Column type for the matrix.
113
+ */
114
+ template <Column_types column_type = Column_types::INTRUSIVE_LIST>
115
+ struct Zigzag_options : Default_options<column_type, true>
116
+ {
117
+ static const bool has_row_access = true;
118
+ static const bool has_column_pairings = false;
119
+ static const bool has_vine_update = true;
120
+ static const bool is_of_boundary_type = false;
121
+ static const bool has_map_column_container = true;
122
+ static const bool has_removable_columns = true;
123
+ static const bool has_removable_rows = true;
124
+ };
125
+
126
+ /**
127
+ * @brief Options needed to use the representative cycles.
128
+ *
129
+ * @tparam col_type Column type for the matrix.
130
+ */
131
+ template <Column_types col_type = Column_types::INTRUSIVE_SET>
132
+ struct Representative_cycles_options : Default_options<col_type, true>
133
+ {
134
+ static const bool has_column_pairings = true;
135
+ static const bool can_retrieve_representative_cycles = true;
136
+ };
137
+
138
+ /**
139
+ * @brief Options used by the Multipersistence module.
140
+ *
141
+ * @tparam column_type Column type for the matrix.
142
+ */
143
+ template <Column_types column_type = Column_types::INTRUSIVE_SET>
144
+ struct Multi_persistence_options : Default_options<column_type, true>
145
+ {
146
+ static const bool has_column_pairings = true;
147
+ static const bool has_vine_update = true;
148
+ };
149
+
150
+ /**
151
+ * @brief Options used by the cohomology module.
152
+ *
153
+ * @tparam column_type Column type for the matrix.
154
+ * @tparam is_z2_only True if Z2.
155
+ * @tparam FieldOperators Field operator.
156
+ */
157
+ template <Column_types column_type = Column_types::INTRUSIVE_LIST,
158
+ bool is_z2_only = true,
159
+ class FieldOperators = persistence_fields::Zp_field_operators<> >
160
+ struct Cohomology_persistence_options : Default_options<column_type, is_z2_only, FieldOperators>
161
+ {
162
+ static const bool has_row_access = true;
163
+ static const bool has_column_compression = true;
164
+ static const bool has_removable_rows = true;
165
+ };
166
+
167
+ } // namespace persistence_matrix
168
+ } // namespace Gudhi
169
+
170
+ #endif // PM_OPTIONS_INCLUDED
@@ -0,0 +1,367 @@
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): Clement Maria, Pawel Dlotko, Clement Jamin
4
+ *
5
+ * Copyright (C) 2014 Inria
6
+ *
7
+ * Modification(s):
8
+ * - YYYY/MM Author: Description of the modification
9
+ */
10
+
11
+ #ifndef READER_UTILS_H_
12
+ #define READER_UTILS_H_
13
+
14
+ #include <gudhi/graph_simplicial_complex.h>
15
+ #include <gudhi/Debug_utils.h>
16
+
17
+ # include <boost/iterator/function_output_iterator.hpp>
18
+ #include <boost/graph/adjacency_list.hpp>
19
+
20
+ #include <iostream>
21
+ #include <fstream>
22
+ #include <map>
23
+ #include <limits> // for numeric_limits
24
+ #include <string>
25
+ #include <vector>
26
+ #include <utility> // for pair
27
+ #include <tuple> // for std::make_tuple
28
+
29
+ namespace Gudhi {
30
+
31
+ // Keep this file tag for Doxygen to parse the code, otherwise, functions are not documented.
32
+ // It is required for global functions and variables.
33
+
34
+ /** @file
35
+ * @brief This file includes common file reader for GUDHI
36
+ */
37
+
38
+ /**
39
+ * @brief Read a set of points to turn it into a vector< vector<double> > by filling points.
40
+ *
41
+ * File format: 1 point per line<br>
42
+ * X11 X12 ... X1d<br>
43
+ * X21 X22 ... X2d<br>
44
+ * etc<br>
45
+ */
46
+ inline void read_points(std::string file_name, std::vector<std::vector<double>>& points) {
47
+ std::ifstream in_file(file_name.c_str(), std::ios::in);
48
+ if (!in_file.is_open()) {
49
+ std::cerr << "Unable to open file " << file_name << std::endl;
50
+ return;
51
+ }
52
+
53
+ std::string line;
54
+ double x;
55
+ while (getline(in_file, line)) {
56
+ std::vector<double> point;
57
+ std::istringstream iss(line);
58
+ while (iss >> x) {
59
+ point.push_back(x);
60
+ }
61
+ // Check for empty lines
62
+ if (!point.empty()) points.push_back(point);
63
+ }
64
+ in_file.close();
65
+ }
66
+
67
+ /**
68
+ * @brief Read a graph from a file.
69
+ *
70
+ * \tparam Graph_t Type for the return graph. Must be constructible from iterators on pairs of Vertex_handle
71
+ * \tparam Filtration_value Type for the value of the read filtration
72
+ * \tparam Vertex_handle Type for the value of the read vertices
73
+ *
74
+ * File format: 1 simplex per line<br>
75
+ * Dim1 X11 X12 ... X1d Fil1<br>
76
+ * Dim2 X21 X22 ... X2d Fil2<br>
77
+ * etc<br>
78
+ *
79
+ * The vertices must be labeled from 0 to n-1.
80
+ * Every simplex must appear exactly once.
81
+ * Simplices of dimension more than 1 are ignored.
82
+ */
83
+ template <typename Graph_t, typename Filtration_value, typename Vertex_handle>
84
+ Graph_t read_graph(std::string file_name) {
85
+ std::ifstream in_(file_name.c_str(), std::ios::in);
86
+ if (!in_.is_open()) {
87
+ std::string error_str("read_graph - Unable to open file ");
88
+ error_str.append(file_name);
89
+ std::cerr << error_str << std::endl;
90
+ throw std::invalid_argument(error_str);
91
+ }
92
+
93
+ typedef std::pair<Vertex_handle, Vertex_handle> Edge_t;
94
+ std::vector<Edge_t> edges;
95
+ std::vector<Filtration_value> edges_fil;
96
+ std::map<Vertex_handle, Filtration_value> vertices;
97
+
98
+ std::string line;
99
+ int dim;
100
+ Vertex_handle u, v, max_h = -1;
101
+ Filtration_value fil;
102
+ while (getline(in_, line)) {
103
+ std::istringstream iss(line);
104
+ while (iss >> dim) {
105
+ switch (dim) {
106
+ case 0: {
107
+ iss >> u;
108
+ iss >> fil;
109
+ vertices[u] = fil;
110
+ if (max_h < u) {
111
+ max_h = u;
112
+ }
113
+ break;
114
+ }
115
+ case 1: {
116
+ iss >> u;
117
+ iss >> v;
118
+ iss >> fil;
119
+ edges.push_back(Edge_t(u, v));
120
+ edges_fil.push_back(fil);
121
+ break;
122
+ }
123
+ default: { break; }
124
+ }
125
+ }
126
+ }
127
+ in_.close();
128
+
129
+ if ((size_t)(max_h + 1) != vertices.size()) {
130
+ std::cerr << "Error: vertices must be labeled from 0 to n-1 \n";
131
+ }
132
+
133
+ Graph_t skel_graph(edges.begin(), edges.end(), edges_fil.begin(), vertices.size());
134
+ auto vertex_prop = boost::get(vertex_filtration_t(), skel_graph);
135
+
136
+ typename boost::graph_traits<Graph_t>::vertex_iterator vi, vi_end;
137
+ auto v_it = vertices.begin();
138
+ for (std::tie(vi, vi_end) = boost::vertices(skel_graph); vi != vi_end; ++vi, ++v_it) {
139
+ boost::put(vertex_prop, *vi, v_it->second);
140
+ }
141
+
142
+ return skel_graph;
143
+ }
144
+
145
+ /**
146
+ * @brief Read a face from a file.
147
+ *
148
+ * File format: 1 simplex per line<br>
149
+ * Dim1 X11 X12 ... X1d Fil1<br>
150
+ * Dim2 X21 X22 ... X2d Fil2<br>
151
+ * etc<br>
152
+ *
153
+ * The vertices must be labeled from 0 to n-1.
154
+ * Every simplex must appear exactly once.
155
+ * Simplices of dimension more than 1 are ignored.
156
+ */
157
+ template <typename Vertex_handle, typename Filtration_value>
158
+ bool read_simplex(std::istream& in_, std::vector<Vertex_handle>& simplex, Filtration_value& fil) {
159
+ int dim = 0;
160
+ if (!(in_ >> dim)) return false;
161
+ Vertex_handle v;
162
+ for (int i = 0; i < dim + 1; ++i) {
163
+ if (!(in_ >> v)) return false;
164
+ simplex.push_back(v);
165
+ }
166
+ if (!(in_ >> fil)) return false;
167
+ in_.ignore((std::numeric_limits<std::streamsize>::max)(), '\n'); // ignore until the carriage return
168
+ return true;
169
+ }
170
+
171
+ /**
172
+ * @brief Read a hasse simplex from a file.
173
+ *
174
+ * File format: 1 simplex per line<br>
175
+ * Dim1 k11 k12 ... k1Dim1 Fil1<br>
176
+ * Dim2 k21 k22 ... k2Dim2 Fil2<br>
177
+ * etc<br>
178
+ *
179
+ * The key of a simplex is its position in the filtration order and also the number of its row in the file.
180
+ * Dimi ki1 ki2 ... kiDimi Fili means that the ith simplex in the filtration has dimension Dimi, filtration value
181
+ * fil1 and simplices with key ki1 ... kiDimi in its boundary.*/
182
+ template <typename Simplex_key, typename Filtration_value>
183
+ bool read_hasse_simplex(std::istream& in_, std::vector<Simplex_key>& boundary, Filtration_value& fil) {
184
+ int dim;
185
+ if (!(in_ >> dim)) return false;
186
+ if (dim == 0) {
187
+ in_ >> fil;
188
+ return true;
189
+ }
190
+ Simplex_key key;
191
+ for (int i = 0; i < dim + 1; ++i) {
192
+ in_ >> key;
193
+ boundary.push_back(key);
194
+ }
195
+ in_ >> fil;
196
+ return true;
197
+ }
198
+
199
+ /**
200
+ * @brief Read a lower triangular distance matrix from a csv file. We assume that the .csv store the whole
201
+ * (square) matrix.
202
+ *
203
+ * @author Pawel Dlotko
204
+ *
205
+ * Square matrix file format:<br>
206
+ * 0;D12;...;D1j<br>
207
+ * D21;0;...;D2j<br>
208
+ * ...<br>
209
+ * Dj1;Dj2;...;0<br>
210
+ *
211
+ * lower matrix file format:<br>
212
+ * 0<br>
213
+ * D21;<br>
214
+ * D31;D32;<br>
215
+ * ...<br>
216
+ * Dj1;Dj2;...;Dj(j-1);<br>
217
+ *
218
+ **/
219
+ template <typename Filtration_value>
220
+ std::vector<std::vector<Filtration_value>> read_lower_triangular_matrix_from_csv_file(const std::string& filename,
221
+ const char separator = ';') {
222
+ #ifdef DEBUG_TRACES
223
+ std::clog << "Using procedure read_lower_triangular_matrix_from_csv_file \n";
224
+ #endif // DEBUG_TRACES
225
+ std::vector<std::vector<Filtration_value>> result;
226
+ std::ifstream in;
227
+ in.open(filename.c_str());
228
+ if (!in.is_open()) {
229
+ return result;
230
+ }
231
+
232
+ std::string line;
233
+
234
+ // the first line is empty, so we ignore it:
235
+ std::getline(in, line);
236
+ std::vector<Filtration_value> values_in_this_line;
237
+ result.push_back(values_in_this_line);
238
+
239
+ int number_of_line = 0;
240
+
241
+ // first, read the file line by line to a string:
242
+ while (std::getline(in, line)) {
243
+ // if line is empty, break
244
+ if (line.size() == 0) break;
245
+
246
+ // if the last element of a string is comma:
247
+ if (line[line.size() - 1] == separator) {
248
+ // then shrink the string by one
249
+ line.pop_back();
250
+ }
251
+
252
+ // replace all commas with spaces
253
+ std::replace(line.begin(), line.end(), separator, ' ');
254
+
255
+ // put the new line to a stream
256
+ std::istringstream iss(line);
257
+ // and now read the doubles.
258
+
259
+ int number_of_entry = 0;
260
+ std::vector<Filtration_value> values_in_this_line;
261
+ while (iss.good()) {
262
+ double entry;
263
+ iss >> entry;
264
+ if (number_of_entry <= number_of_line) {
265
+ values_in_this_line.push_back(entry);
266
+ }
267
+ ++number_of_entry;
268
+ }
269
+ if (!values_in_this_line.empty()) result.push_back(values_in_this_line);
270
+ ++number_of_line;
271
+ }
272
+ in.close();
273
+
274
+ #ifdef DEBUG_TRACES
275
+ std::clog << "Here is the matrix we read : \n";
276
+ for (size_t i = 0; i != result.size(); ++i) {
277
+ for (size_t j = 0; j != result[i].size(); ++j) {
278
+ std::clog << result[i][j] << " ";
279
+ }
280
+ std::clog << std::endl;
281
+ }
282
+ #endif // DEBUG_TRACES
283
+
284
+ return result;
285
+ } // read_lower_triangular_matrix_from_csv_file
286
+
287
+ /**
288
+ Reads a file containing persistence intervals.
289
+ Each line might contain 2, 3 or 4 values: [[field] dimension] birth death
290
+ The output iterator `out` is used this way: `*out++ = std::make_tuple(dim, birth, death);`
291
+ where `dim` is an `int`, `birth` a `double`, and `death` a `double`.
292
+ Note: the function does not check that birth <= death.
293
+ **/
294
+ template <typename OutputIterator>
295
+ void read_persistence_intervals_and_dimension(std::string const& filename, OutputIterator out) {
296
+ #ifdef DEBUG_TRACES
297
+ std::clog << "read_persistence_intervals_and_dimension - " << filename << std::endl;
298
+ #endif // DEBUG_TRACES
299
+ std::ifstream in(filename);
300
+ if (!in.is_open()) {
301
+ std::string error_str("read_persistence_intervals_and_dimension - Unable to open file ");
302
+ error_str.append(filename);
303
+ std::cerr << error_str << std::endl;
304
+ throw std::invalid_argument(error_str);
305
+ }
306
+
307
+ while (!in.eof()) {
308
+ std::string line;
309
+ getline(in, line);
310
+ if (line.length() != 0 && line[0] != '#') {
311
+ double numbers[4];
312
+ int n = sscanf(line.c_str(), "%lf %lf %lf %lf", &numbers[0], &numbers[1], &numbers[2], &numbers[3]);
313
+ #ifdef DEBUG_TRACES
314
+ std::clog << "[" << n << "] = ";
315
+ for (int i = 0; i < n; i++) {
316
+ std::clog << numbers[i] << ",";
317
+ }
318
+ std::clog << std::endl;
319
+ #endif // DEBUG_TRACES
320
+ if (n >= 2) {
321
+ int dim = (n >= 3 ? static_cast<int>(numbers[n - 3]) : -1);
322
+ *out++ = std::make_tuple(dim, numbers[n - 2], numbers[n - 1]);
323
+ }
324
+ }
325
+ }
326
+ }
327
+
328
+ /**
329
+ Reads a file containing persistence intervals.
330
+ Each line might contain 2, 3 or 4 values: [[field] dimension] birth death
331
+ The return value is an `std::map<dim, std::vector<std::pair<birth, death>>>`
332
+ where `dim` is an `int`, `birth` a `double`, and `death` a `double`.
333
+ Note: the function does not check that birth <= death.
334
+ **/
335
+ inline std::map<int, std::vector<std::pair<double, double>>> read_persistence_intervals_grouped_by_dimension(
336
+ std::string const& filename) {
337
+ std::map<int, std::vector<std::pair<double, double>>> ret;
338
+ read_persistence_intervals_and_dimension(
339
+ filename, boost::make_function_output_iterator([&ret](std::tuple<int, double, double> t) {
340
+ ret[get<0>(t)].push_back(std::make_pair(get<1>(t), get<2>(t)));
341
+ }));
342
+ return ret;
343
+ }
344
+
345
+ /**
346
+ Reads a file containing persistence intervals.
347
+ Each line might contain 2, 3 or 4 values: [[field] dimension] birth death
348
+ If `only_this_dim` = -1, dimension is ignored and all lines are returned.
349
+ If `only_this_dim` is >= 0, only the lines where dimension = `only_this_dim`
350
+ (or where dimension is not specified) are returned.
351
+ The return value is an `std::vector<std::pair<birth, death>>`
352
+ where `dim` is an `int`, `birth` a `double`, and `death` a `double`.
353
+ Note: the function does not check that birth <= death.
354
+ **/
355
+ inline std::vector<std::pair<double, double>> read_persistence_intervals_in_dimension(std::string const& filename,
356
+ int only_this_dim = -1) {
357
+ std::vector<std::pair<double, double>> ret;
358
+ read_persistence_intervals_and_dimension(
359
+ filename, boost::make_function_output_iterator([only_this_dim, &ret](std::tuple<int, double, double> t) {
360
+ if (only_this_dim == get<0>(t) || only_this_dim == -1) ret.emplace_back(get<1>(t), get<2>(t));
361
+ }));
362
+ return ret;
363
+ }
364
+
365
+ } // namespace Gudhi
366
+
367
+ #endif // READER_UTILS_H_