cMHN 1.2
C++ library for learning MHNs with pRC
Loading...
Searching...
No Matches
exclude.hpp
Go to the documentation of this file.
1// SPDX-License-Identifier: BSD-2-Clause
2
3#ifndef pRC_CORE_TENSOR_VIEWS_EXCLUDE_H
4#define pRC_CORE_TENSOR_VIEWS_EXCLUDE_H
5
10
11namespace pRC::TensorViews
12{
13 template<class T, class N, class F, class E, class... Vs>
14 class Exclude;
15
16 template<class T, class N, class F, Index... Es, class... Vs>
17 requires(IsTensorView<Vs> && ...)
18 class Exclude<T, N, F, Sequence<Index, Es...>, Vs...>
19 : public Conditional<
21 ResultOf<pRC::Chip<Es...>, Vs, decltype(Es)...>...>>,
22 Assignable<T, N, Exclude<T, N, F, Sequence<Index, Es...>, Vs...>>,
23 View<T, N, Exclude<T, N, F, Sequence<Index, Es...>, Vs...>>>
24 {
25 private:
26 using Base = Conditional<
28 ResultOf<pRC::Chip<Es...>, Vs, decltype(Es)...>...>>,
30
31 public:
32 template<class... Xs>
33 requires(IsSame<Vs, RemoveReference<Xs>> && ...)
34 Exclude(F f, Xs &&...args)
35 : mF(forward<F>(f))
36 , mArgs(forward<Xs>(args)...)
37 {
38 }
39
40 using Base::operator=;
41
42 template<IsConvertible<Index>... Is>
43 requires(sizeof...(Is) == Base::Dimension)
44 constexpr decltype(auto) operator()(Is const... indices)
45 {
46 return this->call(indices...);
47 }
48
49 template<IsConvertible<Index>... Is>
50 requires(sizeof...(Is) == Base::Dimension)
51 constexpr decltype(auto) operator()(Is const... indices) const
52 {
53 return this->call(indices...);
54 }
55
56 constexpr decltype(auto) operator()(
57 typename Base::Subscripts const &subscripts)
58 {
59 return operator()(subscripts, makeSeriesFor<Index, Es...>(),
61 makeRange<Index, sizeof...(Es), Base::Dimension>());
62 }
63
64 constexpr decltype(auto) operator()(
65 typename Base::Subscripts const &subscripts) const
66 {
67 return operator()(subscripts, makeSeriesFor<Index, Es...>(),
69 makeRange<Index, sizeof...(Es), Base::Dimension>());
70 }
71
72 constexpr decltype(auto) operator[](Index const index) = delete;
73 constexpr decltype(auto) operator[](Index const index) const = delete;
74
75 private:
76 template<Index... IEs, Index... Ops, Index... IOs>
77 constexpr decltype(auto) operator()(
78 typename Base::Subscripts const &subscripts,
79 Sequence<Index, IEs...> const, Sequence<Index, Ops...> const,
80 Sequence<Index, IOs...> const)
81 {
82 return mF(chip<Es...>(get<Ops>(mArgs), subscripts[IEs]...)...)(
83 subscripts[IOs]...);
84 }
85
86 template<Index... IEs, Index... Ops, Index... IOs>
87 constexpr decltype(auto) operator()(
88 typename Base::Subscripts const &subscripts,
89 Sequence<Index, IEs...> const, Sequence<Index, Ops...> const,
90 Sequence<Index, IOs...> const) const
91 {
92 return mF(chip<Es...>(get<Ops>(mArgs), subscripts[IEs]...)...)(
93 subscripts[IOs]...);
94 }
95
96 private:
97 F mF;
98 Tuple<Vs...> mArgs;
99 };
100}
101#endif // pRC_CORE_TENSOR_VIEWS_EXCLUDE_H
Definition gtest_unittest.cc:5120
Definition value.hpp:12
Definition sequence.hpp:29
Definition assignable.hpp:21
Definition chip.hpp:18
Definition exclude.hpp:14
Definition declarations.hpp:20
Definition concepts.hpp:40
Definition concepts.hpp:28
Definition declarations.hpp:36
pRC::Float<> T
Definition externs_nonTT.hpp:1
Definition declarations.hpp:18
Definition cholesky.hpp:10
Size Index
Definition basics.hpp:32
static constexpr auto makeSeriesFor()
Definition sequence.hpp:399
std::tuple< Ts... > Tuple
Definition basics.hpp:23
std::invoke_result_t< F, Args... > ResultOf
Definition basics.hpp:59
static constexpr auto makeRange()
Definition sequence.hpp:421
static constexpr auto chip(Sequence< T, Is... > const)
Definition sequence.hpp:584
std::conditional_t< B, T, F > Conditional
Definition basics.hpp:56
Definition chip.hpp:12