ACTS
Experiment-independent tracking
Loading...
Searching...
No Matches
matrix_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#pragma once
9
10// Project include(s).
11#include "detray/algebra/common/matrix.hpp"
12#include "detray/algebra/common/vector.hpp"
13#include "detray/algebra/concepts.hpp"
14
15// System include(s).
16#include <cassert>
17
18namespace detray::algebra::storage {
19
27 template <template <typename, std::size_t> class array_t,
28 concepts::scalar scalar_t, std::size_t ROW, std::size_t COL>
29 DETRAY_HOST_DEVICE constexpr decltype(auto) operator()(
30 const matrix<array_t, scalar_t, ROW, COL> &m, std::size_t row,
31 std::size_t col) const {
32 // Make sure that the indices are valid.
33 assert(row < ROW);
34 assert(col < COL);
35
36 // Return the selected element.
37 return m[col][row];
38 }
39
45 template <template <typename, std::size_t> class array_t,
46 concepts::scalar scalar_t, std::size_t ROW, std::size_t COL>
47 DETRAY_HOST_DEVICE constexpr decltype(auto) operator()(
48 matrix<array_t, scalar_t, ROW, COL> &m, std::size_t row,
49 std::size_t col) const {
50 assert(row < ROW);
51 assert(col < COL);
52
53 return m[col][row];
54 }
55
60 template <template <typename, std::size_t> class array_t,
61 concepts::scalar scalar_t, std::size_t ROW>
62 DETRAY_HOST_DEVICE constexpr decltype(auto) operator()(
63 const matrix<array_t, scalar_t, ROW, 1> &m, std::size_t row) const {
64 assert(row < ROW);
65 return m[0][row];
66 }
67
72 template <template <typename, std::size_t> class array_t,
73 concepts::scalar scalar_t, std::size_t ROW>
74 DETRAY_HOST_DEVICE constexpr decltype(auto) operator()(
75 matrix<array_t, scalar_t, ROW, 1> &m, std::size_t row) const {
76 assert(row < ROW);
77 return m[0][row];
78 }
79
84 template <template <typename, std::size_t> class array_t,
85 concepts::scalar scalar_t, std::size_t N>
86 DETRAY_HOST_DEVICE constexpr decltype(auto) operator()(
87 const vector<N, scalar_t, array_t> &v, std::size_t row) const {
88 assert(row < N);
89 return v[row];
90 }
91
96 template <template <typename, std::size_t> class array_t,
97 concepts::scalar scalar_t, std::size_t N>
98 DETRAY_HOST_DEVICE constexpr decltype(auto) operator()(
99 vector<N, scalar_t, array_t> &v, std::size_t row) const {
100 assert(row < N);
101 return v[row];
102 }
103
104}; // struct element_getter
105
107template <std::size_t ROW, std::size_t COL, concepts::scalar scalar_t,
108 template <typename, std::size_t> class array_t>
109DETRAY_HOST_DEVICE constexpr decltype(auto) element(
110 const matrix<array_t, scalar_t, ROW, COL> &m, std::size_t row,
111 std::size_t col) {
112 return element_getter{}(m, row, col);
113}
114
116template <std::size_t ROW, std::size_t COL, concepts::scalar scalar_t,
117 template <typename, std::size_t> class array_t>
118DETRAY_HOST_DEVICE constexpr decltype(auto) element(
119 matrix<array_t, scalar_t, ROW, COL> &m, std::size_t row, std::size_t col) {
120 return element_getter{}(m, row, col);
121}
122
124template <std::size_t ROW, concepts::scalar scalar_t,
125 template <typename, std::size_t> class array_t>
126DETRAY_HOST_DEVICE constexpr decltype(auto) element(
127 const matrix<array_t, scalar_t, ROW, 1> &m, std::size_t row) {
128 return element_getter{}(m, row);
129}
130
132template <std::size_t ROW, concepts::scalar scalar_t,
133 template <typename, std::size_t> class array_t>
134DETRAY_HOST_DEVICE constexpr decltype(auto) element(
135 matrix<array_t, scalar_t, ROW, 1> &m, std::size_t row) {
136 return element_getter{}(m, row);
137}
138
140template <std::size_t N, concepts::scalar scalar_t,
141 template <typename, std::size_t> class array_t>
142DETRAY_HOST_DEVICE constexpr decltype(auto) element(
143 const vector<N, scalar_t, array_t> &v, std::size_t row) {
144 return element_getter{}(v, row);
145}
146
148template <std::size_t N, concepts::scalar scalar_t,
149 template <typename, std::size_t> class array_t>
150DETRAY_HOST_DEVICE constexpr decltype(auto) element(
151 vector<N, scalar_t, array_t> &v, 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 mROW,
183 std::size_t mCOL, concepts::scalar scalar_t,
184 template <typename, std::size_t> class array_t>
185 DETRAY_HOST_DEVICE constexpr auto operator()(
186 const matrix<array_t, scalar_t, mROW, mCOL> &m, const std::size_t row,
187 const std::size_t col) const noexcept {
188 static_assert(ROWS <= mROW);
189 static_assert(COLS <= mCOL);
190 assert(row + ROWS <= mROW);
191 assert(col + COLS <= mCOL);
192
193 using input_matrix_t = matrix<array_t, scalar_t, mROW, mCOL>;
195
196 matrix_t res_m;
197
198 // Don't access single elements in underlying vectors unless necessary
199 if constexpr (matrix_t::storage_rows() == input_matrix_t::storage_rows()) {
200 if (row == 0u) {
201 for (std::size_t j = col; j < col + COLS; ++j) {
202 res_m[j - col] = m[j];
203 }
204
205 return res_m;
206 }
207 }
208
209 for (std::size_t j = col; j < col + COLS; ++j) {
210 for (std::size_t i = row; i < row + ROWS; ++i) {
211 res_m[j - col][i - row] = m[j][i];
212 }
213 }
214
215 return res_m;
216 }
217
223 template <std::size_t SIZE, std::size_t ROWS, std::size_t COLS,
224 concepts::scalar scalar_t,
225 template <typename, std::size_t> class array_t>
226 DETRAY_HOST_DEVICE constexpr auto vector(
227 const matrix<array_t, scalar_t, ROWS, COLS> &m, const std::size_t row,
228 const std::size_t col) const noexcept {
229 static_assert(SIZE <= ROWS);
230 static_assert(SIZE <= COLS);
231 assert(row + SIZE <= ROWS);
232 assert(col <= COLS);
233
234 using input_matrix_t = matrix<array_t, scalar_t, ROWS, COLS>;
236
237 vector_t res_v{};
238
239 // Don't access single elements in underlying vectors unless necessary
240 if constexpr (SIZE == input_matrix_t::storage_rows()) {
241 if (row == 0u) {
242 return m[col];
243 }
244 }
245 for (std::size_t i = row; i < row + SIZE; ++i) {
246 res_v[i - row] = m[col][i];
247 }
248
249 return res_v;
250 }
251
257 template <std::size_t ROWS, std::size_t COLS, std::size_t mROW,
258 std::size_t mCOL, concepts::scalar scalar_t,
259 template <typename, std::size_t> class array_t>
260 DETRAY_HOST_DEVICE constexpr void set(
262 const matrix<array_t, scalar_t, ROWS, COLS> &b, const std::size_t row,
263 const std::size_t col) const noexcept {
264 static_assert(ROWS <= mROW);
265 static_assert(COLS <= mCOL);
266 assert(row + ROWS <= mROW);
267 assert(col + COLS <= mCOL);
268
269 using input_matrix_t = matrix<array_t, scalar_t, mROW, mCOL>;
271
272 // Don't access single elements in underlying vectors unless necessary
273 if constexpr (ROWS == mROW &&
274 matrix_t::storage_rows() == input_matrix_t::storage_rows()) {
275 if (row == 0u) {
276 for (std::size_t j = col; j < col + COLS; ++j) {
277 m[j] = b[j - col];
278 }
279 return;
280 }
281 }
282 for (std::size_t j = col; j < col + COLS; ++j) {
283 for (std::size_t i = row; i < row + ROWS; ++i) {
284 m[j][i] = b[j - col][i - row];
285 }
286 }
287 }
288
294 template <std::size_t ROWS, std::size_t COLS, std::size_t N,
295 concepts::scalar scalar_t,
296 template <typename, std::size_t> class array_t>
297 DETRAY_HOST_DEVICE constexpr void set(
300 const std::size_t row, const std::size_t col) const noexcept {
303
304 static_assert(N <= ROWS);
305 assert(row + N <= matrix_t::rows());
306 assert(row < matrix_t::rows());
307 assert(col < matrix_t::columns());
308
309 if constexpr (ROWS == N &&
310 matrix_t::storage_rows() == vector_t::simd_size()) {
311 if (row == 0u) {
312 m[col] = b;
313 return;
314 }
315 }
316 for (std::size_t i = row; i < N + row; ++i) {
317 m[col][i] = b[i - row];
318 }
319 }
320
321}; // struct block_getter
322
324template <std::size_t ROWS, std::size_t COLS, std::size_t mROW,
325 std::size_t mCOL, concepts::scalar scalar_t,
326 template <typename, std::size_t> class array_t>
327DETRAY_HOST_DEVICE constexpr auto block(
328 const matrix<array_t, scalar_t, mROW, mCOL> &m, const std::size_t row,
329 const std::size_t col) noexcept {
330 return block_getter{}.template operator()<ROWS, COLS>(m, row, col);
331}
332
334template <std::size_t ROWS, std::size_t COLS, std::size_t N,
335 concepts::scalar scalar_t,
336 template <typename, std::size_t> class array_t>
337DETRAY_HOST_DEVICE constexpr void set_block(
338 matrix<array_t, scalar_t, ROWS, COLS> &m,
339 const vector<N, scalar_t, array_t> &b, const std::size_t row,
340 const std::size_t col) noexcept {
341 block_getter{}.set(m, b, row, col);
342}
343
345template <std::size_t ROWS, std::size_t COLS, std::size_t mROW,
346 std::size_t mCOL, concepts::scalar scalar_t,
347 template <typename, std::size_t> class array_t>
348DETRAY_HOST_DEVICE constexpr void set_block(
350 const matrix<array_t, scalar_t, ROWS, COLS> &b, const std::size_t row,
351 const std::size_t col) noexcept {
352 block_getter{}.set(m, b, row, col);
353}
354
355} // namespace detray::algebra::storage
Vector wrapper for AoS vs interleaved SoA data.
Definition vector.hpp:52
Scalar concept: Elements of vectors/matrices (can be simd vectors).
Definition concepts.hpp:40
constexpr double m
Meter.
Definition Units.hpp:97
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
Functor used to access a submatrix of a matrix.
Definition matrix_getter.hpp:176
constexpr auto vector(const matrix< array_t, scalar_t, ROWS, COLS > &m, const std::size_t row, const std::size_t col) const noexcept
Get a vector of a const matrix.
Definition matrix_getter.hpp:226
constexpr void set(matrix< array_t, scalar_t, mROW, mCOL > &m, const matrix< array_t, scalar_t, ROWS, COLS > &b, const std::size_t row, const std::size_t col) const noexcept
Write a block into a matrix.
Definition matrix_getter.hpp:260
constexpr void set(matrix< array_t, scalar_t, ROWS, COLS > &m, const detray::algebra::storage::vector< N, scalar_t, array_t > &b, const std::size_t row, const std::size_t col) const noexcept
Operator setting a block with a vector.
Definition matrix_getter.hpp:297
constexpr auto operator()(const matrix< array_t, scalar_t, mROW, mCOL > &m, const std::size_t row, const std::size_t col) const noexcept
Get a block of a const matrix.
Definition matrix_getter.hpp:185
Functor used to access elements of a matrix.
Definition matrix_getter.hpp:21
Generic matrix type that can take vectors as columns.
Definition matrix.hpp:25