27template <uni20::RealOrComplex Scalar>
struct RabcTerm
39template <uni20::RealOrComplex Scalar> [[nodiscard]]
constexpr auto rabc_term_key(
RabcTerm<Scalar> const& term)
noexcept
44template <
class Key>
void require_canonical_rabc_keys(std::vector<Key>
const& keys)
46 if (!std::ranges::is_sorted(keys) || std::ranges::adjacent_find(keys) != keys.end())
47 throw std::invalid_argument(
"R/A/B/C logical key tables must be sorted and unique");
68template <uni20::RealOrComplex Scalar,
class RKey,
class AKey,
class BKey,
class CKey>
class RabcContractionPlan {
87 std::vector<b_key_type>
b_keys, std::vector<c_key_type>
c_keys,
88 std::vector<term_type>
terms)
92 detail::require_canonical_rabc_keys(r_keys_);
93 detail::require_canonical_rabc_keys(a_keys_);
94 detail::require_canonical_rabc_keys(b_keys_);
95 detail::require_canonical_rabc_keys(c_keys_);
96 for (
auto const& term : terms_)
100 throw std::invalid_argument(
"R/A/B/C term has an out-of-range logical key index");
120 [[nodiscard]]
auto term_count() const noexcept ->
std::
size_t {
return terms_.size(); }
123 [[nodiscard]]
static auto canonicalize(std::vector<term_type>
terms) -> std::vector<term_type>
126 return detail::rabc_term_key(lhs) < detail::rabc_term_key(rhs);
129 std::vector<term_type> result;
130 result.reserve(
terms.size());
131 for (
auto const& term :
terms)
133 if (!result.empty() && detail::rabc_term_key(result.back()) == detail::rabc_term_key(term))
136 result.push_back(term);
142 std::vector<r_key_type> r_keys_;
143 std::vector<a_key_type> a_keys_;
144 std::vector<b_key_type> b_keys_;
145 std::vector<c_key_type> c_keys_;
146 std::vector<term_type> terms_;
151template <uni20::RealOrComplex Scalar,
class RKey,
class AKey,
class BKey,
class CKey>
152inline constexpr bool is_rabc_contraction_plan<RabcContractionPlan<Scalar, RKey, AKey, BKey, CKey>> =
true;
156concept RabcPlan = is_rabc_contraction_plan<std::remove_cvref_t<T>>;
Immutable sparse coefficient tensor for an R/A/B/C contraction.
Definition rabc_contraction_plan.hpp:68
auto c_keys() const noexcept -> std::span< c_key_type const >
Return right-environment logical keys addressed by term indices.
Definition rabc_contraction_plan.hpp:114
CKey c_key_type
Definition rabc_contraction_plan.hpp:74
auto b_keys() const noexcept -> std::span< b_key_type const >
Return input-center logical keys addressed by term indices.
Definition rabc_contraction_plan.hpp:111
RabcTerm< scalar_type > term_type
Definition rabc_contraction_plan.hpp:75
auto term_count() const noexcept -> std::size_t
Return the number of canonical nonzero terms.
Definition rabc_contraction_plan.hpp:120
AKey a_key_type
Definition rabc_contraction_plan.hpp:72
RabcContractionPlan(std::vector< r_key_type > r_keys, std::vector< a_key_type > a_keys, std::vector< b_key_type > b_keys, std::vector< c_key_type > c_keys, std::vector< term_type > terms)
Retain logical key tables and canonicalize sparse coefficients.
Definition rabc_contraction_plan.hpp:86
auto terms() const noexcept -> std::span< term_type const >
Return the canonical nonzero terms.
Definition rabc_contraction_plan.hpp:117
auto a_keys() const noexcept -> std::span< a_key_type const >
Return left-environment logical keys addressed by term indices.
Definition rabc_contraction_plan.hpp:108
RabcContractionPlan()=default
Construct an empty sparse coefficient plan.
auto r_keys() const noexcept -> std::span< r_key_type const >
Return output logical keys addressed by term indices.
Definition rabc_contraction_plan.hpp:105
RKey r_key_type
Definition rabc_contraction_plan.hpp:71
BKey b_key_type
Definition rabc_contraction_plan.hpp:73
Scalar scalar_type
Definition rabc_contraction_plan.hpp:70
Concept for numeric scalar types (integer, real, or complex).
Definition scalar_concepts.hpp:81
Concrete logical R/A/B/C coefficient-plan type.
Definition rabc_contraction_plan.hpp:156
Definition right_first_rabc.hpp:34
constexpr bool is_rabc_contraction_plan
Definition rabc_contraction_plan.hpp:149
std::size_t span
Definition presentation.cpp:2017
One nonzero coefficient in R_r += f(r,a,b,c) A_a B_b transpose(C_c).
Definition rabc_contraction_plan.hpp:28
std::size_t r_key_index
Definition rabc_contraction_plan.hpp:29
std::size_t a_key_index
Definition rabc_contraction_plan.hpp:30
std::size_t b_key_index
Definition rabc_contraction_plan.hpp:31
std::size_t c_key_index
Definition rabc_contraction_plan.hpp:32
Scalar coefficient
Definition rabc_contraction_plan.hpp:33