xref: /aosp_15_r20/external/ComputeLibrary/arm_compute/graph/INodeVisitor.h (revision c217d954acce2dbc11938adb493fc0abd69584f3)
1*c217d954SCole Faust /*
2*c217d954SCole Faust  * Copyright (c) 2018-2021 Arm Limited.
3*c217d954SCole Faust  *
4*c217d954SCole Faust  * SPDX-License-Identifier: MIT
5*c217d954SCole Faust  *
6*c217d954SCole Faust  * Permission is hereby granted, free of charge, to any person obtaining a copy
7*c217d954SCole Faust  * of this software and associated documentation files (the "Software"), to
8*c217d954SCole Faust  * deal in the Software without restriction, including without limitation the
9*c217d954SCole Faust  * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or
10*c217d954SCole Faust  * sell copies of the Software, and to permit persons to whom the Software is
11*c217d954SCole Faust  * furnished to do so, subject to the following conditions:
12*c217d954SCole Faust  *
13*c217d954SCole Faust  * The above copyright notice and this permission notice shall be included in all
14*c217d954SCole Faust  * copies or substantial portions of the Software.
15*c217d954SCole Faust  *
16*c217d954SCole Faust  * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
17*c217d954SCole Faust  * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
18*c217d954SCole Faust  * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
19*c217d954SCole Faust  * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
20*c217d954SCole Faust  * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
21*c217d954SCole Faust  * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
22*c217d954SCole Faust  * SOFTWARE.
23*c217d954SCole Faust  */
24*c217d954SCole Faust #ifndef ARM_COMPUTE_GRAPH_INODEVISITOR_H
25*c217d954SCole Faust #define ARM_COMPUTE_GRAPH_INODEVISITOR_H
26*c217d954SCole Faust 
27*c217d954SCole Faust #include "arm_compute/graph/nodes/NodesFwd.h"
28*c217d954SCole Faust 
29*c217d954SCole Faust namespace arm_compute
30*c217d954SCole Faust {
31*c217d954SCole Faust namespace graph
32*c217d954SCole Faust {
33*c217d954SCole Faust /**  Node visitor interface */
34*c217d954SCole Faust class INodeVisitor
35*c217d954SCole Faust {
36*c217d954SCole Faust public:
37*c217d954SCole Faust     /** Default destructor. */
38*c217d954SCole Faust     virtual ~INodeVisitor() = default;
39*c217d954SCole Faust     /** Visit INode.
40*c217d954SCole Faust      *
41*c217d954SCole Faust      * @param[in] n Node to visit.
42*c217d954SCole Faust      */
43*c217d954SCole Faust     virtual void visit(INode &n) = 0;
44*c217d954SCole Faust     /** Visit ActivationLayerNode.
45*c217d954SCole Faust      *
46*c217d954SCole Faust      * @param[in] n Node to visit.
47*c217d954SCole Faust      */
48*c217d954SCole Faust     virtual void visit(ActivationLayerNode &n) = 0;
49*c217d954SCole Faust     /** Visit BatchNormalizationLayerNode.
50*c217d954SCole Faust      *
51*c217d954SCole Faust      * @param[in] n Node to visit.
52*c217d954SCole Faust      */
53*c217d954SCole Faust     virtual void visit(BatchNormalizationLayerNode &n) = 0;
54*c217d954SCole Faust     /** Visit ConcatenateLayerNode.
55*c217d954SCole Faust      *
56*c217d954SCole Faust      * @param[in] n Node to visit.
57*c217d954SCole Faust      */
58*c217d954SCole Faust     virtual void visit(ConcatenateLayerNode &n) = 0;
59*c217d954SCole Faust     /** Visit ConstNode.
60*c217d954SCole Faust      *
61*c217d954SCole Faust      * @param[in] n Node to visit.
62*c217d954SCole Faust      */
63*c217d954SCole Faust     virtual void visit(ConstNode &n) = 0;
64*c217d954SCole Faust     /** Visit ConvolutionLayerNode.
65*c217d954SCole Faust      *
66*c217d954SCole Faust      * @param[in] n Node to visit.
67*c217d954SCole Faust      */
68*c217d954SCole Faust     virtual void visit(ConvolutionLayerNode &n) = 0;
69*c217d954SCole Faust     /** Visit DepthwiseConvolutionLayerNode.
70*c217d954SCole Faust      *
71*c217d954SCole Faust      * @param[in] n Node to visit.
72*c217d954SCole Faust      */
73*c217d954SCole Faust     virtual void visit(DepthwiseConvolutionLayerNode &n) = 0;
74*c217d954SCole Faust     /** Visit DequantizationLayerNode.
75*c217d954SCole Faust      *
76*c217d954SCole Faust      * @param[in] n Node to visit.
77*c217d954SCole Faust      */
78*c217d954SCole Faust     virtual void visit(DequantizationLayerNode &n) = 0;
79*c217d954SCole Faust     /** Visit DetectionOutputLayerNode.
80*c217d954SCole Faust      *
81*c217d954SCole Faust      * @param[in] n Node to visit.
82*c217d954SCole Faust      */
83*c217d954SCole Faust     virtual void visit(DetectionOutputLayerNode &n) = 0;
84*c217d954SCole Faust     /** Visit DetectionPostProcessLayerNode.
85*c217d954SCole Faust      *
86*c217d954SCole Faust      * @param[in] n Node to visit.
87*c217d954SCole Faust      */
88*c217d954SCole Faust     virtual void visit(DetectionPostProcessLayerNode &n) = 0;
89*c217d954SCole Faust     /** Visit EltwiseLayerNode.
90*c217d954SCole Faust      *
91*c217d954SCole Faust      * @param[in] n Node to visit.
92*c217d954SCole Faust      */
93*c217d954SCole Faust     virtual void visit(EltwiseLayerNode &n) = 0;
94*c217d954SCole Faust     /** Visit FlattenLayerNode.
95*c217d954SCole Faust      *
96*c217d954SCole Faust      * @param[in] n Node to visit.
97*c217d954SCole Faust      */
98*c217d954SCole Faust     virtual void visit(FlattenLayerNode &n) = 0;
99*c217d954SCole Faust     /** Visit FullyConnectedLayerNode.
100*c217d954SCole Faust      *
101*c217d954SCole Faust      * @param[in] n Node to visit.
102*c217d954SCole Faust      */
103*c217d954SCole Faust     virtual void visit(FullyConnectedLayerNode &n) = 0;
104*c217d954SCole Faust     /** Visit FusedConvolutionBatchNormalizationNode.
105*c217d954SCole Faust      *
106*c217d954SCole Faust      * @param[in] n Node to visit.
107*c217d954SCole Faust      */
108*c217d954SCole Faust     virtual void visit(FusedConvolutionBatchNormalizationNode &n) = 0;
109*c217d954SCole Faust     /** Visit FusedConvolutionBatchNormalizationWithPostOpsNode.
110*c217d954SCole Faust      *
111*c217d954SCole Faust      * @param[in] n Node to visit.
112*c217d954SCole Faust      */
113*c217d954SCole Faust     virtual void visit(FusedConvolutionBatchNormalizationWithPostOpsNode &n) = 0;
114*c217d954SCole Faust     /** Visit FusedConvolutionWithPostOpNode.
115*c217d954SCole Faust      *
116*c217d954SCole Faust      * @param[in] n Node to visit.
117*c217d954SCole Faust      */
118*c217d954SCole Faust     virtual void visit(FusedConvolutionWithPostOpNode &n) = 0;
119*c217d954SCole Faust     /** Visit FusedDepthwiseConvolutionBatchNormalizationNode.
120*c217d954SCole Faust      *
121*c217d954SCole Faust      * @param[in] n Node to visit.
122*c217d954SCole Faust      */
123*c217d954SCole Faust     virtual void visit(FusedDepthwiseConvolutionBatchNormalizationNode &n) = 0;
124*c217d954SCole Faust     /** Visit InputNode.
125*c217d954SCole Faust      *
126*c217d954SCole Faust      * @param[in] n Node to visit.
127*c217d954SCole Faust      */
128*c217d954SCole Faust     virtual void visit(InputNode &n) = 0;
129*c217d954SCole Faust     /** Visit NormalizationLayerNode.
130*c217d954SCole Faust      *
131*c217d954SCole Faust      * @param[in] n Node to visit.
132*c217d954SCole Faust      */
133*c217d954SCole Faust     virtual void visit(NormalizationLayerNode &n) = 0;
134*c217d954SCole Faust     /** Visit OutputNode.
135*c217d954SCole Faust      *
136*c217d954SCole Faust      * @param[in] n Node to visit.
137*c217d954SCole Faust      */
138*c217d954SCole Faust     virtual void visit(OutputNode &n) = 0;
139*c217d954SCole Faust     /** Visit PermuteLayerNode.
140*c217d954SCole Faust      *
141*c217d954SCole Faust      * @param[in] n Node to visit.
142*c217d954SCole Faust      */
143*c217d954SCole Faust     virtual void visit(PermuteLayerNode &n) = 0;
144*c217d954SCole Faust     /** Visit PreluLayerNode.
145*c217d954SCole Faust      *
146*c217d954SCole Faust      * @param[in] n Node to visit.
147*c217d954SCole Faust      */
148*c217d954SCole Faust     virtual void visit(PReluLayerNode &n) = 0;
149*c217d954SCole Faust     /** Visit PoolingLayerNode.
150*c217d954SCole Faust      *
151*c217d954SCole Faust      * @param[in] n Node to visit.
152*c217d954SCole Faust      */
153*c217d954SCole Faust     virtual void visit(PoolingLayerNode &n) = 0;
154*c217d954SCole Faust     /** Visit PrintLayerNode.
155*c217d954SCole Faust      *
156*c217d954SCole Faust      * @param[in] n Node to visit.
157*c217d954SCole Faust      */
158*c217d954SCole Faust     virtual void visit(PrintLayerNode &n) = 0;
159*c217d954SCole Faust     /** Visit PriorBoxLayerNode.
160*c217d954SCole Faust      *
161*c217d954SCole Faust      * @param[in] n Node to visit.
162*c217d954SCole Faust      */
163*c217d954SCole Faust     virtual void visit(PriorBoxLayerNode &n) = 0;
164*c217d954SCole Faust     /** Visit QuantizationLayerNode.
165*c217d954SCole Faust      *
166*c217d954SCole Faust      * @param[in] n Node to visit.
167*c217d954SCole Faust      */
168*c217d954SCole Faust     virtual void visit(QuantizationLayerNode &n) = 0;
169*c217d954SCole Faust     /** Visit ReshapeLayerNode.
170*c217d954SCole Faust      *
171*c217d954SCole Faust      * @param[in] n Node to visit.
172*c217d954SCole Faust      */
173*c217d954SCole Faust     virtual void visit(ReshapeLayerNode &n) = 0;
174*c217d954SCole Faust     /** Visit SoftmaxLayerNode.
175*c217d954SCole Faust      *
176*c217d954SCole Faust      * @param[in] n Node to visit.
177*c217d954SCole Faust      */
178*c217d954SCole Faust     virtual void visit(SoftmaxLayerNode &n) = 0;
179*c217d954SCole Faust     /** Visit SplitLayerNode.
180*c217d954SCole Faust      *
181*c217d954SCole Faust      * @param[in] n Node to visit.
182*c217d954SCole Faust      */
183*c217d954SCole Faust     virtual void visit(SplitLayerNode &n) = 0;
184*c217d954SCole Faust     /** Visit StackLayerNode.
185*c217d954SCole Faust      *
186*c217d954SCole Faust      * @param[in] n Node to visit.
187*c217d954SCole Faust      */
188*c217d954SCole Faust     virtual void visit(StackLayerNode &n) = 0;
189*c217d954SCole Faust };
190*c217d954SCole Faust 
191*c217d954SCole Faust /** Default visitor implementation
192*c217d954SCole Faust  *
193*c217d954SCole Faust  * Implements visit methods by calling a default function.
194*c217d954SCole Faust  * Inherit from DefaultNodeVisitor if you don't want to provide specific implementation for all nodes.
195*c217d954SCole Faust  */
196*c217d954SCole Faust class DefaultNodeVisitor : public INodeVisitor
197*c217d954SCole Faust {
198*c217d954SCole Faust public:
199*c217d954SCole Faust     /** Default destructor */
200*c217d954SCole Faust     virtual ~DefaultNodeVisitor() = default;
201*c217d954SCole Faust 
202*c217d954SCole Faust #ifndef DOXYGEN_SKIP_THIS
203*c217d954SCole Faust     // Inherited methods overridden
204*c217d954SCole Faust     virtual void visit(INode &n) override;
205*c217d954SCole Faust     virtual void visit(ActivationLayerNode &n) override;
206*c217d954SCole Faust     virtual void visit(BatchNormalizationLayerNode &n) override;
207*c217d954SCole Faust     virtual void visit(ConcatenateLayerNode &n) override;
208*c217d954SCole Faust     virtual void visit(ConstNode &n) override;
209*c217d954SCole Faust     virtual void visit(ConvolutionLayerNode &n) override;
210*c217d954SCole Faust     virtual void visit(DequantizationLayerNode &n) override;
211*c217d954SCole Faust     virtual void visit(DetectionOutputLayerNode &n) override;
212*c217d954SCole Faust     virtual void visit(DetectionPostProcessLayerNode &n) override;
213*c217d954SCole Faust     virtual void visit(DepthwiseConvolutionLayerNode &n) override;
214*c217d954SCole Faust     virtual void visit(EltwiseLayerNode &n) override;
215*c217d954SCole Faust     virtual void visit(FlattenLayerNode &n) override;
216*c217d954SCole Faust     virtual void visit(FullyConnectedLayerNode &n) override;
217*c217d954SCole Faust     virtual void visit(FusedConvolutionBatchNormalizationNode &n) override;
218*c217d954SCole Faust     virtual void visit(FusedConvolutionBatchNormalizationWithPostOpsNode &n) override;
219*c217d954SCole Faust     virtual void visit(FusedConvolutionWithPostOpNode &n) override;
220*c217d954SCole Faust     virtual void visit(FusedDepthwiseConvolutionBatchNormalizationNode &n) override;
221*c217d954SCole Faust     virtual void visit(InputNode &n) override;
222*c217d954SCole Faust     virtual void visit(NormalizationLayerNode &n) override;
223*c217d954SCole Faust     virtual void visit(OutputNode &n) override;
224*c217d954SCole Faust     virtual void visit(PermuteLayerNode &n) override;
225*c217d954SCole Faust     virtual void visit(PoolingLayerNode &n) override;
226*c217d954SCole Faust     virtual void visit(PReluLayerNode &n) override;
227*c217d954SCole Faust     virtual void visit(PrintLayerNode &n) override;
228*c217d954SCole Faust     virtual void visit(PriorBoxLayerNode &n) override;
229*c217d954SCole Faust     virtual void visit(QuantizationLayerNode &n) override;
230*c217d954SCole Faust     virtual void visit(ReshapeLayerNode &n) override;
231*c217d954SCole Faust     virtual void visit(SoftmaxLayerNode &n) override;
232*c217d954SCole Faust     virtual void visit(SplitLayerNode &n) override;
233*c217d954SCole Faust     virtual void visit(StackLayerNode &n) override;
234*c217d954SCole Faust #endif /* DOXYGEN_SKIP_THIS */
235*c217d954SCole Faust 
236*c217d954SCole Faust     /** Function to be overloaded by the client and implement default behavior for the
237*c217d954SCole Faust      *  non-overloaded visitors
238*c217d954SCole Faust      */
239*c217d954SCole Faust     virtual void default_visit(INode &n) = 0;
240*c217d954SCole Faust };
241*c217d954SCole Faust } // namespace graph
242*c217d954SCole Faust } // namespace arm_compute
243*c217d954SCole Faust #endif /* ARM_COMPUTE_GRAPH_INODEVISITOR_H */
244