1 /* 2 * Copyright (c) 2021 Arm Limited. 3 * 4 * SPDX-License-Identifier: MIT 5 * 6 * Permission is hereby granted, free of charge, to any person obtaining a copy 7 * of this software and associated documentation files (the "Software"), to 8 * deal in the Software without restriction, including without limitation the 9 * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or 10 * sell copies of the Software, and to permit persons to whom the Software is 11 * furnished to do so, subject to the following conditions: 12 * 13 * The above copyright notice and this permission notice shall be included in all 14 * copies or substantial portions of the Software. 15 * 16 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 17 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 18 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 19 * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 20 * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 21 * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 22 * SOFTWARE. 23 */ 24 #ifndef ARM_COMPUTE_EXPERIMENTAL_POSTOPS 25 #define ARM_COMPUTE_EXPERIMENTAL_POSTOPS 26 27 #include "arm_compute/core/experimental/IPostOp.h" 28 29 #include "arm_compute/core/Types.h" 30 31 #include <vector> 32 33 namespace arm_compute 34 { 35 namespace experimental 36 { 37 /** (EXPERIMENTAL_POST_OPS) 38 * Implementation of specific IPostOps 39 */ 40 41 template <typename TensorRelatedT> 42 struct PostOpAct : public IPostOp<TensorRelatedT> 43 { 44 public: PostOpActPostOpAct45 PostOpAct(const ActivationLayerInfo &act_info) 46 : _act_info{ act_info } 47 { 48 } 49 // NOTE: PostOps do not own any resources pointed to by TensorRelatedT if it's a pointer type, thus allow shallow copy 50 ~PostOpAct() override = default; 51 PostOpAct(const PostOpAct &) = default; 52 PostOpAct &operator=(const PostOpAct &) = default; 53 PostOpAct(PostOpAct &&) = default; 54 PostOpAct &operator=(PostOpAct &&) = default; 55 prev_dst_posPostOpAct56 int prev_dst_pos() const override 57 { 58 return 0; 59 } typePostOpAct60 PostOpType type() const override 61 { 62 return PostOpType::Activation; 63 } argumentsPostOpAct64 std::vector<TensorRelatedT *> arguments() override 65 { 66 return {}; 67 } argumentsPostOpAct68 std::vector<const TensorRelatedT *> arguments() const override 69 { 70 return {}; 71 } clonePostOpAct72 std::unique_ptr<IPostOp<TensorRelatedT>> clone() const override 73 { 74 return std::make_unique<PostOpAct<TensorRelatedT>>(*this); 75 } 76 ActivationLayerInfo _act_info; 77 }; 78 79 template <typename TensorRelatedT> 80 struct PostOpEltwiseAdd : public IPostOp<TensorRelatedT> 81 { 82 public: PostOpEltwiseAddPostOpEltwiseAdd83 PostOpEltwiseAdd(TensorRelatedT addend, int prev_dst_pos, ConvertPolicy policy) 84 : _addend{ addend }, 85 _prev_dst_pos{ prev_dst_pos }, 86 _policy{ policy } 87 { 88 } 89 // NOTE: PostOps do not own any resources pointed to by TensorRelatedT if it's a pointer type, thus allow shallow copy 90 ~PostOpEltwiseAdd() override = default; 91 PostOpEltwiseAdd(const PostOpEltwiseAdd &) = default; 92 PostOpEltwiseAdd &operator=(const PostOpEltwiseAdd &) = default; 93 PostOpEltwiseAdd(PostOpEltwiseAdd &&) = default; 94 PostOpEltwiseAdd &operator=(PostOpEltwiseAdd &&) = default; prev_dst_posPostOpEltwiseAdd95 int prev_dst_pos() const override 96 { 97 return _prev_dst_pos; 98 } typePostOpEltwiseAdd99 PostOpType type() const override 100 { 101 return PostOpType::Eltwise_Add; 102 } argumentsPostOpEltwiseAdd103 std::vector<TensorRelatedT *> arguments() override 104 { 105 return { &_addend }; 106 } argumentsPostOpEltwiseAdd107 std::vector<const TensorRelatedT *> arguments() const override 108 { 109 return { &_addend }; 110 } clonePostOpEltwiseAdd111 std::unique_ptr<IPostOp<TensorRelatedT>> clone() const override 112 { 113 return std::make_unique<PostOpEltwiseAdd<TensorRelatedT>>(*this); 114 } 115 TensorRelatedT _addend; 116 int _prev_dst_pos; 117 ConvertPolicy _policy; 118 }; 119 120 template <typename TensorRelatedT> 121 struct PostOpEltwisePRelu : public IPostOp<TensorRelatedT> 122 { 123 public: PostOpEltwisePReluPostOpEltwisePRelu124 PostOpEltwisePRelu(TensorRelatedT alpha_param, int prev_dst_pos, ConvertPolicy policy) 125 : _alpha_param{ alpha_param }, 126 _prev_dst_pos{ prev_dst_pos }, 127 _policy{ policy } 128 { 129 } 130 // NOTE: PostOps do not own any resources pointed to by TensorRelatedT if it's a pointer type, thus allow shallow copy 131 ~PostOpEltwisePRelu() override = default; 132 PostOpEltwisePRelu(const PostOpEltwisePRelu &) = default; 133 PostOpEltwisePRelu &operator=(const PostOpEltwisePRelu &) = default; 134 PostOpEltwisePRelu(PostOpEltwisePRelu &&) = default; 135 PostOpEltwisePRelu &operator=(PostOpEltwisePRelu &&) = default; prev_dst_posPostOpEltwisePRelu136 int prev_dst_pos() const override 137 { 138 return _prev_dst_pos; 139 } typePostOpEltwisePRelu140 PostOpType type() const override 141 { 142 return PostOpType::Eltwise_PRelu; 143 } argumentsPostOpEltwisePRelu144 std::vector<TensorRelatedT *> arguments() override 145 { 146 return { &_alpha_param }; 147 } argumentsPostOpEltwisePRelu148 std::vector<const TensorRelatedT *> arguments() const override 149 { 150 return { &_alpha_param }; 151 } clonePostOpEltwisePRelu152 std::unique_ptr<IPostOp<TensorRelatedT>> clone() const override 153 { 154 return std::make_unique<PostOpEltwisePRelu<TensorRelatedT>>(*this); 155 } 156 TensorRelatedT _alpha_param; 157 int _prev_dst_pos; 158 ConvertPolicy _policy; 159 }; 160 } // namespace experimental 161 } // namespace arm_compute 162 #endif //ARM_COMPUTE_EXPERIMENTAL_POSTOPS