17#ifndef PM_COLUMN_UTILITIES_H
18#define PM_COLUMN_UTILITIES_H
26namespace persistence_matrix {
28template <
class Entry,
typename Entry_iterator>
29Entry* _get_entry(
const Entry_iterator& itTarget)
40template <
class Column,
class Entry_iterator,
typename F1,
typename F2,
typename F3,
typename F4>
41void _generic_merge_entry_to_column(Column& targetColumn,
42 Entry_iterator& itSource,
43 typename Column::Column_support::iterator& itTarget,
50 typename Column::Entry* targetEntry = _get_entry<typename Column::Entry>(itTarget);
52 if (targetEntry->get_row_index() < itSource->get_row_index()) {
53 process_target(targetEntry);
55 }
else if (targetEntry->get_row_index() > itSource->get_row_index()) {
56 process_source(itSource, itTarget);
59 if constexpr (Column::Master::Option_list::is_z2) {
61 if constexpr (Column::Master::isNonBasic && !Column::Master::Option_list::is_of_boundary_type) {
62 if (targetEntry->get_row_index() == targetColumn.get_pivot()) pivotIsZeroed =
true;
64 targetColumn._delete_entry(itTarget);
66 update_target1(targetEntry->get_element(), itSource);
67 if (targetEntry->get_element() == Column::Field_operators::get_additive_identity()) {
68 if constexpr (Column::Master::isNonBasic && !Column::Master::Option_list::is_of_boundary_type) {
69 if (targetEntry->get_row_index() == targetColumn.get_pivot()) pivotIsZeroed =
true;
71 targetColumn._delete_entry(itTarget);
73 update_target2(targetEntry);
74 if constexpr (Column::Master::Option_list::has_row_access) targetColumn.update_entry(*targetEntry);
83template <
class Column,
class Entry_range,
typename F1,
typename F2,
typename F3,
typename F4,
typename F5>
84bool _generic_add_to_column(
const Entry_range& source,
92 bool pivotIsZeroed =
false;
94 auto& target = targetColumn.column_;
95 auto itTarget = target.begin();
96 auto itSource = source.begin();
97 while (itTarget != target.end() && itSource != source.end()) {
98 _generic_merge_entry_to_column(targetColumn, itSource, itTarget,
99 process_target, process_source, update_target1, update_target2,
103 finish_target(itTarget);
105 while (itSource != source.end()) {
106 process_source(itSource, target.end());
110 return pivotIsZeroed;
113template <
class Column,
class Entry_range>
114bool _add_to_column(
const Entry_range& source, Column& targetColumn)
116 return _generic_add_to_column(
119 [&]([[maybe_unused]]
typename Column::Entry* entryTarget) {},
120 [&](
typename Entry_range::const_iterator& itSource,
const typename Column::Column_support::iterator& itTarget) {
121 if constexpr (Column::Master::Option_list::is_z2) {
122 targetColumn._insert_entry(itSource->get_row_index(), itTarget);
124 targetColumn._insert_entry(itSource->get_element(), itSource->get_row_index(), itTarget);
127 [&](
typename Column::Field_element& targetElement,
typename Entry_range::const_iterator& itSource) {
128 if constexpr (!Column::Master::Option_list::is_z2)
129 targetColumn.operators_->add_inplace(targetElement, itSource->get_element());
131 [&]([[maybe_unused]]
typename Column::Entry* entryTarget) {},
132 [&]([[maybe_unused]]
typename Column::Column_support::iterator& itTarget) {}
136template <
class Column,
class Entry_range>
137bool _multiply_target_and_add_to_column(
const typename Column::Field_element& val,
138 const Entry_range& source,
139 Column& targetColumn)
142 if constexpr (Column::Master::isNonBasic && !Column::Master::Option_list::is_of_boundary_type) {
143 throw std::invalid_argument(
"A chain column should not be multiplied by 0.");
146 targetColumn.clear();
150 return _generic_add_to_column(
153 [&](
typename Column::Entry* entryTarget) {
154 targetColumn.operators_->multiply_inplace(entryTarget->get_element(), val);
157 if constexpr (Column::Master::Option_list::has_row_access) targetColumn.update_entry(*entryTarget);
159 [&](
typename Entry_range::const_iterator& itSource,
const typename Column::Column_support::iterator& itTarget) {
160 targetColumn._insert_entry(itSource->get_element(), itSource->get_row_index(), itTarget);
162 [&](
typename Column::Field_element& targetElement,
typename Entry_range::const_iterator& itSource) {
163 targetColumn.operators_->multiply_and_add_inplace_front(targetElement, val, itSource->get_element());
165 [&]([[maybe_unused]]
typename Column::Entry* entryTarget) {},
166 [&](
typename Column::Column_support::iterator& itTarget) {
167 while (itTarget != targetColumn.column_.end()) {
168 typename Column::Entry* targetEntry = _get_entry<typename Column::Entry>(itTarget);
169 targetColumn.operators_->multiply_inplace(targetEntry->get_element(), val);
170 if constexpr (Column::Master::Option_list::has_row_access) targetColumn.update_entry(*targetEntry);
177template <
class Column,
class Entry_range>
178bool _multiply_source_and_add_to_column(
const typename Column::Field_element& val,
179 const Entry_range& source,
180 Column& targetColumn)
186 return _generic_add_to_column(
189 []([[maybe_unused]]
typename Column::Entry* entryTarget) {},
190 [&](
typename Entry_range::const_iterator& itSource,
const typename Column::Column_support::iterator& itTarget) {
191 typename Column::Entry* entry =
192 targetColumn._insert_entry(itSource->get_element(), itSource->get_row_index(), itTarget);
193 targetColumn.operators_->multiply_inplace(entry->get_element(), val);
194 if constexpr (Column::Master::Option_list::has_row_access) targetColumn.update_entry(*entry);
196 [&](
typename Column::Field_element& targetElement,
typename Entry_range::const_iterator& itSource) {
197 targetColumn.operators_->multiply_and_add_inplace_back(itSource->get_element(), val, targetElement);
199 [&]([[maybe_unused]]
typename Column::Entry* entryTarget) {},
200 []([[maybe_unused]]
typename Column::Column_support::iterator& itTarget) {});
205template <
class Column>
206std::size_t hash_column(
const Column& column)
208 std::size_t seed = 0;
209 for (
auto& entry : column) {
210 seed ^= std::hash<unsigned int>()(entry.get_row_index() *
static_cast<unsigned int>(entry.get_element())) +
211 0x9e3779b9 + (seed << 6) + (seed >> 2);
Gudhi namespace.
Definition: SimplicialComplexForAlpha.h:14
Contains the options for the matrix template.