17#ifndef PM_POS_TO_ID_TRANSLATION_H
18#define PM_POS_TO_ID_TRANSLATION_H
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>
123 template <
typename BirthComparatorFunction,
typename DeathComparatorFunction>
125 const BirthComparatorFunction& birthComparator,
126 const DeathComparatorFunction& deathComparator);
163 template <
typename BirthComparatorFunction,
typename DeathComparatorFunction,
class Boundary_range>
166 const BirthComparatorFunction& birthComparator,
167 const DeathComparatorFunction& deathComparator);
191 template <
typename BirthComparatorFunction,
typename DeathComparatorFunction>
194 const BirthComparatorFunction& birthComparator,
195 const DeathComparatorFunction& deathComparator);
235 template <
class Boundary_range = Boundary>
237 Dimension dim = Master_matrix::template get_null_value<Dimension>());
255 template <
class Boundary_range = Boundary>
257 const Boundary_range& boundary,
258 Dimension dim = Master_matrix::template get_null_value<Dimension>());
436 matrix_.reset(colSettings);
437 positionToIndex_.clear();
456 swap(matrix1.matrix_, matrix2.matrix_);
457 matrix1.positionToIndex_.swap(matrix2.positionToIndex_);
458 std::swap(matrix1.nextPosition_, matrix2.nextPosition_);
459 std::swap(matrix1.nextIndex_, matrix2.nextIndex_);
538 Underlying_matrix matrix_;
539 std::vector<Index> positionToIndex_;
544template <
class Underlying_matrix,
class Master_matrix>
547 : matrix_(colSettings), nextPosition_(0), nextIndex_(0)
550template <
class Underlying_matrix,
class Master_matrix>
551template <
class Boundary_range>
553 const std::vector<Boundary_range>& orderedBoundaries,
555 : matrix_(orderedBoundaries, colSettings),
556 positionToIndex_(orderedBoundaries.size()),
557 nextPosition_(orderedBoundaries.size()),
558 nextIndex_(orderedBoundaries.size())
560 for (
Index i = 0; i < orderedBoundaries.size(); i++) {
561 positionToIndex_[i] = i;
565template <
class Underlying_matrix,
class Master_matrix>
567 unsigned int numberOfColumns,
569 : matrix_(numberOfColumns, colSettings), positionToIndex_(numberOfColumns), nextPosition_(0), nextIndex_(0)
572template <
class Underlying_matrix,
class Master_matrix>
573template <
typename BirthComparatorFunction,
typename DeathComparatorFunction>
576 const BirthComparatorFunction& birthComparator,
577 const DeathComparatorFunction& deathComparator)
578 : matrix_(colSettings, birthComparator, deathComparator), nextPosition_(0), nextIndex_(0)
581template <
class Underlying_matrix,
class Master_matrix>
582template <
typename BirthComparatorFunction,
typename DeathComparatorFunction,
class Boundary_range>
584 const std::vector<Boundary_range>& orderedBoundaries,
586 const BirthComparatorFunction& birthComparator,
587 const DeathComparatorFunction& deathComparator)
588 : matrix_(orderedBoundaries, colSettings, birthComparator, deathComparator),
589 positionToIndex_(orderedBoundaries.size()),
590 nextPosition_(orderedBoundaries.size()),
591 nextIndex_(orderedBoundaries.size())
593 for (
Index i = 0; i < orderedBoundaries.size(); i++) {
594 positionToIndex_[i] = i;
598template <
class Underlying_matrix,
class Master_matrix>
599template <
typename BirthComparatorFunction,
typename DeathComparatorFunction>
601 unsigned int numberOfColumns,
603 const BirthComparatorFunction& birthComparator,
604 const DeathComparatorFunction& deathComparator)
605 : matrix_(numberOfColumns, colSettings, birthComparator, deathComparator),
606 positionToIndex_(numberOfColumns),
611template <
class Underlying_matrix,
class Master_matrix>
615 : matrix_(matrixToCopy.matrix_, colSettings),
616 positionToIndex_(matrixToCopy.positionToIndex_),
617 nextPosition_(matrixToCopy.nextPosition_),
618 nextIndex_(matrixToCopy.nextIndex_)
621template <
class Underlying_matrix,
class Master_matrix>
624 : matrix_(std::move(other.matrix_)),
625 positionToIndex_(std::move(other.positionToIndex_)),
626 nextPosition_(std::exchange(other.nextPosition_, 0)),
627 nextIndex_(std::exchange(other.nextIndex_, 0))
630template <
class Underlying_matrix,
class Master_matrix>
631template <
class Boundary_range>
635 if (positionToIndex_.size() <= nextPosition_) {
636 positionToIndex_.resize((nextPosition_ * 2) + 1);
639 positionToIndex_[nextPosition_++] = nextIndex_++;
641 matrix_.insert_boundary(boundary, dim);
644template <
class Underlying_matrix,
class Master_matrix>
645template <
class Boundary_range>
647 const Boundary_range& boundary,
650 if (positionToIndex_.size() <= nextPosition_) {
651 positionToIndex_.resize((nextPosition_ * 2) + 1);
654 positionToIndex_[nextPosition_++] = nextIndex_++;
656 matrix_.insert_boundary(cellIndex, boundary, dim);
659template <
class Underlying_matrix,
class Master_matrix>
663 return matrix_.get_column(positionToIndex_[position]);
666template <
class Underlying_matrix,
class Master_matrix>
670 return matrix_.get_column(positionToIndex_[position]);
673template <
class Underlying_matrix,
class Master_matrix>
677 return matrix_.get_row(rowIndex);
680template <
class Underlying_matrix,
class Master_matrix>
684 return matrix_.get_row(rowIndex);
687template <
class Underlying_matrix,
class Master_matrix>
690 return matrix_.erase_empty_row(rowIndex);
693template <
class Underlying_matrix,
class Master_matrix>
698 ID_index pivot = matrix_.get_pivot(positionToIndex_[position]);
699 std::vector<Index> columnsToSwap(nextPosition_ - position);
701 if (nextPosition_ != position) {
702 positionToIndex_[position] = positionToIndex_[position + 1];
703 for (
Pos_index p = position + 1; p < nextPosition_; ++p) {
704 columnsToSwap[p - position - 1] = positionToIndex_[p];
705 positionToIndex_[p] = positionToIndex_[p + 1];
707 columnsToSwap.back() = positionToIndex_[nextPosition_];
710 matrix_.remove_maximal_cell(pivot, columnsToSwap);
713template <
class Underlying_matrix,
class Master_matrix>
717 if constexpr (Master_matrix::Option_list::has_vine_update) {
718 std::vector<Index> columnsToSwap;
719 matrix_.remove_maximal_cell(matrix_.get_pivot(positionToIndex_[nextPosition_]), columnsToSwap);
721 matrix_.remove_last();
725template <
class Underlying_matrix,
class Master_matrix>
729 return matrix_.get_max_dimension();
732template <
class Underlying_matrix,
class Master_matrix>
736 return matrix_.get_number_of_columns();
739template <
class Underlying_matrix,
class Master_matrix>
743 return matrix_.get_column_dimension(positionToIndex_[position]);
746template <
class Underlying_matrix,
class Master_matrix>
750 return matrix_.add_to(positionToIndex_[sourcePosition], positionToIndex_[targetPosition]);
753template <
class Underlying_matrix,
class Master_matrix>
759 return matrix_.multiply_target_and_add_to(
760 positionToIndex_[sourcePosition], coefficient, positionToIndex_[targetPosition]);
763template <
class Underlying_matrix,
class Master_matrix>
769 return matrix_.multiply_source_and_add_to(
770 coefficient, positionToIndex_[sourcePosition], positionToIndex_[targetPosition]);
773template <
class Underlying_matrix,
class Master_matrix>
777 return matrix_.is_zero_entry(positionToIndex_[position], rowIndex);
780template <
class Underlying_matrix,
class Master_matrix>
783 return matrix_.is_zero_column(positionToIndex_[position]);
786template <
class Underlying_matrix,
class Master_matrix>
790 Index id = matrix_.get_column_with_pivot(cellIndex);
792 while (positionToIndex_[i] !=
id) ++i;
796template <
class Underlying_matrix,
class Master_matrix>
800 return matrix_.get_pivot(positionToIndex_[position]);
803template <
class Underlying_matrix,
class Master_matrix>
804inline void Position_to_index_overlay<Underlying_matrix, Master_matrix>::print()
806 return matrix_.print();
809template <
class Underlying_matrix,
class Master_matrix>
813 return matrix_.get_current_barcode();
816template <
class Underlying_matrix,
class Master_matrix>
819 matrix_.update_all_representative_cycles(dim);
822template <
class Underlying_matrix,
class Master_matrix>
825 matrix_.update_representative_cycle(bar);
828template <
class Underlying_matrix,
class Master_matrix>
829inline const std::vector<typename Position_to_index_overlay<Underlying_matrix, Master_matrix>::Cycle>&
832 return matrix_.get_all_representative_cycles();
835template <
class Underlying_matrix,
class Master_matrix>
839 return matrix_.get_representative_cycle(bar);
842template <
class Underlying_matrix,
class Master_matrix>
845 Index next = matrix_.vine_swap_with_z_eq_1_case(positionToIndex_[position], positionToIndex_[position + 1]);
846 if (next == positionToIndex_[position]) {
847 std::swap(positionToIndex_[position], positionToIndex_[position + 1]);
854template <
class Underlying_matrix,
class Master_matrix>
857 Index next = matrix_.vine_swap(positionToIndex_[position], positionToIndex_[position + 1]);
858 if (next == positionToIndex_[position]) {
859 std::swap(positionToIndex_[position], positionToIndex_[position + 1]);
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:774
typename Master_matrix::Index Index
Definition Position_to_index_overlay.h:42
typename Master_matrix::Row Row
Definition Position_to_index_overlay.h:53
Index get_number_of_columns() const
Returns the current number of columns in the matrix.
Definition Position_to_index_overlay.h:734
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:741
typename Master_matrix::Cycle Cycle
Definition Position_to_index_overlay.h:57
const Cycle & get_representative_cycle(const Bar &bar) const
Only available if PersistenceMatrixOptions::can_retrieve_representative_cycles is true....
Definition Position_to_index_overlay.h:837
void update_all_representative_cycles(Dimension dim=Master_matrix::template get_null_value< Dimension >())
Only available if PersistenceMatrixOptions::can_retrieve_representative_cycles is true....
Definition Position_to_index_overlay.h:817
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:727
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
friend void swap(Position_to_index_overlay &matrix1, Position_to_index_overlay &matrix2) noexcept
Swap operator.
Definition Position_to_index_overlay.h:454
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:632
void erase_empty_row(ID_index rowIndex)
Only available if PersistenceMatrixOptions::has_row_access and PersistenceMatrixOptions::has_removabl...
Definition Position_to_index_overlay.h:688
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:811
typename Master_matrix::Barcode Barcode
Definition Position_to_index_overlay.h:56
Position_to_index_overlay & operator=(Position_to_index_overlay &&other) noexcept=default
Move assign operator.
bool is_zero_column(Pos_index position)
Indicates if the column at given index has value zero.
Definition Position_to_index_overlay.h:781
void update_representative_cycle(const Bar &bar)
Only available if PersistenceMatrixOptions::can_retrieve_representative_cycles is true....
Definition Position_to_index_overlay.h:823
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:754
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:545
ID_index get_pivot(Pos_index position)
Returns the row index of the pivot of the given column.
Definition Position_to_index_overlay.h:798
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:747
void remove_maximal_cell(Pos_index position)
Only available if PersistenceMatrixOptions::has_removable_columns, PersistenceMatrixOptions::has_vine...
Definition Position_to_index_overlay.h:694
Position_to_index_overlay & operator=(const Position_to_index_overlay &other)=default
Assign operator.
void reset(Column_settings *colSettings)
Resets the matrix to an empty matrix.
Definition Position_to_index_overlay.h:434
typename Master_matrix::Column_settings Column_settings
Definition Position_to_index_overlay.h:60
void remove_last()
Only available if PersistenceMatrixOptions::has_removable_columns is true and, if PersistenceMatrixOp...
Definition Position_to_index_overlay.h:714
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:675
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
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:764
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:661
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:788
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:843
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:855
const std::vector< Cycle > & get_all_representative_cycles() const
Only available if PersistenceMatrixOptions::can_retrieve_representative_cycles is true....
Definition Position_to_index_overlay.h:830
Persistence matrix namespace.
Definition FieldOperators.h:18
Gudhi namespace.
Definition SimplicialComplexForAlpha.h:14