Uni20
Asynchronous tensor and runtime library.
Loading...
Searching...
No Matches
conjugate_accessor.hpp
Go to the documentation of this file.
1#pragma once
2
10#include <uni20/core/math.hpp>
13
14#include <concepts>
15#include <type_traits>
16#include <utility>
17
18namespace uni20
19{
20namespace detail
21{
22
23struct conjugate_function
24{
25 template <uni20::Complex C>
26 [[nodiscard]] UNI20_HOST_DEVICE constexpr auto operator()(C const& value) const -> C
27 {
28 return uni20::conj(value);
29 }
30
31 template <class Value>
33 [[nodiscard]] UNI20_HOST_DEVICE constexpr decltype(auto) operator()(Value&& value) const
34 {
35 return conj(static_cast<Value&&>(value));
36 }
37};
38
39} // namespace detail
40
42template <class Accessor> struct accessor_applies_conjugation : std::false_type
43{};
44
46template <class Accessor>
47inline constexpr bool accessor_applies_conjugation_v =
49
51template <class Mdspan>
52inline constexpr bool mdspan_needs_conjugation_v =
53 accessor_applies_conjugation_v<typename std::remove_cvref_t<Mdspan>::accessor_type>;
54
60template <AccessorPolicy Accessor>
63 public:
64 using wrapped_accessor_type = Accessor;
65 using value_type = std::remove_cv_t<typename Accessor::element_type>;
66 using element_type = value_type const;
67 using reference = std::invoke_result_t<detail::conjugate_function, typename Accessor::reference>;
68 using data_handle_type = typename Accessor::data_handle_type;
71
73 requires std::default_initializable<Accessor>
74 : accessor_{}
75 {}
76
78 UNI20_HOST_DEVICE constexpr explicit conjugated_accessor(Accessor accessor)
79 : accessor_(static_cast<Accessor&&>(accessor))
80 {}
81
84 {
85 return detail::conjugate_function{}(accessor_.access(ptr, offset));
86 }
87
90 {
91 return accessor_.offset(ptr, offset);
92 }
93
95 [[nodiscard]] UNI20_HOST_DEVICE constexpr auto wrapped_accessor() const& -> Accessor const& { return accessor_; }
96
98 [[nodiscard]] UNI20_HOST_DEVICE constexpr auto wrapped_accessor() && -> Accessor
99 {
100 return static_cast<Accessor&&>(accessor_);
101 }
102
103 private:
104 [[no_unique_address]] Accessor accessor_{};
105};
106
107template <AccessorPolicy Accessor> struct accessor_applies_conjugation<conjugated_accessor<Accessor>> : std::true_type
108{};
109
111template <AccessorPolicy Accessor, class Domain>
112inline constexpr bool enable_accessor_in_domain<conjugated_accessor<Accessor>, Domain> =
113 enable_accessor_in_domain<Accessor, Domain>;
114
116template <MdspanLike Span>
118 !accessor_applies_conjugation_v<typename std::remove_cvref_t<Span>::accessor_type>)
119[[nodiscard]] constexpr auto conj(Span const& span)
120{
121 auto accessor = conjugated_accessor{const_accessor(span.accessor())};
122 using accessor_type = decltype(accessor);
123 using extents_type = typename Span::extents_type;
124 using layout_type = typename Span::layout_type;
125 using element_type = typename accessor_type::element_type;
126
127 return stdex::mdspan<element_type, extents_type, layout_type, accessor_type>{span.data_handle(), span.mapping(),
128 std::move(accessor)};
129}
130
132template <MdspecLike Span>
134 !accessor_applies_conjugation_v<typename std::remove_cvref_t<Span>::accessor_type>)
135[[nodiscard]] constexpr auto conj(Span const& span)
136{
137 auto accessor = conjugated_accessor{const_accessor(span.accessor())};
138 using accessor_type = decltype(accessor);
139 using extents_type = typename Span::extents_type;
140 using layout_type = typename Span::layout_type;
141 using element_type = typename accessor_type::element_type;
142 using descriptor_type = typename Span::data_descriptor_type;
143
145 span.data_descriptor(), span.mapping(), std::move(accessor)};
146}
147
149template <MdspanLike Span>
151 accessor_applies_conjugation_v<typename std::remove_cvref_t<Span>::accessor_type>)
152[[nodiscard]] constexpr auto conj(Span const& span)
153{
154 auto accessor = span.accessor().wrapped_accessor();
155 using accessor_type = decltype(accessor);
156 using extents_type = typename Span::extents_type;
157 using layout_type = typename Span::layout_type;
158 using element_type = typename accessor_type::element_type;
159
160 return stdex::mdspan<element_type, extents_type, layout_type, accessor_type>{span.data_handle(), span.mapping(),
161 std::move(accessor)};
162}
163
165template <MdspecLike Span>
167 accessor_applies_conjugation_v<typename std::remove_cvref_t<Span>::accessor_type>)
168[[nodiscard]] constexpr auto conj(Span const& span)
169{
170 auto accessor = span.accessor().wrapped_accessor();
171 using accessor_type = decltype(accessor);
172 using extents_type = typename Span::extents_type;
173 using layout_type = typename Span::layout_type;
174 using element_type = typename accessor_type::element_type;
175 using descriptor_type = typename Span::data_descriptor_type;
176
178 span.data_descriptor(), span.mapping(), std::move(accessor)};
179}
180
182template <MdspanLike Span>
184[[nodiscard]] constexpr auto conj(Span const& span)
185{
186 auto accessor = const_accessor(span.accessor());
187 using accessor_type = decltype(accessor);
188 using extents_type = typename Span::extents_type;
189 using layout_type = typename Span::layout_type;
190 using element_type = typename accessor_type::element_type;
191
192 return stdex::mdspan<element_type, extents_type, layout_type, accessor_type>{span.data_handle(), span.mapping(),
193 std::move(accessor)};
194}
195
197template <MdspecLike Span>
199[[nodiscard]] constexpr auto conj(Span const& span)
200{
201 auto accessor = const_accessor(span.accessor());
202 using accessor_type = decltype(accessor);
203 using extents_type = typename Span::extents_type;
204 using layout_type = typename Span::layout_type;
205 using element_type = typename accessor_type::element_type;
206 using descriptor_type = typename Span::data_descriptor_type;
207
209 span.data_descriptor(), span.mapping(), std::move(accessor)};
210}
211
212} // namespace uni20
Ordered domain spaces of a tensor morphism.
Definition morphism_boundary.hpp:24
Read-only accessor that returns uni20::conj of the wrapped accessor value.
Definition conjugate_accessor.hpp:62
UNI20_HOST_DEVICE constexpr data_handle_type offset(data_handle_type ptr, offset_type offset) const
Delegate handle offsetting to the wrapped accessor.
Definition conjugate_accessor.hpp:89
UNI20_HOST_DEVICE constexpr conjugated_accessor(Accessor accessor)
Construct from the accessor whose values should be conjugated on read.
Definition conjugate_accessor.hpp:78
UNI20_HOST_DEVICE constexpr auto wrapped_accessor() const &-> Accessor const &
Return the wrapped accessor.
Definition conjugate_accessor.hpp:95
UNI20_HOST_DEVICE constexpr reference access(data_handle_type ptr, offset_type offset) const
Return the conjugated value at a handle-relative offset.
Definition conjugate_accessor.hpp:83
std::remove_cv_t< typename Accessor::element_type > value_type
Definition conjugate_accessor.hpp:65
UNI20_HOST_DEVICE constexpr auto wrapped_accessor() &&-> Accessor
Move out the wrapped accessor.
Definition conjugate_accessor.hpp:98
UNI20_HOST_DEVICE constexpr conjugated_accessor()
Definition conjugate_accessor.hpp:72
typename Accessor::data_handle_type data_handle_type
Definition conjugate_accessor.hpp:68
value_type const element_type
Definition conjugate_accessor.hpp:66
std::invoke_result_t< detail::conjugate_function, typename Accessor::reference > reference
Definition conjugate_accessor.hpp:67
span_offset_t< Accessor > offset_type
Definition conjugate_accessor.hpp:70
Accessor wrapped_accessor_type
Definition conjugate_accessor.hpp:64
Store a data descriptor with the mapping and accessor for an eventual mdspan.
Definition mdspec.hpp:31
constexpr auto data_descriptor() noexcept -> data_descriptor_type &
Return the descriptor used to acquire writable data access.
Definition mdspec.hpp:77
Project compiler annotations shared by host and device code.
#define UNI20_HOST_DEVICE
Definition compiler_attributes.hpp:12
Concept for complex scalar types.
Definition scalar_concepts.hpp:75
locale_t value
Definition data_table.cpp:49
uni20::complex< T > conj(detail::standard_complex< T > x)
Returns the complex conjugate for complex-valued scalars.
Definition math.hpp:70
typename span_offset_type< AP >::type span_offset_t
Convenience alias for accessor_offset_type<AP>::type.
Definition mdspan/concepts.hpp:48
constexpr stdex::default_accessor< T const > const_accessor(stdex::default_accessor< T > const &accessor_policy)
Wrap a default_accessor<T> into a const_default_accessor<T>.
Definition mdspan/concepts.hpp:160
Scalar math helper utilities.
Mdspan concept and accessor extensions for Uni20.
Mdspan-shaped metadata for storage whose data handle requires acquisition.
Definition qnum.hpp:403
Definition async/async.hpp:26
constexpr bool accessor_applies_conjugation_v
True when an accessor presents conjugated values.
Definition conjugate_accessor.hpp:47
constexpr bool mdspan_needs_conjugation_v
True when an mdspan-like type's accessor presents conjugated values.
Definition conjugate_accessor.hpp:52
std::size_t span
Definition presentation.cpp:2017
Trait used by mdspan accessors that present conjugated values on read.
Definition conjugate_accessor.hpp:43