diff options
Diffstat (limited to 'unsupported/Eigen/CXX11/src/Tensor/TensorSyclLeafCount.h')
-rw-r--r-- | unsupported/Eigen/CXX11/src/Tensor/TensorSyclLeafCount.h | 188 |
1 files changed, 188 insertions, 0 deletions
diff --git a/unsupported/Eigen/CXX11/src/Tensor/TensorSyclLeafCount.h b/unsupported/Eigen/CXX11/src/Tensor/TensorSyclLeafCount.h new file mode 100644 index 000000000..77e0e15e1 --- /dev/null +++ b/unsupported/Eigen/CXX11/src/Tensor/TensorSyclLeafCount.h @@ -0,0 +1,188 @@ +// This file is part of Eigen, a lightweight C++ template library +// for linear algebra. +// +// Mehdi Goli Codeplay Software Ltd. +// Ralph Potter Codeplay Software Ltd. +// Luke Iwanski Codeplay Software Ltd. +// Contact: <eigen@codeplay.com> +// +// This Source Code Form is subject to the terms of the Mozilla +// Public License v. 2.0. If a copy of the MPL was not distributed +// with this file, You can obtain one at http://mozilla.org/MPL/2.0/. + +/***************************************************************** + * TensorSyclLeafCount.h + * + * \brief: + * The leaf count used the pre-order expression tree traverse in order to name + * count the number of leaf nodes in the expression + * +*****************************************************************/ + +#ifndef UNSUPPORTED_EIGEN_CXX11_SRC_TENSORYSYCL_LEAF_COUNT_HPP +#define UNSUPPORTED_EIGEN_CXX11_SRC_TENSORYSYCL_LEAF_COUNT_HPP + +namespace Eigen { +namespace TensorSycl { +namespace internal { +/// \brief LeafCount used to counting terminal nodes. The total number of +/// leaf nodes is used by MakePlaceHolderExprHelper to find the order +/// of the leaf node in a expression tree at compile time. +template <typename Expr> +struct LeafCount; + +/// specialisation of the \ref LeafCount struct when the node type is const +/// TensorMap +template <typename PlainObjectType, int Options_, + template <class> class MakePointer_> +struct LeafCount<const TensorMap<PlainObjectType, Options_, MakePointer_>> { + static const size_t Count = 1; +}; + +/// specialisation of the \ref LeafCount struct when the node type is TensorMap +template <typename PlainObjectType, int Options_, + template <class> class MakePointer_> +struct LeafCount<TensorMap<PlainObjectType, Options_, MakePointer_>> { + static const size_t Count = 1; +}; + +/// specialisation of the \ref LeafCount struct when the node type is const +/// TensorCwiseNullaryOp +template <typename OP, typename RHSExpr> +struct LeafCount<const TensorCwiseNullaryOp<OP, RHSExpr>> { + static const size_t Count = LeafCount<RHSExpr>::Count; +}; + +/// specialisation of the \ref LeafCount struct when the node type is +/// TensorCwiseNullaryOp +template <typename OP, typename RHSExpr> +struct LeafCount<TensorCwiseNullaryOp<OP, RHSExpr>> { + static const size_t Count = LeafCount<RHSExpr>::Count; +}; + +/// specialisation of the \ref LeafCount struct when the node type is const +/// TensorBroadcastingOp +template <typename OP, typename RHSExpr> +struct LeafCount<const TensorBroadcastingOp<OP, RHSExpr>> { + static const size_t Count = LeafCount<RHSExpr>::Count; +}; + +/// specialisation of the \ref LeafCount struct when the node type is +/// TensorCwiseNullaryOp +template <typename OP, typename RHSExpr> +struct LeafCount<TensorBroadcastingOp<OP, RHSExpr>> { + static const size_t Count = LeafCount<RHSExpr>::Count; +}; + +// TensorCwiseUnaryOp +template <typename OP, typename RHSExpr> +struct LeafCount<const TensorCwiseUnaryOp<OP, RHSExpr>> { + static const size_t Count = LeafCount<RHSExpr>::Count; +}; + +// TensorCwiseUnaryOp +template <typename OP, typename RHSExpr> +struct LeafCount<TensorCwiseUnaryOp<OP, RHSExpr>> { + static const size_t Count = LeafCount<RHSExpr>::Count; +}; + +/// specialisation of the \ref LeafCount struct when the node type is const +/// TensorCwiseBinaryOp +template <typename OP, typename LHSExpr, typename RHSExpr> +struct LeafCount<const TensorCwiseBinaryOp<OP, LHSExpr, RHSExpr>> { + static const size_t Count = + LeafCount<LHSExpr>::Count + LeafCount<RHSExpr>::Count; +}; + +/// specialisation of the \ref LeafCount struct when the node type is +/// TensorCwiseBinaryOp +template <typename OP, typename LHSExpr, typename RHSExpr> +struct LeafCount<TensorCwiseBinaryOp<OP, LHSExpr, RHSExpr>> { + static const size_t Count = + LeafCount<LHSExpr>::Count + LeafCount<RHSExpr>::Count; +}; + +/// specialisation of the \ref LeafCount struct when the node type is +/// TensorCwiseTernaryOp +template <typename OP, typename Arg1Expr, typename Arg2Expr, typename Arg3Expr> +struct LeafCount<TensorCwiseTernaryOp<OP, Arg1Expr, Arg2Expr, Arg3Expr>> { + static const size_t Count = LeafCount<Arg1Expr>::Count + + LeafCount<Arg2Expr>::Count + + LeafCount<Arg3Expr>::Count; +}; + +/// specialisation of the \ref LeafCount struct when the node type is const +/// TensorCwiseTernaryOp +template <typename OP, typename Arg1Expr, typename Arg2Expr, typename Arg3Expr> +struct LeafCount<const TensorCwiseTernaryOp<OP, Arg1Expr, Arg2Expr, Arg3Expr>> { + static const size_t Count = LeafCount<Arg1Expr>::Count + + LeafCount<Arg2Expr>::Count + + LeafCount<Arg3Expr>::Count; +}; + +/// specialisation of the \ref LeafCount struct when the node type is +/// TensorCwiseSelectOp +template <typename IfExpr, typename ThenExpr, typename ElseExpr> +struct LeafCount<TensorSelectOp<IfExpr, ThenExpr, ElseExpr>> { + static const size_t Count = LeafCount<IfExpr>::Count + + LeafCount<ThenExpr>::Count + + LeafCount<ElseExpr>::Count; +}; + +/// specialisation of the \ref LeafCount struct when the node type is const +/// TensorCwiseSelectOp +template <typename IfExpr, typename ThenExpr, typename ElseExpr> +struct LeafCount<const TensorSelectOp<IfExpr, ThenExpr, ElseExpr>> { + static const size_t Count = LeafCount<IfExpr>::Count + + LeafCount<ThenExpr>::Count + + LeafCount<ElseExpr>::Count; +}; + +/// specialisation of the \ref LeafCount struct when the node type is +/// TensorAssignOp +template <typename LHSExpr, typename RHSExpr> +struct LeafCount<TensorAssignOp<LHSExpr, RHSExpr>> { + static const size_t Count = + LeafCount<LHSExpr>::Count + LeafCount<RHSExpr>::Count; +}; + +/// specialisation of the \ref LeafCount struct when the node type is const +/// TensorAssignOp +template <typename LHSExpr, typename RHSExpr> +struct LeafCount<const TensorAssignOp<LHSExpr, RHSExpr>> { + static const size_t Count = + LeafCount<LHSExpr>::Count + LeafCount<RHSExpr>::Count; +}; + +/// specialisation of the \ref LeafCount struct when the node type is const +/// TensorForcedEvalOp +template <typename Expr> +struct LeafCount<const TensorForcedEvalOp<Expr>> { + static const size_t Count = 1; +}; + +/// specialisation of the \ref LeafCount struct when the node type is +/// TensorForcedEvalOp +template <typename Expr> +struct LeafCount<TensorForcedEvalOp<Expr>> { + static const size_t Count = 1; +}; + +/// specialisation of the \ref LeafCount struct when the node type is const +/// TensorEvalToOp +template <typename Expr> +struct LeafCount<const TensorEvalToOp<Expr>> { + static const size_t Count = 1 + LeafCount<Expr>::Count; +}; + +/// specialisation of the \ref LeafCount struct when the node type is +/// TensorEvalToOp +template <typename Expr> +struct LeafCount<TensorEvalToOp<Expr>> { + static const size_t Count = 1 + LeafCount<Expr>::Count; +}; +} +} +} // namespace Eigen + +#endif // UNSUPPORTED_EIGEN_CXX11_SRC_TENSORYSYCL_LEAF_COUNT_HPP |