xref: /aosp_15_r20/external/ComputeLibrary/arm_compute/core/experimental/PostOps.h (revision c217d954acce2dbc11938adb493fc0abd69584f3)
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