11#include "detray/algebra/common/matrix.hpp"
12#include "detray/algebra/common/vector.hpp"
13#include "detray/algebra/concepts.hpp"
18namespace detray::algebra::storage {
27 template <
template <
typename, std::
size_t>
class array_t,
29 DETRAY_HOST_DEVICE
constexpr decltype(
auto)
operator()(
31 std::size_t col)
const {
45 template <
template <
typename, std::
size_t>
class array_t,
47 DETRAY_HOST_DEVICE
constexpr decltype(
auto)
operator()(
49 std::size_t col)
const {
60 template <
template <
typename, std::
size_t>
class array_t,
62 DETRAY_HOST_DEVICE
constexpr decltype(
auto)
operator()(
72 template <
template <
typename, std::
size_t>
class array_t,
74 DETRAY_HOST_DEVICE
constexpr decltype(
auto)
operator()(
84 template <
template <
typename, std::
size_t>
class array_t,
86 DETRAY_HOST_DEVICE
constexpr decltype(
auto)
operator()(
96 template <
template <
typename, std::
size_t>
class array_t,
98 DETRAY_HOST_DEVICE
constexpr decltype(
auto)
operator()(
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,
112 return element_getter{}(m, row, col);
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);
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(
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(
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(
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(
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 mROW,
184 template <
typename, std::
size_t>
class array_t>
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);
199 if constexpr (matrix_t::storage_rows() == input_matrix_t::storage_rows()) {
201 for (std::size_t j = col; j < col + COLS; ++j) {
202 res_m[j - col] = m[j];
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];
223 template <std::size_t SIZE, std::size_t ROWS, std::size_t COLS,
225 template <
typename, std::
size_t>
class array_t>
226 DETRAY_HOST_DEVICE
constexpr auto vector(
228 const std::size_t col)
const noexcept {
229 static_assert(SIZE <= ROWS);
230 static_assert(SIZE <= COLS);
231 assert(row + SIZE <= ROWS);
240 if constexpr (SIZE == input_matrix_t::storage_rows()) {
245 for (std::size_t i = row; i < row + SIZE; ++i) {
246 res_v[i - row] = m[col][i];
257 template <std::size_t ROWS, std::size_t COLS, std::size_t mROW,
259 template <
typename, std::
size_t>
class array_t>
260 DETRAY_HOST_DEVICE
constexpr void set(
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);
273 if constexpr (ROWS == mROW &&
274 matrix_t::storage_rows() == input_matrix_t::storage_rows()) {
276 for (std::size_t j = col; j < col + COLS; ++j) {
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];
294 template <std::size_t ROWS, std::size_t COLS, std::size_t N,
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 {
304 static_assert(N <= ROWS);
305 assert(row + N <= matrix_t::rows());
306 assert(row < matrix_t::rows());
307 assert(col < matrix_t::columns());
309 if constexpr (ROWS == N &&
310 matrix_t::storage_rows() == vector_t::simd_size()) {
316 for (std::size_t i = row; i < N + row; ++i) {
317 m[col][i] = b[i - row];
324template <std::size_t ROWS, std::size_t COLS, std::size_t mROW,
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);
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);
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(
351 const std::size_t col)
noexcept {
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