ACTS
Experiment-independent tracking
Loading...
Searching...
No Matches
array_operators.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 "detray/algebra/concepts.hpp"
13#include "detray/definitions/detail/qualifiers.hpp"
14
15// System include(s).
16#include <cstddef>
17#include <type_traits>
18
19namespace detray::algebra::array {
20
23
24template <template <typename, std::size_t> class array_t,
25 concepts::scalar scalar1_t, concepts::scalar scalar2_t>
26DETRAY_HOST_DEVICE constexpr array_t<scalar1_t, 2> operator*(
27 const array_t<scalar1_t, 2> &a, scalar2_t s) {
28 return {a[0] * static_cast<scalar1_t>(s), a[1] * static_cast<scalar1_t>(s)};
29}
30
31template <template <typename, std::size_t> class array_t,
32 concepts::scalar scalar1_t, concepts::scalar scalar2_t>
33DETRAY_HOST_DEVICE constexpr array_t<scalar1_t, 2> operator*(
34 scalar2_t s, const array_t<scalar1_t, 2> &a) {
35 return {static_cast<scalar1_t>(s) * a[0], static_cast<scalar1_t>(s) * a[1]};
36}
37
38template <template <typename, std::size_t> class array_t,
39 concepts::scalar scalar_t>
40DETRAY_HOST_DEVICE constexpr array_t<scalar_t, 2> operator-(
41 const array_t<scalar_t, 2> &a, const array_t<scalar_t, 2> &b) {
42 return {a[0] - b[0], a[1] - b[1]};
43}
44
45template <template <typename, std::size_t> class array_t,
46 concepts::scalar scalar_t>
47DETRAY_HOST_DEVICE constexpr array_t<scalar_t, 2> operator+(
48 const array_t<scalar_t, 2> &a, const array_t<scalar_t, 2> &b) {
49 return {a[0] + b[0], a[1] + b[1]};
50}
51
53
56
57template <template <typename, std::size_t> class array_t,
58 concepts::scalar scalar1_t, concepts::scalar scalar2_t>
59DETRAY_HOST_DEVICE constexpr array_t<scalar1_t, 3> operator*(
60 const array_t<scalar1_t, 3> &a, scalar2_t s) {
61 return {a[0] * static_cast<scalar1_t>(s), a[1] * static_cast<scalar1_t>(s),
62 a[2] * static_cast<scalar1_t>(s)};
63}
64
65template <template <typename, std::size_t> class array_t,
66 concepts::scalar scalar1_t, concepts::scalar scalar2_t>
67DETRAY_HOST_DEVICE constexpr array_t<scalar1_t, 3> operator*(
68 scalar2_t s, const array_t<scalar1_t, 3> &a) {
69 return {static_cast<scalar1_t>(s) * a[0], static_cast<scalar1_t>(s) * a[1],
70 static_cast<scalar1_t>(s) * a[2]};
71}
72
73template <template <typename, std::size_t> class array_t,
74 concepts::scalar scalar_t>
75DETRAY_HOST_DEVICE constexpr array_t<scalar_t, 3> operator-(
76 const array_t<scalar_t, 3> &a, const array_t<scalar_t, 3> &b) {
77 return {a[0] - b[0], a[1] - b[1], a[2] - b[2]};
78}
79
80template <template <typename, std::size_t> class array_t,
81 concepts::scalar scalar_t>
82DETRAY_HOST_DEVICE constexpr array_t<scalar_t, 3> operator+(
83 const array_t<scalar_t, 3> &a, const array_t<scalar_t, 3> &b) {
84 return {a[0] + b[0], a[1] + b[1], a[2] + b[2]};
85}
86
88
91
92template <typename index_t, template <typename, index_t> class array_t,
93 concepts::scalar scalar1_t, concepts::scalar scalar2_t, index_t ROWS,
94 index_t COLS>
95DETRAY_HOST_DEVICE constexpr array_t<array_t<scalar1_t, ROWS>, COLS> operator*(
96 const array_t<array_t<scalar1_t, ROWS>, COLS> &a, scalar2_t s) {
97 array_t<array_t<scalar1_t, ROWS>, COLS> ret{};
98
99 for (index_t j = 0; j < COLS; ++j) {
100 for (index_t i = 0; i < ROWS; ++i) {
101 ret[j][i] = a[j][i] * static_cast<scalar1_t>(s);
102 }
103 }
104
105 return ret;
106}
107
108template <typename index_t, template <typename, index_t> class array_t,
109 concepts::scalar scalar1_t, concepts::scalar scalar2_t, index_t ROWS,
110 index_t COLS>
111DETRAY_HOST_DEVICE constexpr array_t<array_t<scalar1_t, ROWS>, COLS> operator*(
112 scalar2_t s, const array_t<array_t<scalar1_t, ROWS>, COLS> &a) {
113 array_t<array_t<scalar1_t, ROWS>, COLS> ret{};
114
115 for (index_t j = 0; j < COLS; ++j) {
116 for (index_t i = 0; i < ROWS; ++i) {
117 ret[j][i] = a[j][i] * static_cast<scalar1_t>(s);
118 }
119 }
120
121 return ret;
122}
123
124template <typename index_t, template <typename, index_t> class array_t,
125 concepts::scalar scalar_t, index_t M, index_t N, index_t O>
126DETRAY_HOST_DEVICE constexpr array_t<array_t<scalar_t, M>, O> operator*(
127 const array_t<array_t<scalar_t, M>, N> &A,
128 const array_t<array_t<scalar_t, N>, O> &B) {
129 array_t<array_t<scalar_t, M>, O> C{};
130
131 for (index_t j = 0; j < O; ++j) {
132 for (index_t i = 0; i < M; ++i) {
133 C[j][i] = 0.f;
134 }
135 }
136
137 for (index_t i = 0; i < N; ++i) {
138 for (index_t j = 0; j < O; ++j) {
139 for (index_t k = 0; k < M; ++k) {
140 C[j][k] += A[i][k] * B[j][i];
141 }
142 }
143 }
144
145 return C;
146}
147
148template <typename index_t, template <typename, index_t> class array_t,
149 concepts::scalar scalar_t, index_t ROWS, index_t COLS>
150DETRAY_HOST_DEVICE constexpr array_t<array_t<scalar_t, ROWS>, COLS> operator+(
151 const array_t<array_t<scalar_t, ROWS>, COLS> &A,
152 const array_t<array_t<scalar_t, ROWS>, COLS> &B) {
153 array_t<array_t<scalar_t, ROWS>, COLS> C{};
154
155 for (index_t j = 0; j < COLS; ++j) {
156 for (index_t i = 0; i < ROWS; ++i) {
157 C[j][i] = A[j][i] + B[j][i];
158 }
159 }
160
161 return C;
162}
163
164template <typename index_t, template <typename, index_t> class array_t,
165 concepts::scalar scalar_t, index_t ROWS, index_t COLS>
166DETRAY_HOST_DEVICE constexpr array_t<array_t<scalar_t, ROWS>, COLS> operator-(
167 const array_t<array_t<scalar_t, ROWS>, COLS> &A,
168 const array_t<array_t<scalar_t, ROWS>, COLS> &B) {
169 array_t<array_t<scalar_t, ROWS>, COLS> C{};
170
171 for (index_t j = 0; j < COLS; ++j) {
172 for (index_t i = 0; i < ROWS; ++i) {
173 C[j][i] = A[j][i] - B[j][i];
174 }
175 }
176
177 return C;
178}
179
181
184
185template <typename index_t, template <typename, index_t> class array_t,
186 concepts::scalar scalar_t, index_t ROWS, index_t COLS>
187DETRAY_HOST_DEVICE constexpr array_t<scalar_t, ROWS> operator*(
188 const array_t<array_t<scalar_t, ROWS>, COLS> &a,
189 const array_t<scalar_t, COLS> &b) {
190 array_t<scalar_t, ROWS> ret{0};
191
192 for (index_t j = 0; j < COLS; ++j) {
193 for (index_t i = 0; i < ROWS; ++i) {
194 ret[i] += a[j][i] * b[j];
195 }
196 }
197
198 return ret;
199}
200
202
203} // namespace detray::algebra::array
constexpr double s
Definition Units.hpp:120
constexpr array_t< scalar1_t, 2 > operator*(const array_t< scalar1_t, 2 > &a, scalar2_t s)
Multiply an array-backed vector by a scalar.
Definition array_operators.hpp:26
constexpr array_t< scalar_t, 2 > operator+(const array_t< scalar_t, 2 > &a, const array_t< scalar_t, 2 > &b)
Add array-backed vectors component-wise.
Definition array_operators.hpp:47
constexpr array_t< scalar_t, 2 > operator-(const array_t< scalar_t, 2 > &a, const array_t< scalar_t, 2 > &b)
Subtract array-backed vectors component-wise.
Definition array_operators.hpp:40