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"
19#pragma warning(disable : 4244 4701 4702)
21#include <Fastor/Fastor.h>
23#pragma warning(default : 4244 4701 4702)
30namespace detray::algebra::fastor::storage {
39 template <std::
size_t ROWS, std::
size_t COLS, concepts::scalar scalar_t>
41 Fastor::Tensor<scalar_t, ROWS, COLS> &m, std::size_t row,
42 std::size_t col)
const {
53 template <std::
size_t ROWS, std::
size_t COLS, concepts::scalar scalar_t>
55 const Fastor::Tensor<scalar_t, ROWS, COLS> &m, std::size_t row,
56 std::size_t col)
const {
66 template <std::
size_t N, concepts::scalar scalar_t>
68 Fastor::Tensor<scalar_t, N, 1> &m, std::size_t row)
const {
77 template <std::
size_t N, concepts::scalar scalar_t>
79 const Fastor::Tensor<scalar_t, N, 1> &m, std::size_t row)
const {
88 template <std::
size_t N, concepts::scalar scalar_t>
90 Fastor::Tensor<scalar_t, N> &m, std::size_t row)
const {
99 template <std::
size_t N, concepts::scalar scalar_t>
101 const Fastor::Tensor<scalar_t, N> &m, std::size_t row)
const {
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,
113 return element_getter()(m, row, col);
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);
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);
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);
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) {
145template <concepts::scalar scalar_t, std::
size_t N>
146DETRAY_HOST_DEVICE
constexpr scalar_t &element(Fastor::Tensor<scalar_t, N> &m,
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>();
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));
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>();
166 using index_t = detray::traits::index_t<std::decay_t<V>>;
167 return element(vector,
static_cast<index_t
>(I));
178 template <std::size_t ROWS, std::size_t COLS, std::size_t oROWS,
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)));
192 template <std::size_t SIZE, std::size_t oROWS, std::size_t oCOLS,
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)));
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;
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;
233template <std::size_t ROWS, std::size_t COLS, std::size_t oROWS,
235DETRAY_HOST_DEVICE
decltype(
auto) block(
236 const Fastor::Tensor<scalar_t, oROWS, oCOLS> &m, std::size_t row,
238 return block_getter{}.template operator()<ROWS, COLS>(m, row, col);
242template <std::size_t SIZE, std::size_t ROWS, std::size_t COLS,
244DETRAY_HOST_DEVICE
constexpr decltype(
auto) vector(
245 const Fastor::Tensor<scalar_t, ROWS, COLS> &m, std::size_t row,
247 return block_getter{}.template vector<SIZE>(m, row, col);
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) {
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) {
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