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