1#ifndef __DUNE_ACFEM_TENSORS_OPTIMIZATION_RESTRICTION_HH__
2#define __DUNE_ACFEM_TENSORS_OPTIMIZATION_RESTRICTION_HH__
4#include "../../expressions/optimizegeneral.hh"
5#include "../expressionoperations.hh"
6#include "../modules.hh"
7#include "../operations/restriction.hh"
13 namespace Expressions {
15 template<
class DefectPositions,
class PivotSequence,
class T>
16 constexpr inline bool IsUnaryZeroV<
17 OperationTraits<RestrictionOperation<DefectPositions, PivotSequence> >,
19 && TensorTraits<T>::isZero(PivotSequence{}, DefectPositions{}));
25 namespace Optimization::Restriction {
27 using RestrictionTag = OptimizeNext<Policy::DefaultOptimizationTag>;
29 template<
class DefectPositions,
class PivotSequence,
class T>
30 constexpr auto zero(OperationTraits<RestrictionOperation<DefectPositions, PivotSequence> >, T&&)
32 using Signature =
typename TensorTraits<T>::Signature;
33 using DefectSignature = SequenceSliceComplement<Signature, DefectPositions>;
35 DUNE_ACFEM_EXPRESSION_RESULT(
36 zeros(DefectSignature{}, Disclosure{})
41 template<
class F,
class T>
42 constexpr inline bool IsConstRestrictionOfConstRestrictionV =
false;
44 template<
class DefectPositions,
class PivotSequence,
class T>
45 constexpr inline bool IsConstRestrictionOfConstRestrictionV<
46 OperationTraits<RestrictionOperation<DefectPositions, PivotSequence> >,
48 && IsConstRestriction<T>::value);
51 template<
class F,
class T, std::enable_if_t<IsConstRestrictionOfConstRestrictionV<std::decay_t<F>, T>,
int> = 0>
52 constexpr decltype(
auto) operate(RestrictionTag, F&&, T&& t)
54 DUNE_ACFEM_RECORD_OPTIMIZATION;
56 using OuterTraits = RestrictionTraits<std::decay_t<F> >;
57 using InnerTraits = RestrictionTraits<Operation<T> >;
58 using OuterDefects =
typename OuterTraits::DefectPositions;
59 using OuterPivots =
typename OuterTraits::PivotSequence;
60 using InnerDefects =
typename InnerTraits::DefectPositions;
61 using InnerPivots =
typename InnerTraits::PivotSequence;
63 using MergedDefects = JoinedDefects<InnerDefects, OuterDefects>;
64 using Injects = JoinedInjections<InnerDefects, OuterDefects>;
65 using MergedPivots = InsertAt<InnerPivots, OuterPivots, Injects>;
67 DUNE_ACFEM_EXPRESSION_RESULT(
68 (operate<RestrictionOperation<MergedDefects, MergedPivots> >(
69 std::forward<T>(t).operand(0_c)
71 ,
"merge restrictions"
75 template<
class F,
class T>
76 constexpr inline bool IsNonConstRestrictionOfNonConstRestrictionV =
false;
78 template<std::size_t D0, std::size_t... DRest,
class T>
79 constexpr inline bool IsNonConstRestrictionOfNonConstRestrictionV<
80 OperationTraits<RestrictionOperation<Seq<D0, DRest...>, Seq<> > >,
81 T> = (IsDynamicRestriction<T>::value
82 && !std::is_reference<Operand<0, T> >::value);
85 template<
class F,
class T, std::enable_if_t<IsNonConstRestrictionOfNonConstRestrictionV<F, T>,
int> = 0>
86 constexpr decltype(
auto) operate(RestrictionTag, F&& f, T&& t)
88 DUNE_ACFEM_RECORD_OPTIMIZATION;
90 using OuterTraits = RestrictionTraits<std::decay_t<F> >;
91 using InnerTraits = RestrictionTraits<Operation<T> >;
92 using InnerDefects =
typename InnerTraits::DefectPositions;
93 using OuterDefects =
typename OuterTraits::DefectPositions;
95 using MergedDefects = JoinedDefects<InnerDefects, OuterDefects>;
96 using Injects = JoinedInjections<InnerDefects, OuterDefects>;
98 auto at =
insertAt(std::forward<T>(t).lookAt(), f.pivotIndices_, Injects{});
100 DUNE_ACFEM_EXPRESSION_RESULT(
101 operate(OperationTraits<RestrictionOperation<MergedDefects, Seq<> > >(at), std::move(std::forward<T>(t)).operand(0_c))
102 ,
"merge non-const restrictions"
106 template<
class F,
class T>
107 constexpr inline bool IsConstRestrictionOfEyeV =
false;
109 template<
class DefectPositions,
class PivotSequence,
class T>
110 constexpr inline bool IsConstRestrictionOfEyeV<
111 OperationTraits<RestrictionOperation<DefectPositions, PivotSequence> >,
122 template<
class F,
class T, std::enable_if_t<IsConstRestrictionOfEyeV<F, T>,
int> = 0>
123 constexpr auto operate(OptimizeTerminal1, F&&, T&& t)
125 DUNE_ACFEM_RECORD_OPTIMIZATION;
127 using Traits = RestrictionTraits<std::decay_t<F> >;
128 using DefectPositions =
typename Traits::DefectPositions;
129 using PivotSequence =
typename Traits::PivotSequence;
130 using Signature =
typename TensorTraits<T>::Signature;
131 using DefectSignature = SequenceSliceComplement<Signature, DefectPositions>;
132 using ValueType =
typename std::decay_t<T>::ValueType;
135 DUNE_ACFEM_EXPRESSION_RESULT(
136 (KroneckerDelta<DefectSignature,
MakeConstantSequence<defectRank, Head<PivotSequence>::value>, ValueType>{})
137 ,
"non-zero restriction of eye"
141 template<
class F,
class T>
142 constexpr inline bool IsConstRestrictionOfBlockEyeV =
false;
144 template<
class DefectPositions,
class PivotSequence,
class T>
145 constexpr inline bool IsConstRestrictionOfBlockEyeV<
146 OperationTraits<RestrictionOperation<DefectPositions, PivotSequence> >,
148 && IsBlockEye<T>::value
149 && IsBlockEyePositionsV<DefectPositions, BlockEyeTraits<T>::blockRank_,
typename BlockEyeTraits<T>::BlockSignature>);
167 template<
class F,
class T, std::enable_if_t<IsConstRestrictionOfBlockEyeV<F, T>,
int> = 0>
168 constexpr auto operate(OptimizeTerminal1, F&&, T&& t)
170 DUNE_ACFEM_RECORD_OPTIMIZATION;
172 using OperandType = std::decay_t<T>;
173 using Signature =
typename OperandType::Signature;
174 using Traits = RestrictionTraits<std::decay_t<F> >;
175 using DefectPositions =
typename Traits::DefectPositions;
176 using PivotSequence =
typename Traits::PivotSequence;
177 using DefectSignature = SequenceSliceComplement<Signature, DefectPositions>;
179 using ValueType =
typename OperandType::ValueType;
182 using BlockSignature =
typename BlockEyeTraits<OperandType>::BlockSignature;
185 static_assert(defectRank % blockSize == 0,
186 "Internal template specialization error: rank of resulting KroneckerDelta must be a multiple of the BlockSignature size.");
188 constexpr std::size_t numBlocks = defectRank / blockSize;
191 using PivotBlock = HeadPart<blockSize, PivotSequence>;
194 using KroneckerPivots = SequenceProd<numBlocks, PivotBlock>;
196 DUNE_ACFEM_EXPRESSION_RESULT(
197 (KroneckerDelta<DefectSignature, KroneckerPivots, ValueType>{})
198 ,
"non-zero restriction of block-eye"
208 namespace Expressions {
210 using Tensor::Optimization::Restriction::operate;
constexpr auto zero(T &&t)
Use the zero fraction as canonical zero element for scalars.
Definition: constantoperations.hh:80
constexpr std::size_t size()
Gives the number of elements in tuple-likes and std::integer_sequence.
Definition: size.hh:73
MakeIndexSequence< N, Value, 0 > MakeConstantSequence
Generate a constant index sequence of the given size.
Definition: generators.hh:45
auto insertAt(SrcTuple &&src, DataTuple &&data, BoolConstant< AssumeSorted >=BoolConstant< AssumeSorted >{})
Insert the elements of data at positions given by pos into src in turn.
Definition: subtuple.hh:106
constexpr bool isConstant(Sequence< T, T0, Ts... >)
Definition: compare.hh:285