18#ifndef PM_BASE_PAIRING_H
19#define PM_BASE_PAIRING_H
22#include <unordered_map>
29namespace persistence_matrix {
50template <
class Master_matrix>
52 Master_matrix::Option_list::has_removable_columns,
53 Cell_position_to_ID_mapper<typename Master_matrix::ID_index, typename Master_matrix::Pos_index>,
58 using Bar =
typename Master_matrix::Bar;
59 using Barcode =
typename Master_matrix::Barcode;
61 using Index =
typename Master_matrix::Index;
62 using Dimension =
typename Master_matrix::Dimension;
84 if constexpr (Master_matrix::Option_list::has_removable_columns) {
85 swap(
static_cast<Cell_position_to_ID_mapper<ID_index, Pos_index>&
>(pairing1),
86 static_cast<Cell_position_to_ID_mapper<ID_index, Pos_index>&
>(pairing2));
88 pairing1.barcode_.swap(pairing2.barcode_);
89 pairing1.deathToBar_.swap(pairing2.deathToBar_);
90 pairing1.idToPosition_.swap(pairing2.idToPosition_);
91 std::swap(pairing1.isReduced_, pairing2.isReduced_);
95 using Pos_index =
typename Master_matrix::Pos_index;
96 using ID_index =
typename Master_matrix::ID_index;
97 using Dictionary =
typename Master_matrix::Bar_dictionary;
98 using Base_matrix =
typename Master_matrix::Master_boundary_matrix;
100 using PIDM =
typename std::conditional<Master_matrix::Option_list::has_removable_columns,
101 Cell_position_to_ID_mapper<ID_index, Pos_index>,
106 Dictionary deathToBar_;
110 std::unordered_map<ID_index,Pos_index> idToPosition_;
114 void _remove_last(Pos_index columnIndex);
121template <
class Master_matrix>
125template <
class Master_matrix>
128 if (!isReduced_) _reduce();
132template <
class Master_matrix>
135 constexpr const Pos_index nullDeath = Master_matrix::template get_null_value<Pos_index>();
136 constexpr const Index nullIndex = Master_matrix::template get_null_value<Index>();
138 std::unordered_map<Index, Index> negativeColumns(_matrix()->get_number_of_columns());
140 auto dim = _matrix()->get_max_dimension();
141 std::vector<std::vector<Index> > columnsByDim(dim + 1);
142 for (
auto& v : columnsByDim) v.reserve(_matrix()->get_number_of_columns());
143 for (
unsigned int i = 0; i < _matrix()->get_number_of_columns(); i++) {
144 columnsByDim[dim - _matrix()->get_column_dimension(i)].push_back(i);
147 for (
const auto& cols : columnsByDim) {
148 for (Index i : cols) {
149 auto& curr = _matrix()->get_column(i);
150 if (curr.is_empty()) {
151 if (negativeColumns.find(i) == negativeColumns.end()) {
152 barcode_.emplace_back(i, nullDeath, dim);
155 ID_index pivot = curr.get_pivot();
156 auto it = idToPosition_.find(pivot);
157 Index pivotColumnNumber = it == idToPosition_.end() ? pivot : it->second;
158 auto itNeg = negativeColumns.find(pivotColumnNumber);
159 Index pivotKiller = itNeg == negativeColumns.end() ? nullIndex : itNeg->second;
161 while (pivot != Master_matrix::template get_null_value<ID_index>() &&
162 pivotKiller != Master_matrix::template get_null_value<Index>()) {
163 if constexpr (Master_matrix::Option_list::is_z2) {
164 curr += _matrix()->get_column(pivotKiller);
166 auto& toadd = _matrix()->get_column(pivotKiller);
167 typename Master_matrix::Element coef = toadd.get_pivot_value();
168 auto& operators = _matrix()->colSettings_->operators;
169 coef = operators.get_inverse(coef);
170 operators.multiply_inplace(coef, operators.get_characteristic() - curr.get_pivot_value());
171 curr.multiply_source_and_add(toadd, coef);
174 pivot = curr.get_pivot();
175 it = idToPosition_.find(pivot);
176 pivotColumnNumber = it == idToPosition_.end() ? pivot : it->second;
177 itNeg = negativeColumns.find(pivotColumnNumber);
178 pivotKiller = itNeg == negativeColumns.end() ? nullIndex : itNeg->second;
181 if (pivot != Master_matrix::template get_null_value<ID_index>()) {
182 negativeColumns.emplace(pivotColumnNumber, i);
183 _matrix()->get_column(pivotColumnNumber).clear();
184 barcode_.emplace_back(pivotColumnNumber, i, dim - 1);
187 barcode_.emplace_back(i, nullDeath, dim);
194 if constexpr (Master_matrix::Option_list::has_removable_columns) {
196 std::sort(barcode_.begin(), barcode_.end(), [](
const Bar& b1,
const Bar& b2) { return b1.birth < b2.birth; });
198 for (Index i = 0; i < barcode_.size(); ++i) {
199 auto d = barcode_[i].death;
200 if (d != Master_matrix::template get_null_value<Pos_index>()) {
201 deathToBar_.emplace(d, i);
209template <
class Master_matrix>
210inline void Base_pairing<Master_matrix>::_remove_last(Pos_index columnIndex)
212 static_assert(Master_matrix::Option_list::has_removable_columns,
"remove_last not available.");
215 auto it = deathToBar_.find(columnIndex);
217 if (it == deathToBar_.end()) {
220 barcode_[it->second].death = Master_matrix::template get_null_value<Pos_index>();
221 deathToBar_.erase(it);
225 auto it = PIDM::map_.find(columnIndex);
226 if (it != PIDM::map_.end()){
227 idToPosition_.erase(it->second);
228 PIDM::map_.erase(it);
Contains the Gudhi::persistence_matrix::Cell_position_to_ID_mapper class and Gudhi::persistence_matri...
A basic matrix structure allowing to easily manipulate and access entire columns and rows,...
Definition: Base_matrix.h:39
Class managing the barcode for Boundary_matrix if the option was enabled.
Definition: base_pairing.h:56
typename Master_matrix::Bar Bar
Definition: base_pairing.h:58
typename Master_matrix::Dimension Dimension
Definition: base_pairing.h:62
friend void swap(Base_pairing &pairing1, Base_pairing &pairing2)
Swap operator.
Definition: base_pairing.h:83
typename Master_matrix::Barcode Barcode
Definition: base_pairing.h:59
Base_pairing()
Default constructor.
Definition: base_pairing.h:122
typename Master_matrix::Index Index
Definition: base_pairing.h:61
const Barcode & get_current_barcode()
Reduces the matrix stored in Boundary_matrix and computes the corresponding barcode.
Definition: base_pairing.h:126
typename Master_matrix::Column_container Column_container
Definition: base_pairing.h:60
Data structure for matrices, and in particular thought for matrices representing filtered complexes i...
Definition: Matrix.h:144
Gudhi namespace.
Definition: SimplicialComplexForAlpha.h:14
Empty structure. Inherited instead of Base_pairing, when the computation of the barcode was not enabl...
Definition: base_pairing.h:38