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