SeqAn3 3.3.0-rc.1
The Modern C++ library for sequence analysis.
score_matrix_single_column.hpp
Go to the documentation of this file.
1// -----------------------------------------------------------------------------------------------------
2// Copyright (c) 2006-2022, Knut Reinert & Freie Universität Berlin
3// Copyright (c) 2016-2022, Knut Reinert & MPI für molekulare Genetik
4// This file may be used, modified and/or redistributed under the terms of the 3-clause BSD-License
5// shipped with this file and also available at: https://github.com/seqan/seqan3/blob/master/LICENSE.md
6// -----------------------------------------------------------------------------------------------------
7
13#pragma once
14
15#include <ranges>
16#include <vector>
17
25
26namespace seqan3::detail
27{
28
51template <typename score_t>
54{
55private:
57 using physical_column_t = std::vector<score_t, aligned_allocator<score_t, alignof(score_t)>>;
59 using virtual_column_t = decltype(views::repeat_n(score_t{}, 1));
60
61 class matrix_iterator;
62
64 physical_column_t optimal_column{};
66 physical_column_t horizontal_column{};
68 virtual_column_t vertical_column{};
70 size_t number_of_columns{};
71
72public:
82
84
111 template <std::integral column_index_t, std::integral row_index_t>
112 void resize(column_index_type<column_index_t> const number_of_columns,
113 row_index_type<row_index_t> const number_of_rows,
114 score_t const initial_value = score_t{})
115 {
116 this->number_of_columns = number_of_columns.get();
117 optimal_column.clear();
118 horizontal_column.clear();
119 optimal_column.resize(number_of_rows.get(), initial_value);
120 horizontal_column.resize(number_of_rows.get(), initial_value);
121 vertical_column = views::repeat_n(initial_value, number_of_rows.get());
122 }
123
129 {
130 return matrix_iterator{*this, 0u};
131 }
132
134 matrix_iterator begin() const = delete;
135
138 {
139 return matrix_iterator{*this, number_of_columns};
140 }
141
143 matrix_iterator end() const = delete;
145};
146
158template <typename score_t>
161{
162private:
164 using matrix_column_t = decltype(views::zip(std::declval<physical_column_t &>(),
165 std::declval<physical_column_t &>(),
166 std::declval<virtual_column_t &>()));
167
169 static constexpr auto transform_to_affine_cell = std::views::transform(
170 [](auto && tpl) -> affine_cell_proxy<std::remove_cvref_t<decltype(tpl)>>
171 {
172 using fwd_tuple_t = decltype(tpl);
173 return affine_cell_proxy<std::remove_cvref_t<fwd_tuple_t>>{std::forward<fwd_tuple_t>(tpl)};
174 });
175
177 score_matrix_single_column * host_ptr{nullptr};
179 size_t current_column_id{};
180
181public:
186 using value_type = decltype(std::declval<matrix_column_t>() | transform_to_affine_cell);
190 using pointer = void;
196
200 matrix_iterator() noexcept = default;
201 matrix_iterator(matrix_iterator const &) noexcept = default;
202 matrix_iterator(matrix_iterator &&) noexcept = default;
203 matrix_iterator & operator=(matrix_iterator const &) noexcept = default;
204 matrix_iterator & operator=(matrix_iterator &&) noexcept = default;
205 ~matrix_iterator() = default;
206
212 explicit matrix_iterator(score_matrix_single_column & host_matrix, size_t const initial_column_id) noexcept :
213 host_ptr{std::addressof(host_matrix)},
214 current_column_id{initial_column_id}
215 {}
217
223 {
224 return views::zip(host_ptr->optimal_column, host_ptr->horizontal_column, host_ptr->vertical_column)
225 | transform_to_affine_cell;
226 }
228
234 {
235 ++current_column_id;
236 return *this;
237 }
238
240 void operator++(int)
241 {
242 ++(*this);
243 }
245
250 friend bool operator==(matrix_iterator const & lhs, matrix_iterator const & rhs) noexcept
251 {
252 return lhs.current_column_id == rhs.current_column_id;
253 }
254
256 friend bool operator!=(matrix_iterator const & lhs, matrix_iterator const & rhs) noexcept
257 {
258 return !(lhs == rhs);
259 }
261};
262
263} // namespace seqan3::detail
T addressof(T... args)
Provides seqan3::detail::affine_cell_proxy.
Provides seqan3::aligned_allocator.
Allocates uninitialized storage whose memory-alignment is specified by alignment.
Definition: aligned_allocator.hpp:77
A proxy for an affine score matrix cell.
Definition: affine_cell_proxy.hpp:117
Score matrix iterator for the pairwise alignment using only a single column.
Definition: score_matrix_single_column.hpp:161
decltype(std::declval< matrix_column_t >()|transform_to_affine_cell) value_type
The value type.
Definition: score_matrix_single_column.hpp:186
reference operator*() const
Returns the range over the current column.
Definition: score_matrix_single_column.hpp:222
void pointer
The pointer type.
Definition: score_matrix_single_column.hpp:190
value_type reference
The reference type.
Definition: score_matrix_single_column.hpp:188
friend bool operator!=(matrix_iterator const &lhs, matrix_iterator const &rhs) noexcept
Tests whether lhs != rhs.
Definition: score_matrix_single_column.hpp:256
matrix_iterator & operator++()
Move this to the next column.
Definition: score_matrix_single_column.hpp:233
friend bool operator==(matrix_iterator const &lhs, matrix_iterator const &rhs) noexcept
Tests whether lhs == rhs.
Definition: score_matrix_single_column.hpp:250
decltype(views::zip(std::declval< physical_column_t & >(), std::declval< physical_column_t & >(), std::declval< virtual_column_t & >())) matrix_column_t
The type of the zipped score column.
Definition: score_matrix_single_column.hpp:166
void operator++(int)
Move this to the next column.
Definition: score_matrix_single_column.hpp:240
Score matrix for the pairwise alignment using only a single column.
Definition: score_matrix_single_column.hpp:54
decltype(views::repeat_n(score_t{}, 1)) virtual_column_t
The type of the virtual score column which only stores one value.
Definition: score_matrix_single_column.hpp:59
score_matrix_single_column(score_matrix_single_column &&)=default
Defaulted.
void resize(column_index_type< column_index_t > const number_of_columns, row_index_type< row_index_t > const number_of_rows, score_t const initial_value=score_t{})
Resizes the matrix.
Definition: score_matrix_single_column.hpp:112
matrix_iterator begin()
Returns the iterator pointing to the first column.
Definition: score_matrix_single_column.hpp:128
score_matrix_single_column & operator=(score_matrix_single_column const &)=default
Defaulted.
matrix_iterator end()
Returns the iterator pointing behind the last column.
Definition: score_matrix_single_column.hpp:137
matrix_iterator end() const =delete
This score matrix is not const-iterable.
matrix_iterator begin() const =delete
This score matrix is not const-iterable.
score_matrix_single_column(score_matrix_single_column const &)=default
Defaulted.
score_matrix_single_column & operator=(score_matrix_single_column &&)=default
Defaulted.
constexpr value_t & get() &noexcept
Returns the underlying value.
Definition: strong_type.hpp:204
decltype(detail::transform< trait_t >(list_t{})) transform
Apply a transformation trait to every type in the list and return a seqan3::type_list of the results.
Definition: type_list/traits.hpp:470
constexpr auto zip
A view adaptor that takes several views and returns tuple-like values from every i-th element of each...
Definition: zip.hpp:573
constexpr auto repeat_n
A view factory that repeats a given value n times.
Definition: repeat_n.hpp:91
A type that satisfies std::is_arithmetic_v<t>.
The generic simd concept.
Provides seqan3::detail::matrix_index, seqan3::detail::matrix_coordinate and associated strong types.
The internal SeqAn3 namespace.
Definition: aligned_sequence_concept.hpp:29
Provides seqan3::views::repeat_n.
A strong type for designated initialisation of the column index of a matrix.
Definition: matrix_coordinate.hpp:32
A strong type for designated initialisation of the row index of a matrix.
Definition: matrix_coordinate.hpp:61
Provides concepts that do not have equivalents in C++20.
Provides seqan3::simd::simd_concept.
Provides seqan3::views::zip.