11#include "detray/algebra/common/vector.hpp"
12#include "detray/algebra/concepts.hpp"
13#include "detray/algebra/type_traits.hpp"
19namespace detray::algebra::storage {
22template <
template <
typename, std::
size_t>
class array_t,
23 concepts::scalar scalar_t, std::size_t ROW, std::size_t COL>
38 requires(
sizeof...(vector_t) == COL)
39 explicit matrix(vector_t &&...v) : m_storage{std::forward<vector_t>(v)...} {}
61 static consteval std::size_t
rows() {
return ROW; }
72 static consteval std::size_t
columns() {
return COL; }
76 template <std::size_t R, std::size_t C,
typename S,
77 template <
typename, std::
size_t>
class A>
84 template <std::size_t... I>
86 requires(!std::is_scalar_v<scalar_t>)
87 constexpr bool equal(
const matrix &rhs,
88 std::index_sequence<I...> )
const {
89 return (... && (m_storage[I] == rhs[I]));
93 template <std::size_t... I>
95 requires(std::is_scalar_v<scalar_t>)
96 constexpr bool equal(
const matrix &rhs,
97 std::index_sequence<I...> )
const {
98 return (... && ((m_storage[I].
get() == rhs[I].
get()).isFull()));
104 template <std::size_t R, std::size_t C,
typename S,
105 template <
typename, std::
size_t>
class A>
106 DETRAY_HOST_DEVICE
friend constexpr decltype(
auto)
operator+(
109 template <std::size_t R, std::size_t C,
typename S,
110 template <
typename, std::
size_t>
class A>
111 DETRAY_HOST_DEVICE
friend constexpr decltype(
auto)
operator-(
114 template <std::size_t R, std::size_t C,
typename S1,
typename S2,
115 template <
typename, std::
size_t>
class A>
116 DETRAY_HOST_DEVICE
friend constexpr decltype(
auto)
operator*(
121 DETRAY_HOST_DEVICE
friend constexpr decltype(
auto)
operator*(
125 template <std::size_t R, std::size_t C,
typename S,
126 template <
typename, std::
size_t>
class A>
127 DETRAY_HOST_DEVICE
friend constexpr decltype(
auto)
operator*(
131 template <std::size_t LR, std::size_t C, std::size_t RC,
typename S,
132 template <
typename, std::
size_t>
class A>
133 DETRAY_HOST_DEVICE
friend constexpr decltype(
auto)
operator*(
138 std::array<vector_type, COL> m_storage;
143template <concepts::matrix matrix_t, std::
size_t COLS = matrix_t::columns()>
144DETRAY_HOST_DEVICE
constexpr matrix_t zero() noexcept {
147 DETRAY_UNROLL_N(COLS)
148 for (std::size_t j = 0u; j < COLS; ++j) {
150 m[j] =
typename matrix_t::vector_type{};
157template <concepts::matrix matrix_t>
158DETRAY_HOST_DEVICE
constexpr void set_zero(matrix_t &m)
noexcept {
159 m = zero<matrix_t>();
163template <concepts::matrix matrix_t,
164 std::size_t R = detray::traits::max_rank<matrix_t>>
165DETRAY_HOST_DEVICE
constexpr matrix_t identity() noexcept {
167 matrix_t m{zero<matrix_t>()};
170 for (std::size_t i = 0u; i <
R; ++i) {
171 m[i][i] =
typename matrix_t::scalar_type(1);
178template <concepts::matrix matrix_t>
179DETRAY_HOST_DEVICE
constexpr void set_identity(matrix_t &m)
noexcept {
180 m = identity<matrix_t>();
184template <std::size_t ROW, std::size_t COL, concepts::scalar scalar_t,
185 template <
typename, std::
size_t>
class array_t, std::size_t... I>
186DETRAY_HOST_DEVICE
constexpr auto transpose(
188 std::index_sequence<I...> )
noexcept {
190 using column_t =
typename matrix_T_t::vector_type;
195 for (std::size_t j = 0u; j < ROW; ++j) {
196 res_m[j] = column_t{
m[I][j]...};
203template <concepts::matrix matrix_t>
204DETRAY_HOST_DEVICE
constexpr auto transpose(
const matrix_t &m)
noexcept {
205 return transpose(m, std::make_index_sequence<matrix_t::columns()>());
209template <std::size_t ROW, std::size_t COL,
typename scalar_t,
210 template <
typename, std::
size_t>
class array_t>
211DETRAY_HOST_DEVICE
constexpr bool operator==(
214 return lhs.equal(rhs, std::make_index_sequence<COL>());
218template <concepts::matrix matrix_t, concepts::scalar scalar_t,
220DETRAY_HOST_DEVICE
constexpr matrix_t matrix_scalar_mul(
221 scalar_t a,
const matrix_t &rhs,
222 std::index_sequence<J...> )
noexcept {
223 using mat_scalar_t = detray::traits::scalar_t<matrix_t>;
225 return matrix_t{(
static_cast<mat_scalar_t
>(a) * rhs[
J])...};
229template <concepts::matrix matrix_t, std::size_t...
J>
230DETRAY_HOST_DEVICE
constexpr matrix_t matrix_add(
231 const matrix_t &lhs,
const matrix_t &rhs,
232 std::index_sequence<J...> )
noexcept {
233 return matrix_t{(lhs[
J] + rhs[
J])...};
236template <concepts::matrix matrix_t, std::size_t...
J>
237DETRAY_HOST_DEVICE
constexpr decltype(
auto) matrix_sub(
238 const matrix_t &lhs,
const matrix_t &rhs,
239 std::index_sequence<J...> )
noexcept {
240 return matrix_t{(lhs[
J] - rhs[
J])...};
245template <std::size_t ROW, std::size_t COL, concepts::scalar scalar_t,
246 template <
typename, std::
size_t>
class array_t>
247DETRAY_HOST_DEVICE
constexpr decltype(
auto)
operator+(
252 return matrix_add(lhs, rhs, std::make_index_sequence<matrix_t::columns()>());
255template <std::size_t ROW, std::size_t COL, concepts::scalar scalar_t,
256 template <
typename, std::
size_t>
class array_t>
257DETRAY_HOST_DEVICE
constexpr decltype(
auto)
operator-(
262 return matrix_sub(lhs, rhs, std::make_index_sequence<matrix_t::columns()>());
265template <std::size_t
R, std::size_t C,
typename S1,
typename S2,
266 template <
typename, std::
size_t>
class A>
267DETRAY_HOST_DEVICE
constexpr decltype(
auto)
operator*(
271 return matrix_scalar_mul(
static_cast<S1
>(a), rhs,
272 std::make_index_sequence<matrix_t::columns()>());
275template <std::size_t
R, std::size_t C, concepts::scalar S1,
276 concepts::scalar S2,
template <
typename, std::
size_t>
class A>
277DETRAY_HOST_DEVICE
constexpr decltype(
auto)
operator*(
279 return static_cast<S1
>(a) * lhs;
283template <std::size_t ROW, std::size_t COL, concepts::scalar scalar_t,
284 template <
typename, std::
size_t>
class array_t>
285DETRAY_HOST_DEVICE
constexpr decltype(
auto)
operator*(
293 for (std::size_t j = 1u; j < COL; ++j) {
295 res_v = res_v + v[j] * lhs[j];
302template <std::size_t LROW, std::size_t COL, std::size_t RCOL,
303 concepts::scalar scalar_t,
304 template <
typename, std::
size_t>
class array_t>
305DETRAY_HOST_DEVICE
constexpr decltype(
auto)
operator*(
310 DETRAY_UNROLL_N(RCOL)
311 for (std::size_t j = 0u; j < RCOL; ++j) {
313 res_m[j] = rhs[j][0] * lhs[0];
317 for (std::size_t i = 1u; i < COL; ++i) {
319 res_m[j] = res_m[j] + rhs[j][i] * lhs[i];
Vector wrapper for AoS vs interleaved SoA data.
Definition vector.hpp:52
static consteval std::size_t simd_size()
Definition vector.hpp:56
Scalar concept: Elements of vectors/matrices (can be simd vectors).
Definition concepts.hpp:40
Vector concepts.
Definition concepts.hpp:59
constexpr double m
Meter.
Definition Units.hpp:97
constexpr double J
Joule in GeV.
Definition Units.hpp:153
@ R
Radial coordinate.
Definition SpacePointColumns.hpp:26
const auto & get(const detray::tuple< Ts... > &t) noexcept
Get a tuple element by index from a const tuple.
Definition tuple.hpp:152
Generic matrix type that can take vectors as columns.
Definition matrix.hpp:25
constexpr vector_type & operator[](const std::size_t i)
Definition matrix.hpp:53
static consteval std::size_t storage_rows()
Definition matrix.hpp:66
algebra::storage::vector< ROW, scalar_t, array_t > vector_type
The matrix consists of column vectors.
Definition matrix.hpp:27
matrix(vector_t &&...v)
Construct from given column vectors v.
Definition matrix.hpp:39
static consteval std::size_t columns()
Definition matrix.hpp:72
static consteval std::size_t rows()
Definition matrix.hpp:61
constexpr matrix()=default
Default constructor.
friend constexpr bool operator==(const matrix< A, S, R, C > &lhs, const matrix< A, S, R, C > &rhs)
Equality operator between two matrices.
scalar_t scalar_type
Value type: Can be simd types.
Definition matrix.hpp:29
constexpr const vector_type & operator[](const std::size_t i) const
Subscript operator.
Definition matrix.hpp:46