VisionCpp  0.0.1
eval_expr_r_unary.hpp
Go to the documentation of this file.
1 // This file is part of VisionCpp, a lightweight C++ template library
2 // for computer vision and image processing.
3 //
4 // Copyright (C) 2016 Codeplay Software Limited. All Rights Reserved.
5 //
6 // Contact: visioncpp@codeplay.com
7 //
8 // Licensed under the Apache License, Version 2.0 (the "License");
9 // you may not use this file except in compliance with the License.
10 // You may obtain a copy of the License at
11 //
12 // http://www.apache.org/licenses/LICENSE-2.0
13 //
14 // Unless required by applicable law or agreed to in writing, software
15 // distributed under the License is distributed on an "AS IS" BASIS,
16 // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
17 // See the License for the specific language governing permissions and
18 // limitations under the License.
19 
20 /// \file eval_expr_r_unary.hpp
21 /// \brief This file contains the specialisation of the EvalExpr
22 /// for RUnOP( pointwise Unary operation node).
23 
24 #ifndef VISIONCPP_INCLUDE_FRAMEWORK_EVALUATOR_EVAL_EXPRESSION_EVAL_EXPR_R_UNARY_HPP_
25 #define VISIONCPP_INCLUDE_FRAMEWORK_EVALUATOR_EVAL_EXPRESSION_EVAL_EXPR_R_UNARY_HPP_
26 
27 namespace visioncpp {
28 namespace internal {
29 /// \brief Partial specialisation of the EvalExpr when the expression is
30 /// an RUnOP(unary operation) expression.
31 template <typename UN_OP, typename Nested, size_t Cols, size_t Rows,
32  size_t LfType, size_t LVL, typename Loc, typename... Params>
33 struct EvalExpr<RUnOP<UN_OP, Nested, Cols, Rows, LfType, LVL>, Loc, Params...> {
34  /// \brief evaluate function when the internal::ops_category is PointOP.
35  static typename UN_OP::OutType
36  eval_point(Loc &cOffset, const tools::tuple::Tuple<Params...> &t) {
37  auto nested_acc = EvalExpr<Nested, Loc, Params...>::eval_point(cOffset, t);
38  return typename UN_OP::OP()(
39  tools::convert<typename UN_OP::InType>(nested_acc));
40  }
41  /// \brief evaluate function when the internal::ops_category is NeighbourOP.
42  template <bool IsRoot, size_t Halo_Top, size_t Halo_Left, size_t Halo_Butt,
43  size_t Halo_Right, size_t Offset, size_t Index, size_t LC,
44  size_t LR>
45  static auto eval_neighbour(Loc &cOffset,
47  -> decltype(
49  t)) {
50  constexpr size_t OutOffset = OutputLocation<IsRoot, Offset + Index - 1>::ID;
51  constexpr bool isLocal =
52  Trait<typename tools::RemoveAll<decltype(
53  tools::tuple::get<OutOffset>(t))>::Type>::scope == scope::Local;
54  auto nested_acc = EvalExpr<Nested, Loc, Params...>::template eval_neighbour<
55  false, Halo_Top, Halo_Left, Halo_Butt, Halo_Right,
56  Offset, Index - 1, LC, LR>(cOffset, t)
57  .get_pointer();
58  for (int i = 0; i < LC; i += cOffset.cLRng) {
59  if (get_compare<isLocal, LC, Cols>(cOffset.l_c, i, cOffset.g_c)) {
60  for (int j = 0; j < LR; j += cOffset.rLRng) {
61  if (get_compare<isLocal, LR, Rows>(cOffset.l_r, j, cOffset.g_r)) {
62  *(tools::tuple::get<OutOffset>(t).get_pointer() +
63  calculate_index(id_val<isLocal>(cOffset.l_c, cOffset.g_c) + i,
64  id_val<isLocal>(cOffset.l_r, cOffset.g_r) + j,
65  id_val<isLocal>(LC, Cols),
66  id_val<isLocal>(LR, Rows))) =
67  tools::convert<typename MemoryTrait<
68  LfType, decltype(tools::tuple::get<OutOffset>(t))>::Type>(
69  typename UN_OP::OP()(
70  *(nested_acc + calculate_index(cOffset.l_c + i,
71  cOffset.l_r + j, LC,
72  LR))));
73  }
74  }
75  }
76  }
77 
78  // here you need to put a local barrier
79  cOffset.barrier();
80  // return the the valid neighbour area for parent
81  return tools::tuple::get<OutOffset>(t);
82  }
83 };
84 } // namespace internal
85 } // namespace visioncpp
86 #endif // VISIONCPP_INCLUDE_FRAMEWORK_EVALUATOR_EVAL_EXPRESSION_EVAL_EXPR_R_UNARY_HPP_
EnableIf< k==0, typename ElemTypeHolder< 0, Tuple< Ts... > >::type & >::type get(Tuple< Ts... > &t)
get
Definition: tuple.hpp:99
T1 convert(T2 x)
function convert
Definition: convert.hpp:558
static size_t calculate_index(size_t c, size_t r, size_t cols, size_t rows)
function calculate_index
static constexpr ScopeType Local
VisionCpp namespace.
Definition: sycl/device.hpp:24
static auto eval_neighbour(Loc &cOffset, const tools::tuple::Tuple< Params... > &t) -> decltype(tools::tuple::get< OutputLocation< IsRoot, Offset+Index - 1 >::ID >(t))
evaluate function when the internal::ops_category is NeighbourOP.
static UN_OP::OutType eval_point(Loc &cOffset, const tools::tuple::Tuple< Params... > &t)
evaluate function when the internal::ops_category is PointOP.
eval_global_neighbour function:
Definition: evaluator.hpp:195
This class is used to determine the ElementType of accessor template parameters.
This is used to find whether a node should use a global memory output or a local memory output is cre...
Definition: evaluator.hpp:265
The definition is in RUnOP file.
This struct is used to trait the value type inside the accessor.
Definition: evaluator.hpp:89
These methods are used to remove all the & const and * from a type.
The tuple is a fixed-size collection of heterogeneous values.
Definition: tuple.hpp:48