ArmNN
 22.08
EthosnRefLayerSupport.cpp
Go to the documentation of this file.
1 //
2 // Copyright © 2017 Arm Ltd. All rights reserved.
3 // SPDX-License-Identifier: MIT
4 //
5 
7 #include "EthosnRefBackendId.hpp"
8 
9 #include <armnn/Types.hpp>
10 #include <armnn/Descriptors.hpp>
12 
14 
15 #include <InternalTypes.hpp>
16 #include <LayerSupportCommon.hpp>
17 
19 
22 
23 #include <vector>
24 #include <algorithm>
25 #include <array>
26 
27 namespace armnn
28 {
29 
31  const TensorInfo& output,
32  const Convolution2dDescriptor& descriptor,
33  const TensorInfo& weights,
34  const Optional<TensorInfo>& biases,
35  Optional<std::string&> reasonIfUnsupported) const
36 {
37  bool supported = true;
38 
39  // Define supported types.
40  std::array<DataType,3> supportedTypes =
41  {
45  };
46 
47  supported &= CheckSupportRule(TypeAnyOf(input, supportedTypes), reasonIfUnsupported,
48  "EthosnReference Convolution2d: input is not a supported type.");
49 
50  supported &= CheckSupportRule(TypeAnyOf(output, supportedTypes), reasonIfUnsupported,
51  "EthosnReference Convolution2d: output is not a supported type.");
52 
53  supported &= CheckSupportRule(TypesAreEqual(input, output), reasonIfUnsupported,
54  "EthosnReference Convolution2d: input and output types mismatched.");
55 
56  supported &= CheckSupportRule(TypeAnyOf(weights, supportedTypes), reasonIfUnsupported,
57  "EthosnReference Convolution2d: weights is not a supported type.");
58 
59  supported &= CheckSupportRule(TypesAreEqual(input, weights), reasonIfUnsupported,
60  "EthosnReference Convolution2d: input and weights types mismatched.");
61 
62  if (biases.has_value())
63  {
64  std::array<DataType,1> biasesSupportedTypes =
65  {
67  };
68 
69  supported &= CheckSupportRule(TypeAnyOf(biases.value(), biasesSupportedTypes), reasonIfUnsupported,
70  "EthosnReference Convolution2d: biases is not a supported type.");
71  }
72  IgnoreUnused(descriptor);
73 
74  return supported;
75 }
76 
78  const TensorInfo& output,
80  const TensorInfo& weights,
83 {
84  bool supported = true;
85 
86 
87  // Define supported types.
88  std::array<DataType,3> supportedTypes =
89  {
93  };
94 
95  supported &= CheckSupportRule(TypeAnyOf(input, supportedTypes), reasonIfUnsupported,
96  "EthosnReference DepthwiseConvolution2d: input is not a supported type.");
97 
98  supported &= CheckSupportRule(TypeAnyOf(output, supportedTypes), reasonIfUnsupported,
99  "EthosnReference DepthwiseConvolution2d: output is not a supported type.");
100 
101  supported &= CheckSupportRule(TypesAreEqual(input, output), reasonIfUnsupported,
102  "EthosnReference DepthwiseConvolution2d: input and output types mismatched.");
103 
104  supported &= CheckSupportRule(TypeAnyOf(weights, supportedTypes), reasonIfUnsupported,
105  "EthosnReference DepthwiseConvolution2d: weights is not a supported type.");
106 
107  supported &= CheckSupportRule(TypesAreEqual(input, weights), reasonIfUnsupported,
108  "EthosnReference DepthwiseConvolution2d: input and weights types mismatched.");
109 
110  if (biases.has_value())
111  {
112  std::array<DataType,1> biasesSupportedTypes =
113  {
115  };
116 
117  supported &= CheckSupportRule(TypeAnyOf(biases.value(), biasesSupportedTypes), reasonIfUnsupported,
118  "EthosnReference DepthwiseConvolution2d: biases is not a supported type.");
119  }
120  IgnoreUnused(descriptor);
121 
122  return supported;
123 }
124 
125 
126 
128  const TensorInfo& output,
130  const TensorInfo& weights,
133 {
134  bool supported = true;
135 
136 
137  // Define supported types.
138  std::array<DataType,3> supportedTypes =
139  {
143  };
144 
145  supported &= CheckSupportRule(TypeAnyOf(input, supportedTypes), reasonIfUnsupported,
146  "EthosnReference TransposeConvolution2d: input is not a supported type.");
147 
148  supported &= CheckSupportRule(TypeAnyOf(output, supportedTypes), reasonIfUnsupported,
149  "EthosnReference TransposeConvolution2d: output is not a supported type.");
150 
151  supported &= CheckSupportRule(TypesAreEqual(input, output), reasonIfUnsupported,
152  "EthosnReference TransposeConvolution2d: input and output types mismatched.");
153 
154  supported &= CheckSupportRule(TypeAnyOf(weights, supportedTypes), reasonIfUnsupported,
155  "EthosnReference TransposeConvolution2d: weights is not a supported type.");
156 
157  supported &= CheckSupportRule(TypesAreEqual(input, weights), reasonIfUnsupported,
158  "EthosnReference TransposeConvolution2d: input and weights types mismatched.");
159 
160  if (biases.has_value())
161  {
162  std::array<DataType,1> biasesSupportedTypes =
163  {
165  };
166 
167  supported &= CheckSupportRule(TypeAnyOf(biases.value(), biasesSupportedTypes), reasonIfUnsupported,
168  "EthosnReference TransposeConvolution2d: biases is not a supported type.");
169  }
170  IgnoreUnused(descriptor);
171 
172  return supported;
173 }
174 
176  const TensorInfo& output,
179 {
180  IgnoreUnused(descriptor);
181  bool supported = true;
182 
183  // Define supported output and inputs types.
184  std::array<DataType,3> supportedTypes =
185  {
189  };
190 
191  supported &= CheckSupportRule(TypeAnyOf(input, supportedTypes), reasonIfUnsupported,
192  "EthosnReference Poolind2d: input is not a supported type.");
193 
194  supported &= CheckSupportRule(TypeAnyOf(output, supportedTypes), reasonIfUnsupported,
195  "EthosnReference Poolind2d: output is not a supported type.");
196 
197  supported &= CheckSupportRule(TypesAreEqual(input, output), reasonIfUnsupported,
198  "EthosnReference Poolind2d: input and output types are mismatched.");
199 
200  supported = (descriptor.m_PoolType == armnn::PoolingAlgorithm::Average);
201  if ( descriptor.m_PoolType != armnn::PoolingAlgorithm::Average)
202  {
203  reasonIfUnsupported.value() += "EthosnReference poolind2d: pooling algorithm is not supported.";
204  }
205 
206  return supported;
207 }
208 
209 } // namespace armnn
A TransposeConvolution2dDescriptor for the TransposeConvolution2dLayer.
const TensorInfo & output
A Convolution2dDescriptor for the Convolution2dLayer.
const TensorInfo const ActivationDescriptor Optional< std::string & > reasonIfUnsupported
bool IsTransposeConvolution2dSupported(const TensorInfo &input, const TensorInfo &output, const TransposeConvolution2dDescriptor &descriptor, const TensorInfo &weights, const Optional< TensorInfo > &biases, Optional< std::string &> reasonIfUnsupported=EmptyOptional()) const override
Copyright (c) 2021 ARM Limited and Contributors.
void IgnoreUnused(Ts &&...)
const TensorInfo const ActivationDescriptor & descriptor
bool IsConvolution2dSupported(const TensorInfo &input, const TensorInfo &output, const Convolution2dDescriptor &descriptor, const TensorInfo &weights, const Optional< TensorInfo > &biases, Optional< std::string &> reasonIfUnsupported=EmptyOptional()) const override
bool IsPooling2dSupported(const TensorInfo &input, const TensorInfo &output, const Pooling2dDescriptor &descriptor, Optional< std::string &> reasonIfUnsupported=EmptyOptional()) const override
bool has_value() const noexcept
Definition: Optional.hpp:53
bool IsDepthwiseConvolutionSupported(const TensorInfo &input, const TensorInfo &output, const DepthwiseConvolution2dDescriptor &descriptor, const TensorInfo &weights, const Optional< TensorInfo > &biases, Optional< std::string &> reasonIfUnsupported=EmptyOptional()) const override
PoolingAlgorithm m_PoolType
The pooling algorithm to use (Max. Average, L2).
const TensorInfo const Convolution2dDescriptor const TensorInfo const Optional< TensorInfo > & biases
A Pooling2dDescriptor for the Pooling2dLayer.
bool CheckSupportRule(F rule, Optional< std::string &> reasonIfUnsupported, const char *reason)
const TensorInfo const Convolution2dDescriptor const TensorInfo & weights
A DepthwiseConvolution2dDescriptor for the DepthwiseConvolution2dLayer.