cMHN 1.2
C++ library for learning MHNs with pRC
Loading...
Searching...
No Matches
reduce.hpp
Go to the documentation of this file.
1// SPDX-License-Identifier: BSD-2-Clause
2
3#ifndef pRC_CORE_TENSOR_FUNCTIONS_REDUCE_H
4#define pRC_CORE_TENSOR_FUNCTIONS_REDUCE_H
5
9
10namespace pRC
11{
12 template<class F, Index... Is, class X, IsTensorish R = RemoveReference<X>,
13 class E = ResultOf<X, typename R::Subscripts>>
14 requires(sizeof...(Is) <= R::Dimension && max(Is...) < R::Dimension) &&
15 IsInvocable<F, E, E> &&
16 IsInvocable<F, decltype(F::template Identity<typename R::Type>()), E> &&
17 requires { chip<Is...>(typename R::Sizes()); }
18 static inline constexpr auto reduce(X &&a)
19 {
20 if constexpr(IsInvocable<View, X>)
21 {
24 using Sizes = decltype(chip<Is...>(typename R::Sizes()));
25
26 return TensorViews::Reduce<T, Sizes, F,
27 decltype(sort(Sequence<Index, Is...>())), V>(
28 view(forward<X>(a)));
29 }
30 else
31 {
32 return eval(reduce<F, Is...>(a));
33 }
34 }
35
36 template<class F, class X, IsTensorish R = RemoveReference<X>,
37 class E = ResultOf<X, typename R::Subscripts>>
38 requires IsInvocable<F, E, E> &&
39 IsInvocable<F, decltype(F::template Identity<typename R::Type>()), E>
40 static inline constexpr auto reduce(X &&a)
41 {
42 if constexpr(R::Dimension == 0)
43 {
44 if constexpr(!IsInvocable<View, X>)
45 {
46 return eval(forward<X>(a));
47 }
48 else
49 {
50 return view(forward<X>(a));
51 }
52 }
53 else
54 {
56 [&a](auto const... seq)
57 {
58 return reduce<F, seq...>(forward<X>(a));
59 });
60 }
61 }
62}
63#endif // pRC_CORE_TENSOR_FUNCTIONS_REDUCE_H
Definition value.hpp:12
Definition sequence.hpp:29
Definition reduce.hpp:14
Definition concepts.hpp:31
pRC::Float<> T
Definition externs_nonTT.hpp:1
Definition cholesky.hpp:10
Size Index
Definition basics.hpp:32
std::remove_reference_t< T > RemoveReference
Definition basics.hpp:41
static constexpr decltype(auto) view(X &&a)
Definition view.hpp:13
Sequence< Size, Ns... > Sizes
Definition sequence.hpp:100
static constexpr auto makeSeries()
Definition sequence.hpp:390
static constexpr auto reduce(Sequence< T, I1, I2, Is... > const)
Definition sequence.hpp:458
static constexpr auto chip(Sequence< T, Is... > const)
Definition sequence.hpp:584
RemoveConst< RemoveReference< T > > RemoveConstReference
Definition basics.hpp:47
static constexpr decltype(auto) expand(Sequence< T, Seq... > const, F &&f, Xs &&...args)
Definition sequence.hpp:383
static constexpr void sort(C const &compare, T &a, Size const k=T::size(), Size const d=0)
Definition sort.hpp:15
static constexpr decltype(auto) eval(X &&a)
Definition eval.hpp:12
static constexpr decltype(auto) max(X &&a)
Definition max.hpp:13