ACTS
Experiment-independent tracking
Loading...
Searching...
No Matches
array_getter.hpp
1// This file is part of the ACTS project.
2//
3// Copyright (C) 2016 CERN for the benefit of the ACTS project
4//
5// This Source Code Form is subject to the terms of the Mozilla Public
6// License, v. 2.0. If a copy of the MPL was not distributed with this
7// file, You can obtain one at https://mozilla.org/MPL/2.0/.
8
9#pragma once
10
11// Project include(s).
12#include "detray/algebra/common/math.hpp"
13#include "detray/algebra/concepts.hpp"
14#include "detray/definitions/detail/assert.hpp"
15#include "detray/definitions/detail/qualifiers.hpp"
16
17// System include(s).
18#include <cstddef>
19#include <type_traits>
20
21namespace detray::algebra::array::storage {
22
30 template <std::size_t ROWS, std::size_t COLS, concepts::scalar scalar_t,
31 template <typename, std::size_t> class array_t>
32 DETRAY_HOST_DEVICE constexpr scalar_t &operator()(
33 array_t<array_t<scalar_t, ROWS>, COLS> &m, std::size_t row,
34 std::size_t col) const {
35 assert(row < ROWS);
36 assert(col < COLS);
37 return m[col][row];
38 }
39
45 template <std::size_t ROWS, std::size_t COLS, concepts::scalar scalar_t,
46 template <typename, std::size_t> class array_t>
47 DETRAY_HOST_DEVICE constexpr scalar_t operator()(
48 const array_t<array_t<scalar_t, ROWS>, COLS> &m, std::size_t row,
49 std::size_t col) const {
50 assert(row < ROWS);
51 assert(col < COLS);
52 return m[col][row];
53 }
54
59 template <std::size_t N, concepts::scalar scalar_t,
60 template <typename, std::size_t> class array_t>
61 DETRAY_HOST_DEVICE constexpr scalar_t &operator()(
62 array_t<array_t<scalar_t, N>, 1> &m, std::size_t row) const {
63 assert(row < N);
64 return m[0][row];
65 }
66
71 template <std::size_t N, concepts::scalar scalar_t,
72 template <typename, std::size_t> class array_t>
73 DETRAY_HOST_DEVICE constexpr scalar_t operator()(
74 const array_t<array_t<scalar_t, N>, 1> &m, std::size_t row) const {
75 assert(row < N);
76 return m[0][row];
77 }
78
83 template <std::size_t N, concepts::scalar scalar_t,
84 template <typename, std::size_t> class array_t>
85 DETRAY_HOST_DEVICE constexpr scalar_t &operator()(array_t<scalar_t, N> &m,
86 std::size_t row) const {
87 assert(row < N);
88 return m[row];
89 }
90
95 template <std::size_t N, concepts::scalar scalar_t,
96 template <typename, std::size_t> class array_t>
97 DETRAY_HOST_DEVICE constexpr scalar_t operator()(
98 const array_t<scalar_t, N> &m, std::size_t row) const {
99 assert(row < N);
100 return m[row];
101 }
102
103}; // struct element_getter
104
106template <template <typename, std::size_t> class array_t,
107 concepts::scalar scalar_t, std::size_t ROWS, std::size_t COLS>
108DETRAY_HOST_DEVICE constexpr scalar_t element(
109 const array_t<array_t<scalar_t, ROWS>, COLS> &m, std::size_t row,
110 std::size_t col) {
111 return element_getter()(m, row, col);
112}
113
115template <template <typename, std::size_t> class array_t,
116 concepts::scalar scalar_t, std::size_t ROWS, std::size_t COLS>
117DETRAY_HOST_DEVICE constexpr scalar_t &element(
118 array_t<array_t<scalar_t, ROWS>, COLS> &m, std::size_t row,
119 std::size_t col) {
120 return element_getter()(m, row, col);
121}
122
124template <template <typename, std::size_t> class array_t,
125 concepts::scalar scalar_t, std::size_t N>
126DETRAY_HOST_DEVICE constexpr scalar_t element(
127 const array_t<array_t<scalar_t, N>, 1> &m, std::size_t row) {
128 return element_getter()(m, row);
129}
130
132template <template <typename, std::size_t> class array_t,
133 concepts::scalar scalar_t, std::size_t N>
134DETRAY_HOST_DEVICE constexpr scalar_t &element(
135 array_t<array_t<scalar_t, N>, 1> &m, std::size_t row) {
136 return element_getter()(m, row);
137}
138
140template <template <typename, std::size_t> class array_t,
141 concepts::scalar scalar_t, std::size_t N>
142DETRAY_HOST_DEVICE constexpr scalar_t element(const array_t<scalar_t, N> &v,
143 std::size_t row) {
144 return element_getter()(v, row);
145}
146
148template <template <typename, std::size_t> class array_t,
149 concepts::scalar scalar_t, std::size_t N>
150DETRAY_HOST_DEVICE constexpr scalar_t &element(array_t<scalar_t, N> &v,
151 std::size_t row) {
152 return element_getter()(v, row);
153}
154
155template <std::size_t I, std::size_t J, concepts::matrix M>
156DETRAY_HOST_DEVICE decltype(auto) element(M &matrix) {
157 if constexpr (concepts::has_compile_time_2d_access<M>) {
158 return matrix.template element<I, J>();
159 } else {
160 using index_t = detray::traits::index_t<std::decay_t<M>>;
161 return element(matrix, static_cast<index_t>(I), static_cast<index_t>(J));
162 }
163}
164
165template <std::size_t I, concepts::vector V>
166DETRAY_HOST_DEVICE decltype(auto) element(V &vector) {
167 if constexpr (concepts::has_compile_time_1d_access<V>) {
168 return vector.template element<I>();
169 } else {
170 using index_t = detray::traits::index_t<std::decay_t<V>>;
171 return element(vector, static_cast<index_t>(I));
172 }
173}
174
182 template <std::size_t ROWS, std::size_t COLS, std::size_t oROWS,
183 std::size_t oCOLS, concepts::scalar scalar_t,
184 template <typename, std::size_t> class array_t>
185 DETRAY_HOST_DEVICE constexpr auto operator()(
186 const array_t<array_t<scalar_t, oROWS>, oCOLS> &m, std::size_t row,
187 std::size_t col) const {
188 array_t<array_t<scalar_t, ROWS>, COLS> submatrix{};
189
190 for (std::size_t icol = col; icol < col + COLS; ++icol) {
191 for (std::size_t irow = row; irow < row + ROWS; ++irow) {
192 submatrix[icol - col][irow - row] = m[icol][irow];
193 }
194 }
195 return submatrix;
196 }
197
203 template <std::size_t SIZE, std::size_t ROWS, std::size_t COLS,
204 concepts::scalar scalar_t,
205 template <typename, std::size_t> class array_t>
206 DETRAY_HOST_DEVICE constexpr array_t<scalar_t, SIZE> vector(
207 const array_t<array_t<scalar_t, ROWS>, COLS> &m, std::size_t row,
208 std::size_t col) const {
209 assert(col < COLS);
210 assert(row + SIZE <= ROWS);
211
212 array_t<scalar_t, SIZE> subvector{};
213
214 for (std::size_t irow = row; irow < row + SIZE; ++irow) {
215 subvector[irow - row] = m[col][irow];
216 }
217
218 return subvector;
219 }
220
227 template <std::size_t ROWS, std::size_t COLS, class input_matrix_type,
228 concepts::scalar scalar_t,
229 template <typename, std::size_t> class array_t>
230 DETRAY_HOST_DEVICE constexpr void set(
231 input_matrix_type &m, const array_t<array_t<scalar_t, ROWS>, COLS> &b,
232 std::size_t row, std::size_t col) const {
233 for (std::size_t j = 0u; j < COLS; ++j) {
234 for (std::size_t i = 0u; i < ROWS; ++i) {
235 m[j + col][i + row] = b[j][i];
236 }
237 }
238 }
239
246 template <std::size_t ROWS, concepts::scalar scalar_t,
247 template <typename, std::size_t> class vector_t,
248 class input_matrix_type>
249 DETRAY_HOST_DEVICE constexpr void set(input_matrix_type &m,
250 const vector_t<scalar_t, ROWS> &b,
251 std::size_t row,
252 std::size_t col) const {
253 for (std::size_t i = 0; i < ROWS; ++i) {
254 m[col][i + row] = b[i];
255 }
256 }
257
258}; // struct block_getter
259
269template <std::size_t ROWS, std::size_t COLS, class input_matrix_type>
270DETRAY_HOST_DEVICE constexpr decltype(auto) block(const input_matrix_type &m,
271 std::size_t row,
272 std::size_t col) {
273 constexpr block_getter block{};
274 return block.template operator()<ROWS, COLS>(m, row, col);
275}
276
283template <std::size_t SIZE, std::size_t ROWS, std::size_t COLS,
284 concepts::scalar scalar_t,
285 template <typename, std::size_t> class array_t>
286DETRAY_HOST_DEVICE constexpr array_t<scalar_t, SIZE> vector(
287 const array_t<array_t<scalar_t, ROWS>, COLS> &m, std::size_t row,
288 std::size_t col) {
289 constexpr block_getter block{};
290 return block.template vector<SIZE>(m, row, col);
291}
292
301template <std::size_t ROWS, std::size_t COLS, class input_matrix_type,
302 concepts::scalar scalar_t,
303 template <typename, std::size_t> class array_t>
304DETRAY_HOST_DEVICE constexpr void set_block(
305 input_matrix_type &m, const array_t<array_t<scalar_t, ROWS>, COLS> &b,
306 std::size_t row, std::size_t col) {
307 constexpr block_getter block{};
308 block.set(m, b, row, col);
309}
310
318template <std::size_t ROWS, concepts::scalar scalar_t,
319 template <typename, std::size_t> class vector_t,
320 class input_matrix_type>
321DETRAY_HOST_DEVICE constexpr void set_block(input_matrix_type &m,
322 const vector_t<scalar_t, ROWS> &b,
323 std::size_t row, std::size_t col) {
324 constexpr block_getter block{};
325 block.set(m, b, row, col);
326}
327
328} // namespace detray::algebra::array::storage
Scalar concept: Elements of vectors/matrices (can be simd vectors).
Definition concepts.hpp:40
"Block getter", assuming a simple 2D array access
Definition array_getter.hpp:176
constexpr void set(input_matrix_type &m, const array_t< array_t< scalar_t, ROWS >, COLS > &b, std::size_t row, std::size_t col) const
Sets a matrix of dimension ROWS and COLS as submatrix of m beginning at row row and column col.
Definition array_getter.hpp:230
constexpr void set(input_matrix_type &m, const vector_t< scalar_t, ROWS > &b, std::size_t row, std::size_t col) const
Sets a vector of length ROWS as submatrix of m beginning at row row and column col.
Definition array_getter.hpp:249
constexpr array_t< scalar_t, SIZE > vector(const array_t< array_t< scalar_t, ROWS >, COLS > &m, std::size_t row, std::size_t col) const
Operator producing a vector out of a const matrix.
Definition array_getter.hpp:206
constexpr auto operator()(const array_t< array_t< scalar_t, oROWS >, oCOLS > &m, std::size_t row, std::size_t col) const
Operator producing a sub-matrix from a const matrix.
Definition array_getter.hpp:185
"Element getter", assuming a simple 2D array access
Definition array_getter.hpp:24
constexpr scalar_t & operator()(array_t< array_t< scalar_t, ROWS >, COLS > &m, std::size_t row, std::size_t col) const
Operator getting a reference to one element of a non-const matrix.
Definition array_getter.hpp:32
constexpr scalar_t & operator()(array_t< scalar_t, N > &m, std::size_t row) const
Operator getting a reference to one element of a non-const matrix.
Definition array_getter.hpp:85
constexpr scalar_t operator()(const array_t< array_t< scalar_t, N >, 1 > &m, std::size_t row) const
Operator getting a reference to one element of a const matrix.
Definition array_getter.hpp:73
constexpr scalar_t operator()(const array_t< scalar_t, N > &m, std::size_t row) const
Operator getting a reference to one element of a const matrix.
Definition array_getter.hpp:97
constexpr scalar_t operator()(const array_t< array_t< scalar_t, ROWS >, COLS > &m, std::size_t row, std::size_t col) const
Operator getting one value of a const matrix.
Definition array_getter.hpp:47
constexpr scalar_t & operator()(array_t< array_t< scalar_t, N >, 1 > &m, std::size_t row) const
Operator getting a reference to one element of a non-const matrix.
Definition array_getter.hpp:61