pRC
multi-purpose Tensor Train library for C++
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 class Exclude<T, N, F, Sequence<Index, Es...>, Vs...>
18 : public Conditional<
19 IsAssignable<ResultOf<F,
20 ResultOf<pRC::Chip<Es...>, Vs, decltype(Es)...>...>>,
21 Assignable<T, N, Exclude<T, N, F, Sequence<Index, Es...>, Vs...>>,
22 View<T, N, Exclude<T, N, F, Sequence<Index, Es...>, Vs...>>>
23 {
24 static_assert(All<IsTensorView<Vs>...>());
25
26 private:
27 using Base = Conditional<
29 ResultOf<pRC::Chip<Es...>, Vs, decltype(Es)...>...>>,
31
32 public:
33 template<class... Xs, If<All<IsSame<Vs, RemoveReference<Xs>>...>> = 0>
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<class... Is, If<All<IsConvertible<Is, Index>...>> = 0,
43 If<IsSatisfied<(sizeof...(Is) == typename Base::Dimension())>> = 0>
44 constexpr decltype(auto) operator()(Is const... indices)
45 {
46 return operator()(Indices<typename Base::Dimension{}>(indices...),
48 makeRange<Index, sizeof...(Es), typename Base::Dimension{}>());
49 }
50
51 template<class... Is, If<All<IsConvertible<Is, Index>...>> = 0,
52 If<IsSatisfied<(sizeof...(Is) == typename Base::Dimension())>> = 0>
53 constexpr decltype(auto) operator()(Is const... indices) const
54 {
55 return operator()(Indices<typename Base::Dimension{}>(indices...),
57 makeRange<Index, sizeof...(Es), typename Base::Dimension{}>());
58 }
59
60 constexpr decltype(auto) operator()(
61 typename Base::Subscripts const &subscripts)
62 {
63 return this->call(subscripts);
64 }
65
66 constexpr decltype(auto) operator()(
67 typename Base::Subscripts const &subscripts) const
68 {
69 return this->call(subscripts);
70 }
71
72 private:
73 template<Index... IEs, Index... Ops, Index... IOs>
74 constexpr decltype(auto) operator()(
75 Indices<typename Base::Dimension{}> const &indices,
76 Sequence<Index, IEs...> const, Sequence<Index, Ops...> const,
77 Sequence<Index, IOs...> const)
78 {
79 return mF(chip<Es...>(get<Ops>(mArgs), indices[IEs]...)...)(
80 indices[IOs]...);
81 }
82
83 template<Index... IEs, Index... Ops, Index... IOs>
84 constexpr decltype(auto) operator()(
85 Indices<typename Base::Dimension{}> const &indices,
86 Sequence<Index, IEs...> const, Sequence<Index, Ops...> const,
87 Sequence<Index, IOs...> const) const
88 {
89 return mF(chip<Es...>(get<Ops>(mArgs), indices[IEs]...)...)(
90 indices[IOs]...);
91 }
92
93 private:
94 F mF;
95 tuple<Vs...> mArgs;
96 };
97}
98#endif // pRC_CORE_TENSOR_VIEWS_EXCLUDE_H
Definition indices.hpp:15
Definition sequence.hpp:34
Definition assignable.hpp:22
constexpr decltype(auto) operator()(Is const ... indices)
Definition exclude.hpp:44
constexpr decltype(auto) operator()(Is const ... indices) const
Definition exclude.hpp:53
Definition exclude.hpp:14
Definition type_traits.hpp:32
Definition diagonal.hpp:11
std::conjunction< Bs... > All
Definition type_traits.hpp:77
static constexpr auto makeSeriesFor()
Definition sequence.hpp:367
std::invoke_result_t< F, Args... > ResultOf
Definition type_traits.hpp:140
std::enable_if_t< B{}, int > If
Definition type_traits.hpp:68
static constexpr auto makeRange()
Definition sequence.hpp:389
std::is_assignable< T, U > IsAssignable
Definition type_traits.hpp:146
Constant< Bool, B > IsSatisfied
Definition type_traits.hpp:71
static constexpr Conditional< IsSatisfied< C >, RemoveConstReference< X >, X > copy(X &&a)
Definition copy.hpp:13
Sequence(std::integer_sequence< T, Seq... > const) -> Sequence< T, Seq... >
std::conditional_t< B{}, T, F > Conditional
Definition type_traits.hpp:131
Size Index
Definition type_traits.hpp:21
Definition chip.hpp:13