22 #ifndef UNSUPPORTED_EIGEN_CXX11_SRC_TENSOR_TENSORSYCL_EXTRACT_FUNCTORS_HPP 23 #define UNSUPPORTED_EIGEN_CXX11_SRC_TENSOR_TENSORSYCL_EXTRACT_FUNCTORS_HPP 26 namespace TensorSycl {
36 template <
typename Evaluator>
struct FunctorExtractor{
37 typedef typename Evaluator::Dimensions Dimensions;
38 const Dimensions m_dimensions;
39 const Dimensions& dimensions()
const {
return m_dimensions; }
40 FunctorExtractor(
const Evaluator& expr)
41 : m_dimensions(expr.dimensions()) {}
47 template <
template <
class,
class>
class UnaryCategory,
typename OP,
typename RHSExpr,
typename Dev>
48 struct FunctorExtractor<TensorEvaluator<const UnaryCategory<OP, RHSExpr>, Dev> > {
49 FunctorExtractor<TensorEvaluator<RHSExpr, Dev> > rhsExpr;
51 FunctorExtractor(
const TensorEvaluator<
const UnaryCategory<OP, RHSExpr>, Dev>& expr)
52 : rhsExpr(expr.impl()), func(expr.functor()) {}
56 template <
template <
class,
class>
class UnaryCategory,
typename OP,
typename RHSExpr,
typename Dev>
57 struct FunctorExtractor<TensorEvaluator<UnaryCategory<OP, RHSExpr>, Dev> >
58 : FunctorExtractor<TensorEvaluator<const UnaryCategory<OP, RHSExpr>, Dev> >{};
62 template <
template<
class,
class,
class>
class BinaryCategory,
typename OP,
typename LHSExpr,
typename RHSExpr,
typename Dev>
63 struct FunctorExtractor<TensorEvaluator<const BinaryCategory<OP, LHSExpr, RHSExpr>, Dev> > {
64 FunctorExtractor<TensorEvaluator<LHSExpr, Dev> > lhsExpr;
65 FunctorExtractor<TensorEvaluator<RHSExpr, Dev> > rhsExpr;
67 FunctorExtractor(
const TensorEvaluator<
const BinaryCategory<OP, LHSExpr, RHSExpr>, Dev>& expr)
68 : lhsExpr(expr.left_impl()),rhsExpr(expr.right_impl()),func(expr.functor()) {}
73 template <
template <
class,
class,
class>
class BinaryCategory,
typename OP,
typename LHSExpr,
typename RHSExpr,
typename Dev>
74 struct FunctorExtractor<TensorEvaluator<BinaryCategory<OP, LHSExpr, RHSExpr>, Dev> >
75 : FunctorExtractor<TensorEvaluator<const BinaryCategory<OP, LHSExpr, RHSExpr>, Dev> >{};
79 template <
template <
class,
class,
class,
class>
class TernaryCategory,
typename OP,
typename Arg1Expr,
typename Arg2Expr,
typename Arg3Expr,
typename Dev>
80 struct FunctorExtractor<TensorEvaluator<const TernaryCategory<OP, Arg1Expr, Arg2Expr, Arg3Expr>, Dev> > {
81 FunctorExtractor<TensorEvaluator<Arg1Expr, Dev> > arg1Expr;
82 FunctorExtractor<TensorEvaluator<Arg2Expr, Dev> > arg2Expr;
83 FunctorExtractor<TensorEvaluator<Arg3Expr, Dev> > arg3Expr;
85 FunctorExtractor(
const TensorEvaluator<
const TernaryCategory<OP, Arg1Expr, Arg2Expr, Arg3Expr>, Dev>& expr)
86 : arg1Expr(expr.arg1Impl()), arg2Expr(expr.arg2Impl()), arg3Expr(expr.arg3Impl()), func(expr.functor()) {}
91 template <
template <
class,
class,
class,
class>
class TernaryCategory,
typename OP,
typename Arg1Expr,
typename Arg2Expr,
typename Arg3Expr,
typename Dev>
92 struct FunctorExtractor<TensorEvaluator< TernaryCategory<OP, Arg1Expr, Arg2Expr, Arg3Expr>, Dev> >
93 :FunctorExtractor<TensorEvaluator<const TernaryCategory<OP, Arg1Expr, Arg2Expr, Arg3Expr>, Dev> >{};
97 template <
typename IfExpr,
typename ThenExpr,
typename ElseExpr,
typename Dev>
98 struct FunctorExtractor< TensorEvaluator<const TensorSelectOp<IfExpr, ThenExpr, ElseExpr>, Dev> > {
99 FunctorExtractor<TensorEvaluator<IfExpr, Dev> > ifExpr;
100 FunctorExtractor<TensorEvaluator<ThenExpr, Dev> > thenExpr;
101 FunctorExtractor<TensorEvaluator<ElseExpr, Dev> > elseExpr;
102 FunctorExtractor(
const TensorEvaluator<
const TensorSelectOp<IfExpr, ThenExpr, ElseExpr>, Dev>& expr)
103 : ifExpr(expr.cond_impl()), thenExpr(expr.then_impl()), elseExpr(expr.else_impl()) {}
108 template <
typename IfExpr,
typename ThenExpr,
typename ElseExpr,
typename Dev>
109 struct FunctorExtractor<TensorEvaluator<TensorSelectOp<IfExpr, ThenExpr, ElseExpr>, Dev> >
110 :FunctorExtractor< TensorEvaluator<const TensorSelectOp<IfExpr, ThenExpr, ElseExpr>, Dev> > {};
114 template <
typename LHSExpr,
typename RHSExpr,
typename Dev>
115 struct FunctorExtractor<TensorEvaluator<const TensorAssignOp<LHSExpr, RHSExpr>, Dev> > {
116 FunctorExtractor<TensorEvaluator<LHSExpr, Dev> > lhsExpr;
117 FunctorExtractor<TensorEvaluator<RHSExpr, Dev> > rhsExpr;
118 FunctorExtractor(
const TensorEvaluator<
const TensorAssignOp<LHSExpr, RHSExpr>, Dev>& expr)
119 : lhsExpr(expr.left_impl()), rhsExpr(expr.right_impl()) {}
124 template <
typename LHSExpr,
typename RHSExpr,
typename Dev>
125 struct FunctorExtractor<TensorEvaluator<TensorAssignOp<LHSExpr, RHSExpr>, Dev> >
126 :FunctorExtractor<TensorEvaluator<const TensorAssignOp<LHSExpr, RHSExpr>, Dev> >{};
131 template <
typename RHSExpr,
typename Dev>
132 struct FunctorExtractor<TensorEvaluator<const TensorEvalToOp<RHSExpr>, Dev> > {
133 FunctorExtractor<TensorEvaluator<RHSExpr, Dev> > rhsExpr;
134 FunctorExtractor(
const TensorEvaluator<
const TensorEvalToOp<RHSExpr>, Dev>& expr)
135 : rhsExpr(expr.impl()) {}
140 template <
typename RHSExpr,
typename Dev>
141 struct FunctorExtractor<TensorEvaluator<TensorEvalToOp<RHSExpr>, Dev> >
142 : FunctorExtractor<TensorEvaluator<const TensorEvalToOp<RHSExpr>, Dev> > {};
144 template<
typename Dim,
size_t NumOutputDim>
struct DimConstr {
145 template<
typename InDim>
146 static inline Dim getDim(InDim dims ) {
return dims;}
149 template<
typename Dim>
struct DimConstr<Dim, 0> {
150 template<
typename InDim>
151 static inline Dim getDim(InDim dims ) {
return Dim(dims.TotalSize());}
154 template<
typename Op,
typename Dims,
typename ArgType,
template <
class>
class MakePointer_,
typename Device>
155 struct FunctorExtractor<TensorEvaluator<const TensorReductionOp<Op, Dims, ArgType, MakePointer_>, Device>>{
156 typedef TensorEvaluator<const TensorReductionOp<Op, Dims, ArgType, MakePointer_>, Device> Evaluator;
157 typedef typename Eigen::internal::conditional<Evaluator::NumOutputDims==0, DSizes<typename Evaluator::Index, 1>,
typename Evaluator::Dimensions >::type Dimensions;
158 const Dimensions m_dimensions;
159 const Dimensions& dimensions()
const {
return m_dimensions; }
160 FunctorExtractor(
const TensorEvaluator<
const TensorReductionOp<Op, Dims, ArgType, MakePointer_>, Device>& expr)
161 : m_dimensions(DimConstr<Dimensions, Evaluator::NumOutputDims>::getDim(expr.dimensions())) {}
165 template<
typename Op,
typename Dims,
typename ArgType,
template <
class>
class MakePointer_,
typename Device>
166 struct FunctorExtractor<TensorEvaluator<TensorReductionOp<Op, Dims, ArgType, MakePointer_>, Device>>
167 : FunctorExtractor<TensorEvaluator<const TensorReductionOp<Op, Dims, ArgType, MakePointer_>, Device>>{};
169 template <
typename Evaluator>
170 auto inline extractFunctors(
const Evaluator& evaluator)-> FunctorExtractor<Evaluator> {
171 return FunctorExtractor<Evaluator>(evaluator);
177 #endif // UNSUPPORTED_EIGEN_CXX11_SRC_TENSOR_TENSORSYCL_EXTRACT_FUNCTORS_HPP Namespace containing all symbols from the Eigen library.
Definition: AdolcForward:45