62 using Offsets = std::array<ptrdiff_t,RANK>;
125 using namespace hana::literals;
126 if constexpr (
n!=0
_c) {
134 if constexpr (
decltype(
len0)::value) {
136 return d+
decltype(
len0)::value;
152 case 1:
run(hana::size_c<1>);
break;
153 case 2:
run(hana::size_c<2>);
break;
154 case 3:
run(hana::size_c<3>);
break;
155 case 4:
run(hana::size_c<4>);
break;
156 default:
run(hana::size_c<0>);
164 template <
size_t RANK2>
219 throw std::runtime_error(
"Dimension mismatch in addition of MultiDiagonals");
223 for (
auto&& [
to,
from] : std::views::zip(
it->second.dataStorage(),
diag.dataStorage()))
to+=
from;
251 if (
md.diagonals.empty())
return {};
255 for (
auto&& [
v,
o] : std::views::zip(
res,
kv.first))
v +=
size_t(
o<0 ? -
o :
o);
261 for (
const auto&
kv :
md.diagonals)
270 json::array&
arr =
jv.emplace_array();
272 arr.push_back( json::object{ {
"offsets",json::value_from(
offsets)}, {
"diagonal",json::value_from(
diag)} } );
297template <
size_t RANK>
302 if (
a.diagonals.empty() ||
b.diagonals.empty())
return MD{};
304 const auto dim = calculateAndCheckDimensions(
a);
305 if (
dim != calculateAndCheckDimensions(
b))
throw std::runtime_error(
"Mismatch in MultiDiagonal composition dimensions");
309 for (
const auto& [
p,
diagA] :
a.diagonals)
for (
const auto& [
q,
diagB] :
b.diagonals) {
311 typename MD::Offsets
s;
313 std::array<ptrdiff_t,RANK>
iA,
iB;
317 for (
size_t i=0; i<
RANK; ++i) {
339 for (
size_t i=0; i<
RANK; ++i) {
352namespace multidiagonal {
368 res.diagonals.emplace(
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
#define FWD(x)
Perfect-forwarding macro. Expands to std::forward<decltype(x)>(x), avoiding the need to repeat the ty...
Definition Traits.h:5
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
size_t offset
Definition MultiArray.h:174
std::span< T > dataView
Definition MultiArray.h:176
Extents< RANK > strides
Definition MultiArray.h:172
std::vector< T > StorageType
Underlying storage type: std::vector<T>. May eventually be replaced by kokkos::View or std::valarray.
Definition MultiArray.h:259
Namespace alias for Boost.Hana, used for compile-time sequences and heterogeneous containers.
Definition MultiArray.h:17
constexpr auto concatenate(const std::array< Type, sizes > &... arrays)
Concatenates multiple std::array instances of different sizes into one.
Definition MultiArray.h:33
MultiArray< dcomp, RANK > & conj(MultiArray< dcomp, RANK > &ma)
In-place complex conjugation of all elements of ma.
Definition MultiArrayComplex.h:155
auto & incrementMultiIndex(Extents< RANK > &idx, Extents< RANK > extents)
Increments a multi-index in last-index-fastest order, in-place.
Definition MultiArray.h:61
void checkExtents(MultiArrayConstView< T1, RANK > m1, MultiArrayConstView< T2, RANK > m2, std::string message)
Debug-mode extent check between two views. Throws std::runtime_error on mismatch.
Definition MultiArray.h:201
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
MultiDiagonal< 1 > identity(size_t dim)
Constructs the rank-1 identity operator of dimension dim.
Definition MultiDiagonal.h:365
Comprises modules representing operators of special structure (multidiagonal, sparse) over Hilbert sp...
Definition MultiDiagonal.h:11
MultiDiagonal< RANK > operator|(const MultiDiagonal< RANK > &a, const MultiDiagonal< RANK > &b)
Composition (matrix product) of two MultiDiagonal operators of arbitrary rank: .
Definition MultiDiagonal.h:298
A sparse matrix storing an arbitrary set of diagonals, closed under composition, direct product,...
Definition MultiDiagonal.h:58
MultiDiagonal & dagger()
Definition MultiDiagonal.h:192
friend MultiDiagonal twoITimesImagPartOf(const MultiDiagonal &md)
, which is anti-Hermitian.
Definition MultiDiagonal.h:202
MultiDiagonal & operator+=(const MultiDiagonal &md)
In-place addition. New diagonals are inserted; existing ones accumulate element-wise.
Definition MultiDiagonal.h:214
friend void tag_invoke(const json::value_from_tag &, json::value &jv, const MultiDiagonal &md)
Boost.JSON serialization: emits an array of {"offsets": [...], "diagonal": {...}} objects.
Definition MultiDiagonal.h:268
MultiDiagonal & operator*=(scalar auto d)
Definition MultiDiagonal.h:230
MultiDiagonal operator-() const
Definition MultiDiagonal.h:209
friend MultiDiagonal twoTimesRealPartOf(const MultiDiagonal &md)
, which is Hermitian.
Definition MultiDiagonal.h:197
void operator()(double, MultiArrayConstView< dcomp, RANK > psi, MultiArrayView< dcomp, RANK > dpsidt) const
Accumulates the operator's action on psi into dpsidt: dpsidt(k+o⁻) += diag(k) * psi(k+o⁺) for each di...
Definition MultiDiagonal.h:98
std::map< Offsets, Diagonal > Diagonals
Single-level map: signed offsets → diagonal data.
Definition MultiDiagonal.h:66
friend auto operator-(const MultiDiagonal &md1, const MultiDiagonal &md2)
Definition MultiDiagonal.h:239
friend Dimensions calculateAndCheckDimensions(const MultiDiagonal &md)
Derives and validates the Hilbert space dimensions from the invariant . Returns Dimensions{} for an e...
Definition MultiDiagonal.h:249
friend auto operator+(const MultiDiagonal &md1, const MultiDiagonal &md2)
Definition MultiDiagonal.h:238
friend auto operator*(scalar auto v, const MultiDiagonal &md)
Definition MultiDiagonal.h:241
MultiDiagonal & operator=(const MultiDiagonal &)=delete
Diagonals diagonals
Definition MultiDiagonal.h:83
friend auto operator/(const MultiDiagonal &md, scalar auto v)
Definition MultiDiagonal.h:242
MultiDiagonal(auto &&... args)
Forwards args to the diagonal map. Constrained, so that a non-const lvalue MultiDiagonal reaches the ...
Definition MultiDiagonal.h:73
MultiDiagonal & operator/=(scalar auto d)
Definition MultiDiagonal.h:236
MultiDiagonal & operator-=(const MultiDiagonal &md)
Definition MultiDiagonal.h:228
friend MultiDiagonal hermitianConjugateOf(const MultiDiagonal &md)
Definition MultiDiagonal.h:194
friend auto operator*(const MultiDiagonal< RANK > &md1, const MultiDiagonal< RANK2 > &md2)
Tensor (direct) product: concatenates the signed offset arrays, reflecting the tensor product structu...
Definition MultiDiagonal.h:165
MultiDiagonal & hermitianConjugate()
In-place Hermitian conjugation: negates all offsets and conjugates all diagonal elements....
Definition MultiDiagonal.h:179
std::array< ptrdiff_t, RANK > Offsets
Signed offsets, one per axis: positive = upper, negative = lower, zero = main diagonal.
Definition MultiDiagonal.h:62
MultiDiagonal(MultiDiagonal &&)=default
MultiDiagonal operator+() const
Definition MultiDiagonal.h:211
friend MultiDiagonal copy(const MultiDiagonal &md)
Named deep copy.
Definition MultiDiagonal.h:76
MultiDiagonal(const MultiDiagonal &)=delete