Loading...
Searching...
No Matches
Position_to_index_overlay.h
Go to the documentation of this file.
1/* This file is part of the Gudhi Library - https://gudhi.inria.fr/ - which is released under MIT.
2 * See file LICENSE or go to https://gudhi.inria.fr/licensing/ for full license details.
3 * Author(s): Hannah Schreiber
4 *
5 * Copyright (C) 2022 Inria
6 *
7 * Modification(s):
8 * - YYYY/MM Author: Description of the modification
9 */
10
16
17#ifndef PM_POS_TO_ID_TRANSLATION_H
18#define PM_POS_TO_ID_TRANSLATION_H
19
20#include <vector>
21#include <utility> //std::swap, std::move & std::exchange
22#include <algorithm> //std::transform
23
24namespace Gudhi {
25namespace persistence_matrix {
26
38template <class Underlying_matrix, class Master_matrix>
40{
41 public:
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;
49 using Field_operators = typename Master_matrix::Field_operators;
50 using Field_element = typename Master_matrix::Element;
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;
58 using Entry_representative = typename Master_matrix::Entry_representative;
59 using Entry_constructor = typename Master_matrix::Entry_constructor;
60 using Column_settings = typename Master_matrix::Column_settings;
62
91 template <class Boundary_range = Boundary>
92 Position_to_index_overlay(const std::vector<Boundary_range>& orderedBoundaries, Column_settings* colSettings);
100 Position_to_index_overlay(unsigned int numberOfColumns, Column_settings* colSettings);
123 template <typename BirthComparatorFunction, typename DeathComparatorFunction>
125 const BirthComparatorFunction& birthComparator,
126 const DeathComparatorFunction& deathComparator);
163 template <typename BirthComparatorFunction, typename DeathComparatorFunction, class Boundary_range>
164 Position_to_index_overlay(const std::vector<Boundary_range>& orderedBoundaries,
165 Column_settings* colSettings,
166 const BirthComparatorFunction& birthComparator,
167 const DeathComparatorFunction& deathComparator);
191 template <typename BirthComparatorFunction, typename DeathComparatorFunction>
192 Position_to_index_overlay(unsigned int numberOfColumns,
193 Column_settings* colSettings,
194 const BirthComparatorFunction& birthComparator,
195 const DeathComparatorFunction& deathComparator);
205 Position_to_index_overlay(const Position_to_index_overlay& matrixToCopy, Column_settings* colSettings = nullptr);
212
213 ~Position_to_index_overlay() = default;
214
235 template <class Boundary_range = Boundary>
236 void insert_boundary(const Boundary_range& boundary,
237 Dimension dim = Master_matrix::template get_null_value<Dimension>());
255 template <class Boundary_range = Boundary>
256 void insert_boundary(ID_index cellIndex,
257 const Boundary_range& boundary,
258 Dimension dim = Master_matrix::template get_null_value<Dimension>());
266 Column& get_column(Pos_index position);
274 const Column& get_column(Pos_index position) const;
283 Row& get_row(ID_index rowIndex);
292 const Row& get_row(ID_index rowIndex) const;
307 void erase_empty_row(ID_index rowIndex);
321 void remove_maximal_cell(Pos_index position);
330 void remove_last();
331
352
363 void add_to(Pos_index sourcePosition, Pos_index targetPosition);
376 void multiply_target_and_add_to(Pos_index sourcePosition, const Field_element& coefficient, Pos_index targetPosition);
389 void multiply_source_and_add_to(const Field_element& coefficient, Pos_index sourcePosition, Pos_index targetPosition);
390
399 bool is_zero_entry(Pos_index position, ID_index rowIndex) const;
410 bool is_zero_column(Pos_index position);
411
419 Pos_index get_column_with_pivot(ID_index cellIndex) const; // assumes that pivot exists
426 ID_index get_pivot(Pos_index position);
427
434 void reset(Column_settings* colSettings)
435 {
436 matrix_.reset(colSettings);
437 positionToIndex_.clear();
438 nextPosition_ = 0;
439 nextIndex_ = 0;
440 }
441
450
454 friend void swap(Position_to_index_overlay& matrix1, Position_to_index_overlay& matrix2) noexcept
455 {
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_);
460 }
461
462 void print(); // for debug
463
464 // access to optional methods
465
475 const Barcode& get_current_barcode() const;
476
486 void update_all_representative_cycles(Dimension dim = Master_matrix::template get_null_value<Dimension>());
495 void update_representative_cycle(const Bar& bar);
502 const std::vector<Cycle>& get_all_representative_cycles() const;
510 const Cycle& get_representative_cycle(const Bar& bar) const;
511
535 bool vine_swap(Pos_index position);
536
537 private:
538 Underlying_matrix matrix_;
539 std::vector<Index> positionToIndex_;
540 Pos_index nextPosition_;
541 Index nextIndex_;
542};
543
544template <class Underlying_matrix, class Master_matrix>
546 Column_settings* colSettings)
547 : matrix_(colSettings), nextPosition_(0), nextIndex_(0)
548{}
549
550template <class Underlying_matrix, class Master_matrix>
551template <class Boundary_range>
553 const std::vector<Boundary_range>& orderedBoundaries,
554 Column_settings* colSettings)
555 : matrix_(orderedBoundaries, colSettings),
556 positionToIndex_(orderedBoundaries.size()),
557 nextPosition_(orderedBoundaries.size()),
558 nextIndex_(orderedBoundaries.size())
559{
560 for (Index i = 0; i < orderedBoundaries.size(); i++) {
561 positionToIndex_[i] = i;
562 }
563}
564
565template <class Underlying_matrix, class Master_matrix>
567 unsigned int numberOfColumns,
568 Column_settings* colSettings)
569 : matrix_(numberOfColumns, colSettings), positionToIndex_(numberOfColumns), nextPosition_(0), nextIndex_(0)
570{}
571
572template <class Underlying_matrix, class Master_matrix>
573template <typename BirthComparatorFunction, typename DeathComparatorFunction>
575 Column_settings* colSettings,
576 const BirthComparatorFunction& birthComparator,
577 const DeathComparatorFunction& deathComparator)
578 : matrix_(colSettings, birthComparator, deathComparator), nextPosition_(0), nextIndex_(0)
579{}
580
581template <class Underlying_matrix, class Master_matrix>
582template <typename BirthComparatorFunction, typename DeathComparatorFunction, class Boundary_range>
584 const std::vector<Boundary_range>& orderedBoundaries,
585 Column_settings* colSettings,
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())
592{
593 for (Index i = 0; i < orderedBoundaries.size(); i++) {
594 positionToIndex_[i] = i;
595 }
596}
597
598template <class Underlying_matrix, class Master_matrix>
599template <typename BirthComparatorFunction, typename DeathComparatorFunction>
601 unsigned int numberOfColumns,
602 Column_settings* colSettings,
603 const BirthComparatorFunction& birthComparator,
604 const DeathComparatorFunction& deathComparator)
605 : matrix_(numberOfColumns, colSettings, birthComparator, deathComparator),
606 positionToIndex_(numberOfColumns),
607 nextPosition_(0),
608 nextIndex_(0)
609{}
610
611template <class Underlying_matrix, class Master_matrix>
613 const Position_to_index_overlay& matrixToCopy,
614 Column_settings* colSettings)
615 : matrix_(matrixToCopy.matrix_, colSettings),
616 positionToIndex_(matrixToCopy.positionToIndex_),
617 nextPosition_(matrixToCopy.nextPosition_),
618 nextIndex_(matrixToCopy.nextIndex_)
619{}
620
621template <class Underlying_matrix, class Master_matrix>
623 Position_to_index_overlay&& other) noexcept
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))
628{}
629
630template <class Underlying_matrix, class Master_matrix>
631template <class Boundary_range>
633 Dimension dim)
634{
635 if (positionToIndex_.size() <= nextPosition_) {
636 positionToIndex_.resize((nextPosition_ * 2) + 1);
637 }
638
639 positionToIndex_[nextPosition_++] = nextIndex_++;
640
641 matrix_.insert_boundary(boundary, dim);
642}
643
644template <class Underlying_matrix, class Master_matrix>
645template <class Boundary_range>
647 const Boundary_range& boundary,
648 Dimension dim)
649{
650 if (positionToIndex_.size() <= nextPosition_) {
651 positionToIndex_.resize((nextPosition_ * 2) + 1);
652 }
653
654 positionToIndex_[nextPosition_++] = nextIndex_++;
655
656 matrix_.insert_boundary(cellIndex, boundary, dim);
657}
658
659template <class Underlying_matrix, class Master_matrix>
662{
663 return matrix_.get_column(positionToIndex_[position]);
664}
665
666template <class Underlying_matrix, class Master_matrix>
669{
670 return matrix_.get_column(positionToIndex_[position]);
671}
672
673template <class Underlying_matrix, class Master_matrix>
676{
677 return matrix_.get_row(rowIndex);
678}
679
680template <class Underlying_matrix, class Master_matrix>
683{
684 return matrix_.get_row(rowIndex);
685}
686
687template <class Underlying_matrix, class Master_matrix>
689{
690 return matrix_.erase_empty_row(rowIndex);
691}
692
693template <class Underlying_matrix, class Master_matrix>
695{
696 --nextPosition_;
697
698 ID_index pivot = matrix_.get_pivot(positionToIndex_[position]);
699 std::vector<Index> columnsToSwap(nextPosition_ - position);
700
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];
706 }
707 columnsToSwap.back() = positionToIndex_[nextPosition_];
708 }
709
710 matrix_.remove_maximal_cell(pivot, columnsToSwap);
711}
712
713template <class Underlying_matrix, class Master_matrix>
715{
716 --nextPosition_;
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);
720 } else {
721 matrix_.remove_last(); // linear with vine updates, so it is better to use remove_maximal_cell
722 }
723}
724
725template <class Underlying_matrix, class Master_matrix>
728{
729 return matrix_.get_max_dimension();
730}
731
732template <class Underlying_matrix, class Master_matrix>
735{
736 return matrix_.get_number_of_columns();
737}
738
739template <class Underlying_matrix, class Master_matrix>
742{
743 return matrix_.get_column_dimension(positionToIndex_[position]);
744}
745
746template <class Underlying_matrix, class Master_matrix>
748 Pos_index targetPosition)
749{
750 return matrix_.add_to(positionToIndex_[sourcePosition], positionToIndex_[targetPosition]);
751}
752
753template <class Underlying_matrix, class Master_matrix>
755 Pos_index sourcePosition,
756 const Field_element& coefficient,
757 Pos_index targetPosition)
758{
759 return matrix_.multiply_target_and_add_to(
760 positionToIndex_[sourcePosition], coefficient, positionToIndex_[targetPosition]);
761}
762
763template <class Underlying_matrix, class Master_matrix>
765 const Field_element& coefficient,
766 Pos_index sourcePosition,
767 Pos_index targetPosition)
768{
769 return matrix_.multiply_source_and_add_to(
770 coefficient, positionToIndex_[sourcePosition], positionToIndex_[targetPosition]);
771}
772
773template <class Underlying_matrix, class Master_matrix>
775 ID_index rowIndex) const
776{
777 return matrix_.is_zero_entry(positionToIndex_[position], rowIndex);
778}
779
780template <class Underlying_matrix, class Master_matrix>
782{
783 return matrix_.is_zero_column(positionToIndex_[position]);
784}
785
786template <class Underlying_matrix, class Master_matrix>
789{
790 Index id = matrix_.get_column_with_pivot(cellIndex);
791 Pos_index i = 0;
792 while (positionToIndex_[i] != id) ++i;
793 return i;
794}
795
796template <class Underlying_matrix, class Master_matrix>
799{
800 return matrix_.get_pivot(positionToIndex_[position]);
801}
802
803template <class Underlying_matrix, class Master_matrix>
804inline void Position_to_index_overlay<Underlying_matrix, Master_matrix>::print()
805{
806 return matrix_.print();
807}
808
809template <class Underlying_matrix, class Master_matrix>
812{
813 return matrix_.get_current_barcode();
814}
815
816template <class Underlying_matrix, class Master_matrix>
818{
819 matrix_.update_all_representative_cycles(dim);
820}
821
822template <class Underlying_matrix, class Master_matrix>
824{
825 matrix_.update_representative_cycle(bar);
826}
827
828template <class Underlying_matrix, class Master_matrix>
829inline const std::vector<typename Position_to_index_overlay<Underlying_matrix, Master_matrix>::Cycle>&
831{
832 return matrix_.get_all_representative_cycles();
833}
834
835template <class Underlying_matrix, class Master_matrix>
838{
839 return matrix_.get_representative_cycle(bar);
840}
841
842template <class Underlying_matrix, class Master_matrix>
844{
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]);
848 return true;
849 }
850
851 return false;
852}
853
854template <class Underlying_matrix, class Master_matrix>
856{
857 Index next = matrix_.vine_swap(positionToIndex_[position], positionToIndex_[position + 1]);
858 if (next == positionToIndex_[position]) {
859 std::swap(positionToIndex_[position], positionToIndex_[position + 1]);
860 return true;
861 }
862
863 return false;
864}
865
866} // namespace persistence_matrix
867} // namespace Gudhi
868
869#endif // PM_POS_TO_ID_TRANSLATION_H
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