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"
21namespace detray::algebra::array::storage {
31 template <
typename, std::
size_t>
class array_t>
33 array_t<array_t<scalar_t, ROWS>, COLS> &m, std::size_t row,
34 std::size_t col)
const {
46 template <
typename, std::
size_t>
class array_t>
48 const array_t<array_t<scalar_t, ROWS>, COLS> &m, std::size_t row,
49 std::size_t col)
const {
60 template <
typename, std::
size_t>
class array_t>
62 array_t<array_t<scalar_t, N>, 1> &m, std::size_t row)
const {
72 template <
typename, std::
size_t>
class array_t>
74 const array_t<array_t<scalar_t, N>, 1> &m, std::size_t row)
const {
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 {
96 template <
typename, std::
size_t>
class array_t>
98 const array_t<scalar_t, N> &m, std::size_t row)
const {
106template <
template <
typename, std::
size_t>
class array_t,
108DETRAY_HOST_DEVICE
constexpr scalar_t element(
109 const array_t<array_t<scalar_t, ROWS>, COLS> &m, std::size_t row,
111 return element_getter()(m, row, col);
115template <
template <
typename, std::
size_t>
class array_t,
117DETRAY_HOST_DEVICE
constexpr scalar_t &element(
118 array_t<array_t<scalar_t, ROWS>, COLS> &m, std::size_t row,
120 return element_getter()(m, row, col);
124template <
template <
typename, std::
size_t>
class array_t,
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);
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);
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,
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,
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>();
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));
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>();
170 using index_t = detray::traits::index_t<std::decay_t<V>>;
171 return element(vector,
static_cast<index_t
>(I));
182 template <std::size_t ROWS, std::size_t COLS, std::size_t oROWS,
184 template <
typename, std::
size_t>
class array_t>
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{};
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];
203 template <std::size_t SIZE, std::size_t ROWS, std::size_t COLS,
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 {
210 assert(row + SIZE <= ROWS);
212 array_t<scalar_t, SIZE> subvector{};
214 for (std::size_t irow = row; irow < row + SIZE; ++irow) {
215 subvector[irow - row] = m[col][irow];
227 template <std::size_t ROWS, std::size_t COLS,
class input_matrix_type,
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];
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,
252 std::size_t col)
const {
253 for (std::size_t i = 0; i < ROWS; ++i) {
254 m[col][i + row] = b[i];
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,
273 constexpr block_getter block{};
274 return block.template operator()<ROWS, COLS>(m, row, col);
283template <std::size_t SIZE, std::size_t ROWS, std::size_t COLS,
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,
289 constexpr block_getter block{};
290 return block.template vector<SIZE>(m, row, col);
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) {
308 block.
set(m, b, row, col);
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) {
325 block.
set(m, b, row, col);
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