17#ifndef PM_POS_TO_ID_TRANSLATION_H 
   18#define PM_POS_TO_ID_TRANSLATION_H 
   25namespace persistence_matrix {
 
   38template <
class Underlying_matrix, 
class Master_matrix>
 
   42  using Index = 
typename Master_matrix::Index;                              
 
   43  using ID_index = 
typename Master_matrix::ID_index;                        
 
   44  using Pos_index = 
typename Master_matrix::Pos_index;                      
 
   45  using Dimension = 
typename Master_matrix::Dimension;                      
 
   51  using Boundary = 
typename Master_matrix::Boundary;                        
 
   52  using Column = 
typename Master_matrix::Column;                            
 
   53  using Row = 
typename Master_matrix::Row;                                  
 
   55  using Bar = 
typename Master_matrix::Bar;                                  
 
   56  using Barcode = 
typename Master_matrix::Barcode;                          
 
   57  using Cycle = 
typename Master_matrix::Cycle;                              
 
   91  template <
class Boundary_range = Boundary>
 
  125  template <
typename BirthComparatorFunction, 
typename DeathComparatorFunction>
 
  127                            const BirthComparatorFunction& birthComparator,
 
  128                            const DeathComparatorFunction& deathComparator);
 
  165  template <
typename BirthComparatorFunction, 
typename DeathComparatorFunction, 
class Boundary_range>
 
  168                            const BirthComparatorFunction& birthComparator,
 
  169                            const DeathComparatorFunction& deathComparator);
 
  193  template <
typename BirthComparatorFunction, 
typename DeathComparatorFunction>
 
  196                            const BirthComparatorFunction& birthComparator,
 
  197                            const DeathComparatorFunction& deathComparator);
 
  236  template <
class Boundary_range = Boundary>
 
  238                       Dimension dim = Master_matrix::template get_null_value<Dimension>());
 
  256  template <
class Boundary_range = Boundary>
 
  258                       Dimension dim = Master_matrix::template get_null_value<Dimension>());
 
  439    matrix_.reset(colSettings);
 
  440    positionToIndex_.clear();
 
  455    swap(matrix1.matrix_, matrix2.matrix_);
 
  456    matrix1.positionToIndex_.swap(matrix2.positionToIndex_);
 
  457    std::swap(matrix1.nextPosition_, matrix2.nextPosition_);
 
  458    std::swap(matrix1.nextIndex_, matrix2.nextIndex_);
 
  526  Underlying_matrix matrix_;            
 
  527  std::vector<Index> positionToIndex_;  
 
  532template <
class Underlying_matrix, 
class Master_matrix>
 
  535    : matrix_(colSettings), nextPosition_(0), nextIndex_(0)
 
  538template <
class Underlying_matrix, 
class Master_matrix>
 
  539template <
class Boundary_range>
 
  541    const std::vector<Boundary_range>& orderedBoundaries, 
Column_settings* colSettings)
 
  542    : matrix_(orderedBoundaries, colSettings),
 
  543      positionToIndex_(orderedBoundaries.size()),
 
  544      nextPosition_(orderedBoundaries.size()),
 
  545      nextIndex_(orderedBoundaries.size())
 
  547  for (
Index i = 0; i < orderedBoundaries.size(); i++) {
 
  548    positionToIndex_[i] = i;
 
  552template <
class Underlying_matrix, 
class Master_matrix>
 
  555    : matrix_(numberOfColumns, colSettings),
 
  556      positionToIndex_(numberOfColumns),
 
  561template <
class Underlying_matrix, 
class Master_matrix>
 
  562template <
typename BirthComparatorFunction, 
typename DeathComparatorFunction>
 
  565    const BirthComparatorFunction& birthComparator,
 
  566    const DeathComparatorFunction& deathComparator)
 
  567    : matrix_(colSettings, birthComparator, deathComparator), nextPosition_(0), nextIndex_(0)
 
  570template <
class Underlying_matrix, 
class Master_matrix>
 
  571template <
typename BirthComparatorFunction, 
typename DeathComparatorFunction, 
class Boundary_range>
 
  573    const std::vector<Boundary_range>& orderedBoundaries,
 
  575    const BirthComparatorFunction& birthComparator,
 
  576    const DeathComparatorFunction& deathComparator)
 
  577    : matrix_(orderedBoundaries, colSettings, birthComparator, deathComparator),
 
  578      positionToIndex_(orderedBoundaries.size()),
 
  579      nextPosition_(orderedBoundaries.size()),
 
  580      nextIndex_(orderedBoundaries.size())
 
  582  for (
Index i = 0; i < orderedBoundaries.size(); i++) {
 
  583    positionToIndex_[i] = i;
 
  587template <
class Underlying_matrix, 
class Master_matrix>
 
  588template <
typename BirthComparatorFunction, 
typename DeathComparatorFunction>
 
  590    unsigned int numberOfColumns,
 
  592    const BirthComparatorFunction& birthComparator,
 
  593    const DeathComparatorFunction& deathComparator)
 
  594    : matrix_(numberOfColumns, colSettings, birthComparator, deathComparator),
 
  595      positionToIndex_(numberOfColumns),
 
  600template <
class Underlying_matrix, 
class Master_matrix>
 
  603    : matrix_(matrixToCopy.matrix_, colSettings),
 
  604      positionToIndex_(matrixToCopy.positionToIndex_),
 
  605      nextPosition_(matrixToCopy.nextPosition_),
 
  606      nextIndex_(matrixToCopy.nextIndex_)
 
  609template <
class Underlying_matrix, 
class Master_matrix>
 
  612    : matrix_(std::move(other.matrix_)),
 
  613      positionToIndex_(std::move(other.positionToIndex_)),
 
  614      nextPosition_(std::exchange(other.nextPosition_, 0)),
 
  615      nextIndex_(std::exchange(other.nextIndex_, 0))
 
  618template <
class Underlying_matrix, 
class Master_matrix>
 
  619template <
class Boundary_range>
 
  623  if (positionToIndex_.size() <= nextPosition_) {
 
  624    positionToIndex_.resize(nextPosition_ * 2 + 1);
 
  627  positionToIndex_[nextPosition_++] = nextIndex_++;
 
  629  matrix_.insert_boundary(boundary, dim);
 
  632template <
class Underlying_matrix, 
class Master_matrix>
 
  633template <
class Boundary_range>
 
  635                                                                                        const Boundary_range& boundary,
 
  638  if (positionToIndex_.size() <= nextPosition_) {
 
  639    positionToIndex_.resize(nextPosition_ * 2 + 1);
 
  642  positionToIndex_[nextPosition_++] = nextIndex_++;
 
  644  matrix_.insert_boundary(cellIndex, boundary, dim);
 
  647template <
class Underlying_matrix, 
class Master_matrix>
 
  651  return matrix_.get_column(positionToIndex_[position]);
 
  654template <
class Underlying_matrix, 
class Master_matrix>
 
  658  return matrix_.get_column(positionToIndex_[position]);
 
  661template <
class Underlying_matrix, 
class Master_matrix>
 
  665  return matrix_.get_row(rowIndex);
 
  668template <
class Underlying_matrix, 
class Master_matrix>
 
  672  return matrix_.get_row(rowIndex);
 
  675template <
class Underlying_matrix, 
class Master_matrix>
 
  678  return matrix_.erase_empty_row(rowIndex);
 
  681template <
class Underlying_matrix, 
class Master_matrix>
 
  686  ID_index pivot = matrix_.get_pivot(positionToIndex_[position]);
 
  687  std::vector<Index> columnsToSwap(nextPosition_ - position);
 
  689  if (nextPosition_ != position) {
 
  690    positionToIndex_[position] = positionToIndex_[position + 1];
 
  691    for (
Pos_index p = position + 1; p < nextPosition_; ++p) {
 
  692      columnsToSwap[p - position - 1] = positionToIndex_[p];
 
  693      positionToIndex_[p] = positionToIndex_[p + 1];
 
  695    columnsToSwap.back() = positionToIndex_[nextPosition_];
 
  698  matrix_.remove_maximal_cell(pivot, columnsToSwap);
 
  701template <
class Underlying_matrix, 
class Master_matrix>
 
  705  if constexpr (Master_matrix::Option_list::has_vine_update) {
 
  706    std::vector<Index> columnsToSwap;
 
  707    matrix_.remove_maximal_cell(matrix_.get_pivot(positionToIndex_[nextPosition_]), columnsToSwap);
 
  709    matrix_.remove_last();  
 
  713template <
class Underlying_matrix, 
class Master_matrix>
 
  717  return matrix_.get_max_dimension();
 
  720template <
class Underlying_matrix, 
class Master_matrix>
 
  724  return matrix_.get_number_of_columns();
 
  727template <
class Underlying_matrix, 
class Master_matrix>
 
  731  return matrix_.get_column_dimension(positionToIndex_[position]);
 
  734template <
class Underlying_matrix, 
class Master_matrix>
 
  738  return matrix_.add_to(positionToIndex_[sourcePosition], positionToIndex_[targetPosition]);
 
  741template <
class Underlying_matrix, 
class Master_matrix>
 
  745  return matrix_.multiply_target_and_add_to(positionToIndex_[sourcePosition],
 
  747                                            positionToIndex_[targetPosition]);
 
  750template <
class Underlying_matrix, 
class Master_matrix>
 
  754  return matrix_.multiply_source_and_add_to(coefficient,
 
  755                                            positionToIndex_[sourcePosition],
 
  756                                            positionToIndex_[targetPosition]);
 
  759template <
class Underlying_matrix, 
class Master_matrix>
 
  763  return matrix_.is_zero_entry(positionToIndex_[position], rowIndex);
 
  766template <
class Underlying_matrix, 
class Master_matrix>
 
  769  return matrix_.is_zero_column(positionToIndex_[position]);
 
  772template <
class Underlying_matrix, 
class Master_matrix>
 
  776  Index id = matrix_.get_column_with_pivot(cellIndex);
 
  778  while (positionToIndex_[i] != 
id) ++i;
 
  782template <
class Underlying_matrix, 
class Master_matrix>
 
  786  return matrix_.get_pivot(positionToIndex_[position]);
 
  789template <
class Underlying_matrix, 
class Master_matrix>
 
  793  matrix_ = other.matrix_;
 
  794  positionToIndex_ = other.positionToIndex_;
 
  795  nextPosition_ = other.nextPosition_;
 
  796  nextIndex_ = other.nextIndex_;
 
  801template <
class Underlying_matrix, 
class Master_matrix>
 
  804  return matrix_.print();
 
  807template <
class Underlying_matrix, 
class Master_matrix>
 
  811  return matrix_.get_current_barcode();
 
  814template <
class Underlying_matrix, 
class Master_matrix>
 
  817  matrix_.update_representative_cycles();
 
  820template <
class Underlying_matrix, 
class Master_matrix>
 
  821inline const std::vector<typename Position_to_index_overlay<Underlying_matrix, Master_matrix>::Cycle>&
 
  824  return matrix_.get_representative_cycles();
 
  827template <
class Underlying_matrix, 
class Master_matrix>
 
  831  return matrix_.get_representative_cycle(bar);
 
  834template <
class Underlying_matrix, 
class Master_matrix>
 
  837  Index next = matrix_.vine_swap_with_z_eq_1_case(positionToIndex_[position], positionToIndex_[position + 1]);
 
  838  if (next == positionToIndex_[position]) {
 
  839    std::swap(positionToIndex_[position], positionToIndex_[position + 1]);
 
  846template <
class Underlying_matrix, 
class Master_matrix>
 
  849  Index next = matrix_.vine_swap(positionToIndex_[position], positionToIndex_[position + 1]);
 
  850  if (next == positionToIndex_[position]) {
 
  851    std::swap(positionToIndex_[position], positionToIndex_[position + 1]);
 
Overlay for chain matrices replacing all input and output MatIdx indices of the original methods with...
Definition: Position_to_index_overlay.h:40
 
bool is_zero_entry(Pos_index position, ID_index rowIndex) const
Indicates if the entry at given coordinates has value zero.
Definition: Position_to_index_overlay.h:760
 
typename Master_matrix::Index Index
Definition: Position_to_index_overlay.h:42
 
const std::vector< Cycle > & get_representative_cycles()
Only available if PersistenceMatrixOptions::can_retrieve_representative_cycles is true....
Definition: Position_to_index_overlay.h:822
 
friend void swap(Position_to_index_overlay &matrix1, Position_to_index_overlay &matrix2)
Swap operator.
Definition: Position_to_index_overlay.h:454
 
typename Master_matrix::Row Row
Definition: Position_to_index_overlay.h:54
 
Index get_number_of_columns() const
Returns the current number of columns in the matrix.
Definition: Position_to_index_overlay.h:722
 
typename Master_matrix::Entry_representative Entry_representative
Definition: Position_to_index_overlay.h:58
 
Dimension get_column_dimension(Pos_index position) const
Returns the dimension of the given cell.
Definition: Position_to_index_overlay.h:729
 
typename Master_matrix::Cycle Cycle
Definition: Position_to_index_overlay.h:57
 
const Cycle & get_representative_cycle(const Bar &bar)
Only available if PersistenceMatrixOptions::can_retrieve_representative_cycles is true....
Definition: Position_to_index_overlay.h:829
 
Dimension get_max_dimension() const
Returns the maximal dimension of a cell stored in the matrix. Only available if PersistenceMatrixOpti...
Definition: Position_to_index_overlay.h:715
 
typename Master_matrix::Field_operators Field_operators
Field operators class. Necessary only if PersistenceMatrixOptions::is_z2 is false.
Definition: Position_to_index_overlay.h:49
 
typename Master_matrix::Element Field_element
Definition: Position_to_index_overlay.h:50
 
void insert_boundary(const Boundary_range &boundary, Dimension dim=Master_matrix::template get_null_value< Dimension >())
Inserts at the end of the matrix a new ordered column corresponding to the given boundary....
Definition: Position_to_index_overlay.h:620
 
void erase_empty_row(ID_index rowIndex)
Only available if PersistenceMatrixOptions::has_row_access and PersistenceMatrixOptions::has_removabl...
Definition: Position_to_index_overlay.h:676
 
const Barcode & get_current_barcode() const
Returns the current barcode of the matrix. Available only if PersistenceMatrixOptions::has_column_pai...
Definition: Position_to_index_overlay.h:809
 
typename Master_matrix::Barcode Barcode
Definition: Position_to_index_overlay.h:56
 
bool is_zero_column(Pos_index position)
Indicates if the column at given index has value zero.
Definition: Position_to_index_overlay.h:767
 
void multiply_target_and_add_to(Pos_index sourcePosition, const Field_element &coefficient, Pos_index targetPosition)
Multiplies the target column with the coefficient and then adds the source column to it....
Definition: Position_to_index_overlay.h:742
 
void update_representative_cycles()
Only available if PersistenceMatrixOptions::can_retrieve_representative_cycles is true....
Definition: Position_to_index_overlay.h:815
 
typename Master_matrix::Pos_index Pos_index
Definition: Position_to_index_overlay.h:44
 
Position_to_index_overlay(Column_settings *colSettings)
Constructs an empty matrix.
Definition: Position_to_index_overlay.h:533
 
ID_index get_pivot(Pos_index position)
Returns the row index of the pivot of the given column.
Definition: Position_to_index_overlay.h:784
 
typename Master_matrix::ID_index ID_index
Definition: Position_to_index_overlay.h:43
 
void add_to(Pos_index sourcePosition, Pos_index targetPosition)
Adds column corresponding to sourcePosition onto the column corresponding to targetPosition.
Definition: Position_to_index_overlay.h:735
 
void remove_maximal_cell(Pos_index position)
Only available if PersistenceMatrixOptions::has_removable_columns, PersistenceMatrixOptions::has_vine...
Definition: Position_to_index_overlay.h:682
 
void reset(Column_settings *colSettings)
Resets the matrix to an empty matrix.
Definition: Position_to_index_overlay.h:438
 
typename Master_matrix::Column_settings Column_settings
Definition: Position_to_index_overlay.h:61
 
void remove_last()
Only available if PersistenceMatrixOptions::has_removable_columns is true and, if PersistenceMatrixOp...
Definition: Position_to_index_overlay.h:702
 
Row & get_row(ID_index rowIndex)
Only available if PersistenceMatrixOptions::has_row_access is true. Returns the row at the given row ...
Definition: Position_to_index_overlay.h:663
 
typename Master_matrix::Entry_constructor Entry_constructor
Definition: Position_to_index_overlay.h:59
 
typename Master_matrix::Bar Bar
Definition: Position_to_index_overlay.h:55
 
typename Master_matrix::Dimension Dimension
Definition: Position_to_index_overlay.h:45
 
typename Master_matrix::Column Column
Definition: Position_to_index_overlay.h:52
 
typename Master_matrix::Boundary Boundary
Definition: Position_to_index_overlay.h:51
 
Position_to_index_overlay & operator=(const Position_to_index_overlay &other)
Assign operator.
Definition: Position_to_index_overlay.h:791
 
void multiply_source_and_add_to(const Field_element &coefficient, Pos_index sourcePosition, Pos_index targetPosition)
Multiplies the source column with the coefficient before adding it to the target column....
Definition: Position_to_index_overlay.h:751
 
Column & get_column(Pos_index position)
Returns the column at the given PosIdx index. The type of the column depends on the chosen options,...
Definition: Position_to_index_overlay.h:649
 
Pos_index get_column_with_pivot(ID_index cellIndex) const
Returns the PosIdx index of the column which has the given row index as pivot. Assumes that the pivot...
Definition: Position_to_index_overlay.h:774
 
bool vine_swap_with_z_eq_1_case(Pos_index position)
Only available if PersistenceMatrixOptions::has_vine_update is true. Does the same than vine_swap,...
Definition: Position_to_index_overlay.h:835
 
bool vine_swap(Pos_index position)
Only available if PersistenceMatrixOptions::has_vine_update is true. Does a vine swap between two cel...
Definition: Position_to_index_overlay.h:847
 
Gudhi namespace.
Definition: SimplicialComplexForAlpha.h:14