18#ifndef PM_BASE_PAIRING_H
19#define PM_BASE_PAIRING_H
22#include <unordered_map>
50template <
class Master_matrix>
52 :
protected std::conditional_t<
53 Master_matrix::Option_list::has_removable_columns,
54 Index_mapper<std::unordered_map<typename Master_matrix::Pos_index, typename Master_matrix::ID_index> >,
58 using Pos_index =
typename Master_matrix::Pos_index;
59 using ID_index =
typename Master_matrix::ID_index;
61 using PIDM = std::conditional_t<Master_matrix::Option_list::has_removable_columns,
62 Index_mapper<std::unordered_map<Pos_index, ID_index> >,
66 using Bar =
typename Master_matrix::Bar;
67 using Barcode =
typename Master_matrix::Barcode;
68 using Column =
typename Master_matrix::Column;
69 using Index =
typename Master_matrix::Index;
92 if constexpr (Master_matrix::Option_list::has_removable_columns) {
93 swap(
static_cast<PIDM&
>(pairing1),
static_cast<PIDM&
>(pairing2));
95 pairing1.barcode_.swap(pairing2.barcode_);
96 pairing1.deathToBar_.swap(pairing2.deathToBar_);
97 pairing1.idToPosition_.swap(pairing2.idToPosition_);
98 std::swap(pairing1.isReduced_, pairing2.isReduced_);
102 void _remove_last(Pos_index columnIndex);
103 void _insert_id_position(ID_index
id, Pos_index pos);
107 using Dictionary =
typename Master_matrix::Bar_dictionary;
108 using Base_matrix =
typename Master_matrix::Master_boundary_matrix;
111 Dictionary deathToBar_;
116 std::unordered_map<ID_index, Pos_index> idToPosition_;
119 void _reduce_column_with(
Column& toReduce,
Column& toAdd);
124 constexpr const Base_matrix* _matrix()
const {
return static_cast<const Base_matrix*
>(
this); }
127template <
class Master_matrix>
131template <
class Master_matrix>
134 if (!isReduced_) _reduce();
138template <
class Master_matrix>
139inline void Base_pairing<Master_matrix>::_reduce()
141 constexpr const Pos_index nullDeath = Master_matrix::template get_null_value<Pos_index>();
142 constexpr const Index nullIndex = Master_matrix::template get_null_value<Index>();
143 constexpr const ID_index nullPivot = Master_matrix::template get_null_value<ID_index>();
145 std::unordered_map<Index, Index> negativeColumns(_matrix()->get_number_of_columns());
147 auto dim = _matrix()->get_max_dimension();
148 std::vector<std::vector<Index> > columnsByDim(dim + 1);
149 for (
auto& v : columnsByDim) v.reserve(_matrix()->get_number_of_columns());
150 for (
unsigned int i = 0; i < _matrix()->get_number_of_columns(); i++) {
151 columnsByDim[dim - _matrix()->get_column_dimension(i)].push_back(i);
154 for (
const auto& cols : columnsByDim) {
155 for (Index i : cols) {
156 auto& curr = _matrix()->get_column(i);
157 if (curr.is_empty()) {
158 if (negativeColumns.find(i) == negativeColumns.end()) {
159 barcode_.emplace_back(i, nullDeath, dim);
162 ID_index pivot = curr.get_pivot();
163 auto it = idToPosition_.find(pivot);
164 Index pivotColumnNumber = it == idToPosition_.end() ? pivot : it->second;
165 auto itNeg = negativeColumns.find(pivotColumnNumber);
166 Index pivotKiller = itNeg == negativeColumns.end() ? nullIndex : itNeg->second;
168 while (pivot != nullPivot && pivotKiller != nullIndex) {
169 _reduce_column_with(curr, _matrix()->get_column(pivotKiller));
170 pivot = curr.get_pivot();
171 it = idToPosition_.find(pivot);
172 pivotColumnNumber = it == idToPosition_.end() ? pivot : it->second;
173 itNeg = negativeColumns.find(pivotColumnNumber);
174 pivotKiller = itNeg == negativeColumns.end() ? nullIndex : itNeg->second;
177 if (pivot != nullPivot) {
178 negativeColumns.emplace(pivotColumnNumber, i);
179 _matrix()->get_column(pivotColumnNumber).clear();
180 barcode_.emplace_back(pivotColumnNumber, i, dim - 1);
183 barcode_.emplace_back(i, nullDeath, dim);
190 if constexpr (Master_matrix::Option_list::has_removable_columns) {
192 std::sort(barcode_.begin(), barcode_.end(), [](
const Bar& b1,
const Bar& b2) { return b1.birth < b2.birth; });
194 for (Index i = 0; i < barcode_.size(); ++i) {
195 auto d = barcode_[i].death;
196 if (d != Master_matrix::template get_null_value<Pos_index>()) {
197 deathToBar_.emplace(d, i);
205template <
class Master_matrix>
206inline void Base_pairing<Master_matrix>::_reduce_column_with(Column& toReduce, Column& toAdd)
208 if constexpr (Master_matrix::Option_list::is_z2) {
211 typename Master_matrix::Element coeff = toAdd.get_pivot_value();
212 auto& operators = _matrix()->colSettings_->operators;
213 coeff = operators.get_inverse(coeff);
214 operators.multiply_inplace(coeff, operators.get_characteristic() - toReduce.get_pivot_value());
215 toReduce.multiply_source_and_add(toAdd, coeff);
219template <
class Master_matrix>
220inline void Base_pairing<Master_matrix>::_remove_last(Pos_index columnIndex)
222 static_assert(Master_matrix::Option_list::has_removable_columns,
"remove_last not available.");
225 auto it = deathToBar_.find(columnIndex);
227 if (it == deathToBar_.end()) {
230 barcode_[it->second].death = Master_matrix::template get_null_value<Pos_index>();
231 deathToBar_.erase(it);
235 auto it = PIDM::map_.find(columnIndex);
236 if (it != PIDM::map_.end()) {
237 idToPosition_.erase(it->second);
238 PIDM::map_.erase(it);
242template <
class Master_matrix>
243inline void Base_pairing<Master_matrix>::_insert_id_position(ID_index
id, Pos_index pos)
245 idToPosition_.emplace(
id, pos);
248template <
class Master_matrix>
249inline void Base_pairing<Master_matrix>::_reset()
254 idToPosition_.clear();
A basic matrix structure allowing to easily manipulate and access entire columns and rows,...
Definition Base_matrix.h:39
typename Master_matrix::Bar Bar
Definition base_pairing.h:66
typename Master_matrix::Column Column
Definition base_pairing.h:68
typename Master_matrix::Barcode Barcode
Definition base_pairing.h:67
friend void swap(Base_pairing &pairing1, Base_pairing &pairing2) noexcept
Swap operator.
Definition base_pairing.h:90
Base_pairing()
Default constructor.
Definition base_pairing.h:128
typename Master_matrix::Index Index
Definition base_pairing.h:69
const Barcode & get_current_barcode()
Reduces the matrix stored in Boundary_matrix and computes the corresponding barcode.
Definition base_pairing.h:132
Contains the Gudhi::persistence_matrix::Index_mapper class and Gudhi::persistence_matrix::Dummy_index...
Persistence matrix namespace.
Definition FieldOperators.h:18
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