18#ifndef MASTER_MATRIX_H
19#define MASTER_MATRIX_H
23#include <unordered_map>
25#include <initializer_list>
27#include <boost/intrusive/list.hpp>
29#include <gudhi/Debug_utils.h>
145template <
class PersistenceMatrixOptions = Default_options<> >
164 using Element =
typename Field_operators::Element;
165 using Characteristic =
typename Field_operators::Characteristic;
170 template <
typename T>
182 struct Matrix_row_tag;
183 struct Matrix_column_tag;
185 using Base_hook_matrix_row =
186 boost::intrusive::list_base_hook<boost::intrusive::tag<Matrix_row_tag>,
187 boost::intrusive::link_mode<boost::intrusive::auto_unlink> >;
188 using Base_hook_matrix_list_column =
189 boost::intrusive::list_base_hook<boost::intrusive::tag<Matrix_column_tag>,
190 boost::intrusive::link_mode<boost::intrusive::safe_link> >;
191 using Base_hook_matrix_set_column =
192 boost::intrusive::set_base_hook<boost::intrusive::tag<Matrix_column_tag>,
193 boost::intrusive::link_mode<boost::intrusive::safe_link> >;
196 struct Dummy_row_hook {};
198 struct Dummy_column_hook {};
202 Base_hook_matrix_row,
206 Base_hook_matrix_list_column,
208 Base_hook_matrix_set_column,
209 Dummy_column_hook> >;
213 Entry_column_index<Index>,
214 Dummy_entry_column_index_mixin>;
217 using Entry_field_element_option = std::
218 conditional_t<PersistenceMatrixOptions::is_z2, Dummy_entry_field_element_mixin, Entry_field_element<Element> >;
244 std::conditional_t<PersistenceMatrixOptions::is_z2, ID_index, std::pair<ID_index, Element> >;
280 return e.get_element();
288 return Field_operators::get_multiplicative_identity();
300 return c1.get_column_index() < c2.get_column_index();
311 boost::intrusive::constant_time_size<false>,
312 boost::intrusive::base_hook<Base_hook_matrix_row> >,
313 std::set<Matrix_entry, RowEntryComp> >;
315 using Row_container =
316 std::conditional_t<PersistenceMatrixOptions::has_removable_rows, std::map<ID_index, Row>, std::vector<Row> >;
323 using Matrix_row_access_option =
328 template <
typename value_type>
330 std::unordered_map<unsigned int, value_type>,
331 std::vector<value_type> >;
337 using Column_dimension_option = std::
338 conditional_t<isNonBasic, Column_dimension_holder<Matrix<PersistenceMatrixOptions> >,
Dummy_dimension_holder>;
347 using Matrix_naive_vector_column = Naive_std_vector_column<Matrix<PersistenceMatrixOptions> >;
348 using Matrix_small_vector_column = Naive_small_vector_column<Matrix<PersistenceMatrixOptions> >;
370 Matrix_unordered_set_column,
373 Matrix_vector_column,
376 Matrix_intrusive_list_column,
379 Matrix_naive_vector_column,
381 Matrix_small_vector_column,
382 Matrix_intrusive_set_column>
385 struct Column_z2_settings {
386 Column_z2_settings() : entryConstructor() {}
387 Column_z2_settings([[maybe_unused]] Characteristic characteristic) : entryConstructor() {}
388 Column_z2_settings([[maybe_unused]]
const Column_z2_settings& toCopy) : entryConstructor() {}
389 Column_z2_settings([[maybe_unused]] Column_z2_settings&& toMove) noexcept : entryConstructor() {}
390 ~Column_z2_settings() =
default;
391 Column_z2_settings&
operator=([[maybe_unused]]
const Column_z2_settings& other) {
return *
this; }
392 Column_z2_settings&
operator=([[maybe_unused]] Column_z2_settings&& other)
noexcept {
return *
this; }
397 struct Column_zp_settings {
398 Column_zp_settings() : operators(), entryConstructor() {}
399 Column_zp_settings(Characteristic characteristic) : operators(characteristic), entryConstructor() {}
400 Column_zp_settings(
const Column_zp_settings& toCopy) : operators(toCopy.operators), entryConstructor() {}
401 Column_zp_settings(Column_zp_settings&& toMove) noexcept
402 : operators(std::move(toMove.operators)), entryConstructor() {}
403 ~Column_zp_settings() =
default;
404 Column_zp_settings& operator=(
const Column_zp_settings& other)
406 operators = other.operators;
409 Column_zp_settings& operator=(Column_zp_settings&& other)
noexcept
411 if (
this == &other)
return *
this;
413 operators = std::move(other.operators);
441 using Column_settings = std::conditional_t<PersistenceMatrixOptions::is_z2, Column_z2_settings, Column_zp_settings>;
446 static Field_operators const* get_operator_ptr(Column_settings
const* colSettings)
451 if (colSettings ==
nullptr)
return nullptr;
452 return &(colSettings->operators);
458 template <
typename T>
462 return Field_operators::get_value(v);
464 return operators->get_value(v);
470 static Element get_coefficient_value(
bool v, [[maybe_unused]]
Field_operators const* operators) {
return v; }
485 std::unordered_map<Index, Column>,
486 std::vector<Column> >;
496 std::conditional_t<PersistenceMatrixOptions::has_removable_columns, std::list<Bar>, std::vector<Bar> > >;
497 using Bar_dictionary =
498 std::conditional_t<hasFixedBarcode,
501 std::unordered_map<Pos_index, Index>
504 std::unordered_map<Pos_index, typename Barcode::iterator>,
505 std::vector<Index> > >;
509 std::initializer_list<ID_index>,
510 std::initializer_list<std::pair<ID_index, Element> > >;
514 static const bool maxDimensionIsNeeded =
518 using Matrix_dimension_option =
532 template <
class Base>
537 using Base_pairing_option =
551 using RU_representative_cycles_option =
556 using Chain_pairing_option =
565 using Chain_representative_cycles_option =
573 using Cycle = std::vector<Entry_representative>;
578 template <
class EntryRange>
579 static Cycle build_cycle_from_range(
const EntryRange& entries)
582 if constexpr (RangeTraits<EntryRange>::has_size) {
583 cycle.reserve(entries.size());
585 for (
const auto& c : entries) {
587 cycle.push_back(c.get_row_index());
589 cycle.push_back({c.get_row_index(), c.get_element()});
598 using Returned_column =
599 std::conditional_t<!isNonBasic && PersistenceMatrixOptions::has_column_compression, const Column, Column>;
602 std::conditional_t<!isNonBasic && PersistenceMatrixOptions::has_column_compression, const Row, Row>;
605 using Insertion_return =
609 std::vector<Entry_representative> >;
641 template <
class Container = Boundary>
642 Matrix(
const std::vector<Container>& columns, Characteristic characteristic = 11);
652 Matrix(
unsigned int numberOfColumns, Characteristic characteristic = Field_operators::nullCharacteristic);
700 template <
class Boundary_range = Boundary>
701 Matrix(
const std::vector<Boundary_range>& orderedBoundaries,
704 Characteristic characteristic = 11);
731 Characteristic characteristic = Field_operators::nullCharacteristic);
776 template <
class Container,
class = std::enable_if_t<!std::is_arithmetic_v<Container> > >
789 template <
class Container,
class = std::enable_if_t<!std::is_arithmetic_v<Container> > >
831 template <
class Boundary_range = Boundary>
853 template <
class Boundary_range = Boundary>
879 template <
class Boundary_range = Boundary>
1083 template <
typename Integer_index>
1084 std::enable_if_t<std::is_integral_v<Integer_index> >
add_to(Integer_index sourceColumnIndex,
1085 Integer_index targetColumnIndex);
1098 template <
class Entry_range>
1099 std::enable_if_t<!std::is_integral_v<Entry_range> >
add_to(
const Entry_range& sourceColumn,
Index targetColumnIndex);
1117 template <
typename Integer_index>
1120 Integer_index targetColumnIndex);
1135 template <
class Entry_range>
1138 Index targetColumnIndex);
1156 template <
typename Integer_index>
1158 Integer_index sourceColumnIndex,
1159 Integer_index targetColumnIndex);
1174 template <
class Entry_range>
1176 const Entry_range& sourceColumn,
1177 Index targetColumnIndex);
1319 swap(matrix1.matrix_, matrix2.matrix_);
1320 std::swap(matrix1.colSettings_, matrix2.colSettings_);
1477 using Underlying_matrix = std::conditional_t<
1492 Master_boundary_matrix,
1497 Master_chain_matrix,
1502 Master_base_matrix>;
1506 Column_settings* colSettings_;
1507 Underlying_matrix matrix_;
1509 static constexpr void _assert_options();
1511 Element _get_value(
int coefficient)
const;
1514template <
class PersistenceMatrixOptions>
1520 "When no barcode is recorded with vine swaps, comparison functions for the columns have to be provided.");
1524template <
class PersistenceMatrixOptions>
1525template <
class Container>
1527 : colSettings_(new Column_settings(characteristic)), matrix_(columns, colSettings_)
1531 "When no barcode is recorded with vine swaps for chain matrices, comparison functions for the columns "
1532 "have to be provided.");
1536template <
class PersistenceMatrixOptions>
1538 : colSettings_(new Column_settings(characteristic)), matrix_(numberOfColumns, colSettings_)
1542 "When no barcode is recorded with vine swaps for chain matrices, comparison functions for the columns "
1543 "have to be provided.");
1547template <
class PersistenceMatrixOptions>
1550 : colSettings_(new Column_settings()), matrix_(colSettings_, birthComparator, deathComparator)
1555 "Constructor only available for chain matrices when vine swaps are enabled, but the barcode is not recorded.");
1559template <
class PersistenceMatrixOptions>
1560template <
class Boundary_range>
1564 Characteristic characteristic)
1565 : colSettings_(new Column_settings(characteristic)),
1566 matrix_(orderedBoundaries, colSettings_, birthComparator, deathComparator)
1571 "Constructor only available for chain matrices when vine swaps are enabled, but the barcode is not recorded.");
1575template <
class PersistenceMatrixOptions>
1579 Characteristic characteristic)
1580 : colSettings_(new Column_settings(characteristic)),
1581 matrix_(numberOfColumns, colSettings_, birthComparator, deathComparator)
1586 "Constructor only available for chain matrices when vine swaps are enabled, but the barcode is not recorded.");
1590template <
class PersistenceMatrixOptions>
1592 : colSettings_(new Column_settings(*matrixToCopy.colSettings_)), matrix_(matrixToCopy.matrix_, colSettings_)
1597template <
class PersistenceMatrixOptions>
1599 : colSettings_(std::exchange(other.colSettings_,
nullptr)), matrix_(std::move(other.matrix_))
1604template <
class PersistenceMatrixOptions>
1605inline Matrix<PersistenceMatrixOptions>::~Matrix()
1607 matrix_.reset(colSettings_);
1608 delete colSettings_;
1611template <
class PersistenceMatrixOptions>
1615 if (colSettings_->operators.get_characteristic() != Field_operators::nullCharacteristic) {
1616 std::cerr <<
"Warning: Characteristic already initialised. Changing it could lead to incoherences in the matrix "
1617 "as the modulo was already applied to values in existing columns.";
1620 colSettings_->operators.set_characteristic(characteristic);
1624template <
class PersistenceMatrixOptions>
1625template <
class Container,
class>
1629 GUDHI_CHECK(colSettings_->operators.get_characteristic() != Field_operators::nullCharacteristic,
1630 std::logic_error(
"Matrix::insert_column - Columns cannot be initialized if the coefficient field "
1631 "characteristic is not specified."));
1636 "'insert_column' not available for the chosen options. The input has to be in the form of a cell boundary.");
1637 matrix_.insert_column(column);
1640template <
class PersistenceMatrixOptions>
1641template <
class Container,
class>
1645 GUDHI_CHECK(colSettings_->operators.get_characteristic() != Field_operators::nullCharacteristic,
1646 std::logic_error(
"Matrix::insert_column - Columns cannot be initialized if the coefficient field "
1647 "characteristic is not specified."));
1651 "'insert_column' with those parameters is not available for the chosen options.");
1653 "Columns have to be inserted at the end of the matrix when row access is enabled.");
1654 matrix_.insert_column(column, columnIndex);
1657template <
class PersistenceMatrixOptions>
1662 "'insert_column' not available for the chosen options. The input has to be in the form of a cell boundary.");
1665 matrix_.insert_column(idx);
1667 GUDHI_CHECK(colSettings_->operators.get_characteristic() != Field_operators::nullCharacteristic,
1668 std::logic_error(
"Matrix::insert_column - Columns cannot be initialized if the coefficient field "
1669 "characteristic is not specified."));
1670 matrix_.insert_column(idx, e);
1674template <
class PersistenceMatrixOptions>
1675template <
class Boundary_range>
1677 const Boundary_range& boundary,
1681 GUDHI_CHECK(colSettings_->operators.get_characteristic() != Field_operators::nullCharacteristic,
1682 std::logic_error(
"Matrix::insert_boundary - Columns cannot be initialized if the coefficient field "
1683 "characteristic is not specified."));
1688 return matrix_.insert_boundary(boundary, dim);
1690 matrix_.insert_boundary(boundary, dim);
1693template <
class PersistenceMatrixOptions>
1694template <
class Boundary_range>
1695inline typename Matrix<PersistenceMatrixOptions>::Insertion_return
1699 GUDHI_CHECK(colSettings_->operators.get_characteristic() != Field_operators::nullCharacteristic,
1700 std::logic_error(
"Matrix::insert_boundary - Columns cannot be initialized if the coefficient field "
1701 "characteristic is not specified."));
1704 static_assert(isNonBasic,
"Only enabled for non-basic matrices.");
1707 return matrix_.insert_boundary(cellIndex, boundary, dim);
1709 matrix_.insert_boundary(cellIndex, boundary, dim);
1712template <
class PersistenceMatrixOptions>
1713template <
class Boundary_range>
1717 "'insert_maximal_cell' is not available for the chosen options.");
1719 "'insert_maximal_cell' is not available for the chosen options.");
1720 matrix_.insert_maximal_cell(columnIndex, boundary, dim);
1723template <
class PersistenceMatrixOptions>
1727 return matrix_.get_column(columnIndex);
1730template <
class PersistenceMatrixOptions>
1732 Index columnIndex)
const
1734 return matrix_.get_column(columnIndex);
1737template <
class PersistenceMatrixOptions>
1747 "Only enabled for position indexed RU matrices.");
1749 return matrix_.get_column(columnIndex, inR);
1752template <
class PersistenceMatrixOptions>
1758 return matrix_.get_row(rowIndex);
1761template <
class PersistenceMatrixOptions>
1767 return matrix_.get_row(rowIndex);
1770template <
class PersistenceMatrixOptions>
1781 "Only enabled for position indexed RU matrices.");
1783 return matrix_.get_row(rowIndex, inR);
1786template <
class PersistenceMatrixOptions>
1791 "'remove_column' is not available for the chosen options.");
1793 matrix_.remove_column(columnIndex);
1796template <
class PersistenceMatrixOptions>
1801 "'erase_empty_row' is not available for the chosen options.");
1803 matrix_.erase_empty_row(rowIndex);
1806template <
class PersistenceMatrixOptions>
1810 "'remove_maximal_cell(ID_index)' is not available for the chosen options.");
1812 "'remove_maximal_cell(ID_index)' is not available for the chosen options.");
1815 "'remove_maximal_cell(ID_index)' is not available for the chosen options.");
1817 matrix_.remove_maximal_cell(columnIndex);
1820template <
class PersistenceMatrixOptions>
1822 const std::vector<ID_index>& columnsToSwap)
1825 "'remove_maximal_cell(ID_index,const std::vector<Index>&)' is not available for the chosen options.");
1827 "'remove_maximal_cell(ID_index,const std::vector<Index>&)' is not available for the chosen options.");
1829 "'remove_maximal_cell(ID_index,const std::vector<Index>&)' is not available for the chosen options.");
1831 matrix_.remove_maximal_cell(cellIndex, columnsToSwap);
1834template <
class PersistenceMatrixOptions>
1838 "'remove_last' is not available for the chosen options.");
1840 "'remove_last' is not available for the chosen options.");
1843 "'remove_last' is not available for the chosen options.");
1845 matrix_.remove_last();
1848template <
class PersistenceMatrixOptions>
1851 static_assert(isNonBasic,
"'get_max_dimension' is not available for the chosen options.");
1853 return matrix_.get_max_dimension();
1856template <
class PersistenceMatrixOptions>
1859 return matrix_.get_number_of_columns();
1862template <
class PersistenceMatrixOptions>
1864 Index columnIndex)
const
1866 static_assert(isNonBasic,
"'get_column_dimension' is not available for the chosen options.");
1868 return matrix_.get_column_dimension(columnIndex);
1871template <
class PersistenceMatrixOptions>
1872template <
typename Integer_index>
1874 Integer_index sourceColumnIndex,
1875 Integer_index targetColumnIndex)
1877 matrix_.add_to(sourceColumnIndex, targetColumnIndex);
1880template <
class PersistenceMatrixOptions>
1881template <
class Entry_range>
1883 const Entry_range& sourceColumn,
1884 Index targetColumnIndex)
1886 static_assert(!isNonBasic,
1887 "For boundary or chain matrices, only additions with columns inside the matrix is allowed to maintain "
1888 "algebraic consistency.");
1890 matrix_.add_to(sourceColumn, targetColumnIndex);
1893template <
class PersistenceMatrixOptions>
1894template <
typename Integer_index>
1895inline std::enable_if_t<std::is_integral_v<Integer_index> >
1898 Integer_index targetColumnIndex)
1900 matrix_.multiply_target_and_add_to(sourceColumnIndex, _get_value(coefficient), targetColumnIndex);
1903template <
class PersistenceMatrixOptions>
1904template <
class Entry_range>
1906 const Entry_range& sourceColumn,
1908 Index targetColumnIndex)
1910 static_assert(!isNonBasic,
1911 "For boundary or chain matrices, only additions with columns inside the matrix is allowed to maintain "
1912 "algebraic consistency.");
1914 matrix_.multiply_target_and_add_to(sourceColumn, _get_value(coefficient), targetColumnIndex);
1917template <
class PersistenceMatrixOptions>
1918template <
typename Integer_index>
1919inline std::enable_if_t<std::is_integral_v<Integer_index> >
1921 Integer_index sourceColumnIndex,
1922 Integer_index targetColumnIndex)
1924 matrix_.multiply_source_and_add_to(_get_value(coefficient), sourceColumnIndex, targetColumnIndex);
1927template <
class PersistenceMatrixOptions>
1928template <
class Entry_range>
1931 const Entry_range& sourceColumn,
1932 Index targetColumnIndex)
1934 static_assert(!isNonBasic,
1935 "For boundary or chain matrices, only additions with columns inside the matrix is allowed to maintain "
1936 "algebraic consistency.");
1938 matrix_.multiply_source_and_add_to(_get_value(coefficient), sourceColumn, targetColumnIndex);
1941template <
class PersistenceMatrixOptions>
1945 "'zero_entry' is not available for the chosen options.");
1947 return matrix_.zero_entry(columnIndex, rowIndex);
1950template <
class PersistenceMatrixOptions>
1958 "Only enabled for RU matrices.");
1960 return matrix_.zero_entry(columnIndex, rowIndex, inR);
1963template <
class PersistenceMatrixOptions>
1967 "'zero_column' is not available for the chosen options.");
1969 return matrix_.zero_column(columnIndex);
1972template <
class PersistenceMatrixOptions>
1980 "Only enabled for RU matrices.");
1982 return matrix_.zero_column(columnIndex, inR);
1985template <
class PersistenceMatrixOptions>
1988 return matrix_.is_zero_entry(columnIndex, rowIndex);
1991template <
class PersistenceMatrixOptions>
1999 "Only enabled for RU matrices.");
2001 return matrix_.is_zero_entry(columnIndex, rowIndex, inR);
2004template <
class PersistenceMatrixOptions>
2007 return matrix_.is_zero_column(columnIndex);
2010template <
class PersistenceMatrixOptions>
2018 "Only enabled for RU matrices.");
2020 return matrix_.is_zero_column(columnIndex, inR);
2023template <
class PersistenceMatrixOptions>
2030 "'get_column_with_pivot' is not available for the chosen options.");
2032 return matrix_.get_column_with_pivot(cellIndex);
2035template <
class PersistenceMatrixOptions>
2039 static_assert(isNonBasic,
"'get_pivot' is not available for the chosen options.");
2041 return matrix_.get_pivot(columnIndex);
2044template <
class PersistenceMatrixOptions>
2047 swap(matrix_, other.matrix_);
2048 std::swap(colSettings_, other.colSettings_);
2053template <
class PersistenceMatrixOptions>
2056 if (
this == &other)
return *
this;
2058 matrix_ = std::move(other.matrix_);
2059 colSettings_ = std::exchange(other.colSettings_,
nullptr);
2064template <
class PersistenceMatrixOptions>
2065inline void Matrix<PersistenceMatrixOptions>::print()
2067 return matrix_.print();
2070template <
class PersistenceMatrixOptions>
2075 return matrix_.get_current_barcode();
2078template <
class PersistenceMatrixOptions>
2086 "'get_current_barcode' is not const for boundary matrices as the barcode is only computed when explicitly "
2089 return matrix_.get_current_barcode();
2092template <
class PersistenceMatrixOptions>
2099 "This method was not enabled.");
2100 return matrix_.swap_columns(columnIndex1, columnIndex2);
2103template <
class PersistenceMatrixOptions>
2110 "This method was not enabled.");
2111 return matrix_.swap_rows(rowIndex1, rowIndex2);
2114template <
class PersistenceMatrixOptions>
2121 "This method was not enabled.");
2122 return matrix_.vine_swap_with_z_eq_1_case(index);
2125template <
class PersistenceMatrixOptions>
2134 "This method was not enabled.");
2136 return matrix_.vine_swap_with_z_eq_1_case(columnIndex1, columnIndex2);
2139template <
class PersistenceMatrixOptions>
2146 "This method was not enabled.");
2147 return matrix_.vine_swap(index);
2150template <
class PersistenceMatrixOptions>
2158 "This method was not enabled.");
2159 return matrix_.vine_swap(columnIndex1, columnIndex2);
2162template <
class PersistenceMatrixOptions>
2166 matrix_.update_all_representative_cycles(dim);
2169template <
class PersistenceMatrixOptions>
2173 matrix_.update_representative_cycle(bar);
2176template <
class PersistenceMatrixOptions>
2177inline const std::vector<typename Matrix<PersistenceMatrixOptions>::Cycle>&
2181 return matrix_.get_all_representative_cycles();
2184template <
class PersistenceMatrixOptions>
2189 return matrix_.get_representative_cycle(bar);
2192template <
class PersistenceMatrixOptions>
2193constexpr void Matrix<PersistenceMatrixOptions>::_assert_options()
2197 "Row access is not possible for heap columns.");
2199 "Vine update currently works only for Z_2 coefficients.");
2204 "Column compression not compatible with heap columns.");
2227template <
class PersistenceMatrixOptions>
2228inline typename Matrix<PersistenceMatrixOptions>::Element Matrix<PersistenceMatrixOptions>::_get_value(
2229 int coefficient)
const
2231 return get_coefficient_value(coefficient, get_operator_ptr(colSettings_));
Contains the Gudhi::persistence_matrix::Base_matrix class.
Contains the Gudhi::persistence_matrix::Base_matrix_with_column_compression class.
Contains the Gudhi::persistence_matrix::Boundary_matrix class.
Contains the Gudhi::persistence_matrix::Chain_matrix class.
Contains the Gudhi::persistence_matrix::Id_to_index_overlay class.
Contains the Gudhi::persistence_matrix::Position_to_index_overlay class.
Contains the Gudhi::persistence_matrix::RU_matrix class.
Contains the Gudhi::persistence_fields::Z2_field_operators class.
Contains the Gudhi::persistence_matrix::Base_pairing class and Gudhi::persistence_matrix::Dummy_base_...
Contains the Gudhi::persistence_matrix::Base_swap class and Gudhi::persistence_matrix::Dummy_base_swa...
Contains the Gudhi::persistence_matrix::Chain_column_extra_properties class and Gudhi::persistence_ma...
Contains the Gudhi::persistence_matrix::Chain_pairing class and Gudhi::persistence_matrix::Dummy_chai...
Contains the Gudhi::persistence_matrix::Chain_representative_cycles class and Gudhi::persistence_matr...
Contains the Gudhi::persistence_matrix::Chain_barcode_swap and Gudhi::persistence_matrix::Chain_vine_...
Class defining operators for the field.
Definition Z2_field_operators.h:32
A base matrix (also see Base_matrix), but with column compression. That is, all identical columns in ...
Definition Base_matrix_with_column_compression.h:46
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
Class managing the column and row swaps in Base_matrix and Boundary_matrix.
Definition base_swap.h:50
Matrix structure to store the ordered boundary matrix of a filtered complex in order to compute its ...
Definition Boundary_matrix.h:44
Class managing the barcode for Chain_vine_swap.
Definition chain_vine_swap.h:89
Class managing the pivot and partitioning of columns in Chain_matrix.
Definition chain_column_extra_properties.h:58
Matrix structure storing a compatible base of a filtered chain complex. See zigzag....
Definition Chain_matrix.h:57
Class managing the barcode for Chain_matrix if the option was enabled.
Definition chain_pairing.h:48
Class managing the representative cycles for Chain_matrix if the option was enabled.
Definition chain_rep_cycles.h:56
Class managing the vine swaps for Chain_matrix.
Definition chain_vine_swap.h:235
Matrix entry class. Stores by default only the row index it belongs to, but can also store its column...
Definition entry_types.h:163
ID_index get_row_index() const
Returns the row index stored in the entry.
Definition entry_types.h:217
Column class following the PersistenceMatrixColumn concept. Not compatible with row access.
Definition heap_column.h:52
Overlay for non-basic matrices replacing all input and output MatIdx indices of the original methods ...
Definition Id_to_index_overlay.h:42
Column class following the PersistenceMatrixColumn concept.
Definition intrusive_list_column.h:50
Column class following the PersistenceMatrixColumn concept.
Definition intrusive_set_column.h:50
Column class following the PersistenceMatrixColumn concept.
Definition list_column.h:51
Class managing the maximal dimension of a cell represented in the inheriting matrix,...
Definition matrix_dimension_holders.h:136
Class managing the maximal dimension of a cell represented in the inheriting matrix,...
Definition matrix_dimension_holders.h:58
Class managing the row access for the inheriting matrix.
Definition matrix_row_access.h:54
std::enable_if_t< std::is_integral_v< Integer_index > > multiply_target_and_add_to(Integer_index sourceColumnIndex, int coefficient, Integer_index targetColumnIndex)
Multiplies the target column with the coefficient and then adds the source column to it....
Definition Matrix.h:1896
void set_characteristic(Characteristic characteristic)
Sets the characteristic of the coefficient field if PersistenceMatrixOptions::is_z2 is false,...
Definition Matrix.h:1612
Persistence_interval< Dimension, Pos_index > Bar
Definition Matrix.h:179
Dimension get_column_dimension(Index columnIndex) const
Returns the dimension of the given cell. Only available for non-basic matrices.
Definition Matrix.h:1863
void swap_rows(Index rowIndex1, Index rowIndex2)
Only available for base matrices without column compression and simple boundary matrices (only storin...
Definition Matrix.h:2104
Index get_column_with_pivot(ID_index cellIndex) const
Returns the MatIdx index of the column which has the given row index as pivot. Only available for RU ...
Definition Matrix.h:2024
std::conditional_t< RU_rep_cycles_options::has_intrusive_rows, boost::intrusive::list< Matrix_entry, boost::intrusive::constant_time_size< false >, boost::intrusive::base_hook< Base_hook_matrix_row > >, std::set< Matrix_entry, RowEntryComp > > Row
Definition Matrix.h:309
std::enable_if_t< std::is_integral_v< Integer_index > > multiply_source_and_add_to(int coefficient, Integer_index sourceColumnIndex, Integer_index targetColumnIndex)
Multiplies the source column with the coefficient before adding it to the target column....
Definition Matrix.h:1920
static constexpr T get_null_value()
Returns value from a type when not set.
Definition Matrix.h:171
Entry< Matrix< RU_rep_cycles_options > > Matrix_entry
Definition Matrix.h:222
std::enable_if_t<!std::is_integral_v< Entry_range > > multiply_target_and_add_to(const Entry_range &sourceColumn, int coefficient, Index targetColumnIndex)
Multiplies the target column with the coefficient and then adds the given range of Entry to it....
Definition Matrix.h:1905
void update_representative_cycle(const Bar &bar)
Only available if PersistenceMatrixOptions::can_retrieve_representative_cycles is true....
Definition Matrix.h:2170
void zero_column(Index columnIndex)
Zeroes the column at the given index. Not available for chain matrices and for base matrices with col...
Definition Matrix.h:1964
Index vine_swap(Index columnIndex1, Index columnIndex2)
Only available if PersistenceMatrixOptions::has_vine_update is true and if it is either a chain matri...
Definition Matrix.h:2151
void zero_column(Index columnIndex, bool inR)
Only available for RU matrices. Zeroes the column at the given index in if inR is true or in if inR...
Definition Matrix.h:1973
const Cycle & get_representative_cycle(const Bar &bar) const
Only available if PersistenceMatrixOptions::can_retrieve_representative_cycles is true....
Definition Matrix.h:2186
Matrix(const Matrix &matrixToCopy)
Copy constructor.
Definition Matrix.h:1591
const Barcode & get_current_barcode()
Returns the current barcode of the matrix. Available only if PersistenceMatrixOptions::has_column_pai...
Definition Matrix.h:2071
void insert_column(ID_index idx, Element e=1U)
Inserts a new column at the end of the matrix. The column will consist of the given index only.
Definition Matrix.h:1658
std::enable_if_t<!std::is_integral_v< Entry_range > > add_to(const Entry_range &sourceColumn, Index targetColumnIndex)
Adds the given range of Entry onto the column at targetColumnIndex in the matrix. Only available for ...
Definition Matrix.h:1882
typename Field_operators::Element Element
Definition Matrix.h:164
const std::vector< Cycle > & get_all_representative_cycles() const
Only available if PersistenceMatrixOptions::can_retrieve_representative_cycles is true....
Definition Matrix.h:2178
std::enable_if_t<!std::is_integral_v< Entry_range > > multiply_source_and_add_to(int coefficient, const Entry_range &sourceColumn, Index targetColumnIndex)
Multiplies the source column with the coefficient before adding it to the target column....
Definition Matrix.h:1929
Matrix(unsigned int numberOfColumns, const std::function< bool(Pos_index, Pos_index)> &birthComparator, const std::function< bool(Pos_index, Pos_index)> &deathComparator, Characteristic characteristic=Field_operators::nullCharacteristic)
Constructs a new empty matrix and reserves space for the given number of columns. Only available when...
Definition Matrix.h:1576
ID_index get_pivot(Index columnIndex)
Returns the row index of the pivot of the given column. Only available for non-basic matrices.
Definition Matrix.h:2036
Returned_column & get_column(Index columnIndex)
Returns the column at the given MatIdx index. For RU matrices, is equivalent to get_column(columnInde...
Definition Matrix.h:1724
typename RU_rep_cycles_options::Dimension Dimension
Definition Matrix.h:153
std::conditional_t< hasFixedBarcode, std::vector< Bar >, std::conditional_t< RU_rep_cycles_options::has_removable_columns, std::list< Bar >, std::vector< Bar > > > Barcode
Definition Matrix.h:493
void swap_columns(Index columnIndex1, Index columnIndex2)
Only available for base matrices without column compression and simple boundary matrices (only storin...
Definition Matrix.h:2093
bool is_zero_entry(Index columnIndex, ID_index rowIndex)
Indicates if the entry at given coordinates has value zero.
Definition Matrix.h:1986
typename RU_rep_cycles_options::Index Index
Definition Matrix.h:150
Matrix & operator=(Matrix other) &
void zero_entry(Index columnIndex, ID_index rowIndex, bool inR)
Only available for RU matrices. Zeroes the entry at the given coordinates in if inR is true or in i...
Definition Matrix.h:1951
Matrix(const std::function< bool(Pos_index, Pos_index)> &birthComparator, const std::function< bool(Pos_index, Pos_index)> &deathComparator)
Constructs a new empty matrix with the given comparator functions. Only available when those comparat...
Definition Matrix.h:1548
void zero_entry(Index columnIndex, ID_index rowIndex)
Zeroes the entry at the given coordinates. Not available for chain matrices and for base matrices wit...
Definition Matrix.h:1942
Insertion_return insert_boundary(const Boundary_range &boundary, Dimension dim=Matrix::get_null_value< Dimension >())
Inserts at the end of the matrix a new ordered column corresponding to the given boundary....
Definition Matrix.h:1676
Returned_row & get_row(ID_index rowIndex)
Only available if PersistenceMatrixOptions::has_row_access is true. Returns the row at the given row ...
Definition Matrix.h:1753
Pool_entry_constructor< Matrix_entry > Entry_constructor
Definition Matrix.h:234
const Column & get_column(Index columnIndex, bool inR)
Only available for RU matrices without Column_indexation_types::IDENTIFIER indexing....
Definition Matrix.h:1738
static New_entry_constructor< Matrix_entry > defaultEntryConstructor
Definition Matrix.h:229
void remove_last()
Removes the last inserted column/cell from the matrix. If the matrix is non basic,...
Definition Matrix.h:1835
Insertion_return insert_boundary(ID_index cellIndex, const Boundary_range &boundary, Dimension dim=Matrix::get_null_value< Dimension >())
Only available for non-basic matrices. It does the same as the other version, but allows the boundary...
Definition Matrix.h:1696
Matrix & operator=(Matrix &&other) &&noexcept
Assign operator.
Definition Matrix.h:2054
bool is_zero_column(Index columnIndex)
Indicates if the column at given index has value zero.
Definition Matrix.h:2005
const Row & get_row(ID_index rowIndex, bool inR)
Only available for RU matrices without Column_indexation_types::IDENTIFIER indexing....
Definition Matrix.h:1771
void erase_empty_row(ID_index rowIndex)
The effect varies depending on the matrices and the options:
Definition Matrix.h:1797
Matrix(Matrix &&other) noexcept
Move constructor. After the move, the given matrix will be empty.
Definition Matrix.h:1598
std::vector< Entry_representative > Cycle
Definition Matrix.h:573
Matrix()
Default constructor. Initializes an empty matrix.
Definition Matrix.h:1515
const Column & get_column(Index columnIndex) const
Only available for chain matrices. Returns the column at the given MatIdx index. The type of the colu...
Definition Matrix.h:1731
bool vine_swap(Pos_index index)
Only available if PersistenceMatrixOptions::has_vine_update is true and if it is either a boundary ma...
Definition Matrix.h:2140
Matrix(unsigned int numberOfColumns, Characteristic characteristic=Field_operators::nullCharacteristic)
Constructs a new empty matrix and reserves space for the given number of columns.
Definition Matrix.h:1537
const Row & get_row(ID_index rowIndex) const
Only available for chain matrices and matrices with column compression. Returns the row at the given ...
Definition Matrix.h:1762
friend void swap(Matrix &matrix1, Matrix &matrix2) noexcept
Swap operator for two matrices.
Definition Matrix.h:1317
std::conditional_t< RU_rep_cycles_options::is_z2, Gudhi::persistence_fields::Z2_field_operators, typename RU_rep_cycles_options::Field_coeff_operators > Field_operators
Definition Matrix.h:158
void remove_column(Index columnIndex)
Only available for base matrices without column compression and if PersistenceMatrixOptions::has_map_...
Definition Matrix.h:1787
bool vine_swap_with_z_eq_1_case(Pos_index index)
Only available if PersistenceMatrixOptions::has_vine_update is true and if it is either a boundary ma...
Definition Matrix.h:2115
std::conditional_t< RU_rep_cycles_options::column_type==Column_types::HEAP, Matrix_heap_column, std::conditional_t< RU_rep_cycles_options::column_type==Column_types::LIST, Matrix_list_column, std::conditional_t< RU_rep_cycles_options::column_type==Column_types::SET, Matrix_set_column, std::conditional_t< RU_rep_cycles_options::column_type==Column_types::UNORDERED_SET, Matrix_unordered_set_column, std::conditional_t< RU_rep_cycles_options::column_type==Column_types::VECTOR, Matrix_vector_column, std::conditional_t< RU_rep_cycles_options::column_type==Column_types::INTRUSIVE_LIST, Matrix_intrusive_list_column, std::conditional_t< RU_rep_cycles_options::column_type==Column_types::NAIVE_VECTOR, Matrix_naive_vector_column, std::conditional_t< RU_rep_cycles_options::column_type==Column_types::SMALL_VECTOR, Matrix_small_vector_column, Matrix_intrusive_set_column > > > > > > > > Column
Definition Matrix.h:359
void insert_column(const Container &column, Index columnIndex)
Inserts a new ordered column at the given index by copying the given range of Entry_representative....
Definition Matrix.h:1642
typename RU_rep_cycles_options::Index ID_index
Definition Matrix.h:151
Index get_number_of_columns() const
Returns the current number of columns in the matrix.
Definition Matrix.h:1857
void update_all_representative_cycles(Dimension dim=get_null_value< Dimension >())
Only available if PersistenceMatrixOptions::can_retrieve_representative_cycles is true....
Definition Matrix.h:2163
Matrix(const std::vector< Container > &columns, Characteristic characteristic=11)
Constructs a new matrix from the given ranges of Entry_representative. Each range corresponds to a co...
Definition Matrix.h:1526
std::conditional_t< RU_rep_cycles_options::is_z2, ID_index, std::pair< ID_index, Element > > Entry_representative
Definition Matrix.h:243
typename RU_rep_cycles_options::Index Pos_index
Definition Matrix.h:152
Dimension get_max_dimension() const
Returns the maximal dimension of a cell stored in the matrix. Only available for non-basic matrices a...
Definition Matrix.h:1849
bool is_zero_entry(Index columnIndex, ID_index rowIndex, bool inR) const
Only available for RU matrices. Indicates if the entry at given coordinates has value zero in if inR...
Definition Matrix.h:1992
std::enable_if_t< std::is_integral_v< Integer_index > > add_to(Integer_index sourceColumnIndex, Integer_index targetColumnIndex)
Adds column at sourceColumnIndex onto the column at targetColumnIndex in the matrix....
Definition Matrix.h:1873
void remove_maximal_cell(ID_index cellIndex, const std::vector< ID_index > &columnsToSwap)
Only available for chain matrices and if PersistenceMatrixOptions::has_removable_columns,...
Definition Matrix.h:1821
const Barcode & get_current_barcode() const
Returns the current barcode of the matrix. Available only if PersistenceMatrixOptions::has_column_pai...
Definition Matrix.h:2079
Matrix(const std::vector< Boundary_range > &orderedBoundaries, const std::function< bool(Pos_index, Pos_index)> &birthComparator, const std::function< bool(Pos_index, Pos_index)> &deathComparator, Characteristic characteristic=11)
Constructs a new matrix from the given ranges with the given comparator functions....
Definition Matrix.h:1561
Index vine_swap_with_z_eq_1_case(Index columnIndex1, Index columnIndex2)
Only available if PersistenceMatrixOptions::has_vine_update is true and if it is either a chain matri...
Definition Matrix.h:2126
void remove_maximal_cell(Index columnIndex)
Only available for RU and chain matrices and if PersistenceMatrixOptions::has_removable_columns and P...
Definition Matrix.h:1807
bool is_zero_column(Index columnIndex, bool inR)
Only available for RU matrices. Indicates if the column at given index has value zero in if inR is t...
Definition Matrix.h:2011
void insert_column(const Container &column)
Inserts a new ordered column at the end of the matrix by copying the given range of Entry_representat...
Definition Matrix.h:1626
void insert_maximal_cell(Index columnIndex, const Boundary_range &boundary, Dimension dim=Matrix::get_null_value< Dimension >())
Inserts the given cell boundary at the given position in the matrix/filtration such that the matrix r...
Definition Matrix.h:1714
Overlay for chain matrices replacing all input and output MatIdx indices of the original methods with...
Definition Position_to_index_overlay.h:40
Class managing the barcode for RU_vine_swap.
Definition ru_vine_swap.h:62
Matrix structure to store the ordered boundary matrix of a filtered complex in order to compute its ...
Definition RU_matrix.h:47
Class managing the barcode for RU_matrix if the option was enabled.
Definition ru_pairing.h:50
Class managing the representative cycles for RU_matrix if the option was enabled.
Definition ru_rep_cycles.h:57
Class managing the vine swaps for RU_matrix.
Definition ru_vine_swap.h:185
Class managing the row access for the columns.
Definition row_access.h:52
Column class following the PersistenceMatrixColumn concept.
Definition set_column.h:51
Column class following the PersistenceMatrixColumn concept.
Definition unordered_set_column.h:68
Column class following the PersistenceMatrixColumn concept.
Definition vector_column.h:54
Contains the Gudhi::persistence_matrix::Column_dimension_holder class and Gudhi::persistence_matrix::...
Contains different versions of Gudhi::persistence_matrix::Entry factories.
Contains the Gudhi::persistence_matrix::Entry, Gudhi::persistence_matrix::Entry_column_index and Gudh...
@ IDENTIFIER
Definition persistence_matrix_options.h:56
@ POSITION
Definition persistence_matrix_options.h:55
@ CONTAINER
Definition persistence_matrix_options.h:54
@ LIST
Definition persistence_matrix_options.h:33
@ INTRUSIVE_SET
Definition persistence_matrix_options.h:44
@ INTRUSIVE_LIST
Definition persistence_matrix_options.h:43
@ UNORDERED_SET
Definition persistence_matrix_options.h:42
@ VECTOR
Definition persistence_matrix_options.h:37
@ SET
Definition persistence_matrix_options.h:34
@ SMALL_VECTOR
Definition persistence_matrix_options.h:40
@ NAIVE_VECTOR
Definition persistence_matrix_options.h:39
@ HEAP
Definition persistence_matrix_options.h:35
Contains the Gudhi::persistence_matrix::Heap_column class. Also defines the std::hash method for Gudh...
Contains the Gudhi::persistence_matrix::Intrusive_list_column class. Also defines the std::hash metho...
Contains the Gudhi::persistence_matrix::Intrusive_set_column class. Also defines the std::hash method...
Contains the Gudhi::persistence_matrix::List_column class. Also defines the std::hash method for Gudh...
Contains the Gudhi::persistence_matrix::Matrix_max_dimension_holder Gudhi::persistence_matrix::Matrix...
Contains the Gudhi::persistence_matrix::Matrix_row_access class and Gudhi::persistence_matrix::Dummy_...
Contains the Gudhi::persistence_matrix::Naive_vector_column class. Also defines the std::hash method ...
Persistence matrix namespace.
Definition FieldOperators.h:18
Gudhi namespace.
Definition SimplicialComplexForAlpha.h:14
Contains Gudhi::persistence_matrix::Persistence_interval class.
Contains the options for the matrix template.
Contains the Gudhi::persistence_matrix::Row_access class and Gudhi::persistence_matrix::Dummy_row_acc...
Contains the Gudhi::persistence_matrix::RU_pairing class and Gudhi::persistence_matrix::Dummy_ru_pair...
Contains the Gudhi::persistence_matrix::RU_representative_cycles class and Gudhi::persistence_matrix:...
Contains the Gudhi::persistence_matrix::RU_vine_swap class, as well as the Gudhi::persistence_matrix:...
Contains the Gudhi::persistence_matrix::Set_column class. Also defines the std::hash method for Gudhi...
Empty structure. Inherited instead of Base_pairing, when the computation of the barcode was not enabl...
Definition base_pairing.h:38
Empty structure. Inherited instead of Base_swap, when the column and row swaps are not enabled.
Definition base_swap.h:33
Empty structure. Inherited instead of Chain_pairing, when the computation of the barcode was not enab...
Definition chain_pairing.h:34
Empty structure. Inherited instead of Chain_column_extra_properties, when the columns are not meant f...
Definition chain_column_extra_properties.h:33
Empty structure. Inherited instead of Chain_representative_cycles, when the computation of the repres...
Definition chain_rep_cycles.h:40
Empty structure. Inherited instead of Chain_vine_swap, when vine swaps are not enabled.
Definition chain_vine_swap.h:55
Empty structure. Inherited instead of Column_dimension_holder, when the columns are not storing a dim...
Definition column_dimension_holder.h:32
Empty structure. Inherited instead of Matrix_max_dimension_holder or Matrix_all_dimension_holder,...
Definition matrix_dimension_holders.h:35
Empty structure. Inherited instead of Matrix_row_access, when the the row access is not enabled.
Definition matrix_row_access.h:32
Empty structure. Inherited instead of Row_access, if the row access is not enabled.
Definition row_access.h:32
Empty structure. Inherited instead of RU_pairing, when the computation of the barcode was not enabled...
Definition ru_pairing.h:36
Empty structure. Inherited instead of RU_representative_cycles, when the computation of the represent...
Definition ru_rep_cycles.h:41
Empty structure. Inherited instead of RU_vine_swap, when vine swaps are not enabled.
Definition ru_vine_swap.h:37
Compares two entries by their position in the row. They are assume to be in the same row.
Definition Matrix.h:297
Type for an interval in a persistent diagram or barcode. Stores the birth, death and dimension of the...
Definition persistence_interval.h:40
Concept of the template parameter for the class Matrix.
Definition PersistenceMatrixOptions.h:32
static const Column_indexation_types column_indexation_type
Specifies the desired indexation scheme to access the methods of the matrix. See matrix description a...
Definition PersistenceMatrixOptions.h:66
static const Column_types column_type
Specifies the desired column type. All possible column types are described in Column_types.
Definition PersistenceMatrixOptions.h:60
static const bool has_matrix_maximal_dimension_access
Only enabled for boundary and chain matrices, i.e., when at least one of the following is true: has_c...
Definition PersistenceMatrixOptions.h:142
unspecified Dimension
Type for the dimension. Has to be an integer type. If unsigned, the maximal value of the type should ...
Definition PersistenceMatrixOptions.h:42
static const bool has_map_column_container
If set to true, the underlying container containing the matrix columns is an std::unordered_map....
Definition PersistenceMatrixOptions.h:101
static const bool has_column_compression
Only enabled for base matrices (i.e., none of the following is true: has_column_pairings,...
Definition PersistenceMatrixOptions.h:83
static const bool has_row_access
If set to true, enables the method Matrix::get_row.
Definition PersistenceMatrixOptions.h:111
static const bool can_retrieve_representative_cycles
If set to true, enables the methods Matrix::update_all_representative_cycles and Matrix::get_all_repr...
Definition PersistenceMatrixOptions.h:161
static const bool has_removable_rows
Only enabled if has_row_access is true, ignored otherwise. If set to true, the underlying container c...
Definition PersistenceMatrixOptions.h:124
static const bool has_column_and_row_swaps
Only enabled for base matrices or simple boundary matrices, i.e., when both has_vine_update and can_r...
Definition PersistenceMatrixOptions.h:89
static const bool is_z2
If true, indicates that the values contained in the matrix are in and can therefore be treated like ...
Definition PersistenceMatrixOptions.h:56
unspecified Index
Type for the different indexation types and should be able to contain the maximal number of columns o...
Definition PersistenceMatrixOptions.h:48
static const bool has_column_pairings
If set to true, enables the method Matrix::get_current_barcode. The matrix will then either be a boun...
Definition PersistenceMatrixOptions.h:148
unspecified Field_coeff_operators
Field operators. Has to follow the FieldOperators concept. The type will not be used if is_z2 is set ...
Definition PersistenceMatrixOptions.h:37
static const bool has_vine_update
If set to true, enables the methods Matrix::vine_swap and Matrix::vine_swap_with_z_eq_1_case....
Definition PersistenceMatrixOptions.h:154
static const bool is_of_boundary_type
Only used, when at least one of the following is true: has_column_pairings, has_vine_update or can_re...
Definition PersistenceMatrixOptions.h:132
static const bool has_removable_columns
If set to true, enables the methods Matrix::remove_maximal_cell and Matrix::remove_last,...
Definition PersistenceMatrixOptions.h:106
static const bool has_intrusive_rows
Only enabled if has_row_access is true, ignored otherwise. If set to true, the underlying container r...
Definition PersistenceMatrixOptions.h:117
Contains the Gudhi::persistence_matrix::Unordered_set_column class. Also defines the std::hash method...
Contains the Gudhi::persistence_matrix::Vector_column class. Also defines the std::hash method for Gu...