File indexing completed on 2025-07-06 08:07:28
0001
0002
0003
0004
0005
0006
0007
0008
0009 #pragma once
0010
0011 #include "Acts/Definitions/Algebra.hpp"
0012
0013 #include <array>
0014 #include <cassert>
0015 #include <cstddef>
0016 #include <cstdint>
0017
0018 namespace Acts::detail {
0019
0020
0021
0022
0023
0024
0025
0026
0027
0028
0029
0030
0031
0032
0033
0034
0035
0036
0037
0038
0039
0040
0041
0042
0043
0044
0045
0046
0047
0048
0049
0050
0051
0052
0053
0054
0055
0056
0057
0058
0059
0060
0061
0062 template <std::size_t kFullSize, std::size_t kSize>
0063 class FixedSizeSubspace {
0064 static_assert(kFullSize <= static_cast<std::size_t>(
0065 std::numeric_limits<std::uint8_t>::max()),
0066 "Full vector space size is larger than the supported range");
0067 static_assert(1u <= kSize, "Subspace size must be at least 1");
0068 static_assert(kSize <= kFullSize,
0069 "Subspace can only be as large as the full space");
0070
0071 template <typename source_t>
0072 using SubspaceVectorFor = Eigen::Matrix<typename source_t::Scalar, kSize, 1>;
0073 template <typename source_t>
0074 using FullspaceVectorFor =
0075 Eigen::Matrix<typename source_t::Scalar, kFullSize, 1>;
0076 template <typename scalar_t>
0077 using ProjectionMatrix = Eigen::Matrix<scalar_t, kSize, kFullSize>;
0078 template <typename scalar_t>
0079 using ExpansionMatrix = Eigen::Matrix<scalar_t, kFullSize, kSize>;
0080
0081
0082
0083
0084
0085
0086
0087
0088 std::array<std::uint8_t, kSize> m_axes;
0089
0090 public:
0091
0092
0093
0094
0095 template <typename index_t>
0096 constexpr explicit FixedSizeSubspace(
0097 const std::array<index_t, kSize>& indices) {
0098 for (std::size_t i = 0u; i < kSize; ++i) {
0099 assert((indices[i] < kFullSize) &&
0100 "Axis indices must be within the full space");
0101 if (0u < i) {
0102 assert((indices[i - 1u] < indices[i]) &&
0103 "Axis indices must be unique and ordered");
0104 }
0105 }
0106 for (std::size_t i = 0; i < kSize; ++i) {
0107 m_axes[i] = static_cast<std::uint8_t>(indices[i]);
0108 }
0109 }
0110
0111
0112 static constexpr std::size_t size() { return kSize; }
0113
0114 static constexpr std::size_t fullSize() { return kFullSize; }
0115
0116
0117
0118
0119
0120 constexpr std::size_t operator[](std::size_t i) const { return m_axes[i]; }
0121
0122 std::size_t indexOf(std::size_t axis) const {
0123 for (std::size_t i = 0; i < kSize; ++i) {
0124 if (m_axes[i] == axis) {
0125 return i;
0126 }
0127 }
0128 return kSize;
0129 }
0130
0131
0132
0133
0134
0135
0136 constexpr const std::array<std::uint8_t, kSize>& indices() const {
0137 return m_axes;
0138 }
0139
0140
0141 constexpr bool contains(std::size_t index) const {
0142 bool isContained = false;
0143
0144
0145 for (std::uint8_t a : m_axes) {
0146 isContained = isContained || (a == index);
0147 }
0148 return isContained;
0149 }
0150
0151
0152
0153
0154
0155
0156
0157
0158 template <typename fullspace_vector_t>
0159 SubspaceVectorFor<fullspace_vector_t> projectVector(
0160 const Eigen::MatrixBase<fullspace_vector_t>& full) const {
0161 EIGEN_STATIC_ASSERT_VECTOR_SPECIFIC_SIZE(fullspace_vector_t, kFullSize);
0162
0163 SubspaceVectorFor<fullspace_vector_t> sub;
0164 for (std::size_t i = 0u; i < kSize; ++i) {
0165 sub[i] = full[m_axes[i]];
0166 }
0167 return sub;
0168 }
0169
0170
0171
0172
0173
0174
0175
0176
0177 template <typename subspace_vector_t>
0178 FullspaceVectorFor<subspace_vector_t> expandVector(
0179 const Eigen::MatrixBase<subspace_vector_t>& sub) const {
0180 EIGEN_STATIC_ASSERT_VECTOR_SPECIFIC_SIZE(subspace_vector_t, kSize);
0181
0182 FullspaceVectorFor<subspace_vector_t> full;
0183 full.setZero();
0184 for (std::size_t i = 0u; i < kSize; ++i) {
0185 full[m_axes[i]] = sub[i];
0186 }
0187 return full;
0188 }
0189
0190
0191
0192
0193 template <typename scalar_t>
0194 ProjectionMatrix<scalar_t> projector() const {
0195 ProjectionMatrix<scalar_t> proj;
0196 proj.setZero();
0197 for (std::size_t i = 0u; i < kSize; ++i) {
0198 proj(i, m_axes[i]) = 1;
0199 }
0200 return proj;
0201 }
0202
0203
0204
0205
0206 template <typename scalar_t>
0207 ExpansionMatrix<scalar_t> expander() const {
0208 ExpansionMatrix<scalar_t> expn;
0209 expn.setZero();
0210 for (std::size_t i = 0u; i < kSize; ++i) {
0211 expn(m_axes[i], i) = 1;
0212 }
0213 return expn;
0214 }
0215 };
0216
0217
0218
0219
0220
0221 template <std::size_t kFullSize>
0222 class VariableSizeSubspace {
0223 static_assert(kFullSize <= static_cast<std::size_t>(UINT8_MAX),
0224 "Full vector space size is larger than the supported range");
0225
0226 template <typename scalar_t>
0227 using FullProjectionMatrix = Eigen::Matrix<scalar_t, kFullSize, kFullSize>;
0228 template <typename scalar_t>
0229 using FullExpansionMatrix = Eigen::Matrix<scalar_t, kFullSize, kFullSize>;
0230
0231 std::size_t m_size{};
0232
0233
0234
0235
0236
0237
0238
0239
0240 std::array<std::uint8_t, kFullSize> m_axes{};
0241
0242 public:
0243
0244
0245
0246
0247 template <typename index_t, std::size_t kSize>
0248 constexpr explicit VariableSizeSubspace(
0249 const std::array<index_t, kSize>& indices) {
0250 m_size = kSize;
0251 for (std::size_t i = 0u; i < kSize; ++i) {
0252 assert((indices[i] < kFullSize) &&
0253 "Axis indices must be within the full space");
0254 if (0u < i) {
0255 assert((indices[i - 1u] < indices[i]) &&
0256 "Axis indices must be unique and ordered");
0257 }
0258 }
0259 for (std::size_t i = 0; i < kSize; ++i) {
0260 m_axes[i] = static_cast<std::uint8_t>(indices[i]);
0261 }
0262 }
0263
0264
0265 constexpr std::size_t size() const { return m_size; }
0266
0267 static constexpr std::size_t fullSize() { return kFullSize; }
0268
0269
0270
0271
0272
0273 constexpr std::size_t operator[](std::size_t i) const {
0274 assert(i < m_size);
0275 return m_axes[i];
0276 }
0277
0278 std::size_t indexOf(std::size_t axis) const {
0279 for (std::size_t i = 0; i < m_size; ++i) {
0280 if (m_axes[i] == axis) {
0281 return i;
0282 }
0283 }
0284 return m_size;
0285 }
0286
0287
0288 constexpr bool contains(std::size_t index) const {
0289 bool isContained = false;
0290
0291
0292 for (std::size_t i = 0; i < kFullSize; ++i) {
0293 isContained = isContained || ((i < m_size) && (m_axes[i] == index));
0294 }
0295 return isContained;
0296 }
0297
0298
0299
0300
0301 template <typename scalar_t>
0302 FullProjectionMatrix<scalar_t> fullProjector() const {
0303 FullProjectionMatrix<scalar_t> proj;
0304 proj.setZero();
0305 for (std::size_t i = 0u; i < m_size; ++i) {
0306 proj(i, m_axes[i]) = 1;
0307 }
0308 return proj;
0309 }
0310
0311
0312
0313
0314 template <typename scalar_t>
0315 FullExpansionMatrix<scalar_t> fullExpander() const {
0316 FullExpansionMatrix<scalar_t> expn;
0317 expn.setZero();
0318 for (std::size_t i = 0u; i < m_size; ++i) {
0319 expn(m_axes[i], i) = 1;
0320 }
0321 return expn;
0322 }
0323 };
0324
0325
0326
0327 }