ACTS
Experiment-independent tracking
Loading...
Searching...
No Matches
fastor_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 "algebra/impl/detail/fastor_matrix_wrapper.hpp"
13#include "detray/algebra/common/math.hpp"
14#include "detray/algebra/concepts.hpp"
15#include "detray/definitions/detail/qualifiers.hpp"
16
17// Fastor include(s).
18#ifdef _MSC_VER
19#pragma warning(disable : 4244 4701 4702)
20#endif // MSVC
21#include <Fastor/Fastor.h>
22#ifdef _MSC_VER
23#pragma warning(default : 4244 4701 4702)
24#endif // MSVC
25
26// System include(s).
27#include <cstddef> // for the std::size_t type
28#include <type_traits>
29
30namespace detray::algebra::fastor::storage {
31
39 template <std::size_t ROWS, std::size_t COLS, concepts::scalar scalar_t>
40 DETRAY_HOST_DEVICE constexpr scalar_t &operator()(
41 Fastor::Tensor<scalar_t, ROWS, COLS> &m, std::size_t row,
42 std::size_t col) const {
43 assert(row < ROWS);
44 assert(col < COLS);
45 return m(row, col);
46 }
47
53 template <std::size_t ROWS, std::size_t COLS, concepts::scalar scalar_t>
54 DETRAY_HOST_DEVICE constexpr scalar_t operator()(
55 const Fastor::Tensor<scalar_t, ROWS, COLS> &m, std::size_t row,
56 std::size_t col) const {
57 assert(row < ROWS);
58 assert(col < COLS);
59 return m(row, col);
60 }
61
66 template <std::size_t N, concepts::scalar scalar_t>
67 DETRAY_HOST_DEVICE constexpr scalar_t &operator()(
68 Fastor::Tensor<scalar_t, N, 1> &m, std::size_t row) const {
69 assert(row < N);
70 return m(row);
71 }
72
77 template <std::size_t N, concepts::scalar scalar_t>
78 DETRAY_HOST_DEVICE constexpr scalar_t operator()(
79 const Fastor::Tensor<scalar_t, N, 1> &m, std::size_t row) const {
80 assert(row < N);
81 return m(row);
82 }
83
88 template <std::size_t N, concepts::scalar scalar_t>
89 DETRAY_HOST_DEVICE constexpr scalar_t &operator()(
90 Fastor::Tensor<scalar_t, N> &m, std::size_t row) const {
91 assert(row < N);
92 return m(row);
93 }
94
99 template <std::size_t N, concepts::scalar scalar_t>
100 DETRAY_HOST_DEVICE constexpr scalar_t operator()(
101 const Fastor::Tensor<scalar_t, N> &m, std::size_t row) const {
102 assert(row < N);
103 return m(row);
104 }
105
106}; // element_getter
107
109template <concepts::scalar scalar_t, std::size_t ROWS, std::size_t COLS>
110DETRAY_HOST_DEVICE constexpr scalar_t element(
111 const Fastor::Tensor<scalar_t, ROWS, COLS> &m, std::size_t row,
112 std::size_t col) {
113 return element_getter()(m, row, col);
114}
115
117template <concepts::scalar scalar_t, std::size_t ROWS, std::size_t COLS>
118DETRAY_HOST_DEVICE constexpr scalar_t &element(
119 Fastor::Tensor<scalar_t, ROWS, COLS> &m, std::size_t row, std::size_t col) {
120 return element_getter()(m, row, col);
121}
122
124template <concepts::scalar scalar_t, std::size_t N>
125DETRAY_HOST_DEVICE constexpr scalar_t element(
126 const Fastor::Tensor<scalar_t, N, 1> &m, std::size_t row) {
127 return element_getter()(m, row);
128}
129
131template <concepts::scalar scalar_t, std::size_t N>
132DETRAY_HOST_DEVICE constexpr scalar_t &element(
133 Fastor::Tensor<scalar_t, N, 1> &m, std::size_t row) {
134 return element_getter()(m, row);
135}
136
138template <concepts::scalar scalar_t, std::size_t N>
139DETRAY_HOST_DEVICE constexpr scalar_t element(
140 const Fastor::Tensor<scalar_t, N> &m, std::size_t row) {
141 return element_getter()(m, row);
142}
143
145template <concepts::scalar scalar_t, std::size_t N>
146DETRAY_HOST_DEVICE constexpr scalar_t &element(Fastor::Tensor<scalar_t, N> &m,
147 std::size_t row) {
148 return element_getter()(m, row);
149}
150
151template <std::size_t I, std::size_t J, concepts::matrix M>
152DETRAY_HOST_DEVICE decltype(auto) element(M &matrix) {
153 if constexpr (concepts::has_compile_time_2d_access<M>) {
154 return matrix.template element<I, J>();
155 } else {
156 using index_t = detray::traits::index_t<std::decay_t<M>>;
157 return element(matrix, static_cast<index_t>(I), static_cast<index_t>(J));
158 }
159}
160
161template <std::size_t I, concepts::vector V>
162DETRAY_HOST_DEVICE decltype(auto) element(V &vector) {
163 if constexpr (concepts::has_compile_time_1d_access<V>) {
164 return vector.template element<I>();
165 } else {
166 using index_t = detray::traits::index_t<std::decay_t<V>>;
167 return element(vector, static_cast<index_t>(I));
168 }
169}
170
178 template <std::size_t ROWS, std::size_t COLS, std::size_t oROWS,
179 std::size_t oCOLS, concepts::scalar scalar_t>
180 DETRAY_HOST_DEVICE algebra::fastor::Matrix<scalar_t, ROWS, COLS> operator()(
181 const Fastor::Tensor<scalar_t, oROWS, oCOLS> &m, std::size_t row,
182 std::size_t col) const {
183 return m(Fastor::seq(static_cast<int>(row), static_cast<int>(row + ROWS)),
184 Fastor::seq(static_cast<int>(col), static_cast<int>(col + COLS)));
185 }
186
192 template <std::size_t SIZE, std::size_t oROWS, std::size_t oCOLS,
193 concepts::scalar scalar_t>
194 DETRAY_HOST_DEVICE Fastor::Tensor<scalar_t, SIZE> vector(
195 const Fastor::Tensor<scalar_t, oROWS, oCOLS> &m, std::size_t row,
196 std::size_t col) const {
197 return Fastor::Tensor<scalar_t, SIZE>(
198 m(Fastor::seq(static_cast<int>(row), static_cast<int>(row + SIZE)),
199 static_cast<int>(col)));
200 }
201
207 template <std::size_t ROWS, std::size_t COLS, concepts::scalar scalar_t,
208 concepts::matrix input_matrix_type>
209 DETRAY_HOST_DEVICE void set(input_matrix_type &m,
210 const Fastor::Tensor<scalar_t, ROWS, COLS> &b,
211 std::size_t row, std::size_t col) const {
212 m(Fastor::seq(static_cast<int>(row), static_cast<int>(row + ROWS)),
213 Fastor::seq(static_cast<int>(col), static_cast<int>(col + COLS))) = b;
214 }
215
221 template <std::size_t ROWS, concepts::scalar scalar_t,
222 concepts::matrix input_matrix_type>
223 DETRAY_HOST_DEVICE void set(input_matrix_type &m,
224 const Fastor::Tensor<scalar_t, ROWS> &b,
225 std::size_t row, std::size_t col) const {
226 m(Fastor::seq(static_cast<int>(row), static_cast<int>(row + ROWS)),
227 static_cast<int>(col)) = b;
228 }
229
230}; // struct block_getter
231
233template <std::size_t ROWS, std::size_t COLS, std::size_t oROWS,
234 std::size_t oCOLS, concepts::scalar scalar_t>
235DETRAY_HOST_DEVICE decltype(auto) block(
236 const Fastor::Tensor<scalar_t, oROWS, oCOLS> &m, std::size_t row,
237 std::size_t col) {
238 return block_getter{}.template operator()<ROWS, COLS>(m, row, col);
239}
240
242template <std::size_t SIZE, std::size_t ROWS, std::size_t COLS,
243 concepts::scalar scalar_t>
244DETRAY_HOST_DEVICE constexpr decltype(auto) vector(
245 const Fastor::Tensor<scalar_t, ROWS, COLS> &m, std::size_t row,
246 std::size_t col) {
247 return block_getter{}.template vector<SIZE>(m, row, col);
248}
249
251template <std::size_t ROWS, std::size_t COLS, concepts::scalar scalar_t,
252 concepts::matrix input_matrix_type>
253DETRAY_HOST_DEVICE void set_block(input_matrix_type &m,
254 const Fastor::Tensor<scalar_t, ROWS, COLS> &b,
255 std::size_t row, std::size_t col) {
256 block_getter{}.set(m, b, row, col);
257}
258
260template <std::size_t ROWS, concepts::scalar scalar_t,
261 concepts::matrix input_matrix_type>
262DETRAY_HOST_DEVICE void set_block(input_matrix_type &m,
263 const Fastor::Tensor<scalar_t, ROWS> &b,
264 std::size_t row, std::size_t col) {
265 block_getter{}.set(m, b, row, col);
266}
267
268} // namespace detray::algebra::fastor::storage
Matrix concepts.
Definition concepts.hpp:83
Scalar concept: Elements of vectors/matrices (can be simd vectors).
Definition concepts.hpp:40
constexpr double m
Meter.
Definition Units.hpp:97
Functor used to extract a block from Fastor matrices.
Definition fastor_getter.hpp:172
algebra::fastor::Matrix< scalar_t, ROWS, COLS > operator()(const Fastor::Tensor< scalar_t, oROWS, oCOLS > &m, std::size_t row, std::size_t col) const
Extract a rectangular block from a matrix.
Definition fastor_getter.hpp:180
void set(input_matrix_type &m, const Fastor::Tensor< scalar_t, ROWS > &b, std::size_t row, std::size_t col) const
Operator setting a block with a vector.
Definition fastor_getter.hpp:223
void set(input_matrix_type &m, const Fastor::Tensor< scalar_t, ROWS, COLS > &b, std::size_t row, std::size_t col) const
Operator setting a block with a matrix.
Definition fastor_getter.hpp:209
Fastor::Tensor< scalar_t, SIZE > vector(const Fastor::Tensor< scalar_t, oROWS, oCOLS > &m, std::size_t row, std::size_t col) const
Extract a contiguous segment from one matrix column.
Definition fastor_getter.hpp:194
Functor used to access elements of Fastor matrices.
Definition fastor_getter.hpp:33
constexpr scalar_t operator()(const Fastor::Tensor< scalar_t, N, 1 > &m, std::size_t row) const
Read an element of a single-column matrix.
Definition fastor_getter.hpp:78
constexpr scalar_t operator()(const Fastor::Tensor< scalar_t, N > &m, std::size_t row) const
Read a vector element.
Definition fastor_getter.hpp:100
constexpr scalar_t operator()(const Fastor::Tensor< scalar_t, ROWS, COLS > &m, std::size_t row, std::size_t col) const
Read a matrix element.
Definition fastor_getter.hpp:54
constexpr scalar_t & operator()(Fastor::Tensor< scalar_t, N > &m, std::size_t row) const
Access a mutable vector element.
Definition fastor_getter.hpp:89
constexpr scalar_t & operator()(Fastor::Tensor< scalar_t, N, 1 > &m, std::size_t row) const
Access a mutable element of a single-column matrix.
Definition fastor_getter.hpp:67
constexpr scalar_t & operator()(Fastor::Tensor< scalar_t, ROWS, COLS > &m, std::size_t row, std::size_t col) const
Access a mutable matrix element.
Definition fastor_getter.hpp:40