blob: 929896d2850d86ad1ffa45b7dba00b53508a5b66 [file] [log] [blame]
David Becke97c6e02018-10-03 13:09:28 +01001//
2// Copyright © 2017 Arm Ltd. All rights reserved.
3// SPDX-License-Identifier: MIT
4//
5#pragma once
6
7#include <armnn/DescriptorsFwd.hpp>
David Beck5eec11d2018-10-04 15:43:17 +01008#include <armnn/Optional.hpp>
David Becke97c6e02018-10-03 13:09:28 +01009#include <vector>
David Beck5eec11d2018-10-04 15:43:17 +010010#include <cctype>
David Beck3e9e1152018-10-17 14:17:50 +010011#include <memory>
David Becke97c6e02018-10-03 13:09:28 +010012
13namespace armnn
14{
15
16class TensorInfo;
17
18class ILayerSupport
19{
20protected:
21 ILayerSupport() {}
22 virtual ~ILayerSupport() {}
23
24public:
25 virtual bool IsActivationSupported(const TensorInfo& input,
26 const TensorInfo& output,
27 const ActivationDescriptor& descriptor,
Matteo Martincigh992d6dc2019-01-10 17:34:20 +000028 Optional<std::string&> reasonIfUnsupported = EmptyOptional()) const = 0;
David Becke97c6e02018-10-03 13:09:28 +010029
30 virtual bool IsAdditionSupported(const TensorInfo& input0,
31 const TensorInfo& input1,
32 const TensorInfo& output,
Matteo Martincigh992d6dc2019-01-10 17:34:20 +000033 Optional<std::string&> reasonIfUnsupported = EmptyOptional()) const = 0;
David Becke97c6e02018-10-03 13:09:28 +010034
35 virtual bool IsBatchNormalizationSupported(const TensorInfo& input,
36 const TensorInfo& output,
37 const TensorInfo& mean,
38 const TensorInfo& var,
39 const TensorInfo& beta,
40 const TensorInfo& gamma,
41 const BatchNormalizationDescriptor& descriptor,
Matteo Martincigh992d6dc2019-01-10 17:34:20 +000042 Optional<std::string&> reasonIfUnsupported = EmptyOptional()) const = 0;
David Becke97c6e02018-10-03 13:09:28 +010043
Éanna Ó Catháin4e1e1362018-11-12 11:36:34 +000044 virtual bool IsBatchToSpaceNdSupported(const TensorInfo& input,
45 const TensorInfo& output,
46 const BatchToSpaceNdDescriptor& descriptor,
Matteo Martincigh992d6dc2019-01-10 17:34:20 +000047 Optional<std::string&> reasonIfUnsupported = EmptyOptional()) const = 0;
Éanna Ó Catháin4e1e1362018-11-12 11:36:34 +000048
David Becke97c6e02018-10-03 13:09:28 +010049 virtual bool IsConstantSupported(const TensorInfo& output,
Matteo Martincigh992d6dc2019-01-10 17:34:20 +000050 Optional<std::string&> reasonIfUnsupported = EmptyOptional()) const = 0;
David Becke97c6e02018-10-03 13:09:28 +010051
52 virtual bool IsConvertFp16ToFp32Supported(const TensorInfo& input,
53 const TensorInfo& output,
Matteo Martincigh992d6dc2019-01-10 17:34:20 +000054 Optional<std::string&> reasonIfUnsupported = EmptyOptional()) const = 0;
David Becke97c6e02018-10-03 13:09:28 +010055
56 virtual bool IsConvertFp32ToFp16Supported(const TensorInfo& input,
57 const TensorInfo& output,
Matteo Martincigh992d6dc2019-01-10 17:34:20 +000058 Optional<std::string&> reasonIfUnsupported = EmptyOptional()) const = 0;
David Becke97c6e02018-10-03 13:09:28 +010059
60 virtual bool IsConvolution2dSupported(const TensorInfo& input,
61 const TensorInfo& output,
62 const Convolution2dDescriptor& descriptor,
63 const TensorInfo& weights,
David Beck5eec11d2018-10-04 15:43:17 +010064 const Optional<TensorInfo>& biases,
Matteo Martincigh992d6dc2019-01-10 17:34:20 +000065 Optional<std::string&> reasonIfUnsupported = EmptyOptional()) const = 0;
David Becke97c6e02018-10-03 13:09:28 +010066
Nattapat Chaimanowonga9a1cf12018-12-03 16:06:49 +000067 virtual bool IsDebugSupported(const TensorInfo& input,
68 const TensorInfo& output,
Nattapat Chaimanowongac5aa1f2018-12-05 15:17:18 +000069 const DebugDescriptor& descriptor,
Matteo Martincigh992d6dc2019-01-10 17:34:20 +000070 Optional<std::string&> reasonIfUnsupported = EmptyOptional()) const = 0;
Nattapat Chaimanowonga9a1cf12018-12-03 16:06:49 +000071
Matteo Martincigh992d6dc2019-01-10 17:34:20 +000072 virtual bool IsDepthwiseConvolutionSupported(
73 const TensorInfo& input,
74 const TensorInfo& output,
75 const DepthwiseConvolution2dDescriptor& descriptor,
76 const TensorInfo& weights,
77 const Optional<TensorInfo>& biases,
78 Optional<std::string&> reasonIfUnsupported = EmptyOptional()) const = 0;
David Becke97c6e02018-10-03 13:09:28 +010079
80 virtual bool IsDivisionSupported(const TensorInfo& input0,
81 const TensorInfo& input1,
82 const TensorInfo& output,
Matteo Martincigh992d6dc2019-01-10 17:34:20 +000083 Optional<std::string&> reasonIfUnsupported = EmptyOptional()) const = 0;
David Becke97c6e02018-10-03 13:09:28 +010084
FrancisMurtagh20995952018-12-17 12:11:36 +000085 virtual bool IsEqualSupported(const TensorInfo& input0,
86 const TensorInfo& input1,
87 const TensorInfo& output,
Matteo Martincigh992d6dc2019-01-10 17:34:20 +000088 Optional<std::string&> reasonIfUnsupported = EmptyOptional()) const = 0;
FrancisMurtagh20995952018-12-17 12:11:36 +000089
arovir01537a0b62018-10-08 12:01:04 +010090 virtual bool IsFakeQuantizationSupported(const TensorInfo& input,
91 const FakeQuantizationDescriptor& descriptor,
Matteo Martincigh992d6dc2019-01-10 17:34:20 +000092 Optional<std::string&> reasonIfUnsupported = EmptyOptional()) const = 0;
David Becke97c6e02018-10-03 13:09:28 +010093
arovir01537a0b62018-10-08 12:01:04 +010094 virtual bool IsFloorSupported(const TensorInfo& input,
95 const TensorInfo& output,
Matteo Martincigh992d6dc2019-01-10 17:34:20 +000096 Optional<std::string&> reasonIfUnsupported = EmptyOptional()) const = 0;
David Becke97c6e02018-10-03 13:09:28 +010097
98 virtual bool IsFullyConnectedSupported(const TensorInfo& input,
99 const TensorInfo& output,
100 const TensorInfo& weights,
101 const TensorInfo& biases,
102 const FullyConnectedDescriptor& descriptor,
Matteo Martincigh992d6dc2019-01-10 17:34:20 +0000103 Optional<std::string&> reasonIfUnsupported = EmptyOptional()) const = 0;
David Becke97c6e02018-10-03 13:09:28 +0100104
arovir01537a0b62018-10-08 12:01:04 +0100105 virtual bool IsInputSupported(const TensorInfo& input,
Matteo Martincigh992d6dc2019-01-10 17:34:20 +0000106 Optional<std::string&> reasonIfUnsupported = EmptyOptional()) const = 0;
arovir01537a0b62018-10-08 12:01:04 +0100107
David Becke97c6e02018-10-03 13:09:28 +0100108 virtual bool IsL2NormalizationSupported(const TensorInfo& input,
109 const TensorInfo& output,
110 const L2NormalizationDescriptor& descriptor,
Matteo Martincigh992d6dc2019-01-10 17:34:20 +0000111 Optional<std::string&> reasonIfUnsupported = EmptyOptional()) const = 0;
David Becke97c6e02018-10-03 13:09:28 +0100112
113 virtual bool IsLstmSupported(const TensorInfo& input,
114 const TensorInfo& outputStateIn,
115 const TensorInfo& cellStateIn,
116 const TensorInfo& scratchBuffer,
117 const TensorInfo& outputStateOut,
118 const TensorInfo& cellStateOut,
119 const TensorInfo& output,
120 const LstmDescriptor& descriptor,
121 const TensorInfo& inputToForgetWeights,
122 const TensorInfo& inputToCellWeights,
123 const TensorInfo& inputToOutputWeights,
124 const TensorInfo& recurrentToForgetWeights,
125 const TensorInfo& recurrentToCellWeights,
126 const TensorInfo& recurrentToOutputWeights,
127 const TensorInfo& forgetGateBias,
128 const TensorInfo& cellBias,
129 const TensorInfo& outputGateBias,
130 const TensorInfo* inputToInputWeights,
131 const TensorInfo* recurrentToInputWeights,
132 const TensorInfo* cellToInputWeights,
133 const TensorInfo* inputGateBias,
134 const TensorInfo* projectionWeights,
135 const TensorInfo* projectionBias,
136 const TensorInfo* cellToForgetWeights,
137 const TensorInfo* cellToOutputWeights,
Matteo Martincigh992d6dc2019-01-10 17:34:20 +0000138 Optional<std::string&> reasonIfUnsupported = EmptyOptional()) const = 0;
David Becke97c6e02018-10-03 13:09:28 +0100139
Nattapat Chaimanowong5a4304a2018-11-28 10:44:37 +0000140 virtual bool IsMaximumSupported(const TensorInfo& input0,
141 const TensorInfo& input1,
142 const TensorInfo& output,
Matteo Martincigh992d6dc2019-01-10 17:34:20 +0000143 Optional<std::string&> reasonIfUnsupported = EmptyOptional()) const = 0;
Nattapat Chaimanowong5a4304a2018-11-28 10:44:37 +0000144
arovir01537a0b62018-10-08 12:01:04 +0100145 virtual bool IsMeanSupported(const TensorInfo& input,
146 const TensorInfo& output,
147 const MeanDescriptor& descriptor,
Matteo Martincigh992d6dc2019-01-10 17:34:20 +0000148 Optional<std::string&> reasonIfUnsupported = EmptyOptional()) const = 0;
149
150 virtual bool IsMemCopySupported(const TensorInfo& input,
151 const TensorInfo& output,
152 Optional<std::string&> reasonIfUnsupported = EmptyOptional()) const = 0;
arovir01537a0b62018-10-08 12:01:04 +0100153
David Becke97c6e02018-10-03 13:09:28 +0100154 virtual bool IsMergerSupported(const std::vector<const TensorInfo*> inputs,
Nikhil Raj8599a412018-11-19 14:51:07 +0000155 const TensorInfo& output,
David Becke97c6e02018-10-03 13:09:28 +0100156 const OriginsDescriptor& descriptor,
Matteo Martincigh992d6dc2019-01-10 17:34:20 +0000157 Optional<std::string&> reasonIfUnsupported = EmptyOptional()) const = 0;
David Becke97c6e02018-10-03 13:09:28 +0100158
kevmay0190539692018-11-29 08:40:19 +0000159 virtual bool IsMinimumSupported(const TensorInfo& input0,
160 const TensorInfo& input1,
161 const TensorInfo& ouput,
Matteo Martincigh992d6dc2019-01-10 17:34:20 +0000162 Optional<std::string&> reasonIfUnsupported = EmptyOptional()) const = 0;
kevmay0190539692018-11-29 08:40:19 +0000163
David Becke97c6e02018-10-03 13:09:28 +0100164 virtual bool IsMultiplicationSupported(const TensorInfo& input0,
165 const TensorInfo& input1,
166 const TensorInfo& output,
Matteo Martincigh992d6dc2019-01-10 17:34:20 +0000167 Optional<std::string&> reasonIfUnsupported = EmptyOptional()) const = 0;
David Becke97c6e02018-10-03 13:09:28 +0100168
169 virtual bool IsNormalizationSupported(const TensorInfo& input,
170 const TensorInfo& output,
171 const NormalizationDescriptor& descriptor,
Matteo Martincigh992d6dc2019-01-10 17:34:20 +0000172 Optional<std::string&> reasonIfUnsupported = EmptyOptional()) const = 0;
David Becke97c6e02018-10-03 13:09:28 +0100173
174 virtual bool IsOutputSupported(const TensorInfo& output,
Matteo Martincigh992d6dc2019-01-10 17:34:20 +0000175 Optional<std::string&> reasonIfUnsupported = EmptyOptional()) const = 0;
David Becke97c6e02018-10-03 13:09:28 +0100176
arovir01537a0b62018-10-08 12:01:04 +0100177 virtual bool IsPadSupported(const TensorInfo& input,
178 const TensorInfo& output,
179 const PadDescriptor& descriptor,
Matteo Martincigh992d6dc2019-01-10 17:34:20 +0000180 Optional<std::string&> reasonIfUnsupported = EmptyOptional()) const = 0;
arovir01537a0b62018-10-08 12:01:04 +0100181
David Becke97c6e02018-10-03 13:09:28 +0100182 virtual bool IsPermuteSupported(const TensorInfo& input,
183 const TensorInfo& output,
184 const PermuteDescriptor& descriptor,
Matteo Martincigh992d6dc2019-01-10 17:34:20 +0000185 Optional<std::string&> reasonIfUnsupported = EmptyOptional()) const = 0;
David Becke97c6e02018-10-03 13:09:28 +0100186
187 virtual bool IsPooling2dSupported(const TensorInfo& input,
188 const TensorInfo& output,
189 const Pooling2dDescriptor& descriptor,
Matteo Martincigh992d6dc2019-01-10 17:34:20 +0000190 Optional<std::string&> reasonIfUnsupported = EmptyOptional()) const = 0;
David Becke97c6e02018-10-03 13:09:28 +0100191
Matteo Martincigh49124022019-01-11 13:25:59 +0000192 virtual bool IsPreCompiledSupported(const TensorInfo& input,
193 const PreCompiledDescriptor& descriptor,
194 Optional<std::string&> reasonIfUnsupported = EmptyOptional()) const = 0;
195
arovir01537a0b62018-10-08 12:01:04 +0100196 virtual bool IsReshapeSupported(const TensorInfo& input,
Matteo Martincigh992d6dc2019-01-10 17:34:20 +0000197 const ReshapeDescriptor& descriptor,
198 Optional<std::string&> reasonIfUnsupported = EmptyOptional()) const = 0;
arovir01537a0b62018-10-08 12:01:04 +0100199
Nattapat Chaimanowong207ef9a2018-11-02 10:57:25 +0000200 virtual bool IsSpaceToBatchNdSupported(const TensorInfo& input,
201 const TensorInfo& output,
202 const SpaceToBatchNdDescriptor& descriptor,
Matteo Martincigh992d6dc2019-01-10 17:34:20 +0000203 Optional<std::string&> reasonIfUnsupported = EmptyOptional()) const = 0;
Nattapat Chaimanowong207ef9a2018-11-02 10:57:25 +0000204
David Becke97c6e02018-10-03 13:09:28 +0100205 virtual bool IsResizeBilinearSupported(const TensorInfo& input,
Matteo Martincigh992d6dc2019-01-10 17:34:20 +0000206 Optional<std::string&> reasonIfUnsupported = EmptyOptional()) const = 0;
David Becke97c6e02018-10-03 13:09:28 +0100207
Mohamed Nour Abouelseouda1d3c6a2018-12-27 12:39:16 +0000208 virtual bool IsRsqrtSupported(const TensorInfo& input,
209 const TensorInfo& output,
Matteo Martincigh992d6dc2019-01-10 17:34:20 +0000210 Optional<std::string&> reasonIfUnsupported = EmptyOptional()) const = 0;
Mohamed Nour Abouelseouda1d3c6a2018-12-27 12:39:16 +0000211
David Becke97c6e02018-10-03 13:09:28 +0100212 virtual bool IsSoftmaxSupported(const TensorInfo& input,
213 const TensorInfo& output,
214 const SoftmaxDescriptor& descriptor,
Matteo Martincigh992d6dc2019-01-10 17:34:20 +0000215 Optional<std::string&> reasonIfUnsupported = EmptyOptional()) const = 0;
David Becke97c6e02018-10-03 13:09:28 +0100216
217 virtual bool IsSplitterSupported(const TensorInfo& input,
218 const ViewsDescriptor& descriptor,
Matteo Martincigh992d6dc2019-01-10 17:34:20 +0000219 Optional<std::string&> reasonIfUnsupported = EmptyOptional()) const = 0;
David Becke97c6e02018-10-03 13:09:28 +0100220
Conor Kennedy430b5d82018-11-14 15:28:28 +0000221 virtual bool IsStridedSliceSupported(const TensorInfo& input,
222 const TensorInfo& output,
223 const StridedSliceDescriptor& descriptor,
Matteo Martincigh992d6dc2019-01-10 17:34:20 +0000224 Optional<std::string&> reasonIfUnsupported = EmptyOptional()) const = 0;
Conor Kennedy430b5d82018-11-14 15:28:28 +0000225
arovir01537a0b62018-10-08 12:01:04 +0100226 virtual bool IsSubtractionSupported(const TensorInfo& input0,
227 const TensorInfo& input1,
228 const TensorInfo& output,
Matteo Martincigh992d6dc2019-01-10 17:34:20 +0000229 Optional<std::string&> reasonIfUnsupported = EmptyOptional()) const = 0;
Matteo Martincigh59a950c2018-12-13 12:48:25 +0000230
231 virtual bool IsGreaterSupported(const TensorInfo& input0,
232 const TensorInfo& input1,
233 const TensorInfo& ouput,
Matteo Martincigh992d6dc2019-01-10 17:34:20 +0000234 Optional<std::string&> reasonIfUnsupported = EmptyOptional()) const = 0;
David Becke97c6e02018-10-03 13:09:28 +0100235}; // class ILayerSupport
236
David Beck3e9e1152018-10-17 14:17:50 +0100237using ILayerSupportSharedPtr = std::shared_ptr<ILayerSupport>;
238
David Becke97c6e02018-10-03 13:09:28 +0100239} // namespace armnn