DUNE-ACFEM (unstable)

reassemblesum.hh
1#ifndef __DUNE_ACFEM_EXPRESSIONS_REASSEMBLESUM_HH__
2#define __DUNE_ACFEM_EXPRESSIONS_REASSEMBLESUM_HH__
3
4#include "explodesum.hh"
5
6namespace Dune::ACFem::Expressions {
7
8 namespace Sums {
9
11 template<class OptimizeTag, class Left, class Right, class SFINAE = void>
13 {
14 using LF = typename Left::Sign;
15 using RF = typename Right::Sign;
16 using Functor = NestedSumFunctor<LF, RF>;
18 };
19
21 template<class OptimizeTag, class Left, class Right>
22 struct AddNodesHelper<OptimizeTag, Left, Right,
23 std::enable_if_t<FunctorHas<IsMinusOperation, typename Left::Sign>::value> >
24 {
25 using LF = typename Left::Sign;
26 using RF = typename Right::Sign;
27 using Functor = NestedSumFunctor<LF, RF>;
29 };
30
34 template<class OptimizeTag, class Left, class Right>
35 using AddNodes = typename AddNodesHelper<OptimizeTag, Left, Right>::Type;
36
37 template<class OptimizeTag, class Pos, class Min, class TryNode, class Candidates, class SFINAE = void>
38 struct MinimizeOneHelper;
39
40 // Start the search
41 template<class OptimizeTag, class TryNode, class Cand0, class... CandRest>
42 struct MinimizeOneHelper<OptimizeTag, TreePosition<0, 1>, void, TryNode, MPL::TypeTuple<Cand0, CandRest...> >
43 {
44 using Type = typename MinimizeOneHelper<OptimizeTag, TreePosition<0, 2>, MPL::TypePair<TreePosition<0, 1>, AddNodes<OptimizeTag, TryNode, Cand0> >, TryNode, MPL::TypeTuple<CandRest...> >::Type;
45 };
46
47 // replace current minimum
48 template<class OptimizeTag, std::size_t Row, std::size_t Col, class ArgMin, class MinNode, class TryNode, class Cand0, class... CandRest>
49 struct MinimizeOneHelper<OptimizeTag, TreePosition<Row, Col>, MPL::TypePair<ArgMin, MinNode>, TryNode, MPL::TypeTuple<Cand0, CandRest...>,
50 std::enable_if_t<(MinNode::complexity > AddNodes<OptimizeTag, TryNode, Cand0>::complexity)> >
51 {
52 using Type = typename MinimizeOneHelper<OptimizeTag, TreePosition<Row, Col+1>, MPL::TypePair<TreePosition<Row, Col>, AddNodes<OptimizeTag, TryNode, Cand0> >, TryNode, MPL::TypeTuple<CandRest...> >::Type;
53 };
54
55 // Keep current minimum
56 template<class OptimizeTag, std::size_t Row, std::size_t Col, class Min, class TryNode, class Cand0, class... CandRest>
57 struct MinimizeOneHelper<OptimizeTag, TreePosition<Row, Col>, Min, TryNode, MPL::TypeTuple<Cand0, CandRest...>,
58 std::enable_if_t<(Min::Second::complexity <= AddNodes<OptimizeTag, TryNode, Cand0>::complexity)> >
59 {
60 using Type = typename MinimizeOneHelper<OptimizeTag, TreePosition<Row, Col+1>, Min, TryNode, MPL::TypeTuple<CandRest...> >::Type;
61 };
62
63 // Recursion end-point.
64 template<class OptimizeTag, class Pos, class Min, class TryNode>
65 struct MinimizeOneHelper<OptimizeTag, Pos, Min, TryNode, MPL::TypeTuple<> >
66 {
67 using Type = Min;
68 };
69
71 template<class OptimizeTag, std::size_t N, class Min, class Try, class Rest>
72 using MinimizeOne = typename MinimizeOneHelper<OptimizeTag, TreePosition<N, N+1>, Min, Try, Rest>::Type;
73
74 template<class OptimizeTag, std::size_t N, class Min, class Candidates>
75 struct MinimizeAllHelper;
76
77 template<class OptimizeTag, std::size_t N, class Min, class Front, class... Rest>
78 struct MinimizeAllHelper<OptimizeTag, N, Min, MPL::TypeTuple<Front, Rest...> >
79 {
80 using Type = typename MinimizeAllHelper<OptimizeTag, N+1, MinimizeOne<OptimizeTag, N, Min, Front, MPL::TypeTuple<Rest...> >, MPL::TypeTuple<Rest...> >::Type;
81 };
82
83 template<class OptimizeTag, std::size_t N, class Min>
84 struct MinimizeAllHelper<OptimizeTag, N, Min, MPL::TypeTuple<> >
85 {
86 using Type = Min;
87 };
88
90 template<class OptimizeTag, class Explode>
91 using MinimizeAll = typename MinimizeAllHelper<OptimizeTag, 0, void, Explode>::Type;
92
98 template<class Min, class Explode, class Out = MPL::TypeTuple<>, std::size_t = 0, class SFINAE = void>
100
101 template<std::size_t N, std::size_t LeftPos, std::size_t RightPos, class MinNode, class Head, class... Rest, class... Out>
102 struct ReplaceByMinimum<MPL::TypePair<TreePosition<LeftPos, RightPos>, MinNode>, MPL::TypeTuple<Head, Rest...>, MPL::TypeTuple<Out...>, N, std::enable_if_t<(LeftPos != N && RightPos != N)> >
103 {
104 using Type = typename ReplaceByMinimum<MPL::TypePair<TreePosition<LeftPos, RightPos>, MinNode>, MPL::TypeTuple<Rest...>, MPL::TypeTuple<Out..., Head>, N+1>::Type;
105 };
106
107 template<std::size_t N, std::size_t RightPos, class MinNode, class Head, class... Rest, class Out>
108 struct ReplaceByMinimum<MPL::TypePair<TreePosition<N, RightPos>, MinNode>, MPL::TypeTuple<Head, Rest...>, Out, N>
109 {
110 using Type = typename ReplaceByMinimum<MPL::TypePair<TreePosition<N, RightPos>, MinNode>, MPL::TypeTuple<Rest...>, Out, N+1>::Type;
111 };
112
113 template<std::size_t N, std::size_t LeftPos, class MinNode, class Head, class... Rest, class Out>
114 struct ReplaceByMinimum<MPL::TypePair<TreePosition<LeftPos, N>, MinNode>, MPL::TypeTuple<Head, Rest...>, Out, N>
115 {
116 using Type = typename ReplaceByMinimum<MPL::TypePair<TreePosition<LeftPos, N>, MinNode>, MPL::TypeTuple<Rest...>, Out, N+1>::Type;
117 };
118
119 template<std::size_t N, class MinPos, class MinNode, class... Out>
120 struct ReplaceByMinimum<MPL::TypePair<MinPos, MinNode>, MPL::TypeTuple<>, MPL::TypeTuple<Out...>, N>
121 {
122 using Type = MPL::TypeTuple<Out..., MinNode>;
123 };
124
125 template<class OptimizeTag, class Explode>
126 struct ReassembleHelper
127 {
128 using Type = typename ReassembleHelper<OptimizeTag, typename ReplaceByMinimum<MinimizeAll<OptimizeTag, Explode>, Explode>::Type>::Type;
129 };
130
131 template<class OptimizeTag, class Sum>
132 struct ReassembleHelper<OptimizeTag, MPL::TypeTuple<Sum> >
133 {
134 using Type = Sum;
135 };
136
140 template<class Explode, class OptimizeTag = OptimizeTop>
141 using Reassemble = typename ReassembleHelper<OptimizeTag, Explode>::Type;
142
143 } // Sums::
144
145} // Dune::ACFem::Expressions::
146
147#endif // __DUNE_ACFEM_EXPRESSIONS_REASSEMBLESUM_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
Definition: reassemblesum.hh:13
Gets the type of the n-th element of a tuple-like or the std::integral_constant corresponding to the ...
Definition: access.hh:42
Creative Commons License   |  Legal Statements / Impressum  |  Hosted by TU Dresden & Uni Heidelberg  |  generated with Hugo v0.111.3 (Sep 4, 22:38, 2025)