26template <
typename T,
typename =
void>
27struct scalar_value_type
34struct scalar_value_type<T, std::void_t<typename T::value_type>>
36 typedef typename T::value_type value_type;
40using scalar_value_type_t =
typename scalar_value_type<T>::value_type;
144 std::size_t offset = 0, std::size_t n = 1)
146 for (std::size_t i = 0; i < perm.size(); ++i)
147 for (std::size_t b = 0; b < n; ++b)
148 std::swap(data[n * (offset + i) + b], data[n * (offset + perm[i]) + b]);
160 std::span<E> data, std::span<const int> emap,
163 for (std::size_t i = 0; i < perm.size(); ++i)
164 for (std::size_t b = 0; b < n; ++b)
165 std::swap(data[n * emap[i] + b], data[n * emap[perm[i]] + b]);
189 std::span<E> data, std::size_t offset = 0,
192 const std::size_t dim = perm.size();
193 const std::size_t data_size = (data.size() + (dim < n ? n - dim : 0)) / n;
194 for (std::size_t b = 0; b < n; ++b)
196 for (std::size_t i = 0; i < dim; ++i)
198 std::swap(data[data_size * b + offset + i],
199 data[data_size * b + offset + perm[i]]);
219template <std::
floating_po
int T>
220std::vector<std::size_t>
257template <
typename T,
typename E>
259 md::mdspan<
const T, md::dextents<std::size_t, 2>> M,
260 std::span<E> data, std::size_t offset = 0, std::size_t n = 1)
262 using U =
typename impl::scalar_value_type_t<E>;
264 const std::size_t dim = v_size_t.size();
274 for (std::size_t b = 0; b < n; ++b)
276 for (std::size_t i = 0; i < dim; ++i)
278 for (std::size_t j = i + 1; j < dim; ++j)
280 data[n * (offset + i) + b]
281 +=
static_cast<U
>(M(i, j)) * data[n * (offset + j) + b];
285 for (std::size_t i = 1; i <= dim; ++i)
287 data[n * (offset + dim - i) + b] *=
static_cast<U
>(M(dim - i, dim - i));
288 for (std::size_t j = 0; j < dim - i; ++j)
290 data[n * (offset + dim - i) + b]
291 +=
static_cast<U
>(M(dim - i, j)) * data[n * (offset + j) + b];
298 for (std::size_t i = 0; i < dim; ++i)
300 for (std::size_t j = i + 1; j < dim; ++j)
302 const U Mij =
static_cast<U
>(M(i, j));
303 for (std::size_t b = 0; b < n; ++b)
305 data[n * (offset + i) + b] += Mij * data[n * (offset + j) + b];
310 for (std::size_t i = 1; i <= dim; ++i)
312 const U Mdiag =
static_cast<U
>(M(dim - i, dim - i));
313 for (std::size_t b = 0; b < n; ++b)
314 data[n * (offset + dim - i) + b] *= Mdiag;
316 for (std::size_t j = 0; j < dim - i; ++j)
318 const U Mij =
static_cast<U
>(M(dim - i, j));
319 for (std::size_t b = 0; b < n; ++b)
321 data[n * (offset + dim - i) + b] += Mij * data[n * (offset + j) + b];
347template <
typename T,
typename E>
349 std::span<const std::size_t> v_size_t,
350 md::mdspan<
const T, md::dextents<std::size_t, 2>> M, std::span<E> data,
351 std::size_t offset = 0, std::size_t n = 1)
353 using U =
typename impl::scalar_value_type_t<E>;
355 const std::size_t dim = v_size_t.size();
356 const std::size_t data_size = (data.size() + (dim < n ? n - dim : 0)) / n;
358 for (std::size_t b = 0; b < n; ++b)
360 for (std::size_t i = 0; i < dim; ++i)
362 for (std::size_t j = i + 1; j < dim; ++j)
364 data[data_size * b + offset + i]
365 +=
static_cast<U
>(M(i, j)) * data[data_size * b + offset + j];
368 for (std::size_t i = 1; i <= dim; ++i)
370 data[data_size * b + offset + dim - i]
371 *=
static_cast<U
>(M(dim - i, dim - i));
372 for (std::size_t j = 0; j < dim - i; ++j)
374 data[data_size * b + offset + dim - i]
375 +=
static_cast<U
>(M(dim - i, j)) * data[data_size * b + offset + j];
std::vector< std::size_t > transpose_lu(std::pair< std::vector< T >, std::array< std::size_t, 2 > > &A)
Compute the LU decomposition of the transpose of a square matrix A.
Definition math.h:296
Matrix and permutation pre-computation.
Definition precompute.h:21
std::vector< std::size_t > prepare_matrix(std::pair< std::vector< T >, std::array< std::size_t, 2 > > &A)
Prepare a square matrix.
Definition precompute.h:221
void apply_permutation(std::span< const std::size_t > perm, std::span< E > data, std::size_t offset=0, std::size_t n=1)
Apply a (precomputed) permutation .
Definition precompute.h:143
void apply_inv_permutation_right(std::span< const std::size_t > perm, std::span< E > data, std::size_t offset=0, std::size_t n=1)
Apply a (precomputed) permutation to some transposed data.
Definition precompute.h:188
void prepare_permutation(std::span< std::size_t > perm)
Prepare a permutation.
Definition precompute.cpp:12
void apply_permutation_mapped(std::span< const std::size_t > perm, std::span< E > data, std::span< const int > emap, std::size_t n=1)
Permutation of mapped data.
Definition precompute.h:159
void apply_transpose_matrix_right(std::span< const std::size_t > v_size_t, md::mdspan< const T, md::dextents< std::size_t, 2 > > M, std::span< E > data, std::size_t offset=0, std::size_t n=1)
Apply a (precomputed) matrix to some transposed data.
Definition precompute.h:348
void apply_matrix(std::span< const std::size_t > v_size_t, md::mdspan< const T, md::dextents< std::size_t, 2 > > M, std::span< E > data, std::size_t offset=0, std::size_t n=1)
Apply a (precomputed) matrix.
Definition precompute.h:258