ArmNN
 22.05
ConstTensorLayerVisitor.hpp
Go to the documentation of this file.
1 //
2 // Copyright © 2017 Arm Ltd. All rights reserved.
3 // SPDX-License-Identifier: MIT
4 //
5 #pragma once
6 
7 #include "TestLayerVisitor.hpp"
8 #include "LayersFwd.hpp"
9 #include <armnn/Descriptors.hpp>
10 #include <armnn/LstmParams.hpp>
14 
15 #include <doctest/doctest.h>
16 
17 namespace armnn
18 {
19 
21 {
22 public:
23  explicit TestConvolution2dLayerVisitor(const Convolution2dDescriptor& convolution2dDescriptor,
24  const char* name = nullptr)
25  : TestLayerVisitor(name)
26  , m_Descriptor(convolution2dDescriptor)
27  {}
28 
30 
32  const armnn::BaseDescriptor& descriptor,
33  const std::vector<armnn::ConstTensor>& constants,
34  const char* name,
35  const armnn::LayerBindingId id = 0) override
36  {
37  armnn::IgnoreUnused(descriptor, constants, id);
38  switch (layer->GetType())
39  {
41  {
42  CheckLayerPointer(layer);
43  CheckLayerName(name);
44  CheckDescriptor(static_cast<const armnn::Convolution2dDescriptor&>(descriptor));
45  break;
46  }
47  default:
48  {
50  }
51  }
52  }
53 
54 protected:
55  void CheckDescriptor(const Convolution2dDescriptor& convolution2dDescriptor);
56 
57 private:
58  Convolution2dDescriptor m_Descriptor;
59 };
60 
62 {
63 public:
65  const char* name = nullptr)
66  : TestLayerVisitor(name)
67  , m_Descriptor(descriptor)
68  {}
69 
71 
73  const armnn::BaseDescriptor& descriptor,
74  const std::vector<armnn::ConstTensor>& constants,
75  const char* name,
76  const armnn::LayerBindingId id = 0) override
77  {
78  armnn::IgnoreUnused(descriptor, constants, id);
79  switch (layer->GetType())
80  {
82  {
83  CheckLayerPointer(layer);
84  CheckLayerName(name);
85  CheckDescriptor(static_cast<const armnn::DepthwiseConvolution2dDescriptor&>(descriptor));
86  break;
87  }
88  default:
89  {
91  }
92  }
93  }
94 
95 protected:
96  void CheckDescriptor(const DepthwiseConvolution2dDescriptor& convolution2dDescriptor);
97 
98 private:
100 };
101 
103 {
104 public:
106  const char* name = nullptr)
107  : TestLayerVisitor(name)
108  , m_Descriptor(descriptor)
109  {}
110 
112 
114  const armnn::BaseDescriptor& descriptor,
115  const std::vector<armnn::ConstTensor>& constants,
116  const char* name,
117  const armnn::LayerBindingId id = 0) override
118  {
119  armnn::IgnoreUnused(descriptor, constants, id);
120  switch (layer->GetType())
121  {
123  {
124  CheckLayerPointer(layer);
125  CheckLayerName(name);
126  CheckDescriptor(static_cast<const armnn::FullyConnectedDescriptor&>(descriptor));
127  break;
128  }
129  default:
130  {
132  }
133  }
134  }
135 
136 protected:
137  void CheckDescriptor(const FullyConnectedDescriptor& descriptor);
138 private:
139  FullyConnectedDescriptor m_Descriptor;
140 };
141 
143 {
144 public:
146  const ConstTensor& mean,
147  const ConstTensor& variance,
148  const ConstTensor& beta,
149  const ConstTensor& gamma,
150  const char* name = nullptr)
151  : TestLayerVisitor(name)
152  , m_Descriptor(descriptor)
153  , m_Mean(mean)
154  , m_Variance(variance)
155  , m_Beta(beta)
156  , m_Gamma(gamma)
157  {}
158 
160  const armnn::BaseDescriptor& descriptor,
161  const std::vector<armnn::ConstTensor>& constants,
162  const char* name,
163  const armnn::LayerBindingId id = 0) override
164  {
165  armnn::IgnoreUnused(descriptor, constants, id);
166  switch (layer->GetType())
167  {
169  {
170  CheckLayerPointer(layer);
171  CheckLayerName(name);
172  CheckDescriptor(static_cast<const armnn::BatchNormalizationDescriptor&>(descriptor));
173  CheckConstTensors(m_Mean, constants[0]);
174  CheckConstTensors(m_Variance, constants[1]);
175  CheckConstTensors(m_Beta, constants[2]);
176  CheckConstTensors(m_Gamma, constants[3]);
177  break;
178  }
179  default:
180  {
182  }
183  }
184  }
185 
186 protected:
187  void CheckDescriptor(const BatchNormalizationDescriptor& descriptor);
188 
189 private:
190  BatchNormalizationDescriptor m_Descriptor;
191  ConstTensor m_Mean;
192  ConstTensor m_Variance;
193  ConstTensor m_Beta;
194  ConstTensor m_Gamma;
195 };
196 
198 {
199 public:
200  explicit TestConstantLayerVisitor(const ConstTensor& input,
201  const char* name = nullptr)
202  : TestLayerVisitor(name)
203  , m_Input(input)
204  {}
205 
207  const armnn::BaseDescriptor& descriptor,
208  const std::vector<armnn::ConstTensor>& constants,
209  const char* name,
210  const armnn::LayerBindingId id = 0) override
211  {
212  armnn::IgnoreUnused(descriptor, constants, id);
213  switch (layer->GetType())
214  {
216  {
217  CheckLayerPointer(layer);
218  CheckLayerName(name);
219  CheckConstTensors(m_Input, constants[0]);
220  break;
221  }
222  default:
223  {
225  }
226  }
227  }
228 
229 private:
230  ConstTensor m_Input;
231 };
232 
233 // Used to supply utility functions to the actual lstm test visitors
235 {
236 public:
237  explicit LstmVisitor(const LstmInputParams& params,
238  const char* name = nullptr)
239  : TestLayerVisitor(name)
240  , m_InputParams(params) {}
241 
242 protected:
243  template<typename LayerType>
244  void CheckInputParameters(const LayerType* layer, const LstmInputParams& inputParams);
245 
247 };
248 
249 template<typename LayerType>
250 void LstmVisitor::CheckInputParameters(const LayerType* layer, const LstmInputParams& inputParams)
251 {
252  CheckConstTensorPtrs("OutputGateBias",
253  inputParams.m_OutputGateBias,
254  layer->m_BasicParameters.m_OutputGateBias);
255  CheckConstTensorPtrs("InputToForgetWeights",
256  inputParams.m_InputToForgetWeights,
257  layer->m_BasicParameters.m_InputToForgetWeights);
258  CheckConstTensorPtrs("InputToCellWeights",
259  inputParams.m_InputToCellWeights,
260  layer->m_BasicParameters.m_InputToCellWeights);
261  CheckConstTensorPtrs("InputToOutputWeights",
262  inputParams.m_InputToOutputWeights,
263  layer->m_BasicParameters.m_InputToOutputWeights);
264  CheckConstTensorPtrs("RecurrentToForgetWeights",
265  inputParams.m_RecurrentToForgetWeights,
266  layer->m_BasicParameters.m_RecurrentToForgetWeights);
267  CheckConstTensorPtrs("RecurrentToCellWeights",
268  inputParams.m_RecurrentToCellWeights,
269  layer->m_BasicParameters.m_RecurrentToCellWeights);
270  CheckConstTensorPtrs("RecurrentToOutputWeights",
271  inputParams.m_RecurrentToOutputWeights,
272  layer->m_BasicParameters.m_RecurrentToOutputWeights);
273  CheckConstTensorPtrs("ForgetGateBias",
274  inputParams.m_ForgetGateBias,
275  layer->m_BasicParameters.m_ForgetGateBias);
276  CheckConstTensorPtrs("CellBias",
277  inputParams.m_CellBias,
278  layer->m_BasicParameters.m_CellBias);
279 
280  CheckConstTensorPtrs("InputToInputWeights",
281  inputParams.m_InputToInputWeights,
282  layer->m_CifgParameters.m_InputToInputWeights);
283  CheckConstTensorPtrs("RecurrentToInputWeights",
284  inputParams.m_RecurrentToInputWeights,
285  layer->m_CifgParameters.m_RecurrentToInputWeights);
286  CheckConstTensorPtrs("InputGateBias",
287  inputParams.m_InputGateBias,
288  layer->m_CifgParameters.m_InputGateBias);
289 
290  CheckConstTensorPtrs("ProjectionBias",
291  inputParams.m_ProjectionBias,
292  layer->m_ProjectionParameters.m_ProjectionBias);
293  CheckConstTensorPtrs("ProjectionWeights",
294  inputParams.m_ProjectionWeights,
295  layer->m_ProjectionParameters.m_ProjectionWeights);
296 
297  CheckConstTensorPtrs("CellToInputWeights",
298  inputParams.m_CellToInputWeights,
299  layer->m_PeepholeParameters.m_CellToInputWeights);
300  CheckConstTensorPtrs("CellToForgetWeights",
301  inputParams.m_CellToForgetWeights,
302  layer->m_PeepholeParameters.m_CellToForgetWeights);
303  CheckConstTensorPtrs("CellToOutputWeights",
304  inputParams.m_CellToOutputWeights,
305  layer->m_PeepholeParameters.m_CellToOutputWeights);
306 
307  CheckConstTensorPtrs("InputLayerNormWeights",
308  inputParams.m_InputLayerNormWeights,
309  layer->m_LayerNormParameters.m_InputLayerNormWeights);
310  CheckConstTensorPtrs("ForgetLayerNormWeights",
311  inputParams.m_ForgetLayerNormWeights,
312  layer->m_LayerNormParameters.m_ForgetLayerNormWeights);
313  CheckConstTensorPtrs("CellLayerNormWeights",
314  inputParams.m_CellLayerNormWeights,
315  layer->m_LayerNormParameters.m_CellLayerNormWeights);
316  CheckConstTensorPtrs("OutputLayerNormWeights",
317  inputParams.m_OutputLayerNormWeights,
318  layer->m_LayerNormParameters.m_OutputLayerNormWeights);
319 }
320 
322 {
323 public:
324  explicit TestLstmLayerVisitor(const LstmDescriptor& descriptor,
325  const LstmInputParams& params,
326  const char* name = nullptr)
327  : LstmVisitor(params, name)
328  , m_Descriptor(descriptor)
329  {}
330 
332  const armnn::BaseDescriptor& descriptor,
333  const std::vector<armnn::ConstTensor>& constants,
334  const char* name,
335  const armnn::LayerBindingId id = 0) override
336  {
337  armnn::IgnoreUnused(descriptor, constants, id);
338  switch (layer->GetType())
339  {
341  {
342  CheckLayerPointer(layer);
343  CheckLayerName(name);
344  CheckDescriptor(static_cast<const armnn::LstmDescriptor&>(descriptor));
345  CheckInputParameters<const LstmLayer>(PolymorphicDowncast<const LstmLayer*>(layer), m_InputParams);
346  break;
347  }
348  default:
349  {
351  }
352  }
353  }
354 
355 protected:
356  void CheckDescriptor(const LstmDescriptor& descriptor);
357 
358 private:
359  LstmDescriptor m_Descriptor;
360 };
361 
363 {
364 public:
365  explicit TestQLstmLayerVisitor(const QLstmDescriptor& descriptor,
366  const LstmInputParams& params,
367  const char* name = nullptr)
368  : LstmVisitor(params, name)
369  , m_Descriptor(descriptor)
370  {}
371 
373  const armnn::BaseDescriptor& descriptor,
374  const std::vector<armnn::ConstTensor>& constants,
375  const char* name,
376  const armnn::LayerBindingId id = 0) override
377  {
378  armnn::IgnoreUnused(descriptor, constants, id);
379  switch (layer->GetType())
380  {
382  {
383  CheckLayerPointer(layer);
384  CheckLayerName(name);
385  CheckDescriptor(static_cast<const armnn::QLstmDescriptor&>(descriptor));
386  CheckInputParameters<const QLstmLayer>(PolymorphicDowncast<const QLstmLayer*>(layer), m_InputParams);
387  break;
388  }
389  default:
390  {
392  }
393  }
394  }
395 
396 protected:
397  void CheckDescriptor(const QLstmDescriptor& descriptor);
398 
399 private:
400  QLstmDescriptor m_Descriptor;
401 };
402 
403 
405 {
406 public:
408  const char* name = nullptr)
409  : TestLayerVisitor(name)
410  , m_InputParams(params)
411  {}
412 
414  const armnn::BaseDescriptor& descriptor,
415  const std::vector<armnn::ConstTensor>& constants,
416  const char* name,
417  const armnn::LayerBindingId id = 0) override
418  {
419  armnn::IgnoreUnused(descriptor, constants, id);
420  switch (layer->GetType())
421  {
423  {
424  CheckLayerPointer(layer);
425  CheckLayerName(name);
426  CheckInputParameters(m_InputParams);
427  break;
428  }
429  default:
430  {
432  }
433  }
434  }
435 
436 protected:
437  void CheckInputParameters(const QuantizedLstmInputParams& params);
438 
439 private:
440  QuantizedLstmInputParams m_InputParams;
441 };
442 
443 
444 } // namespace armnn
void ExecuteStrategy(const armnn::IConnectableLayer *layer, const armnn::BaseDescriptor &descriptor, const std::vector< armnn::ConstTensor > &constants, const char *name, const armnn::LayerBindingId id=0) override
void CheckLayerName(const char *name)
const ConstTensor * m_ProjectionWeights
Definition: LstmParams.hpp:55
Interface for a layer that is connectable to other layers via InputSlots and OutputSlots.
Definition: INetwork.hpp:66
const ConstTensor * m_CellBias
Definition: LstmParams.hpp:53
const ConstTensor * m_CellToOutputWeights
Definition: LstmParams.hpp:50
void ExecuteStrategy(const armnn::IConnectableLayer *layer, const armnn::BaseDescriptor &descriptor, const std::vector< armnn::ConstTensor > &constants, const char *name, const armnn::LayerBindingId id=0) override
A Convolution2dDescriptor for the Convolution2dLayer.
const ConstTensor * m_CellToInputWeights
Definition: LstmParams.hpp:48
void CheckLayerPointer(const IConnectableLayer *layer)
const ConstTensor * m_InputGateBias
Definition: LstmParams.hpp:51
const ConstTensor * m_RecurrentToCellWeights
Definition: LstmParams.hpp:46
void ExecuteStrategy(const armnn::IConnectableLayer *layer, const armnn::BaseDescriptor &descriptor, const std::vector< armnn::ConstTensor > &constants, const char *name, const armnn::LayerBindingId id=0) override
const ConstTensor * m_ForgetLayerNormWeights
Definition: LstmParams.hpp:58
const ConstTensor * m_CellToForgetWeights
Definition: LstmParams.hpp:49
Copyright (c) 2021 ARM Limited and Contributors.
void IgnoreUnused(Ts &&...)
void ExecuteStrategy(const armnn::IConnectableLayer *layer, const armnn::BaseDescriptor &descriptor, const std::vector< armnn::ConstTensor > &constants, const char *name, const armnn::LayerBindingId id=0) override
void CheckInputParameters(const LayerType *layer, const LstmInputParams &inputParams)
TestDepthwiseConvolution2dLayerVisitor(const DepthwiseConvolution2dDescriptor &descriptor, const char *name=nullptr)
int LayerBindingId
Type of identifiers for bindable layers (inputs, outputs).
Definition: Types.hpp:290
const ConstTensor * m_OutputGateBias
Definition: LstmParams.hpp:54
void CheckConstTensors(const ConstTensor &expected, const ConstTensor &actual)
Base class for all descriptors.
Definition: Descriptors.hpp:22
TestBatchNormalizationLayerVisitor(const BatchNormalizationDescriptor &descriptor, const ConstTensor &mean, const ConstTensor &variance, const ConstTensor &beta, const ConstTensor &gamma, const char *name=nullptr)
const ConstTensor * m_InputLayerNormWeights
Definition: LstmParams.hpp:57
const ConstTensor * m_RecurrentToOutputWeights
Definition: LstmParams.hpp:47
An LstmDescriptor for the LstmLayer.
TestFullyConnectedLayerVistor(const FullyConnectedDescriptor &descriptor, const char *name=nullptr)
const ConstTensor * m_ProjectionBias
Definition: LstmParams.hpp:56
TestConvolution2dLayerVisitor(const Convolution2dDescriptor &convolution2dDescriptor, const char *name=nullptr)
A FullyConnectedDescriptor for the FullyConnectedLayer.
A tensor defined by a TensorInfo (shape and data type) and an immutable backing store.
Definition: Tensor.hpp:327
void ExecuteStrategy(const armnn::IConnectableLayer *layer, const armnn::BaseDescriptor &descriptor, const std::vector< armnn::ConstTensor > &constants, const char *name, const armnn::LayerBindingId id=0) override
TestConstantLayerVisitor(const ConstTensor &input, const char *name=nullptr)
void CheckDescriptor(const Convolution2dDescriptor &convolution2dDescriptor)
A QLstmDescriptor for the QLstmLayer.
void Apply(const std::string &)
virtual LayerType GetType() const =0
Returns the armnn::LayerType of this layer.
void ExecuteStrategy(const armnn::IConnectableLayer *layer, const armnn::BaseDescriptor &descriptor, const std::vector< armnn::ConstTensor > &constants, const char *name, const armnn::LayerBindingId id=0) override
const ConstTensor * m_CellLayerNormWeights
Definition: LstmParams.hpp:59
const ConstTensor * m_ForgetGateBias
Definition: LstmParams.hpp:52
const ConstTensor * m_InputToCellWeights
Definition: LstmParams.hpp:42
const ConstTensor * m_InputToOutputWeights
Definition: LstmParams.hpp:43
void CheckConstTensorPtrs(const std::string &name, const ConstTensor *expected, const ConstTensor *actual)
LstmVisitor(const LstmInputParams &params, const char *name=nullptr)
const ConstTensor * m_RecurrentToForgetWeights
Definition: LstmParams.hpp:45
const ConstTensor * m_RecurrentToInputWeights
Definition: LstmParams.hpp:44
TestLstmLayerVisitor(const LstmDescriptor &descriptor, const LstmInputParams &params, const char *name=nullptr)
const ConstTensor * m_OutputLayerNormWeights
Definition: LstmParams.hpp:60
TestQLstmLayerVisitor(const QLstmDescriptor &descriptor, const LstmInputParams &params, const char *name=nullptr)
TestQuantizedLstmLayerVisitor(const QuantizedLstmInputParams &params, const char *name=nullptr)
void ExecuteStrategy(const armnn::IConnectableLayer *layer, const armnn::BaseDescriptor &descriptor, const std::vector< armnn::ConstTensor > &constants, const char *name, const armnn::LayerBindingId id=0) override
void ExecuteStrategy(const armnn::IConnectableLayer *layer, const armnn::BaseDescriptor &descriptor, const std::vector< armnn::ConstTensor > &constants, const char *name, const armnn::LayerBindingId id=0) override
const char * GetLayerTypeAsCString(LayerType type)
A DepthwiseConvolution2dDescriptor for the DepthwiseConvolution2dLayer.
A BatchNormalizationDescriptor for the BatchNormalizationLayer.
const ConstTensor * m_InputToForgetWeights
Definition: LstmParams.hpp:41
LayerType
When adding a new layer, adapt also the LastLayer enum value in the enum class LayerType below...
Definition: Types.hpp:467
const ConstTensor * m_InputToInputWeights
Definition: LstmParams.hpp:40