8#include <boost/serialization/complex.hpp>
13typedef std::complex<double>
dcomp;
16using std::complex_literals::operator
""i;
34noexcept(
noexcept(x*x))
41 const double den = std::abs(a)+std::abs(b);
42 return den==0. ? 0. : std::abs(a-b)/den;
62 void tag_invoke(value_from_tag, value& jv,
const std::complex<T>& c) {
63 jv = {c.real(), c.imag()};
68 std::complex<T>
tag_invoke(value_to_tag<std::complex<T>>,
const value& jv) {
69 return { json::value_to<T>(jv.at(0)), json::value_to<T>(jv.at(1)) } ;
83template <
typename N>
concept scalar = std::convertible_to<N,double> || std::convertible_to<N,dcomp>;
89 return Eigen::Map<CVector>{
ma.dataStorage().data(), Eigen::Index(
ma.
dataView.size())};
96 return Eigen::Map<const CVector>{
ma.dataStorage().data(), Eigen::Index(
ma.
dataView.size())};
105template <
size_t TWO_TIMES_RANK>
requires ( !(TWO_TIMES_RANK%2) )
110 std::ranges::for_each(std::views::iota(0
ul,
RANK), [&] (
size_t i) {
114 throw std::invalid_argument(
"MultiArray does not have the shape of a matrix: index no. "+std::to_string(i)+
": "+std::to_string(
res[i])+
" vs. "+std::to_string(
b));
122template <
size_t TWO_TIMES_RANK>
130template <
size_t TWO_TIMES_RANK>
143template <
size_t RANK1,
size_t RANK2>
148 for (
size_t stride=m1.
dataView.size(), i=0; i<stride; ++i)
for (
size_t j=0; j<m2.
dataView.size(); ++j) res.dataStorage()[i+stride*j]=func(m1.
dataView[i],m2.
dataView[j]);
154template <
size_t RANK>
163template <
size_t RANK>
167template <
size_t RANK>
175template <
size_t TWO_TIMES_RANK>
199template <
size_t TWO_TIMES_RANK>
206 _(i,i)=2.*
real(_(i,i));
Eigen::MatrixX< dcomp > CMatrix
Dense complex matrix type (Eigen dynamic-size).
Definition MultiArrayComplex.h:74
double sqrAbs(dcomp v)
Squared absolute value of a complex number: |v|^2 = re^2 + im^2, computed as such (std::norm),...
Definition MultiArrayComplex.h:47
bool isNonZero(dcomp c)
Returns true if either the real or imaginary part of c is non-zero.
Definition MultiArrayComplex.h:19
bool absCompare(dcomp c1, dcomp c2)
Comparator by absolute value, for use with sorting algorithms.
Definition MultiArrayComplex.h:27
std::complex< double > dcomp
Double-precision complex number. Named to resemble a built-in type rather than a class.
Definition MultiArrayComplex.h:13
dcomp textbookProduct(dcomp a, dcomp b)
Complex product by the textbook formula , for hot loops.
Definition MultiArrayComplex.h:56
auto sqr(auto &&x) noexcept(noexcept(x *x)) -> decltype(x *x)
Generic square: x*x. Return type is deduced; noexcept and SFINAE are propagated.
Definition MultiArrayComplex.h:33
bool hasRealPart(dcomp c)
Returns true if the real part of c is non-zero.
Definition MultiArrayComplex.h:22
double relativeDeviation(const auto &a, const auto &b)
Relative deviation between two values: |a-b| / (|a|+|b|). Returns 0 if both are zero.
Definition MultiArrayComplex.h:39
bool hasImagPart(dcomp c)
Returns true if the imaginary part of c is non-zero.
Definition MultiArrayComplex.h:24
Eigen::VectorX< dcomp > CVector
Dense complex vector type (Eigen dynamic-size).
Definition MultiArrayComplex.h:76
bool realCompare(dcomp c1, dcomp c2)
Comparator by real part, for use with sorting algorithms.
Definition MultiArrayComplex.h:29
A non-owning, strided view over a contiguous buffer. Should be passed by value.
Definition MultiArray.h:106
Extents< RANK > extents
Definition MultiArray.h:172
std::span< T > dataView
Definition MultiArray.h:176
Concept satisfied by scalar numeric types usable as operator coefficients: any type convertible to do...
Definition MultiArrayComplex.h:83
Definition MultiArrayComplex.h:59
void tag_invoke(value_from_tag, value &jv, const std::complex< T > &c)
Boost.JSON serialization for std::complex<T>: emits a two-element JSON array [re, im].
Definition MultiArrayComplex.h:62
auto calculateExtent(Extents< RANK > extents)
Returns the total number of elements: the product of all extents.
Definition MultiArray.h:240
Namespace alias for Boost.Hana, used for compile-time sequences and heterogeneous containers.
Definition MultiArray.h:17
void twoTimesRealPartOfSelf(MultiArrayView< dcomp, TWO_TIMES_RANK > mav)
In-place replacement of a rank-2R matrix view mav with M + M† (twice its Hermitian part).
Definition MultiArrayComplex.h:200
constexpr auto concatenate(const std::array< Type, sizes > &... arrays)
Concatenates multiple std::array instances of different sizes into one.
Definition MultiArray.h:33
std::array< size_t, RANK > Extents
Compile-time–fixed shape and stride descriptor for a rank-RANK array. Should be passed by value,...
Definition MultiArray.h:46
MultiArray< dcomp, RANK > & conj(MultiArray< dcomp, RANK > &ma)
In-place complex conjugation of all elements of ma.
Definition MultiArrayComplex.h:155
void hermitianConjugateSelf(MultiArrayView< dcomp, TWO_TIMES_RANK > mav)
In-place Hermitian conjugation of a rank-2R matrix view mav.
Definition MultiArrayComplex.h:176
auto matricize(MultiArray< dcomp, TWO_TIMES_RANK > &ma)
Maps a mutable rank-2R MultiArray<dcomp> to an Eigen square matrix (no data copy)....
Definition MultiArrayComplex.h:123
Extents< TWO_TIMES_RANK/2 > halveExtents(Extents< TWO_TIMES_RANK > extents)
Extracts the first half of a rank-2R extent array, verifying that both halves are equal.
Definition MultiArrayComplex.h:106
double frobeniusNormSqr(const MultiArray< dcomp, RANK > &ma)
Squared Frobenius norm: . Returns 0 for an empty array.
Definition MultiArrayComplex.h:164
void checkContiguous(MultiArrayView< T, RANK > mav, std::string message)
Debug-mode check that a view covers its storage as an owning MultiArray of the same extents would: of...
Definition MultiArray.h:277
auto directProduct(const MultiArray< dcomp, RANK1 > &m1, const MultiArray< dcomp, RANK2 > &m2, std::function< dcomp(dcomp, dcomp)> func=std::multiplies< dcomp >{})
Tensor (outer) product of two complex multi-arrays.
Definition MultiArrayComplex.h:144
auto vectorize(MultiArray< dcomp, RANK > &ma)
Maps a mutable MultiArray<dcomp,RANK> to an Eigen column vector (no data copy).
Definition MultiArrayComplex.h:87
double frobeniusNorm(const MultiArray< dcomp, RANK > &ma)
Frobenius norm: .
Definition MultiArrayComplex.h:168