Uni20
Asynchronous tensor and runtime library.
Loading...
Searching...
No Matches
rabc_contraction.hpp
Go to the documentation of this file.
1
7#pragma once
8
15
16#include <concepts>
17#include <memory>
18#include <stdexcept>
19#include <type_traits>
20#include <utility>
21
22namespace uni20::linalg
23{
24namespace detail
25{
26
27template <class StoragePolicy> [[nodiscard]] auto make_rabc_backend_selector()
28{
29 using leaf_storage_policy = typename StoragePolicy::leaf_storage_policy;
30 auto contraction_selector = linalg::select_backend_for_storage<leaf_storage_policy>(contract_op<2, 2, 1>{});
31 using contraction_selector_type = std::remove_cvref_t<decltype(contraction_selector)>;
32 return backend_list{tensor_network::RightFirstRabcBackend<leaf_storage_policy, contraction_selector_type>{
33 std::move(contraction_selector)}};
34}
35
36} // namespace detail
37
42template <class StoragePolicy> struct backend_selector_default<tensor_network::rabc_contract_op, StoragePolicy>
43{
44 template <class StorageSelector>
45 static auto select(tensor_network::rabc_contract_op const&, StorageSelector storage_selector)
46 {
47 static_cast<void>(storage_selector);
48 return detail::make_rabc_backend_selector<StoragePolicy>();
49 }
50};
51
52} // namespace uni20::linalg
53
55{
56namespace detail
57{
58
59template <class Output, class B> [[nodiscard]] constexpr bool is_obvious_rabc_alias(Output& output, B const& b) noexcept
60{
61 if constexpr (std::same_as<std::remove_cvref_t<Output>, std::remove_cvref_t<B>>)
62 {
63 return static_cast<void const*>(std::addressof(output)) == static_cast<void const*>(std::addressof(b));
64 }
65 return false;
66}
67
68} // namespace detail
69
85template <class IntermediateStorage, class ContractionSelector, detail::WritableRabcTensor Output, RabcPlan Plan,
86 detail::ReadableRabcTensor A, detail::ReadableRabcTensor B, detail::ReadableRabcTensor C>
87 requires detail::CompatibleRabcOperands<Output, Plan, A, B, C>
88[[nodiscard]] auto
90 Output const& output, Plan plan, A const& a, B const& b, C const& c)
91{
92 auto backend = std::move(std::get<0>(selector.entries));
94 std::move(backend.contraction_selector), output, std::move(plan), a, b, c);
95}
96
106template <detail::WritableRabcTensor Output, RabcPlan Plan, detail::ReadableRabcTensor A, detail::ReadableRabcTensor B,
107 detail::ReadableRabcTensor C>
108 requires detail::CompatibleRabcOperands<Output, Plan, A, B, C>
109[[nodiscard]] auto prepare_rabc_contract(Output const& output, Plan plan, A const& a, B const& b, C const& c)
110{
111 auto selector = linalg::select_backend(rabc_contract_op{}, output);
112 return prepare_rabc_contract(std::move(selector), output, std::move(plan), a, b, c);
113}
114
132template <linalg::KernelBackendSelector BackendSelector, MutableBlockTensorView Output, RabcPlan Plan,
134void rabc_contract(BackendSelector&& selector, Output& output, Plan const& plan, A const& a, B const& b, C const& c)
135{
136 if (detail::is_obvious_rabc_alias(output, b))
137 throw std::invalid_argument("R/A/B/C contraction output must not alias its input center");
138 linalg::dispatch_kernel(std::forward<BackendSelector>(selector), rabc_contract_op{}, output, plan, a, b, c);
139}
140
147template <MutableBlockTensorView Output, RabcPlan Plan, BlockTensorView A, BlockTensorView B, BlockTensorView C>
148void rabc_contract(Output& output, Plan const& plan, A const& a, B const& b, C const& c)
149{
150 auto selector = linalg::select_backend(rabc_contract_op{}, output);
151 rabc_contract(std::move(selector), output, plan, a, b, c);
152}
153
154} // namespace uni20::tensor_network
Ordered backend selector values shared by tensor storage and linalg dispatch.
Concepts and associated types for BlockTensor-level views.
Prepared right-first executor for one fixed R/A/B/C structure.
Definition right_first_rabc.hpp:234
Tensor-level view of a symmetry-preserving collection of dense blocks.
Definition block_tensor_concepts.hpp:52
BlockTensorView whose stored dense blocks support eventual mutation.
Definition block_tensor_concepts.hpp:73
Single named backend or ordered backend list accepted by dispatch front ends.
Definition backend_selector.hpp:88
Operation-tag backend dispatch over tensor-view operands.
Definition cli.cpp:6
Definition linalg/async.hpp:28
backend_list(Backends...) -> backend_list< std::remove_cvref_t< Backends >... >
constexpr auto select_backend(Operation const &operation, FirstTensor const &, RestTensors const &...)
Select the default backend list for an operation on Tensor operands.
Definition backend_selector.hpp:252
void dispatch_kernel(BackendSelector &&selector, Op op, Args &&... args)
Normalize a selector and dispatch or report that every eligible backend declined.
Definition dispatch.hpp:374
Definition right_first_rabc.hpp:34
auto prepare_rabc_contract(linalg::backend_list< RightFirstRabcBackend< IntermediateStorage, ContractionSelector > > selector, Output const &output, Plan plan, A const &a, B const &b, C const &c)
Prepare the single right-first backend selected for fixed R/A/B/C operands.
Definition rabc_contraction.hpp:89
void rabc_contract(BackendSelector &&selector, Output &output, Plan const &plan, A const &a, B const &b, C const &c)
Execute a fixed-output sparse R/A/B/C contraction with an explicit backend selector.
Definition rabc_contraction.hpp:134
Sparse logical plans for R/A/B/C block contractions.
Operation tag for sparse R/A/B/C contraction dispatch.
Storage-domain right-first backend for sparse R/A/B/C contractions.
Ordered list of backend values tried by the dispatch walk.
Definition backend_selector.hpp:62
static auto select(tensor_network::rabc_contract_op const &, StorageSelector storage_selector)
Definition rabc_contraction.hpp:45
Uni20-owned operation-specific default for a storage policy.
Definition backend_selector.hpp:105
Executor that reuses right-first (B_b,C_c) intermediates.
Definition right_first_rabc.hpp:44
Fixed-output sparse R/A/B/C contraction operation tag.
Definition rabc_operation.hpp:18