ArmNN
 22.02
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 ConstTensor& weights,
25  const Optional<ConstTensor>& biases,
26  const char* name = nullptr)
27  : TestLayerVisitor(name)
28  , m_Descriptor(convolution2dDescriptor)
29  , m_Weights(weights)
30  , m_Biases(biases)
31  {}
32 
34 
36  const armnn::BaseDescriptor& descriptor,
37  const std::vector<armnn::ConstTensor>& constants,
38  const char* name,
39  const armnn::LayerBindingId id = 0) override
40  {
41  armnn::IgnoreUnused(descriptor, constants, id);
42  switch (layer->GetType())
43  {
45  {
46  CheckLayerPointer(layer);
47  CheckLayerName(name);
48  CheckDescriptor(static_cast<const armnn::Convolution2dDescriptor&>(descriptor));
49  CheckConstTensors(m_Weights, constants[0]);
50  if (m_Biases.has_value())
51  {
52  CHECK(constants.size() == 2);
53  CheckConstTensors(m_Biases.value(), constants[1]);
54  }
55  break;
56  }
57  default:
58  {
60  }
61  }
62  }
63 
64 protected:
65  void CheckDescriptor(const Convolution2dDescriptor& convolution2dDescriptor);
66 
67 private:
68  Convolution2dDescriptor m_Descriptor;
69  ConstTensor m_Weights;
70  Optional<ConstTensor> m_Biases;
71 };
72 
74 {
75 public:
77  const ConstTensor& weights,
78  const Optional<ConstTensor>& biases,
79  const char* name = nullptr)
80  : TestLayerVisitor(name)
81  , m_Descriptor(descriptor)
82  , m_Weights(weights)
83  , m_Biases(biases)
84  {}
85 
87 
89  const armnn::BaseDescriptor& descriptor,
90  const std::vector<armnn::ConstTensor>& constants,
91  const char* name,
92  const armnn::LayerBindingId id = 0) override
93  {
94  armnn::IgnoreUnused(descriptor, constants, id);
95  switch (layer->GetType())
96  {
98  {
99  CheckLayerPointer(layer);
100  CheckLayerName(name);
101  CheckDescriptor(static_cast<const armnn::DepthwiseConvolution2dDescriptor&>(descriptor));
102  CheckConstTensors(m_Weights, constants[0]);
103  if (m_Biases.has_value())
104  {
105  CHECK(constants.size() == 2);
106  CheckConstTensors(m_Biases.value(), constants[1]);
107  }
108  break;
109  }
110  default:
111  {
113  }
114  }
115  }
116 
117 protected:
118  void CheckDescriptor(const DepthwiseConvolution2dDescriptor& convolution2dDescriptor);
119 
120 private:
122  ConstTensor m_Weights;
123  Optional<ConstTensor> m_Biases;
124 };
125 
127 {
128 public:
130  const char* name = nullptr)
131  : TestLayerVisitor(name)
132  , m_Descriptor(descriptor)
133  {}
134 
136 
138  const armnn::BaseDescriptor& descriptor,
139  const std::vector<armnn::ConstTensor>& constants,
140  const char* name,
141  const armnn::LayerBindingId id = 0) override
142  {
143  armnn::IgnoreUnused(descriptor, constants, id);
144  switch (layer->GetType())
145  {
147  {
148  CheckLayerPointer(layer);
149  CheckLayerName(name);
150  CheckDescriptor(static_cast<const armnn::FullyConnectedDescriptor&>(descriptor));
151  break;
152  }
153  default:
154  {
156  }
157  }
158  }
159 
160 protected:
161  void CheckDescriptor(const FullyConnectedDescriptor& descriptor);
162 private:
163  FullyConnectedDescriptor m_Descriptor;
164 };
165 
167 {
168 public:
170  const ConstTensor& mean,
171  const ConstTensor& variance,
172  const ConstTensor& beta,
173  const ConstTensor& gamma,
174  const char* name = nullptr)
175  : TestLayerVisitor(name)
176  , m_Descriptor(descriptor)
177  , m_Mean(mean)
178  , m_Variance(variance)
179  , m_Beta(beta)
180  , m_Gamma(gamma)
181  {}
182 
184  const armnn::BaseDescriptor& descriptor,
185  const std::vector<armnn::ConstTensor>& constants,
186  const char* name,
187  const armnn::LayerBindingId id = 0) override
188  {
189  armnn::IgnoreUnused(descriptor, constants, id);
190  switch (layer->GetType())
191  {
193  {
194  CheckLayerPointer(layer);
195  CheckLayerName(name);
196  CheckDescriptor(static_cast<const armnn::BatchNormalizationDescriptor&>(descriptor));
197  CheckConstTensors(m_Mean, constants[0]);
198  CheckConstTensors(m_Variance, constants[1]);
199  CheckConstTensors(m_Beta, constants[2]);
200  CheckConstTensors(m_Gamma, constants[3]);
201  break;
202  }
203  default:
204  {
206  }
207  }
208  }
209 
210 protected:
211  void CheckDescriptor(const BatchNormalizationDescriptor& descriptor);
212 
213 private:
214  BatchNormalizationDescriptor m_Descriptor;
215  ConstTensor m_Mean;
216  ConstTensor m_Variance;
217  ConstTensor m_Beta;
218  ConstTensor m_Gamma;
219 };
220 
222 {
223 public:
224  explicit TestConstantLayerVisitor(const ConstTensor& input,
225  const char* name = nullptr)
226  : TestLayerVisitor(name)
227  , m_Input(input)
228  {}
229 
231  const armnn::BaseDescriptor& descriptor,
232  const std::vector<armnn::ConstTensor>& constants,
233  const char* name,
234  const armnn::LayerBindingId id = 0) override
235  {
236  armnn::IgnoreUnused(descriptor, constants, id);
237  switch (layer->GetType())
238  {
240  {
241  CheckLayerPointer(layer);
242  CheckLayerName(name);
243  CheckConstTensors(m_Input, constants[0]);
244  break;
245  }
246  default:
247  {
249  }
250  }
251  }
252 
253 private:
254  ConstTensor m_Input;
255 };
256 
257 // Used to supply utility functions to the actual lstm test visitors
259 {
260 public:
261  explicit LstmVisitor(const LstmInputParams& params,
262  const char* name = nullptr)
263  : TestLayerVisitor(name)
264  , m_InputParams(params) {}
265 
266 protected:
267  template<typename LayerType>
268  void CheckInputParameters(const LayerType* layer, const LstmInputParams& inputParams);
269 
271 };
272 
273 template<typename LayerType>
274 void LstmVisitor::CheckInputParameters(const LayerType* layer, const LstmInputParams& inputParams)
275 {
276  CheckConstTensorPtrs("OutputGateBias",
277  inputParams.m_OutputGateBias,
278  layer->m_BasicParameters.m_OutputGateBias);
279  CheckConstTensorPtrs("InputToForgetWeights",
280  inputParams.m_InputToForgetWeights,
281  layer->m_BasicParameters.m_InputToForgetWeights);
282  CheckConstTensorPtrs("InputToCellWeights",
283  inputParams.m_InputToCellWeights,
284  layer->m_BasicParameters.m_InputToCellWeights);
285  CheckConstTensorPtrs("InputToOutputWeights",
286  inputParams.m_InputToOutputWeights,
287  layer->m_BasicParameters.m_InputToOutputWeights);
288  CheckConstTensorPtrs("RecurrentToForgetWeights",
289  inputParams.m_RecurrentToForgetWeights,
290  layer->m_BasicParameters.m_RecurrentToForgetWeights);
291  CheckConstTensorPtrs("RecurrentToCellWeights",
292  inputParams.m_RecurrentToCellWeights,
293  layer->m_BasicParameters.m_RecurrentToCellWeights);
294  CheckConstTensorPtrs("RecurrentToOutputWeights",
295  inputParams.m_RecurrentToOutputWeights,
296  layer->m_BasicParameters.m_RecurrentToOutputWeights);
297  CheckConstTensorPtrs("ForgetGateBias",
298  inputParams.m_ForgetGateBias,
299  layer->m_BasicParameters.m_ForgetGateBias);
300  CheckConstTensorPtrs("CellBias",
301  inputParams.m_CellBias,
302  layer->m_BasicParameters.m_CellBias);
303 
304  CheckConstTensorPtrs("InputToInputWeights",
305  inputParams.m_InputToInputWeights,
306  layer->m_CifgParameters.m_InputToInputWeights);
307  CheckConstTensorPtrs("RecurrentToInputWeights",
308  inputParams.m_RecurrentToInputWeights,
309  layer->m_CifgParameters.m_RecurrentToInputWeights);
310  CheckConstTensorPtrs("InputGateBias",
311  inputParams.m_InputGateBias,
312  layer->m_CifgParameters.m_InputGateBias);
313 
314  CheckConstTensorPtrs("ProjectionBias",
315  inputParams.m_ProjectionBias,
316  layer->m_ProjectionParameters.m_ProjectionBias);
317  CheckConstTensorPtrs("ProjectionWeights",
318  inputParams.m_ProjectionWeights,
319  layer->m_ProjectionParameters.m_ProjectionWeights);
320 
321  CheckConstTensorPtrs("CellToInputWeights",
322  inputParams.m_CellToInputWeights,
323  layer->m_PeepholeParameters.m_CellToInputWeights);
324  CheckConstTensorPtrs("CellToForgetWeights",
325  inputParams.m_CellToForgetWeights,
326  layer->m_PeepholeParameters.m_CellToForgetWeights);
327  CheckConstTensorPtrs("CellToOutputWeights",
328  inputParams.m_CellToOutputWeights,
329  layer->m_PeepholeParameters.m_CellToOutputWeights);
330 
331  CheckConstTensorPtrs("InputLayerNormWeights",
332  inputParams.m_InputLayerNormWeights,
333  layer->m_LayerNormParameters.m_InputLayerNormWeights);
334  CheckConstTensorPtrs("ForgetLayerNormWeights",
335  inputParams.m_ForgetLayerNormWeights,
336  layer->m_LayerNormParameters.m_ForgetLayerNormWeights);
337  CheckConstTensorPtrs("CellLayerNormWeights",
338  inputParams.m_CellLayerNormWeights,
339  layer->m_LayerNormParameters.m_CellLayerNormWeights);
340  CheckConstTensorPtrs("OutputLayerNormWeights",
341  inputParams.m_OutputLayerNormWeights,
342  layer->m_LayerNormParameters.m_OutputLayerNormWeights);
343 }
344 
346 {
347 public:
348  explicit TestLstmLayerVisitor(const LstmDescriptor& descriptor,
349  const LstmInputParams& params,
350  const char* name = nullptr)
351  : LstmVisitor(params, name)
352  , m_Descriptor(descriptor)
353  {}
354 
356  const armnn::BaseDescriptor& descriptor,
357  const std::vector<armnn::ConstTensor>& constants,
358  const char* name,
359  const armnn::LayerBindingId id = 0) override
360  {
361  armnn::IgnoreUnused(descriptor, constants, id);
362  switch (layer->GetType())
363  {
365  {
366  CheckLayerPointer(layer);
367  CheckLayerName(name);
368  CheckDescriptor(static_cast<const armnn::LstmDescriptor&>(descriptor));
369  CheckInputParameters<const LstmLayer>(PolymorphicDowncast<const LstmLayer*>(layer), m_InputParams);
370  break;
371  }
372  default:
373  {
375  }
376  }
377  }
378 
379 protected:
380  void CheckDescriptor(const LstmDescriptor& descriptor);
381 
382 private:
383  LstmDescriptor m_Descriptor;
384 };
385 
387 {
388 public:
389  explicit TestQLstmLayerVisitor(const QLstmDescriptor& descriptor,
390  const LstmInputParams& params,
391  const char* name = nullptr)
392  : LstmVisitor(params, name)
393  , m_Descriptor(descriptor)
394  {}
395 
397  const armnn::BaseDescriptor& descriptor,
398  const std::vector<armnn::ConstTensor>& constants,
399  const char* name,
400  const armnn::LayerBindingId id = 0) override
401  {
402  armnn::IgnoreUnused(descriptor, constants, id);
403  switch (layer->GetType())
404  {
406  {
407  CheckLayerPointer(layer);
408  CheckLayerName(name);
409  CheckDescriptor(static_cast<const armnn::QLstmDescriptor&>(descriptor));
410  CheckInputParameters<const QLstmLayer>(PolymorphicDowncast<const QLstmLayer*>(layer), m_InputParams);
411  break;
412  }
413  default:
414  {
416  }
417  }
418  }
419 
420 protected:
421  void CheckDescriptor(const QLstmDescriptor& descriptor);
422 
423 private:
424  QLstmDescriptor m_Descriptor;
425 };
426 
427 
429 {
430 public:
432  const char* name = nullptr)
433  : TestLayerVisitor(name)
434  , m_InputParams(params)
435  {}
436 
438  const armnn::BaseDescriptor& descriptor,
439  const std::vector<armnn::ConstTensor>& constants,
440  const char* name,
441  const armnn::LayerBindingId id = 0) override
442  {
443  armnn::IgnoreUnused(descriptor, constants, id);
444  switch (layer->GetType())
445  {
447  {
448  CheckLayerPointer(layer);
449  CheckLayerName(name);
450  CheckInputParameters(m_InputParams);
451  break;
452  }
453  default:
454  {
456  }
457  }
458  }
459 
460 protected:
461  void CheckInputParameters(const QuantizedLstmInputParams& params);
462 
463 private:
464  QuantizedLstmInputParams m_InputParams;
465 };
466 
467 
468 } // 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 ConstTensor &weights, const Optional< ConstTensor > &biases, const char *name=nullptr)
int LayerBindingId
Type of identifiers for bindable layers (inputs, outputs).
Definition: Types.hpp:277
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
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
TestConvolution2dLayerVisitor(const Convolution2dDescriptor &convolution2dDescriptor, const ConstTensor &weights, const Optional< ConstTensor > &biases, const char *name=nullptr)
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:458
const ConstTensor * m_InputToInputWeights
Definition: LstmParams.hpp:40