DUNE-ACFEM (unstable)

operationpair.hh
1#ifndef __DUNE_ACFEM_EXPRESSIONS_OPERATIONPAIR_HH__
2#define __DUNE_ACFEM_EXPRESSIONS_OPERATIONPAIR_HH__
3
4#include "treeoperand.hh"
5#include "complexity.hh"
6
7namespace Dune::ACFem::Expressions {
8
12 template<class S, class E, class Pos>
13 struct TreeData
14 {
15 using Sign = S;
16 using Operand = E;
17 using Position = Pos;
18 };
19
23 template<class S, class F, class TreeData0, class TreeData1, class OptimizeTag = OptimizeTop>
25 {
26 using Sign = S;
27 using FunctorType = F;
28 using TreeNode0 = TreeData0;
29 using TreeNode1 = TreeData1;
30 using Tag = OptimizeTag;
31 };
32
33 template<class T, class SFINAE = void>
34 constexpr inline bool IsTreeDataV = false;
35
36 template<class Sign, class E, class Pos>
37 constexpr inline bool IsTreeDataV<TreeData<Sign, E, Pos> > = true;
38
42 template<class S, class F, class... TreeData0, class TreeData1, class OptimizeTag>
43 struct OperationPair<S, F, MPL::TypeTuple<TreeData0...>, TreeData1, OptimizeTag>
44 {
45 using Sign = S;
46 using FunctorType = F;
47 using TreeNode0 = MPL::TypeTuple<TreeData0...>;
48 using TreeNode1 = TreeData1;
49 using Tag = OptimizeTag;
50 };
51
55 template<class S, class F, class TreeData0, class... TreeData1, class OptimizeTag>
56 struct OperationPair<S, F, TreeData0, MPL::TypeTuple<TreeData1...>, OptimizeTag>
57 {
58 using Sign = S;
59 using FunctorType = F;
60 using TreeNode0 = TreeData0;
61 using TreeNode1 = MPL::TypeTuple<TreeData1...>;
62 using Tag = OptimizeTag;
63 };
64
65 template<class T, class SFINAE = void>
66 constexpr inline bool IsOperationPairV = false;
67
68 template<class Sign, class InnerF, class TreeData0, class TreeData1, class OptimizeTag>
69 constexpr inline bool IsOperationPairV<OperationPair<Sign, InnerF, TreeData0, TreeData1, OptimizeTag> > = true;
70
71 template<class F, class Node>
72 struct MergeTreeNodeSignHelper;
73
74 template<class OuterSign, class Sign, class E, class Pos>
75 struct MergeTreeNodeSignHelper<OuterSign, TreeData<Sign, E, Pos> >
76 {
78 };
79
80 template<class OuterSign, class Sign, class F, class TreeData0, class TreeData1, class OptimizeTag>
81 struct MergeTreeNodeSignHelper<OuterSign, OperationPair<Sign, F, TreeData0, TreeData1, OptimizeTag> >
82 {
83 using Type = OperationPair<NestedSumFunctor<OuterSign, Sign>, F, TreeData0, TreeData1, OptimizeTag>;
84 };
85
86 template<class Sign, class... Node>
87 struct MergeTreeNodeSignHelper<Sign, MPL::TypeTuple<Node...> >
88 {
89 using Type = MPL::TypeTuple<typename MergeTreeNodeSignHelper<Sign, Node>::Type...>;
90 };
91
96 template<class Sign, class Node>
97 using MergeTreeNodeSign = typename MergeTreeNodeSignHelper<Sign, Node>::Type;
98
99 template<class F, class Node>
100 struct SetTreeNodeSignHelper;
101
102 template<class OuterSign, class Sign, class E, class Pos>
103 struct SetTreeNodeSignHelper<OuterSign, TreeData<Sign, E, Pos> >
104 {
105 using Type = TreeData<OuterSign, E, Pos>;
106 };
107
108 template<class OuterSign, class Sign, class F, class TreeData0, class TreeData1, class OptimizeTag>
109 struct SetTreeNodeSignHelper<OuterSign, OperationPair<Sign, F, TreeData0, TreeData1, OptimizeTag> >
110 {
111 using Type = OperationPair<OuterSign, F, TreeData0, TreeData1, OptimizeTag>;
112 };
113
114 template<class Sign, class... Node>
115 struct SetTreeNodeSignHelper<Sign, MPL::TypeTuple<Node...> >
116 {
117 using Type = MPL::TypeTuple<typename SetTreeNodeSignHelper<Sign, Node>::Type...>;
118 };
119
123 template<class Sign, class Node>
124 using SetTreeNodeSign = typename SetTreeNodeSignHelper<Sign, Node>::Type;
125
126 template<class T>
127 struct PositiveTreeNodeHelper;
128
129 template<class Sign, class E, class Pos>
130 struct PositiveTreeNodeHelper<TreeData<Sign, E, Pos> >
131 {
132 using Type = TreeData<PlusFunctor, E, Pos>;
133 };
134
135 template<class Sign, class F, class TreeData0, class TreeData1, class OptimizeTag>
136 struct PositiveTreeNodeHelper<OperationPair<Sign, F, TreeData0, TreeData1, OptimizeTag> >
137 {
138 using Type = OperationPair<PlusFunctor, F, TreeData0, TreeData1, OptimizeTag>;
139 };
140
141 template<class... Node>
142 struct PositiveTreeNodeHelper<MPL::TypeTuple<Node...> >
143 {
144 using Type = MPL::TypeTuple<typename PositiveTreeNodeHelper<Node>::Type...>;
145 };
146
147 template<class Node>
148 using PositiveTreeNode = typename PositiveTreeNodeHelper<Node>::Type;
149
150 template<class T>
151 struct NegativeTreeNodeHelper;
152
153 template<class Sign, class E, class Pos>
154 struct NegativeTreeNodeHelper<TreeData<Sign, E, Pos> >
155 {
156 using Type = TreeData<MinusFunctor, E, Pos>;
157 };
158
159 template<class Sign, class F, class TreeData0, class TreeData1, class OptimizeTag>
160 struct NegativeTreeNodeHelper<OperationPair<Sign, F, TreeData0, TreeData1, OptimizeTag> >
161 {
162 using Type = OperationPair<MinusFunctor, F, TreeData0, TreeData1, OptimizeTag>;
163 };
164
165 template<class Node>
166 using NegativeTreeNode = typename NegativeTreeNodeHelper<Node>::Type;
167
168 template<class Node>
169 constexpr inline bool IsPositiveTreeNodeV = std::is_same<typename Node::Sign, PlusFunctor>::value;
170
171 template<class T>
172 constexpr inline bool IsSimpleTreeNodeV = false;
173
174 template<class S, class E, class Pos>
175 constexpr inline bool IsSimpleTreeNodeV<TreeData<S, E, Pos> > = true;
176
177 template<class S, class F, class TreeData0, class TreeData1, class OptimizeTag>
178 constexpr inline bool IsSimpleTreeNodeV<OperationPair<S, F, TreeData0, TreeData1, OptimizeTag> > =
179 IsSimpleTreeNodeV<TreeData0> && IsSimpleTreeNodeV<TreeData1>;
180
181 template<class T, class SFINAE = void>
182 struct TreeExpressionHelper
183 {};
184
185 template<class T>
186 using TreeExpression = typename TreeExpressionHelper<T>::Type;
187
188 template<class S, class E, class Pos>
189 struct TreeExpressionHelper<TreeData<S, E, Pos> >
190 {
191 using Type = E;
192 };
193
194 template<class S, class F, class TreeData0, class TreeData1, class OptimizeTag>
195 struct TreeExpressionHelper<
196 OperationPair<S, F, TreeData0, TreeData1, OptimizeTag>,
197 std::enable_if_t<IsSimpleTreeNodeV<TreeData0> && IsSimpleTreeNodeV<TreeData1> >
198 >
199 {
200 using Type = ExpressionType<OptimizeTag, F, TreeExpression<TreeData0>, TreeExpression<TreeData1> >;
201 };
202
204
205 template<class TreeNode>
206 constexpr inline std::size_t ComplexityV<TreeNode, std::enable_if_t<IsSimpleTreeNodeV<TreeNode> > > =
207 ComplexityV<TreeExpression<TreeNode> >;
208
209 template<class S, class F, class TreeData0, class TreeData1, class OptimizeTag>
210 constexpr inline std::size_t ComplexityV<
211 OperationPair<S, F, TreeData0, TreeData1, OptimizeTag>,
212 std::enable_if_t<!IsSimpleTreeNodeV<TreeData0> || !IsSimpleTreeNodeV<TreeData1> > > =
213 1 + ComplexityV<TreeData0> + ComplexityV<TreeData1>;
214
219 template<class Arg0, class... Arg>
220 constexpr inline std::size_t ComplexityV<MPL::TypeTuple<Arg0, Arg...> > =
221 (ComplexityV<Arg0> + ... + ComplexityV<Arg>) + sizeof...(Arg) + 1UL - IsPositiveTreeNodeV<Arg0>;
222
224
225 template<class TreeNode>
226 constexpr inline std::size_t ExpressionWeightV<TreeNode, std::enable_if_t<IsSimpleTreeNodeV<TreeNode> > > =
227 ExpressionWeightV<TreeExpression<TreeNode> >;
228
229 template<class S, class F, class TreeData0, class TreeData1, class OptimizeTag>
230 constexpr inline std::size_t ExpressionWeightV<
231 OperationPair<S, F, TreeData0, TreeData1, OptimizeTag>,
232 std::enable_if_t<!IsSimpleTreeNodeV<TreeData0> || !IsSimpleTreeNodeV<TreeData1> > > =
233 Policy::WeightDefaultV + ExpressionWeightV<TreeData0> + ExpressionWeightV<TreeData1>;
234
239 template<class Arg0, class... Arg>
240 constexpr inline std::size_t ExpressionWeightV<MPL::TypeTuple<Arg0, Arg...> > =
241 (ExpressionWeightV<Arg0> + ... + ExpressionWeightV<Arg>) + Policy::WeightDefaultV * (sizeof...(Arg) + 1UL - IsPositiveTreeNodeV<Arg0>);
242
244
245 namespace impl {
246
247 template<class F, class E, class Pos>
248 struct ExpressionFunctor<TreeData<F, E, Pos> >
249 {
250 using Type = Functor<E>;
251 };
252
253 template<class Sign, class Functor, class TreeData0, class TreeData1, class OptimizeTag>
254 struct ExpressionFunctor<OperationPair<Sign, Functor, TreeData0, TreeData1, OptimizeTag> >
255 {
256 using Type = Functor;
257 };
258
259 }
260
261} // Dune::ACFem::Expressions::
262
263#endif // __DUNE_ACFEM_EXPRESSIONS_OPERATIONPAIR_HH__
STL namespace.
Collect sign, operation and data-types of the operands for a binary operation.
Definition: operationpair.hh:25
Optimization pattern disambiguation struct.
Definition: optimizationbase.hh:42
Collect type, sign and the position in an expression of one operand.
Definition: operationpair.hh:14
Creative Commons License   |  Legal Statements / Impressum  |  Hosted by TU Dresden  |  generated with Hugo v0.111.3 (Jul 15, 22:36, 2024)