ArmNN
 21.08
ConstTensorLayerVisitor.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 "Network.hpp"
8 
9 #include <doctest/doctest.h>
10 
11 namespace armnn
12 {
13 
15 {
16  CHECK(m_Descriptor.m_PadLeft == convolution2dDescriptor.m_PadLeft);
17  CHECK(m_Descriptor.m_PadRight == convolution2dDescriptor.m_PadRight);
18  CHECK(m_Descriptor.m_PadTop == convolution2dDescriptor.m_PadTop);
19  CHECK(m_Descriptor.m_PadBottom == convolution2dDescriptor.m_PadBottom);
20  CHECK(m_Descriptor.m_StrideX == convolution2dDescriptor.m_StrideX);
21  CHECK(m_Descriptor.m_StrideY == convolution2dDescriptor.m_StrideY);
22  CHECK(m_Descriptor.m_BiasEnabled == convolution2dDescriptor.m_BiasEnabled);
23  CHECK(m_Descriptor.m_DataLayout == convolution2dDescriptor.m_DataLayout);
24 }
25 
27  const DepthwiseConvolution2dDescriptor& convolution2dDescriptor)
28 {
29  CHECK(m_Descriptor.m_PadLeft == convolution2dDescriptor.m_PadLeft);
30  CHECK(m_Descriptor.m_PadRight == convolution2dDescriptor.m_PadRight);
31  CHECK(m_Descriptor.m_PadTop == convolution2dDescriptor.m_PadTop);
32  CHECK(m_Descriptor.m_PadBottom == convolution2dDescriptor.m_PadBottom);
33  CHECK(m_Descriptor.m_StrideX == convolution2dDescriptor.m_StrideX);
34  CHECK(m_Descriptor.m_StrideY == convolution2dDescriptor.m_StrideY);
35  CHECK(m_Descriptor.m_BiasEnabled == convolution2dDescriptor.m_BiasEnabled);
36  CHECK(m_Descriptor.m_DataLayout == convolution2dDescriptor.m_DataLayout);
37 }
38 
40 {
41  CHECK(m_Descriptor.m_BiasEnabled == descriptor.m_BiasEnabled);
42  CHECK(m_Descriptor.m_TransposeWeightMatrix == descriptor.m_TransposeWeightMatrix);
43 }
44 
46 {
47  CHECK(m_Descriptor.m_Eps == descriptor.m_Eps);
48  CHECK(m_Descriptor.m_DataLayout == descriptor.m_DataLayout);
49 }
50 
52 {
53  CHECK(m_Descriptor.m_ActivationFunc == descriptor.m_ActivationFunc);
54  CHECK(m_Descriptor.m_ClippingThresCell == descriptor.m_ClippingThresCell);
55  CHECK(m_Descriptor.m_ClippingThresProj == descriptor.m_ClippingThresProj);
56  CHECK(m_Descriptor.m_CifgEnabled == descriptor.m_CifgEnabled);
57  CHECK(m_Descriptor.m_PeepholeEnabled == descriptor.m_PeepholeEnabled);
58  CHECK(m_Descriptor.m_ProjectionEnabled == descriptor.m_ProjectionEnabled);
59 }
60 
61 void TestLstmLayerVisitor::CheckConstTensorPtrs(const std::string& name,
62  const ConstTensor* expected,
63  const ConstTensor* actual)
64 {
65  if (expected == nullptr)
66  {
67  CHECK_MESSAGE(actual == nullptr, name + " actual should have been a nullptr");
68  }
69  else
70  {
71  CHECK_MESSAGE(actual != nullptr, name + " actual should have been set");
72  if (actual != nullptr)
73  {
74  CheckConstTensors(*expected, *actual);
75  }
76  }
77 }
78 
80 {
81  CheckConstTensorPtrs("ProjectionBias", m_InputParams.m_ProjectionBias, inputParams.m_ProjectionBias);
82  CheckConstTensorPtrs("ProjectionWeights", m_InputParams.m_ProjectionWeights, inputParams.m_ProjectionWeights);
83  CheckConstTensorPtrs("OutputGateBias", m_InputParams.m_OutputGateBias, inputParams.m_OutputGateBias);
84  CheckConstTensorPtrs("InputToInputWeights",
85  m_InputParams.m_InputToInputWeights, inputParams.m_InputToInputWeights);
86  CheckConstTensorPtrs("InputToForgetWeights",
87  m_InputParams.m_InputToForgetWeights, inputParams.m_InputToForgetWeights);
88  CheckConstTensorPtrs("InputToCellWeights", m_InputParams.m_InputToCellWeights, inputParams.m_InputToCellWeights);
89  CheckConstTensorPtrs(
90  "InputToOutputWeights", m_InputParams.m_InputToOutputWeights, inputParams.m_InputToOutputWeights);
91  CheckConstTensorPtrs(
92  "RecurrentToInputWeights", m_InputParams.m_RecurrentToInputWeights, inputParams.m_RecurrentToInputWeights);
93  CheckConstTensorPtrs(
94  "RecurrentToForgetWeights", m_InputParams.m_RecurrentToForgetWeights, inputParams.m_RecurrentToForgetWeights);
95  CheckConstTensorPtrs(
96  "RecurrentToCellWeights", m_InputParams.m_RecurrentToCellWeights, inputParams.m_RecurrentToCellWeights);
97  CheckConstTensorPtrs(
98  "RecurrentToOutputWeights", m_InputParams.m_RecurrentToOutputWeights, inputParams.m_RecurrentToOutputWeights);
99  CheckConstTensorPtrs(
100  "CellToInputWeights", m_InputParams.m_CellToInputWeights, inputParams.m_CellToInputWeights);
101  CheckConstTensorPtrs(
102  "CellToForgetWeights", m_InputParams.m_CellToForgetWeights, inputParams.m_CellToForgetWeights);
103  CheckConstTensorPtrs(
104  "CellToOutputWeights", m_InputParams.m_CellToOutputWeights, inputParams.m_CellToOutputWeights);
105  CheckConstTensorPtrs("InputGateBias", m_InputParams.m_InputGateBias, inputParams.m_InputGateBias);
106  CheckConstTensorPtrs("ForgetGateBias", m_InputParams.m_ForgetGateBias, inputParams.m_ForgetGateBias);
107  CheckConstTensorPtrs("CellBias", m_InputParams.m_CellBias, inputParams.m_CellBias);
108 }
109 
110 void TestQLstmLayerVisitor::CheckConstTensorPtrs(const std::string& name,
111  const ConstTensor* expected,
112  const ConstTensor* actual)
113 {
114  if (expected == nullptr)
115  {
116  CHECK_MESSAGE(actual == nullptr, name + " actual should have been a nullptr");
117  }
118  else
119  {
120  CHECK_MESSAGE(actual != nullptr, name + " actual should have been set");
121  if (actual != nullptr)
122  {
123  CheckConstTensors(*expected, *actual);
124  }
125  }
126 }
127 
129 {
130  CHECK(m_Descriptor.m_CellClip == descriptor.m_CellClip);
131  CHECK(m_Descriptor.m_ProjectionClip == descriptor.m_ProjectionClip);
132  CHECK(m_Descriptor.m_CifgEnabled == descriptor.m_CifgEnabled);
133  CHECK(m_Descriptor.m_PeepholeEnabled == descriptor.m_PeepholeEnabled);
134  CHECK(m_Descriptor.m_ProjectionEnabled == descriptor.m_ProjectionEnabled);
135 }
136 
138 {
139  CheckConstTensorPtrs("InputToInputWeights",
140  m_InputParams.m_InputToInputWeights,
141  inputParams.m_InputToInputWeights);
142 
143  CheckConstTensorPtrs("InputToForgetWeights",
144  m_InputParams.m_InputToForgetWeights,
145  inputParams.m_InputToForgetWeights);
146 
147  CheckConstTensorPtrs("InputToCellWeights",
148  m_InputParams.m_InputToCellWeights,
149  inputParams.m_InputToCellWeights);
150 
151  CheckConstTensorPtrs("InputToOutputWeights",
152  m_InputParams.m_InputToOutputWeights,
153  inputParams.m_InputToOutputWeights);
154 
155  CheckConstTensorPtrs("RecurrentToInputWeights",
156  m_InputParams.m_RecurrentToInputWeights,
157  inputParams.m_RecurrentToInputWeights);
158 
159  CheckConstTensorPtrs("RecurrentToForgetWeights",
160  m_InputParams.m_RecurrentToForgetWeights,
161  inputParams.m_RecurrentToForgetWeights);
162 
163  CheckConstTensorPtrs("RecurrentToCellWeights",
164  m_InputParams.m_RecurrentToCellWeights,
165  inputParams.m_RecurrentToCellWeights);
166 
167  CheckConstTensorPtrs("RecurrentToOutputWeights",
168  m_InputParams.m_RecurrentToOutputWeights,
169  inputParams.m_RecurrentToOutputWeights);
170 
171  CheckConstTensorPtrs("CellToInputWeights",
172  m_InputParams.m_CellToInputWeights,
173  inputParams.m_CellToInputWeights);
174 
175  CheckConstTensorPtrs("CellToForgetWeights",
176  m_InputParams.m_CellToForgetWeights,
177  inputParams.m_CellToForgetWeights);
178 
179  CheckConstTensorPtrs("CellToOutputWeights",
180  m_InputParams.m_CellToOutputWeights,
181  inputParams.m_CellToOutputWeights);
182 
183  CheckConstTensorPtrs("ProjectionWeights", m_InputParams.m_ProjectionWeights, inputParams.m_ProjectionWeights);
184  CheckConstTensorPtrs("ProjectionBias", m_InputParams.m_ProjectionBias, inputParams.m_ProjectionBias);
185 
186  CheckConstTensorPtrs("InputGateBias", m_InputParams.m_InputGateBias, inputParams.m_InputGateBias);
187  CheckConstTensorPtrs("ForgetGateBias", m_InputParams.m_ForgetGateBias, inputParams.m_ForgetGateBias);
188  CheckConstTensorPtrs("CellBias", m_InputParams.m_CellBias, inputParams.m_CellBias);
189  CheckConstTensorPtrs("OutputGateBias", m_InputParams.m_OutputGateBias, inputParams.m_OutputGateBias);
190 
191  CheckConstTensorPtrs("InputLayerNormWeights",
192  m_InputParams.m_InputLayerNormWeights,
193  inputParams.m_InputLayerNormWeights);
194 
195  CheckConstTensorPtrs("ForgetLayerNormWeights",
196  m_InputParams.m_ForgetLayerNormWeights,
197  inputParams.m_ForgetLayerNormWeights);
198 
199  CheckConstTensorPtrs("CellLayerNormWeights",
200  m_InputParams.m_CellLayerNormWeights,
201  inputParams.m_CellLayerNormWeights);
202 
203  CheckConstTensorPtrs("OutputLayerNormWeights",
204  m_InputParams.m_OutputLayerNormWeights,
205  inputParams.m_OutputLayerNormWeights);
206 }
207 
209  const ConstTensor* expected,
210  const ConstTensor* actual)
211 {
212  if (expected == nullptr)
213  {
214  CHECK_MESSAGE(actual == nullptr, name + " actual should have been a nullptr");
215  }
216  else
217  {
218  CHECK_MESSAGE(actual != nullptr, name + " actual should have been set");
219  if (actual != nullptr)
220  {
221  CheckConstTensors(*expected, *actual);
222  }
223  }
224 }
225 
227 {
228  CheckConstTensorPtrs("InputToInputWeights",
229  m_InputParams.m_InputToInputWeights,
230  inputParams.m_InputToInputWeights);
231 
232  CheckConstTensorPtrs("InputToForgetWeights",
233  m_InputParams.m_InputToForgetWeights,
234  inputParams.m_InputToForgetWeights);
235 
236  CheckConstTensorPtrs("InputToCellWeights",
237  m_InputParams.m_InputToCellWeights,
238  inputParams.m_InputToCellWeights);
239 
240  CheckConstTensorPtrs("InputToOutputWeights",
241  m_InputParams.m_InputToOutputWeights,
242  inputParams.m_InputToOutputWeights);
243 
244  CheckConstTensorPtrs("RecurrentToInputWeights",
245  m_InputParams.m_RecurrentToInputWeights,
246  inputParams.m_RecurrentToInputWeights);
247 
248  CheckConstTensorPtrs("RecurrentToForgetWeights",
249  m_InputParams.m_RecurrentToForgetWeights,
250  inputParams.m_RecurrentToForgetWeights);
251 
252  CheckConstTensorPtrs("RecurrentToCellWeights",
253  m_InputParams.m_RecurrentToCellWeights,
254  inputParams.m_RecurrentToCellWeights);
255 
256  CheckConstTensorPtrs("RecurrentToOutputWeights",
257  m_InputParams.m_RecurrentToOutputWeights,
258  inputParams.m_RecurrentToOutputWeights);
259 
260  CheckConstTensorPtrs("InputGateBias", m_InputParams.m_InputGateBias, inputParams.m_InputGateBias);
261  CheckConstTensorPtrs("ForgetGateBias", m_InputParams.m_ForgetGateBias, inputParams.m_ForgetGateBias);
262  CheckConstTensorPtrs("CellBias", m_InputParams.m_CellBias, inputParams.m_CellBias);
263  CheckConstTensorPtrs("OutputGateBias", m_InputParams.m_OutputGateBias, inputParams.m_OutputGateBias);
264 }
265 
266 TEST_SUITE("TestConstTensorLayerVisitor")
267 {
268 TEST_CASE("CheckConvolution2dLayer")
269 {
270  Convolution2dDescriptor descriptor;
271  descriptor.m_PadLeft = 2;
272  descriptor.m_PadRight = 3;
273  descriptor.m_PadBottom = 1;
274  descriptor.m_PadTop = 5;
275  descriptor.m_StrideX = 2;
276  descriptor.m_StrideY = 3;
277  descriptor.m_DataLayout = DataLayout::NHWC;
278 
279  std::vector<float> data = {1.0, 2.0, 3.0, 4.0, 5.0, 6.0, 7.0, 8.0, 9.0};
280  std::vector<unsigned int> dimensions = {1, 1, 3, 3};
281  ConstTensor weights(TensorInfo(4, dimensions.data(), DataType::Float32), data);
282 
283  TestConvolution2dLayerVisitor visitor(descriptor, weights, EmptyOptional());
284 
285  NetworkImpl net;
286 
287  IConnectableLayer* const layer = net.AddConvolution2dLayer(descriptor, weights, EmptyOptional());
288  layer->Accept(visitor);
289 }
290 
291 TEST_CASE("CheckNamedConvolution2dLayer")
292 {
293  const char* layerName = "Convolution2dLayer";
294  Convolution2dDescriptor descriptor;
295  descriptor.m_PadLeft = 2;
296  descriptor.m_PadRight = 3;
297  descriptor.m_PadBottom = 1;
298  descriptor.m_PadTop = 5;
299  descriptor.m_StrideX = 2;
300  descriptor.m_StrideY = 3;
301  descriptor.m_DataLayout = DataLayout::NHWC;
302 
303  std::vector<float> data = {1.0, 2.0, 3.0, 4.0, 5.0, 6.0, 7.0, 8.0, 9.0};
304  std::vector<unsigned int> dimensions = {1, 1, 3, 3};
305  ConstTensor weights(TensorInfo(4, dimensions.data(), DataType::Float32), data);
306 
307  TestConvolution2dLayerVisitor visitor(descriptor, weights, EmptyOptional(), layerName);
308 
309  NetworkImpl net;
310 
311  IConnectableLayer* const layer = net.AddConvolution2dLayer(descriptor, weights, EmptyOptional(), layerName);
312  layer->Accept(visitor);
313 }
314 
315 TEST_CASE("CheckConvolution2dLayerWithBiases")
316 {
317  Convolution2dDescriptor descriptor;
318  descriptor.m_PadLeft = 2;
319  descriptor.m_PadRight = 3;
320  descriptor.m_PadBottom = 1;
321  descriptor.m_PadTop = 5;
322  descriptor.m_StrideX = 2;
323  descriptor.m_StrideY = 3;
324  descriptor.m_DataLayout = DataLayout::NHWC;
325  descriptor.m_BiasEnabled = true;
326 
327  std::vector<float> data = {1.0, 2.0, 3.0, 4.0, 5.0, 6.0, 7.0, 8.0, 9.0};
328  std::vector<unsigned int> dimensions = {1, 1, 3, 3};
329  ConstTensor weights(TensorInfo(4, dimensions.data(), DataType::Float32), data);
330 
331  std::vector<float> biasData = {1.0, 2.0, 3.0, 4.0, 5.0, 6.0, 7.0, 8.0, 9.0};
332  std::vector<unsigned int> biasDimensions = {1, 1, 3, 3};
333  ConstTensor biases(TensorInfo(4, biasDimensions.data(), DataType::Float32), biasData);
334  Optional<ConstTensor> optionalBiases(biases);
335 
336  TestConvolution2dLayerVisitor visitor(descriptor, weights, optionalBiases);
337 
338  NetworkImpl net;
339 
340  IConnectableLayer* const layer = net.AddConvolution2dLayer(descriptor, weights, optionalBiases);
341  layer->Accept(visitor);
342 }
343 
344 TEST_CASE("CheckNamedConvolution2dLayerWithBiases")
345 {
346  const char* layerName = "Convolution2dLayer";
347  Convolution2dDescriptor descriptor;
348  descriptor.m_PadLeft = 2;
349  descriptor.m_PadRight = 3;
350  descriptor.m_PadBottom = 1;
351  descriptor.m_PadTop = 5;
352  descriptor.m_StrideX = 2;
353  descriptor.m_StrideY = 3;
354  descriptor.m_DataLayout = DataLayout::NHWC;
355  descriptor.m_BiasEnabled = true;
356 
357  std::vector<float> data = {1.0, 2.0, 3.0, 4.0, 5.0, 6.0, 7.0, 8.0, 9.0};
358  std::vector<unsigned int> dimensions = {1, 1, 3, 3};
359  ConstTensor weights(TensorInfo(4, dimensions.data(), DataType::Float32), data);
360 
361  std::vector<float> biasData = {1.0, 2.0, 3.0, 4.0, 5.0, 6.0, 7.0, 8.0, 9.0};
362  std::vector<unsigned int> biasDimensions = {1, 1, 3, 3};
363  ConstTensor biases(TensorInfo(4, biasDimensions.data(), DataType::Float32), biasData);
364  Optional<ConstTensor> optionalBiases(biases);
365 
366  TestConvolution2dLayerVisitor visitor(descriptor, weights, optionalBiases, layerName);
367 
368  NetworkImpl net;
369 
370  IConnectableLayer* const layer = net.AddConvolution2dLayer(descriptor, weights, optionalBiases, layerName);
371  layer->Accept(visitor);
372 }
373 
374 TEST_CASE("CheckDepthwiseConvolution2dLayer")
375 {
377  descriptor.m_PadLeft = 2;
378  descriptor.m_PadRight = 3;
379  descriptor.m_PadBottom = 1;
380  descriptor.m_PadTop = 5;
381  descriptor.m_StrideX = 2;
382  descriptor.m_StrideY = 3;
383  descriptor.m_DataLayout = DataLayout::NHWC;
384 
385  std::vector<float> data = {1.0, 2.0, 3.0, 4.0, 5.0, 6.0, 7.0, 8.0, 9.0};
386  std::vector<unsigned int> dimensions = {1, 1, 3, 3};
387  ConstTensor weights(TensorInfo(4, dimensions.data(), DataType::Float32), data);
388 
389  TestDepthwiseConvolution2dLayerVisitor visitor(descriptor, weights, EmptyOptional());
390 
391  NetworkImpl net;
392 
393  IConnectableLayer* const layer = net.AddDepthwiseConvolution2dLayer(descriptor, weights, EmptyOptional());
394  layer->Accept(visitor);
395 }
396 
397 TEST_CASE("CheckNamedDepthwiseConvolution2dLayer")
398 {
399  const char* layerName = "DepthwiseConvolution2dLayer";
401  descriptor.m_PadLeft = 2;
402  descriptor.m_PadRight = 3;
403  descriptor.m_PadBottom = 1;
404  descriptor.m_PadTop = 5;
405  descriptor.m_StrideX = 2;
406  descriptor.m_StrideY = 3;
407  descriptor.m_DataLayout = DataLayout::NHWC;
408 
409  std::vector<float> data = {1.0, 2.0, 3.0, 4.0, 5.0, 6.0, 7.0, 8.0, 9.0};
410  std::vector<unsigned int> dimensions = {1, 1, 3, 3};
411  ConstTensor weights(TensorInfo(4, dimensions.data(), DataType::Float32), data);
412 
413  TestDepthwiseConvolution2dLayerVisitor visitor(descriptor, weights, EmptyOptional(), layerName);
414 
415  NetworkImpl net;
416 
417  IConnectableLayer* const layer = net.AddDepthwiseConvolution2dLayer(descriptor,
418  weights,
419  EmptyOptional(),
420  layerName);
421  layer->Accept(visitor);
422 }
423 
424 TEST_CASE("CheckDepthwiseConvolution2dLayerWithBiases")
425 {
427  descriptor.m_PadLeft = 2;
428  descriptor.m_PadRight = 3;
429  descriptor.m_PadBottom = 1;
430  descriptor.m_PadTop = 5;
431  descriptor.m_StrideX = 2;
432  descriptor.m_StrideY = 3;
433  descriptor.m_DataLayout = DataLayout::NHWC;
434  descriptor.m_BiasEnabled = true;
435 
436  std::vector<float> data = {1.0, 2.0, 3.0, 4.0, 5.0, 6.0, 7.0, 8.0, 9.0};
437  std::vector<unsigned int> dimensions = {1, 1, 3, 3};
438  ConstTensor weights(TensorInfo(4, dimensions.data(), DataType::Float32), data);
439 
440  std::vector<float> biasData = {1.0, 2.0, 3.0, 4.0, 5.0, 6.0, 7.0, 8.0, 9.0};
441  std::vector<unsigned int> biasDimensions = {1, 1, 3, 3};
442  ConstTensor biases(TensorInfo(4, biasDimensions.data(), DataType::Float32), biasData);
443  Optional<ConstTensor> optionalBiases(biases);
444 
445  TestDepthwiseConvolution2dLayerVisitor visitor(descriptor, weights, optionalBiases);
446 
447  NetworkImpl net;
448 
449  IConnectableLayer* const layer = net.AddDepthwiseConvolution2dLayer(descriptor, weights, optionalBiases);
450  layer->Accept(visitor);
451 }
452 
453 TEST_CASE("CheckNamedDepthwiseConvolution2dLayerWithBiases")
454 {
455  const char* layerName = "DepthwiseConvolution2dLayer";
457  descriptor.m_PadLeft = 2;
458  descriptor.m_PadRight = 3;
459  descriptor.m_PadBottom = 1;
460  descriptor.m_PadTop = 5;
461  descriptor.m_StrideX = 2;
462  descriptor.m_StrideY = 3;
463  descriptor.m_DataLayout = DataLayout::NHWC;
464  descriptor.m_BiasEnabled = true;
465 
466  std::vector<float> data = {1.0, 2.0, 3.0, 4.0, 5.0, 6.0, 7.0, 8.0, 9.0};
467  std::vector<unsigned int> dimensions = {1, 1, 3, 3};
468  ConstTensor weights(TensorInfo(4, dimensions.data(), DataType::Float32), data);
469 
470  std::vector<float> biasData = {1.0, 2.0, 3.0, 4.0, 5.0, 6.0, 7.0, 8.0, 9.0};
471  std::vector<unsigned int> biasDimensions = {1, 1, 3, 3};
472  ConstTensor biases(TensorInfo(4, biasDimensions.data(), DataType::Float32), biasData);
473  Optional<ConstTensor> optionalBiases(biases);
474 
475  TestDepthwiseConvolution2dLayerVisitor visitor(descriptor, weights, optionalBiases, layerName);
476 
477  NetworkImpl net;
478 
479  IConnectableLayer* const layer = net.AddDepthwiseConvolution2dLayer(descriptor, weights, optionalBiases, layerName);
480  layer->Accept(visitor);
481 }
482 
483 TEST_CASE("CheckFullyConnectedLayer")
484 {
485  FullyConnectedDescriptor descriptor;
486  descriptor.m_TransposeWeightMatrix = true;
487  descriptor.m_ConstantWeights = true;
488  descriptor.m_BiasEnabled = false;
489 
490  std::vector<float> data = {1.0, 2.0, 3.0, 4.0, 5.0, 6.0, 7.0, 8.0, 9.0};
491  std::vector<unsigned int> dimensions = {1, 1, 3, 3};
492  ConstTensor weights(TensorInfo(4, dimensions.data(), DataType::Float32), data);
493 
494  TestConstantLayerVisitor weightsVisitor(weights);
495  TestFullyConnectedLayerVistor visitor(descriptor);
496 
497  NetworkImpl net;
498 
499  IConnectableLayer* const weightsLayer = net.AddConstantLayer(weights);
500  IConnectableLayer* const layer = net.AddFullyConnectedLayer(descriptor);
501  weightsLayer->GetOutputSlot(0).Connect(layer->GetInputSlot(1));
502 
503  weightsLayer->Accept(weightsVisitor);
504  layer->Accept(visitor);
505 }
506 
507 TEST_CASE("CheckNamedFullyConnectedLayer")
508 {
509  const char* layerName = "FullyConnectedLayer";
510  FullyConnectedDescriptor descriptor;
511  descriptor.m_TransposeWeightMatrix = true;
512  descriptor.m_ConstantWeights = true;
513  descriptor.m_BiasEnabled = false;
514 
515  std::vector<float> data = {1.0, 2.0, 3.0, 4.0, 5.0, 6.0, 7.0, 8.0, 9.0};
516  std::vector<unsigned int> dimensions = {1, 1, 3, 3};
517  ConstTensor weights(TensorInfo(4, dimensions.data(), DataType::Float32), data);
518 
519  TestConstantLayerVisitor weightsVisitor(weights);
520  TestFullyConnectedLayerVistor visitor(descriptor, layerName);
521 
522  NetworkImpl net;
523 
524  IConnectableLayer* const weightsLayer = net.AddConstantLayer(weights);
525  IConnectableLayer* const layer = net.AddFullyConnectedLayer(descriptor, layerName);
526  weightsLayer->GetOutputSlot(0).Connect(layer->GetInputSlot(1));
527 
528  weightsLayer->Accept(weightsVisitor);
529  layer->Accept(visitor);
530 }
531 
532 TEST_CASE("CheckFullyConnectedLayerWithBiases")
533 {
534  FullyConnectedDescriptor descriptor;
535  descriptor.m_TransposeWeightMatrix = true;
536  descriptor.m_ConstantWeights = true;
537  descriptor.m_BiasEnabled = true;
538 
539  std::vector<float> data = {1.0, 2.0, 3.0, 4.0, 5.0, 6.0, 7.0, 8.0, 9.0};
540  std::vector<unsigned int> dimensions = {1, 1, 3, 3};
541  ConstTensor weights(TensorInfo(4, dimensions.data(), DataType::Float32), data);
542 
543  std::vector<float> biasData = {1.0, 2.0, 3.0, 4.0, 5.0, 6.0, 7.0, 8.0, 9.0};
544  std::vector<unsigned int> biasDimensions = {1, 1, 3, 3};
545  ConstTensor biases(TensorInfo(4, biasDimensions.data(), DataType::Float32), biasData);
546 
547  TestConstantLayerVisitor weightsVisitor(weights);
548  TestConstantLayerVisitor biasesVisitor(biases);
549  TestFullyConnectedLayerVistor visitor(descriptor);
550 
551  NetworkImpl net;
552 
553  IConnectableLayer* const weightsLayer = net.AddConstantLayer(weights);
554  IConnectableLayer* const biasesLayer = net.AddConstantLayer(biases);
555  IConnectableLayer* const layer = net.AddFullyConnectedLayer(descriptor);
556  weightsLayer->GetOutputSlot(0).Connect(layer->GetInputSlot(1));
557  biasesLayer->GetOutputSlot(0).Connect(layer->GetInputSlot(2));
558 
559  weightsLayer->Accept(weightsVisitor);
560  biasesLayer->Accept(biasesVisitor);
561  layer->Accept(visitor);
562 }
563 
564 TEST_CASE("CheckNamedFullyConnectedLayerWithBiases")
565 {
566  const char* layerName = "FullyConnectedLayer";
567  FullyConnectedDescriptor descriptor;
568  descriptor.m_TransposeWeightMatrix = true;
569  descriptor.m_ConstantWeights = true;
570  descriptor.m_BiasEnabled = true;
571 
572  std::vector<float> data = {1.0, 2.0, 3.0, 4.0, 5.0, 6.0, 7.0, 8.0, 9.0};
573  std::vector<unsigned int> dimensions = {1, 1, 3, 3};
574  ConstTensor weights(TensorInfo(4, dimensions.data(), DataType::Float32), data);
575 
576  std::vector<float> biasData = {1.0, 2.0, 3.0, 4.0, 5.0, 6.0, 7.0, 8.0, 9.0};
577  std::vector<unsigned int> biasDimensions = {1, 1, 3, 3};
578  ConstTensor biases(TensorInfo(4, biasDimensions.data(), DataType::Float32), biasData);
579 
580  TestConstantLayerVisitor weightsVisitor(weights);
581  TestConstantLayerVisitor biasesVisitor(biases);
582  TestFullyConnectedLayerVistor visitor(descriptor, layerName);
583 
584  NetworkImpl net;
585 
586  IConnectableLayer* const weightsLayer = net.AddConstantLayer(weights);
587  IConnectableLayer* const biasesLayer = net.AddConstantLayer(biases);
588  IConnectableLayer* const layer = net.AddFullyConnectedLayer(descriptor, layerName);
589  weightsLayer->GetOutputSlot(0).Connect(layer->GetInputSlot(1));
590  biasesLayer->GetOutputSlot(0).Connect(layer->GetInputSlot(2));
591 
592  weightsLayer->Accept(weightsVisitor);
593  biasesLayer->Accept(biasesVisitor);
594  layer->Accept(visitor);
595 }
596 
597 TEST_CASE("CheckBatchNormalizationLayer")
598 {
599  BatchNormalizationDescriptor descriptor;
600  descriptor.m_Eps = 0.0002f;
601  descriptor.m_DataLayout = DataLayout::NHWC;
602 
603  std::vector<float> data = {1.0, 2.0, 3.0, 4.0, 5.0, 6.0, 7.0, 8.0, 9.0};
604  std::vector<unsigned int> dimensions = {1, 1, 3, 3};
605  ConstTensor mean(TensorInfo(4, dimensions.data(), DataType::Float32), data);
606 
607  std::vector<float> varianceData = {1.0, 2.0, 3.0, 4.0, 5.0, 6.0, 7.0, 8.0, 9.0};
608  std::vector<unsigned int> varianceDimensions = {1, 1, 3, 3};
609  ConstTensor variance(TensorInfo(4, varianceDimensions.data(), DataType::Float32), varianceData);
610 
611  std::vector<float> betaData = {1.0, 2.0, 3.0, 4.0, 5.0, 6.0, 7.0, 8.0, 9.0};
612  std::vector<unsigned int> betaDimensions = {1, 1, 3, 3};
613  ConstTensor beta(TensorInfo(4, betaDimensions.data(), DataType::Float32), betaData);
614 
615  std::vector<float> gammaData = {1.0, 2.0, 3.0, 4.0, 5.0, 6.0, 7.0, 8.0, 9.0};
616  std::vector<unsigned int> gammaDimensions = {1, 1, 3, 3};
617  ConstTensor gamma(TensorInfo(4, gammaDimensions.data(), DataType::Float32), gammaData);
618 
619  TestBatchNormalizationLayerVisitor visitor(descriptor, mean, variance, beta, gamma);
620 
621  NetworkImpl net;
622 
623  IConnectableLayer* const layer = net.AddBatchNormalizationLayer(descriptor, mean, variance, beta, gamma);
624  layer->Accept(visitor);
625 }
626 
627 TEST_CASE("CheckNamedBatchNormalizationLayer")
628 {
629  const char* layerName = "BatchNormalizationLayer";
630  BatchNormalizationDescriptor descriptor;
631  descriptor.m_Eps = 0.0002f;
632  descriptor.m_DataLayout = DataLayout::NHWC;
633 
634  std::vector<float> data = {1.0, 2.0, 3.0, 4.0, 5.0, 6.0, 7.0, 8.0, 9.0};
635  std::vector<unsigned int> dimensions = {1, 1, 3, 3};
636  ConstTensor mean(TensorInfo(4, dimensions.data(), DataType::Float32), data);
637 
638  std::vector<float> varianceData = {1.0, 2.0, 3.0, 4.0, 5.0, 6.0, 7.0, 8.0, 9.0};
639  std::vector<unsigned int> varianceDimensions = {1, 1, 3, 3};
640  ConstTensor variance(TensorInfo(4, varianceDimensions.data(), DataType::Float32), varianceData);
641 
642  std::vector<float> betaData = {1.0, 2.0, 3.0, 4.0, 5.0, 6.0, 7.0, 8.0, 9.0};
643  std::vector<unsigned int> betaDimensions = {1, 1, 3, 3};
644  ConstTensor beta(TensorInfo(4, betaDimensions.data(), DataType::Float32), betaData);
645 
646  std::vector<float> gammaData = {1.0, 2.0, 3.0, 4.0, 5.0, 6.0, 7.0, 8.0, 9.0};
647  std::vector<unsigned int> gammaDimensions = {1, 1, 3, 3};
648  ConstTensor gamma(TensorInfo(4, gammaDimensions.data(), DataType::Float32), gammaData);
649 
650  TestBatchNormalizationLayerVisitor visitor(descriptor, mean, variance, beta, gamma, layerName);
651 
652  NetworkImpl net;
653 
655  descriptor, mean, variance, beta, gamma, layerName);
656  layer->Accept(visitor);
657 }
658 
659 TEST_CASE("CheckConstLayer")
660 {
661  std::vector<float> data = {1.0, 2.0, 3.0, 4.0, 5.0, 6.0, 7.0, 8.0, 9.0};
662  std::vector<unsigned int> dimensions = {1, 1, 3, 3};
663  ConstTensor input(TensorInfo(4, dimensions.data(), DataType::Float32), data);
664 
665  TestConstantLayerVisitor visitor(input);
666 
667  NetworkImpl net;
668 
669  IConnectableLayer* const layer = net.AddConstantLayer(input);
670  layer->Accept(visitor);
671 }
672 
673 TEST_CASE("CheckNamedConstLayer")
674 {
675  const char* layerName = "ConstantLayer";
676  std::vector<float> data = {1.0, 2.0, 3.0, 4.0, 5.0, 6.0, 7.0, 8.0, 9.0};
677  std::vector<unsigned int> dimensions = {1, 1, 3, 3};
678  ConstTensor input(TensorInfo(4, dimensions.data(), DataType::Float32), data);
679 
680  TestConstantLayerVisitor visitor(input, layerName);
681 
682  NetworkImpl net;
683 
684  IConnectableLayer* const layer = net.AddConstantLayer(input, layerName);
685  layer->Accept(visitor);
686 }
687 
688 TEST_CASE("CheckLstmLayerBasic")
689 {
690  LstmDescriptor descriptor;
691  descriptor.m_ActivationFunc = 3;
692  descriptor.m_ClippingThresProj = 0.5f;
693  descriptor.m_ClippingThresCell = 0.3f;
694  descriptor.m_CifgEnabled = true; // if this is true then we DON'T need to set the OptCifgParams
695 
696  std::vector<float> inputToForgetWeightsData = {1.0, 2.0, 3.0, 4.0, 5.0, 6.0, 7.0, 8.0, 9.0};
697  std::vector<unsigned int> inputToForgetWeightsDimensions = {1, 1, 3, 3};
698  ConstTensor inputToForgetWeights(
699  TensorInfo(4, inputToForgetWeightsDimensions.data(), DataType::Float32), inputToForgetWeightsData);
700 
701  std::vector<float> inputToCellWeightsData = {1.0, 2.0, 3.0, 4.0, 5.0, 6.0, 7.0, 8.0, 9.0};
702  std::vector<unsigned int> inputToCellWeightsDimensions = {1, 1, 3, 3};
703  ConstTensor inputToCellWeights(
704  TensorInfo(4, inputToCellWeightsDimensions.data(), DataType::Float32), inputToCellWeightsData);
705 
706  std::vector<float> inputToOutputWeightsData = {1.0, 2.0, 3.0, 4.0, 5.0, 6.0, 7.0, 8.0, 9.0};
707  std::vector<unsigned int> inputToOutputWeightsDimensions = {1, 1, 3, 3};
708  ConstTensor inputToOutputWeights(
709  TensorInfo(4, inputToOutputWeightsDimensions.data(), DataType::Float32), inputToOutputWeightsData);
710 
711  std::vector<float> recurrentToForgetWeightsData = {1.0, 2.0, 3.0, 4.0, 5.0, 6.0, 7.0, 8.0, 9.0};
712  std::vector<unsigned int> recurrentToForgetWeightsDimensions = {1, 1, 3, 3};
713  ConstTensor recurrentToForgetWeights(TensorInfo(
714  4, recurrentToForgetWeightsDimensions.data(), DataType::Float32), recurrentToForgetWeightsData);
715 
716  std::vector<float> recurrentToCellWeightsData = {1.0, 2.0, 3.0, 4.0, 5.0, 6.0, 7.0, 8.0, 9.0};
717  std::vector<unsigned int> recurrentToCellWeightsDimensions = {1, 1, 3, 3};
718  ConstTensor recurrentToCellWeights(TensorInfo(
719  4, recurrentToCellWeightsDimensions.data(), DataType::Float32), recurrentToCellWeightsData);
720 
721  std::vector<float> recurrentToOutputWeightsData = {1.0, 2.0, 3.0, 4.0, 5.0, 6.0, 7.0, 8.0, 9.0};
722  std::vector<unsigned int> recurrentToOutputWeightsDimensions = {1, 1, 3, 3};
723  ConstTensor recurrentToOutputWeights(TensorInfo(
724  4, recurrentToOutputWeightsDimensions.data(), DataType::Float32), recurrentToOutputWeightsData);
725 
726  std::vector<float> forgetGateBiasData = {1.0, 2.0, 3.0, 4.0, 5.0, 6.0, 7.0, 8.0, 9.0};
727  std::vector<unsigned int> forgetGateBiasDimensions = {1, 1, 3, 3};
728  ConstTensor forgetGateBias(TensorInfo(
729  4, forgetGateBiasDimensions.data(), DataType::Float32), forgetGateBiasData);
730 
731  std::vector<float> cellBiasData = {1.0, 2.0, 3.0, 4.0, 5.0, 6.0, 7.0, 8.0, 9.0};
732  std::vector<unsigned int> cellBiasDimensions = {1, 1, 3, 3};
733  ConstTensor cellBias(TensorInfo(
734  4, cellBiasDimensions.data(), DataType::Float32), cellBiasData);
735 
736  std::vector<float> outputGateBiasData = {1.0, 2.0, 3.0, 4.0, 5.0, 6.0, 7.0, 8.0, 9.0};
737  std::vector<unsigned int> outputGateBiasDimensions = {1, 1, 3, 3};
738  ConstTensor outputGateBias(TensorInfo(
739  4, outputGateBiasDimensions.data(), DataType::Float32), outputGateBiasData);
740 
741  LstmInputParams params;
742  params.m_InputToForgetWeights = &inputToForgetWeights;
743  params.m_InputToCellWeights = &inputToCellWeights;
744  params.m_InputToOutputWeights = &inputToOutputWeights;
745  params.m_RecurrentToForgetWeights = &recurrentToForgetWeights;
746  params.m_RecurrentToCellWeights = &recurrentToCellWeights;
747  params.m_RecurrentToOutputWeights = &recurrentToOutputWeights;
748  params.m_ForgetGateBias = &forgetGateBias;
749  params.m_CellBias = &cellBias;
750  params.m_OutputGateBias = &outputGateBias;
751 
752  TestLstmLayerVisitor visitor(descriptor, params);
753 
754  NetworkImpl net;
755 
756  IConnectableLayer* const layer = net.AddLstmLayer(descriptor, params);
757  layer->Accept(visitor);
758 }
759 
760 TEST_CASE("CheckNamedLstmLayerBasic")
761 {
762  const char* layerName = "LstmLayer";
763  LstmDescriptor descriptor;
764  descriptor.m_ActivationFunc = 3;
765  descriptor.m_ClippingThresProj = 0.5f;
766  descriptor.m_ClippingThresCell = 0.3f;
767  descriptor.m_CifgEnabled = true; // if this is true then we DON'T need to set the OptCifgParams
768 
769  std::vector<float> inputToForgetWeightsData = {1.0, 2.0, 3.0, 4.0, 5.0, 6.0, 7.0, 8.0, 9.0};
770  std::vector<unsigned int> inputToForgetWeightsDimensions = {1, 1, 3, 3};
771  ConstTensor inputToForgetWeights(
772  TensorInfo(4, inputToForgetWeightsDimensions.data(), DataType::Float32), inputToForgetWeightsData);
773 
774  std::vector<float> inputToCellWeightsData = {1.0, 2.0, 3.0, 4.0, 5.0, 6.0, 7.0, 8.0, 9.0};
775  std::vector<unsigned int> inputToCellWeightsDimensions = {1, 1, 3, 3};
776  ConstTensor inputToCellWeights(
777  TensorInfo(4, inputToCellWeightsDimensions.data(), DataType::Float32), inputToCellWeightsData);
778 
779  std::vector<float> inputToOutputWeightsData = {1.0, 2.0, 3.0, 4.0, 5.0, 6.0, 7.0, 8.0, 9.0};
780  std::vector<unsigned int> inputToOutputWeightsDimensions = {1, 1, 3, 3};
781  ConstTensor inputToOutputWeights(
782  TensorInfo(4, inputToOutputWeightsDimensions.data(), DataType::Float32), inputToOutputWeightsData);
783 
784  std::vector<float> recurrentToForgetWeightsData = {1.0, 2.0, 3.0, 4.0, 5.0, 6.0, 7.0, 8.0, 9.0};
785  std::vector<unsigned int> recurrentToForgetWeightsDimensions = {1, 1, 3, 3};
786  ConstTensor recurrentToForgetWeights(TensorInfo(
787  4, recurrentToForgetWeightsDimensions.data(), DataType::Float32), recurrentToForgetWeightsData);
788 
789  std::vector<float> recurrentToCellWeightsData = {1.0, 2.0, 3.0, 4.0, 5.0, 6.0, 7.0, 8.0, 9.0};
790  std::vector<unsigned int> recurrentToCellWeightsDimensions = {1, 1, 3, 3};
791  ConstTensor recurrentToCellWeights(TensorInfo(
792  4, recurrentToCellWeightsDimensions.data(), DataType::Float32), recurrentToCellWeightsData);
793 
794  std::vector<float> recurrentToOutputWeightsData = {1.0, 2.0, 3.0, 4.0, 5.0, 6.0, 7.0, 8.0, 9.0};
795  std::vector<unsigned int> recurrentToOutputWeightsDimensions = {1, 1, 3, 3};
796  ConstTensor recurrentToOutputWeights(TensorInfo(
797  4, recurrentToOutputWeightsDimensions.data(), DataType::Float32), recurrentToOutputWeightsData);
798 
799  std::vector<float> forgetGateBiasData = {1.0, 2.0, 3.0, 4.0, 5.0, 6.0, 7.0, 8.0, 9.0};
800  std::vector<unsigned int> forgetGateBiasDimensions = {1, 1, 3, 3};
801  ConstTensor forgetGateBias(TensorInfo(
802  4, forgetGateBiasDimensions.data(), DataType::Float32), forgetGateBiasData);
803 
804  std::vector<float> cellBiasData = {1.0, 2.0, 3.0, 4.0, 5.0, 6.0, 7.0, 8.0, 9.0};
805  std::vector<unsigned int> cellBiasDimensions = {1, 1, 3, 3};
806  ConstTensor cellBias(TensorInfo(
807  4, cellBiasDimensions.data(), DataType::Float32), cellBiasData);
808 
809  std::vector<float> outputGateBiasData = {1.0, 2.0, 3.0, 4.0, 5.0, 6.0, 7.0, 8.0, 9.0};
810  std::vector<unsigned int> outputGateBiasDimensions = {1, 1, 3, 3};
811  ConstTensor outputGateBias(TensorInfo(
812  4, outputGateBiasDimensions.data(), DataType::Float32), outputGateBiasData);
813 
814  LstmInputParams params;
815  params.m_InputToForgetWeights = &inputToForgetWeights;
816  params.m_InputToCellWeights = &inputToCellWeights;
817  params.m_InputToOutputWeights = &inputToOutputWeights;
818  params.m_RecurrentToForgetWeights = &recurrentToForgetWeights;
819  params.m_RecurrentToCellWeights = &recurrentToCellWeights;
820  params.m_RecurrentToOutputWeights = &recurrentToOutputWeights;
821  params.m_ForgetGateBias = &forgetGateBias;
822  params.m_CellBias = &cellBias;
823  params.m_OutputGateBias = &outputGateBias;
824 
825  TestLstmLayerVisitor visitor(descriptor, params, layerName);
826 
827  NetworkImpl net;
828 
829  IConnectableLayer* const layer = net.AddLstmLayer(descriptor, params, layerName);
830  layer->Accept(visitor);
831 }
832 
833 TEST_CASE("CheckLstmLayerCifgDisabled")
834 {
835  LstmDescriptor descriptor;
836  descriptor.m_ActivationFunc = 3;
837  descriptor.m_ClippingThresProj = 0.5f;
838  descriptor.m_ClippingThresCell = 0.3f;
839  descriptor.m_CifgEnabled = false; // if this is true then we DON'T need to set the OptCifgParams
840 
841  std::vector<float> inputToForgetWeightsData = {1.0, 2.0, 3.0, 4.0, 5.0, 6.0, 7.0, 8.0, 9.0};
842  std::vector<unsigned int> inputToForgetWeightsDimensions = {1, 1, 3, 3};
843  ConstTensor inputToForgetWeights(
844  TensorInfo(4, inputToForgetWeightsDimensions.data(), DataType::Float32), inputToForgetWeightsData);
845 
846  std::vector<float> inputToCellWeightsData = {1.0, 2.0, 3.0, 4.0, 5.0, 6.0, 7.0, 8.0, 9.0};
847  std::vector<unsigned int> inputToCellWeightsDimensions = {1, 1, 3, 3};
848  ConstTensor inputToCellWeights(
849  TensorInfo(4, inputToCellWeightsDimensions.data(), DataType::Float32), inputToCellWeightsData);
850 
851  std::vector<float> inputToOutputWeightsData = {1.0, 2.0, 3.0, 4.0, 5.0, 6.0, 7.0, 8.0, 9.0};
852  std::vector<unsigned int> inputToOutputWeightsDimensions = {1, 1, 3, 3};
853  ConstTensor inputToOutputWeights(
854  TensorInfo(4, inputToOutputWeightsDimensions.data(), DataType::Float32), inputToOutputWeightsData);
855 
856  std::vector<float> recurrentToForgetWeightsData = {1.0, 2.0, 3.0, 4.0, 5.0, 6.0, 7.0, 8.0, 9.0};
857  std::vector<unsigned int> recurrentToForgetWeightsDimensions = {1, 1, 3, 3};
858  ConstTensor recurrentToForgetWeights(TensorInfo(
859  4, recurrentToForgetWeightsDimensions.data(), DataType::Float32), recurrentToForgetWeightsData);
860 
861  std::vector<float> recurrentToCellWeightsData = {1.0, 2.0, 3.0, 4.0, 5.0, 6.0, 7.0, 8.0, 9.0};
862  std::vector<unsigned int> recurrentToCellWeightsDimensions = {1, 1, 3, 3};
863  ConstTensor recurrentToCellWeights(TensorInfo(
864  4, recurrentToCellWeightsDimensions.data(), DataType::Float32), recurrentToCellWeightsData);
865 
866  std::vector<float> recurrentToOutputWeightsData = {1.0, 2.0, 3.0, 4.0, 5.0, 6.0, 7.0, 8.0, 9.0};
867  std::vector<unsigned int> recurrentToOutputWeightsDimensions = {1, 1, 3, 3};
868  ConstTensor recurrentToOutputWeights(TensorInfo(
869  4, recurrentToOutputWeightsDimensions.data(), DataType::Float32), recurrentToOutputWeightsData);
870 
871  std::vector<float> forgetGateBiasData = {1.0, 2.0, 3.0, 4.0, 5.0, 6.0, 7.0, 8.0, 9.0};
872  std::vector<unsigned int> forgetGateBiasDimensions = {1, 1, 3, 3};
873  ConstTensor forgetGateBias(TensorInfo(
874  4, forgetGateBiasDimensions.data(), DataType::Float32), forgetGateBiasData);
875 
876  std::vector<float> cellBiasData = {1.0, 2.0, 3.0, 4.0, 5.0, 6.0, 7.0, 8.0, 9.0};
877  std::vector<unsigned int> cellBiasDimensions = {1, 1, 3, 3};
878  ConstTensor cellBias(TensorInfo(
879  4, cellBiasDimensions.data(), DataType::Float32), cellBiasData);
880 
881  std::vector<float> outputGateBiasData = {1.0, 2.0, 3.0, 4.0, 5.0, 6.0, 7.0, 8.0, 9.0};
882  std::vector<unsigned int> outputGateBiasDimensions = {1, 1, 3, 3};
883  ConstTensor outputGateBias(TensorInfo(
884  4, outputGateBiasDimensions.data(), DataType::Float32), outputGateBiasData);
885 
886  std::vector<float> inputToInputWeightsData = {1.0, 2.0, 3.0, 4.0, 5.0, 6.0, 7.0, 8.0, 9.0};
887  std::vector<unsigned int> inputToInputWeightsDimensions = {1, 1, 3, 3};
888  ConstTensor inputToInputWeights(
889  TensorInfo(4, inputToInputWeightsDimensions.data(), DataType::Float32), inputToInputWeightsData);
890 
891  std::vector<float> recurrentToInputWeightsData = {1.0, 2.0, 3.0, 4.0, 5.0, 6.0, 7.0, 8.0, 9.0};
892  std::vector<unsigned int> recurrentToInputWeightsDimensions = {1, 1, 3, 3};
893  ConstTensor recurrentToInputWeights(TensorInfo(
894  4, recurrentToInputWeightsDimensions.data(), DataType::Float32), recurrentToInputWeightsData);
895 
896  std::vector<float> inputGateBiasData = {1.0, 2.0, 3.0, 4.0, 5.0, 6.0, 7.0, 8.0, 9.0};
897  std::vector<unsigned int> inputGateBiasDimensions = {1, 1, 3, 3};
898  ConstTensor inputGateBias(
899  TensorInfo(4, inputGateBiasDimensions.data(), DataType::Float32), inputGateBiasData);
900 
901  LstmInputParams params;
902  params.m_InputToForgetWeights = &inputToForgetWeights;
903  params.m_InputToCellWeights = &inputToCellWeights;
904  params.m_InputToOutputWeights = &inputToOutputWeights;
905  params.m_RecurrentToForgetWeights = &recurrentToForgetWeights;
906  params.m_RecurrentToCellWeights = &recurrentToCellWeights;
907  params.m_RecurrentToOutputWeights = &recurrentToOutputWeights;
908  params.m_ForgetGateBias = &forgetGateBias;
909  params.m_CellBias = &cellBias;
910  params.m_OutputGateBias = &outputGateBias;
911 
912  params.m_InputToInputWeights = &inputToInputWeights;
913  params.m_RecurrentToInputWeights = &recurrentToInputWeights;
914  params.m_InputGateBias = &inputGateBias;
915 
916  TestLstmLayerVisitor visitor(descriptor, params);
917 
918  NetworkImpl net;
919 
920  IConnectableLayer* const layer = net.AddLstmLayer(descriptor, params);
921  layer->Accept(visitor);
922 }
923 
924 TEST_CASE("CheckNamedLstmLayerCifgDisabled")
925 {
926  const char* layerName = "LstmLayer";
927  LstmDescriptor descriptor;
928  descriptor.m_ActivationFunc = 3;
929  descriptor.m_ClippingThresProj = 0.5f;
930  descriptor.m_ClippingThresCell = 0.3f;
931  descriptor.m_CifgEnabled = false; // if this is true then we DON'T need to set the OptCifgParams
932 
933  std::vector<float> inputToForgetWeightsData = {1.0, 2.0, 3.0, 4.0, 5.0, 6.0, 7.0, 8.0, 9.0};
934  std::vector<unsigned int> inputToForgetWeightsDimensions = {1, 1, 3, 3};
935  ConstTensor inputToForgetWeights(
936  TensorInfo(4, inputToForgetWeightsDimensions.data(), DataType::Float32), inputToForgetWeightsData);
937 
938  std::vector<float> inputToCellWeightsData = {1.0, 2.0, 3.0, 4.0, 5.0, 6.0, 7.0, 8.0, 9.0};
939  std::vector<unsigned int> inputToCellWeightsDimensions = {1, 1, 3, 3};
940  ConstTensor inputToCellWeights(
941  TensorInfo(4, inputToCellWeightsDimensions.data(), DataType::Float32), inputToCellWeightsData);
942 
943  std::vector<float> inputToOutputWeightsData = {1.0, 2.0, 3.0, 4.0, 5.0, 6.0, 7.0, 8.0, 9.0};
944  std::vector<unsigned int> inputToOutputWeightsDimensions = {1, 1, 3, 3};
945  ConstTensor inputToOutputWeights(
946  TensorInfo(4, inputToOutputWeightsDimensions.data(), DataType::Float32), inputToOutputWeightsData);
947 
948  std::vector<float> recurrentToForgetWeightsData = {1.0, 2.0, 3.0, 4.0, 5.0, 6.0, 7.0, 8.0, 9.0};
949  std::vector<unsigned int> recurrentToForgetWeightsDimensions = {1, 1, 3, 3};
950  ConstTensor recurrentToForgetWeights(TensorInfo(
951  4, recurrentToForgetWeightsDimensions.data(), DataType::Float32), recurrentToForgetWeightsData);
952 
953  std::vector<float> recurrentToCellWeightsData = {1.0, 2.0, 3.0, 4.0, 5.0, 6.0, 7.0, 8.0, 9.0};
954  std::vector<unsigned int> recurrentToCellWeightsDimensions = {1, 1, 3, 3};
955  ConstTensor recurrentToCellWeights(TensorInfo(
956  4, recurrentToCellWeightsDimensions.data(), DataType::Float32), recurrentToCellWeightsData);
957 
958  std::vector<float> recurrentToOutputWeightsData = {1.0, 2.0, 3.0, 4.0, 5.0, 6.0, 7.0, 8.0, 9.0};
959  std::vector<unsigned int> recurrentToOutputWeightsDimensions = {1, 1, 3, 3};
960  ConstTensor recurrentToOutputWeights(TensorInfo(
961  4, recurrentToOutputWeightsDimensions.data(), DataType::Float32), recurrentToOutputWeightsData);
962 
963  std::vector<float> forgetGateBiasData = {1.0, 2.0, 3.0, 4.0, 5.0, 6.0, 7.0, 8.0, 9.0};
964  std::vector<unsigned int> forgetGateBiasDimensions = {1, 1, 3, 3};
965  ConstTensor forgetGateBias(TensorInfo(
966  4, forgetGateBiasDimensions.data(), DataType::Float32), forgetGateBiasData);
967 
968  std::vector<float> cellBiasData = {1.0, 2.0, 3.0, 4.0, 5.0, 6.0, 7.0, 8.0, 9.0};
969  std::vector<unsigned int> cellBiasDimensions = {1, 1, 3, 3};
970  ConstTensor cellBias(TensorInfo(
971  4, cellBiasDimensions.data(), DataType::Float32), cellBiasData);
972 
973  std::vector<float> outputGateBiasData = {1.0, 2.0, 3.0, 4.0, 5.0, 6.0, 7.0, 8.0, 9.0};
974  std::vector<unsigned int> outputGateBiasDimensions = {1, 1, 3, 3};
975  ConstTensor outputGateBias(TensorInfo(
976  4, outputGateBiasDimensions.data(), DataType::Float32), outputGateBiasData);
977 
978  std::vector<float> inputToInputWeightsData = {1.0, 2.0, 3.0, 4.0, 5.0, 6.0, 7.0, 8.0, 9.0};
979  std::vector<unsigned int> inputToInputWeightsDimensions = {1, 1, 3, 3};
980  ConstTensor inputToInputWeights(
981  TensorInfo(4, inputToInputWeightsDimensions.data(), DataType::Float32), inputToInputWeightsData);
982 
983  std::vector<float> recurrentToInputWeightsData = {1.0, 2.0, 3.0, 4.0, 5.0, 6.0, 7.0, 8.0, 9.0};
984  std::vector<unsigned int> recurrentToInputWeightsDimensions = {1, 1, 3, 3};
985  ConstTensor recurrentToInputWeights(TensorInfo(
986  4, recurrentToInputWeightsDimensions.data(), DataType::Float32), recurrentToInputWeightsData);
987 
988  std::vector<float> inputGateBiasData = {1.0, 2.0, 3.0, 4.0, 5.0, 6.0, 7.0, 8.0, 9.0};
989  std::vector<unsigned int> inputGateBiasDimensions = {1, 1, 3, 3};
990  ConstTensor inputGateBias(
991  TensorInfo(4, inputGateBiasDimensions.data(), DataType::Float32), inputGateBiasData);
992 
993  LstmInputParams params;
994  params.m_InputToForgetWeights = &inputToForgetWeights;
995  params.m_InputToCellWeights = &inputToCellWeights;
996  params.m_InputToOutputWeights = &inputToOutputWeights;
997  params.m_RecurrentToForgetWeights = &recurrentToForgetWeights;
998  params.m_RecurrentToCellWeights = &recurrentToCellWeights;
999  params.m_RecurrentToOutputWeights = &recurrentToOutputWeights;
1000  params.m_ForgetGateBias = &forgetGateBias;
1001  params.m_CellBias = &cellBias;
1002  params.m_OutputGateBias = &outputGateBias;
1003 
1004  params.m_InputToInputWeights = &inputToInputWeights;
1005  params.m_RecurrentToInputWeights = &recurrentToInputWeights;
1006  params.m_InputGateBias = &inputGateBias;
1007 
1008  TestLstmLayerVisitor visitor(descriptor, params, layerName);
1009 
1010  NetworkImpl net;
1011 
1012  IConnectableLayer* const layer = net.AddLstmLayer(descriptor, params, layerName);
1013  layer->Accept(visitor);
1014 }
1015 
1016 // TODO add one with peephole
1017 TEST_CASE("CheckLstmLayerPeephole")
1018 {
1019  LstmDescriptor descriptor;
1020  descriptor.m_ActivationFunc = 3;
1021  descriptor.m_ClippingThresProj = 0.5f;
1022  descriptor.m_ClippingThresCell = 0.3f;
1023  descriptor.m_CifgEnabled = true; // if this is true then we DON'T need to set the OptCifgParams
1024  descriptor.m_PeepholeEnabled = true;
1025 
1026  std::vector<float> inputToForgetWeightsData = {1.0, 2.0, 3.0, 4.0, 5.0, 6.0, 7.0, 8.0, 9.0};
1027  std::vector<unsigned int> inputToForgetWeightsDimensions = {1, 1, 3, 3};
1028  ConstTensor inputToForgetWeights(
1029  TensorInfo(4, inputToForgetWeightsDimensions.data(), DataType::Float32), inputToForgetWeightsData);
1030 
1031  std::vector<float> inputToCellWeightsData = {1.0, 2.0, 3.0, 4.0, 5.0, 6.0, 7.0, 8.0, 9.0};
1032  std::vector<unsigned int> inputToCellWeightsDimensions = {1, 1, 3, 3};
1033  ConstTensor inputToCellWeights(
1034  TensorInfo(4, inputToCellWeightsDimensions.data(), DataType::Float32), inputToCellWeightsData);
1035 
1036  std::vector<float> inputToOutputWeightsData = {1.0, 2.0, 3.0, 4.0, 5.0, 6.0, 7.0, 8.0, 9.0};
1037  std::vector<unsigned int> inputToOutputWeightsDimensions = {1, 1, 3, 3};
1038  ConstTensor inputToOutputWeights(
1039  TensorInfo(4, inputToOutputWeightsDimensions.data(), DataType::Float32), inputToOutputWeightsData);
1040 
1041  std::vector<float> recurrentToForgetWeightsData = {1.0, 2.0, 3.0, 4.0, 5.0, 6.0, 7.0, 8.0, 9.0};
1042  std::vector<unsigned int> recurrentToForgetWeightsDimensions = {1, 1, 3, 3};
1043  ConstTensor recurrentToForgetWeights(TensorInfo(
1044  4, recurrentToForgetWeightsDimensions.data(), DataType::Float32), recurrentToForgetWeightsData);
1045 
1046  std::vector<float> recurrentToCellWeightsData = {1.0, 2.0, 3.0, 4.0, 5.0, 6.0, 7.0, 8.0, 9.0};
1047  std::vector<unsigned int> recurrentToCellWeightsDimensions = {1, 1, 3, 3};
1048  ConstTensor recurrentToCellWeights(TensorInfo(
1049  4, recurrentToCellWeightsDimensions.data(), DataType::Float32), recurrentToCellWeightsData);
1050 
1051  std::vector<float> recurrentToOutputWeightsData = {1.0, 2.0, 3.0, 4.0, 5.0, 6.0, 7.0, 8.0, 9.0};
1052  std::vector<unsigned int> recurrentToOutputWeightsDimensions = {1, 1, 3, 3};
1053  ConstTensor recurrentToOutputWeights(TensorInfo(
1054  4, recurrentToOutputWeightsDimensions.data(), DataType::Float32), recurrentToOutputWeightsData);
1055 
1056  std::vector<float> forgetGateBiasData = {1.0, 2.0, 3.0, 4.0, 5.0, 6.0, 7.0, 8.0, 9.0};
1057  std::vector<unsigned int> forgetGateBiasDimensions = {1, 1, 3, 3};
1058  ConstTensor forgetGateBias(TensorInfo(
1059  4, forgetGateBiasDimensions.data(), DataType::Float32), forgetGateBiasData);
1060 
1061  std::vector<float> cellBiasData = {1.0, 2.0, 3.0, 4.0, 5.0, 6.0, 7.0, 8.0, 9.0};
1062  std::vector<unsigned int> cellBiasDimensions = {1, 1, 3, 3};
1063  ConstTensor cellBias(TensorInfo(
1064  4, cellBiasDimensions.data(), DataType::Float32), cellBiasData);
1065 
1066  std::vector<float> outputGateBiasData = {1.0, 2.0, 3.0, 4.0, 5.0, 6.0, 7.0, 8.0, 9.0};
1067  std::vector<unsigned int> outputGateBiasDimensions = {1, 1, 3, 3};
1068  ConstTensor outputGateBias(TensorInfo(
1069  4, outputGateBiasDimensions.data(), DataType::Float32), outputGateBiasData);
1070 
1071  std::vector<float> cellToForgetWeightsData = {1.0, 2.0, 3.0, 4.0, 5.0, 6.0, 7.0, 8.0, 9.0};
1072  std::vector<unsigned int> cellToForgetWeightsDimensions = {1, 1, 3, 3};
1073  ConstTensor cellToForgetWeights(
1074  TensorInfo(4, cellToForgetWeightsDimensions.data(), DataType::Float32), cellToForgetWeightsData);
1075 
1076  std::vector<float> cellToOutputWeightsData = {1.0, 2.0, 3.0, 4.0, 5.0, 6.0, 7.0, 8.0, 9.0};
1077  std::vector<unsigned int> cellToOutputWeightsDimensions = {1, 1, 3, 3};
1078  ConstTensor cellToOutputWeights(
1079  TensorInfo(4, cellToOutputWeightsDimensions.data(), DataType::Float32), cellToOutputWeightsData);
1080 
1081  LstmInputParams params;
1082  params.m_InputToForgetWeights = &inputToForgetWeights;
1083  params.m_InputToCellWeights = &inputToCellWeights;
1084  params.m_InputToOutputWeights = &inputToOutputWeights;
1085  params.m_RecurrentToForgetWeights = &recurrentToForgetWeights;
1086  params.m_RecurrentToCellWeights = &recurrentToCellWeights;
1087  params.m_RecurrentToOutputWeights = &recurrentToOutputWeights;
1088  params.m_ForgetGateBias = &forgetGateBias;
1089  params.m_CellBias = &cellBias;
1090  params.m_OutputGateBias = &outputGateBias;
1091 
1092  params.m_CellToForgetWeights = &cellToForgetWeights;
1093  params.m_CellToOutputWeights = &cellToOutputWeights;
1094 
1095  TestLstmLayerVisitor visitor(descriptor, params);
1096 
1097  NetworkImpl net;
1098 
1099  IConnectableLayer* const layer = net.AddLstmLayer(descriptor, params);
1100  layer->Accept(visitor);
1101 }
1102 
1103 TEST_CASE("CheckLstmLayerPeepholeCifgDisabled")
1104 {
1105  LstmDescriptor descriptor;
1106  descriptor.m_ActivationFunc = 3;
1107  descriptor.m_ClippingThresProj = 0.5f;
1108  descriptor.m_ClippingThresCell = 0.3f;
1109  descriptor.m_CifgEnabled = false;
1110  descriptor.m_PeepholeEnabled = true;
1111 
1112  std::vector<float> inputToForgetWeightsData = {1.0, 2.0, 3.0, 4.0, 5.0, 6.0, 7.0, 8.0, 9.0};
1113  std::vector<unsigned int> inputToForgetWeightsDimensions = {1, 1, 3, 3};
1114  ConstTensor inputToForgetWeights(
1115  TensorInfo(4, inputToForgetWeightsDimensions.data(), DataType::Float32), inputToForgetWeightsData);
1116 
1117  std::vector<float> inputToCellWeightsData = {1.0, 2.0, 3.0, 4.0, 5.0, 6.0, 7.0, 8.0, 9.0};
1118  std::vector<unsigned int> inputToCellWeightsDimensions = {1, 1, 3, 3};
1119  ConstTensor inputToCellWeights(
1120  TensorInfo(4, inputToCellWeightsDimensions.data(), DataType::Float32), inputToCellWeightsData);
1121 
1122  std::vector<float> inputToOutputWeightsData = {1.0, 2.0, 3.0, 4.0, 5.0, 6.0, 7.0, 8.0, 9.0};
1123  std::vector<unsigned int> inputToOutputWeightsDimensions = {1, 1, 3, 3};
1124  ConstTensor inputToOutputWeights(
1125  TensorInfo(4, inputToOutputWeightsDimensions.data(), DataType::Float32), inputToOutputWeightsData);
1126 
1127  std::vector<float> recurrentToForgetWeightsData = {1.0, 2.0, 3.0, 4.0, 5.0, 6.0, 7.0, 8.0, 9.0};
1128  std::vector<unsigned int> recurrentToForgetWeightsDimensions = {1, 1, 3, 3};
1129  ConstTensor recurrentToForgetWeights(TensorInfo(
1130  4, recurrentToForgetWeightsDimensions.data(), DataType::Float32), recurrentToForgetWeightsData);
1131 
1132  std::vector<float> recurrentToCellWeightsData = {1.0, 2.0, 3.0, 4.0, 5.0, 6.0, 7.0, 8.0, 9.0};
1133  std::vector<unsigned int> recurrentToCellWeightsDimensions = {1, 1, 3, 3};
1134  ConstTensor recurrentToCellWeights(TensorInfo(
1135  4, recurrentToCellWeightsDimensions.data(), DataType::Float32), recurrentToCellWeightsData);
1136 
1137  std::vector<float> recurrentToOutputWeightsData = {1.0, 2.0, 3.0, 4.0, 5.0, 6.0, 7.0, 8.0, 9.0};
1138  std::vector<unsigned int> recurrentToOutputWeightsDimensions = {1, 1, 3, 3};
1139  ConstTensor recurrentToOutputWeights(TensorInfo(
1140  4, recurrentToOutputWeightsDimensions.data(), DataType::Float32), recurrentToOutputWeightsData);
1141 
1142  std::vector<float> forgetGateBiasData = {1.0, 2.0, 3.0, 4.0, 5.0, 6.0, 7.0, 8.0, 9.0};
1143  std::vector<unsigned int> forgetGateBiasDimensions = {1, 1, 3, 3};
1144  ConstTensor forgetGateBias(TensorInfo(
1145  4, forgetGateBiasDimensions.data(), DataType::Float32), forgetGateBiasData);
1146 
1147  std::vector<float> cellBiasData = {1.0, 2.0, 3.0, 4.0, 5.0, 6.0, 7.0, 8.0, 9.0};
1148  std::vector<unsigned int> cellBiasDimensions = {1, 1, 3, 3};
1149  ConstTensor cellBias(TensorInfo(
1150  4, cellBiasDimensions.data(), DataType::Float32), cellBiasData);
1151 
1152  std::vector<float> outputGateBiasData = {1.0, 2.0, 3.0, 4.0, 5.0, 6.0, 7.0, 8.0, 9.0};
1153  std::vector<unsigned int> outputGateBiasDimensions = {1, 1, 3, 3};
1154  ConstTensor outputGateBias(TensorInfo(
1155  4, outputGateBiasDimensions.data(), DataType::Float32), outputGateBiasData);
1156 
1157  std::vector<float> cellToInputWeightsData = {1.0, 2.0, 3.0, 4.0, 5.0, 6.0, 7.0, 8.0, 9.0};
1158  std::vector<unsigned int> cellToInputWeightsDimensions = {1, 1, 3, 3};
1159  ConstTensor cellToInputWeights(
1160  TensorInfo(4, cellToInputWeightsDimensions.data(), DataType::Float32), cellToInputWeightsData);
1161 
1162  std::vector<float> cellToForgetWeightsData = {1.0, 2.0, 3.0, 4.0, 5.0, 6.0, 7.0, 8.0, 9.0};
1163  std::vector<unsigned int> cellToForgetWeightsDimensions = {1, 1, 3, 3};
1164  ConstTensor cellToForgetWeights(
1165  TensorInfo(4, cellToForgetWeightsDimensions.data(), DataType::Float32), cellToForgetWeightsData);
1166 
1167  std::vector<float> cellToOutputWeightsData = {1.0, 2.0, 3.0, 4.0, 5.0, 6.0, 7.0, 8.0, 9.0};
1168  std::vector<unsigned int> cellToOutputWeightsDimensions = {1, 1, 3, 3};
1169  ConstTensor cellToOutputWeights(
1170  TensorInfo(4, cellToOutputWeightsDimensions.data(), DataType::Float32), cellToOutputWeightsData);
1171 
1172  std::vector<float> inputToInputWeightsData = {1.0, 2.0, 3.0, 4.0, 5.0, 6.0, 7.0, 8.0, 9.0};
1173  std::vector<unsigned int> inputToInputWeightsDimensions = {1, 1, 3, 3};
1174  ConstTensor inputToInputWeights(
1175  TensorInfo(4, inputToInputWeightsDimensions.data(), DataType::Float32), inputToInputWeightsData);
1176 
1177  std::vector<float> recurrentToInputWeightsData = {1.0, 2.0, 3.0, 4.0, 5.0, 6.0, 7.0, 8.0, 9.0};
1178  std::vector<unsigned int> recurrentToInputWeightsDimensions = {1, 1, 3, 3};
1179  ConstTensor recurrentToInputWeights(TensorInfo(
1180  4, recurrentToInputWeightsDimensions.data(), DataType::Float32), recurrentToInputWeightsData);
1181 
1182  std::vector<float> inputGateBiasData = {1.0, 2.0, 3.0, 4.0, 5.0, 6.0, 7.0, 8.0, 9.0};
1183  std::vector<unsigned int> inputGateBiasDimensions = {1, 1, 3, 3};
1184  ConstTensor inputGateBias(
1185  TensorInfo(4, inputGateBiasDimensions.data(), DataType::Float32), inputGateBiasData);
1186 
1187  LstmInputParams params;
1188  // Basic params
1189  params.m_InputToForgetWeights = &inputToForgetWeights;
1190  params.m_InputToCellWeights = &inputToCellWeights;
1191  params.m_InputToOutputWeights = &inputToOutputWeights;
1192  params.m_RecurrentToForgetWeights = &recurrentToForgetWeights;
1193  params.m_RecurrentToCellWeights = &recurrentToCellWeights;
1194  params.m_RecurrentToOutputWeights = &recurrentToOutputWeights;
1195  params.m_ForgetGateBias = &forgetGateBias;
1196  params.m_CellBias = &cellBias;
1197  params.m_OutputGateBias = &outputGateBias;
1198 
1199  // Peephole params
1200  params.m_CellToInputWeights = &cellToInputWeights;
1201  params.m_CellToForgetWeights = &cellToForgetWeights;
1202  params.m_CellToOutputWeights = &cellToOutputWeights;
1203 
1204  // Cifg params
1205  params.m_InputToInputWeights = &inputToInputWeights;
1206  params.m_RecurrentToInputWeights = &recurrentToInputWeights;
1207  params.m_InputGateBias = &inputGateBias;
1208 
1209  TestLstmLayerVisitor visitor(descriptor, params);
1210 
1211  NetworkImpl net;
1212 
1213  IConnectableLayer* const layer = net.AddLstmLayer(descriptor, params);
1214  layer->Accept(visitor);
1215 }
1216 
1217 TEST_CASE("CheckNamedLstmLayerPeephole")
1218 {
1219  const char* layerName = "LstmLayer";
1220  LstmDescriptor descriptor;
1221  descriptor.m_ActivationFunc = 3;
1222  descriptor.m_ClippingThresProj = 0.5f;
1223  descriptor.m_ClippingThresCell = 0.3f;
1224  descriptor.m_CifgEnabled = true; // if this is true then we DON'T need to set the OptCifgParams
1225  descriptor.m_PeepholeEnabled = true;
1226 
1227  std::vector<float> inputToForgetWeightsData = {1.0, 2.0, 3.0, 4.0, 5.0, 6.0, 7.0, 8.0, 9.0};
1228  std::vector<unsigned int> inputToForgetWeightsDimensions = {1, 1, 3, 3};
1229  ConstTensor inputToForgetWeights(
1230  TensorInfo(4, inputToForgetWeightsDimensions.data(), DataType::Float32), inputToForgetWeightsData);
1231 
1232  std::vector<float> inputToCellWeightsData = {1.0, 2.0, 3.0, 4.0, 5.0, 6.0, 7.0, 8.0, 9.0};
1233  std::vector<unsigned int> inputToCellWeightsDimensions = {1, 1, 3, 3};
1234  ConstTensor inputToCellWeights(
1235  TensorInfo(4, inputToCellWeightsDimensions.data(), DataType::Float32), inputToCellWeightsData);
1236 
1237  std::vector<float> inputToOutputWeightsData = {1.0, 2.0, 3.0, 4.0, 5.0, 6.0, 7.0, 8.0, 9.0};
1238  std::vector<unsigned int> inputToOutputWeightsDimensions = {1, 1, 3, 3};
1239  ConstTensor inputToOutputWeights(
1240  TensorInfo(4, inputToOutputWeightsDimensions.data(), DataType::Float32), inputToOutputWeightsData);
1241 
1242  std::vector<float> recurrentToForgetWeightsData = {1.0, 2.0, 3.0, 4.0, 5.0, 6.0, 7.0, 8.0, 9.0};
1243  std::vector<unsigned int> recurrentToForgetWeightsDimensions = {1, 1, 3, 3};
1244  ConstTensor recurrentToForgetWeights(TensorInfo(
1245  4, recurrentToForgetWeightsDimensions.data(), DataType::Float32), recurrentToForgetWeightsData);
1246 
1247  std::vector<float> recurrentToCellWeightsData = {1.0, 2.0, 3.0, 4.0, 5.0, 6.0, 7.0, 8.0, 9.0};
1248  std::vector<unsigned int> recurrentToCellWeightsDimensions = {1, 1, 3, 3};
1249  ConstTensor recurrentToCellWeights(TensorInfo(
1250  4, recurrentToCellWeightsDimensions.data(), DataType::Float32), recurrentToCellWeightsData);
1251 
1252  std::vector<float> recurrentToOutputWeightsData = {1.0, 2.0, 3.0, 4.0, 5.0, 6.0, 7.0, 8.0, 9.0};
1253  std::vector<unsigned int> recurrentToOutputWeightsDimensions = {1, 1, 3, 3};
1254  ConstTensor recurrentToOutputWeights(TensorInfo(
1255  4, recurrentToOutputWeightsDimensions.data(), DataType::Float32), recurrentToOutputWeightsData);
1256 
1257  std::vector<float> forgetGateBiasData = {1.0, 2.0, 3.0, 4.0, 5.0, 6.0, 7.0, 8.0, 9.0};
1258  std::vector<unsigned int> forgetGateBiasDimensions = {1, 1, 3, 3};
1259  ConstTensor forgetGateBias(TensorInfo(
1260  4, forgetGateBiasDimensions.data(), DataType::Float32), forgetGateBiasData);
1261 
1262  std::vector<float> cellBiasData = {1.0, 2.0, 3.0, 4.0, 5.0, 6.0, 7.0, 8.0, 9.0};
1263  std::vector<unsigned int> cellBiasDimensions = {1, 1, 3, 3};
1264  ConstTensor cellBias(TensorInfo(
1265  4, cellBiasDimensions.data(), DataType::Float32), cellBiasData);
1266 
1267  std::vector<float> outputGateBiasData = {1.0, 2.0, 3.0, 4.0, 5.0, 6.0, 7.0, 8.0, 9.0};
1268  std::vector<unsigned int> outputGateBiasDimensions = {1, 1, 3, 3};
1269  ConstTensor outputGateBias(TensorInfo(
1270  4, outputGateBiasDimensions.data(), DataType::Float32), outputGateBiasData);
1271 
1272  std::vector<float> cellToForgetWeightsData = {1.0, 2.0, 3.0, 4.0, 5.0, 6.0, 7.0, 8.0, 9.0};
1273  std::vector<unsigned int> cellToForgetWeightsDimensions = {1, 1, 3, 3};
1274  ConstTensor cellToForgetWeights(
1275  TensorInfo(4, cellToForgetWeightsDimensions.data(), DataType::Float32), cellToForgetWeightsData);
1276 
1277  std::vector<float> cellToOutputWeightsData = {1.0, 2.0, 3.0, 4.0, 5.0, 6.0, 7.0, 8.0, 9.0};
1278  std::vector<unsigned int> cellToOutputWeightsDimensions = {1, 1, 3, 3};
1279  ConstTensor cellToOutputWeights(
1280  TensorInfo(4, cellToOutputWeightsDimensions.data(), DataType::Float32), cellToOutputWeightsData);
1281 
1282  LstmInputParams params;
1283  params.m_InputToForgetWeights = &inputToForgetWeights;
1284  params.m_InputToCellWeights = &inputToCellWeights;
1285  params.m_InputToOutputWeights = &inputToOutputWeights;
1286  params.m_RecurrentToForgetWeights = &recurrentToForgetWeights;
1287  params.m_RecurrentToCellWeights = &recurrentToCellWeights;
1288  params.m_RecurrentToOutputWeights = &recurrentToOutputWeights;
1289  params.m_ForgetGateBias = &forgetGateBias;
1290  params.m_CellBias = &cellBias;
1291  params.m_OutputGateBias = &outputGateBias;
1292 
1293  params.m_CellToForgetWeights = &cellToForgetWeights;
1294  params.m_CellToOutputWeights = &cellToOutputWeights;
1295 
1296  TestLstmLayerVisitor visitor(descriptor, params, layerName);
1297 
1298  NetworkImpl net;
1299 
1300  IConnectableLayer* const layer = net.AddLstmLayer(descriptor, params, layerName);
1301  layer->Accept(visitor);
1302 }
1303 
1304 // TODO add one with projection
1305 TEST_CASE("CheckLstmLayerProjection")
1306 {
1307  LstmDescriptor descriptor;
1308  descriptor.m_ActivationFunc = 3;
1309  descriptor.m_ClippingThresProj = 0.5f;
1310  descriptor.m_ClippingThresCell = 0.3f;
1311  descriptor.m_CifgEnabled = true; // if this is true then we DON'T need to set the OptCifgParams
1312  descriptor.m_ProjectionEnabled = true;
1313 
1314  std::vector<float> inputToForgetWeightsData = {1.0, 2.0, 3.0, 4.0, 5.0, 6.0, 7.0, 8.0, 9.0};
1315  std::vector<unsigned int> inputToForgetWeightsDimensions = {1, 1, 3, 3};
1316  ConstTensor inputToForgetWeights(
1317  TensorInfo(4, inputToForgetWeightsDimensions.data(), DataType::Float32), inputToForgetWeightsData);
1318 
1319  std::vector<float> inputToCellWeightsData = {1.0, 2.0, 3.0, 4.0, 5.0, 6.0, 7.0, 8.0, 9.0};
1320  std::vector<unsigned int> inputToCellWeightsDimensions = {1, 1, 3, 3};
1321  ConstTensor inputToCellWeights(
1322  TensorInfo(4, inputToCellWeightsDimensions.data(), DataType::Float32), inputToCellWeightsData);
1323 
1324  std::vector<float> inputToOutputWeightsData = {1.0, 2.0, 3.0, 4.0, 5.0, 6.0, 7.0, 8.0, 9.0};
1325  std::vector<unsigned int> inputToOutputWeightsDimensions = {1, 1, 3, 3};
1326  ConstTensor inputToOutputWeights(
1327  TensorInfo(4, inputToOutputWeightsDimensions.data(), DataType::Float32), inputToOutputWeightsData);
1328 
1329  std::vector<float> recurrentToForgetWeightsData = {1.0, 2.0, 3.0, 4.0, 5.0, 6.0, 7.0, 8.0, 9.0};
1330  std::vector<unsigned int> recurrentToForgetWeightsDimensions = {1, 1, 3, 3};
1331  ConstTensor recurrentToForgetWeights(TensorInfo(
1332  4, recurrentToForgetWeightsDimensions.data(), DataType::Float32), recurrentToForgetWeightsData);
1333 
1334  std::vector<float> recurrentToCellWeightsData = {1.0, 2.0, 3.0, 4.0, 5.0, 6.0, 7.0, 8.0, 9.0};
1335  std::vector<unsigned int> recurrentToCellWeightsDimensions = {1, 1, 3, 3};
1336  ConstTensor recurrentToCellWeights(TensorInfo(
1337  4, recurrentToCellWeightsDimensions.data(), DataType::Float32), recurrentToCellWeightsData);
1338 
1339  std::vector<float> recurrentToOutputWeightsData = {1.0, 2.0, 3.0, 4.0, 5.0, 6.0, 7.0, 8.0, 9.0};
1340  std::vector<unsigned int> recurrentToOutputWeightsDimensions = {1, 1, 3, 3};
1341  ConstTensor recurrentToOutputWeights(TensorInfo(
1342  4, recurrentToOutputWeightsDimensions.data(), DataType::Float32), recurrentToOutputWeightsData);
1343 
1344  std::vector<float> forgetGateBiasData = {1.0, 2.0, 3.0, 4.0, 5.0, 6.0, 7.0, 8.0, 9.0};
1345  std::vector<unsigned int> forgetGateBiasDimensions = {1, 1, 3, 3};
1346  ConstTensor forgetGateBias(TensorInfo(
1347  4, forgetGateBiasDimensions.data(), DataType::Float32), forgetGateBiasData);
1348 
1349  std::vector<float> cellBiasData = {1.0, 2.0, 3.0, 4.0, 5.0, 6.0, 7.0, 8.0, 9.0};
1350  std::vector<unsigned int> cellBiasDimensions = {1, 1, 3, 3};
1351  ConstTensor cellBias(TensorInfo(
1352  4, cellBiasDimensions.data(), DataType::Float32), cellBiasData);
1353 
1354  std::vector<float> outputGateBiasData = {1.0, 2.0, 3.0, 4.0, 5.0, 6.0, 7.0, 8.0, 9.0};
1355  std::vector<unsigned int> outputGateBiasDimensions = {1, 1, 3, 3};
1356  ConstTensor outputGateBias(TensorInfo(
1357  4, outputGateBiasDimensions.data(), DataType::Float32), outputGateBiasData);
1358 
1359  std::vector<float> projectionBiasData = {1.0, 2.0, 3.0, 4.0, 5.0, 6.0, 7.0, 8.0, 9.0};
1360  std::vector<unsigned int> projectionBiasDimensions = {1, 1, 3, 3};
1361  ConstTensor projectionBias(
1362  TensorInfo(4, projectionBiasDimensions.data(), DataType::Float32), projectionBiasData);
1363 
1364  std::vector<float> projectionWeightsData = {1.0, 2.0, 3.0, 4.0, 5.0, 6.0, 7.0, 8.0, 9.0};
1365  std::vector<unsigned int> projectionWeightsDimensions = {1, 1, 3, 3};
1366  ConstTensor projectionWeights(
1367  TensorInfo(4, projectionWeightsDimensions.data(), DataType::Float32), projectionWeightsData);
1368 
1369  LstmInputParams params;
1370  params.m_InputToForgetWeights = &inputToForgetWeights;
1371  params.m_InputToCellWeights = &inputToCellWeights;
1372  params.m_InputToOutputWeights = &inputToOutputWeights;
1373  params.m_RecurrentToForgetWeights = &recurrentToForgetWeights;
1374  params.m_RecurrentToCellWeights = &recurrentToCellWeights;
1375  params.m_RecurrentToOutputWeights = &recurrentToOutputWeights;
1376  params.m_ForgetGateBias = &forgetGateBias;
1377  params.m_CellBias = &cellBias;
1378  params.m_OutputGateBias = &outputGateBias;
1379 
1380  params.m_ProjectionWeights = &projectionWeights;
1381  params.m_ProjectionBias = &projectionBias;
1382 
1383  TestLstmLayerVisitor visitor(descriptor, params);
1384 
1385  NetworkImpl net;
1386 
1387  IConnectableLayer* const layer = net.AddLstmLayer(descriptor, params);
1388  layer->Accept(visitor);
1389 }
1390 
1391 TEST_CASE("CheckNamedLstmLayerProjection")
1392 {
1393  const char* layerName = "LstmLayer";
1394  LstmDescriptor descriptor;
1395  descriptor.m_ActivationFunc = 3;
1396  descriptor.m_ClippingThresProj = 0.5f;
1397  descriptor.m_ClippingThresCell = 0.3f;
1398  descriptor.m_CifgEnabled = true; // if this is true then we DON'T need to set the OptCifgParams
1399  descriptor.m_ProjectionEnabled = true;
1400 
1401  std::vector<float> inputToForgetWeightsData = {1.0, 2.0, 3.0, 4.0, 5.0, 6.0, 7.0, 8.0, 9.0};
1402  std::vector<unsigned int> inputToForgetWeightsDimensions = {1, 1, 3, 3};
1403  ConstTensor inputToForgetWeights(
1404  TensorInfo(4, inputToForgetWeightsDimensions.data(), DataType::Float32), inputToForgetWeightsData);
1405 
1406  std::vector<float> inputToCellWeightsData = {1.0, 2.0, 3.0, 4.0, 5.0, 6.0, 7.0, 8.0, 9.0};
1407  std::vector<unsigned int> inputToCellWeightsDimensions = {1, 1, 3, 3};
1408  ConstTensor inputToCellWeights(
1409  TensorInfo(4, inputToCellWeightsDimensions.data(), DataType::Float32), inputToCellWeightsData);
1410 
1411  std::vector<float> inputToOutputWeightsData = {1.0, 2.0, 3.0, 4.0, 5.0, 6.0, 7.0, 8.0, 9.0};
1412  std::vector<unsigned int> inputToOutputWeightsDimensions = {1, 1, 3, 3};
1413  ConstTensor inputToOutputWeights(
1414  TensorInfo(4, inputToOutputWeightsDimensions.data(), DataType::Float32), inputToOutputWeightsData);
1415 
1416  std::vector<float> recurrentToForgetWeightsData = {1.0, 2.0, 3.0, 4.0, 5.0, 6.0, 7.0, 8.0, 9.0};
1417  std::vector<unsigned int> recurrentToForgetWeightsDimensions = {1, 1, 3, 3};
1418  ConstTensor recurrentToForgetWeights(TensorInfo(
1419  4, recurrentToForgetWeightsDimensions.data(), DataType::Float32), recurrentToForgetWeightsData);
1420 
1421  std::vector<float> recurrentToCellWeightsData = {1.0, 2.0, 3.0, 4.0, 5.0, 6.0, 7.0, 8.0, 9.0};
1422  std::vector<unsigned int> recurrentToCellWeightsDimensions = {1, 1, 3, 3};
1423  ConstTensor recurrentToCellWeights(TensorInfo(
1424  4, recurrentToCellWeightsDimensions.data(), DataType::Float32), recurrentToCellWeightsData);
1425 
1426  std::vector<float> recurrentToOutputWeightsData = {1.0, 2.0, 3.0, 4.0, 5.0, 6.0, 7.0, 8.0, 9.0};
1427  std::vector<unsigned int> recurrentToOutputWeightsDimensions = {1, 1, 3, 3};
1428  ConstTensor recurrentToOutputWeights(TensorInfo(
1429  4, recurrentToOutputWeightsDimensions.data(), DataType::Float32), recurrentToOutputWeightsData);
1430 
1431  std::vector<float> forgetGateBiasData = {1.0, 2.0, 3.0, 4.0, 5.0, 6.0, 7.0, 8.0, 9.0};
1432  std::vector<unsigned int> forgetGateBiasDimensions = {1, 1, 3, 3};
1433  ConstTensor forgetGateBias(TensorInfo(
1434  4, forgetGateBiasDimensions.data(), DataType::Float32), forgetGateBiasData);
1435 
1436  std::vector<float> cellBiasData = {1.0, 2.0, 3.0, 4.0, 5.0, 6.0, 7.0, 8.0, 9.0};
1437  std::vector<unsigned int> cellBiasDimensions = {1, 1, 3, 3};
1438  ConstTensor cellBias(TensorInfo(
1439  4, cellBiasDimensions.data(), DataType::Float32), cellBiasData);
1440 
1441  std::vector<float> outputGateBiasData = {1.0, 2.0, 3.0, 4.0, 5.0, 6.0, 7.0, 8.0, 9.0};
1442  std::vector<unsigned int> outputGateBiasDimensions = {1, 1, 3, 3};
1443  ConstTensor outputGateBias(TensorInfo(
1444  4, outputGateBiasDimensions.data(), DataType::Float32), outputGateBiasData);
1445 
1446  std::vector<float> projectionBiasData = {1.0, 2.0, 3.0, 4.0, 5.0, 6.0, 7.0, 8.0, 9.0};
1447  std::vector<unsigned int> projectionBiasDimensions = {1, 1, 3, 3};
1448  ConstTensor projectionBias(
1449  TensorInfo(4, projectionBiasDimensions.data(), DataType::Float32), projectionBiasData);
1450 
1451  std::vector<float> projectionWeightsData = {1.0, 2.0, 3.0, 4.0, 5.0, 6.0, 7.0, 8.0, 9.0};
1452  std::vector<unsigned int> projectionWeightsDimensions = {1, 1, 3, 3};
1453  ConstTensor projectionWeights(
1454  TensorInfo(4, projectionWeightsDimensions.data(), DataType::Float32), projectionWeightsData);
1455 
1456  LstmInputParams params;
1457  params.m_InputToForgetWeights = &inputToForgetWeights;
1458  params.m_InputToCellWeights = &inputToCellWeights;
1459  params.m_InputToOutputWeights = &inputToOutputWeights;
1460  params.m_RecurrentToForgetWeights = &recurrentToForgetWeights;
1461  params.m_RecurrentToCellWeights = &recurrentToCellWeights;
1462  params.m_RecurrentToOutputWeights = &recurrentToOutputWeights;
1463  params.m_ForgetGateBias = &forgetGateBias;
1464  params.m_CellBias = &cellBias;
1465  params.m_OutputGateBias = &outputGateBias;
1466 
1467  params.m_ProjectionWeights = &projectionWeights;
1468  params.m_ProjectionBias = &projectionBias;
1469 
1470  TestLstmLayerVisitor visitor(descriptor, params, layerName);
1471 
1472  NetworkImpl net;
1473 
1474  IConnectableLayer* const layer = net.AddLstmLayer(descriptor, params, layerName);
1475  layer->Accept(visitor);
1476 }
1477 
1478 TEST_CASE("CheckQLstmLayerBasic")
1479 {
1480  QLstmDescriptor descriptor;
1481  descriptor.m_ProjectionClip = 0.5f;
1482  descriptor.m_CellClip = 0.3f;
1483  descriptor.m_CifgEnabled = true;
1484 
1485  // Basic params ONLY
1486  std::vector<uint8_t> inputToForgetWeightsData = {1, 2, 3, 4, 5, 6, 7, 8, 9};
1487  std::vector<unsigned int> inputToForgetWeightsDimensions = {1, 1, 3, 3};
1488  ConstTensor inputToForgetWeights(
1489  TensorInfo(4, inputToForgetWeightsDimensions.data(), DataType::QSymmS8), inputToForgetWeightsData);
1490 
1491  std::vector<uint8_t> inputToCellWeightsData = {1, 2, 3, 4, 5, 6, 7, 8, 9};
1492  std::vector<unsigned int> inputToCellWeightsDimensions = {1, 1, 3, 3};
1493  ConstTensor inputToCellWeights(
1494  TensorInfo(4, inputToCellWeightsDimensions.data(), DataType::QSymmS8), inputToCellWeightsData);
1495 
1496  std::vector<uint8_t> inputToOutputWeightsData = {1, 2, 3, 4, 5, 6, 7, 8, 9};
1497  std::vector<unsigned int> inputToOutputWeightsDimensions = {1, 1, 3, 3};
1498  ConstTensor inputToOutputWeights(
1499  TensorInfo(4, inputToOutputWeightsDimensions.data(), DataType::QSymmS8), inputToOutputWeightsData);
1500 
1501  std::vector<uint8_t> recurrentToForgetWeightsData = {1, 2, 3, 4, 5, 6, 7, 8, 9};
1502  std::vector<unsigned int> recurrentToForgetWeightsDimensions = {1, 1, 3, 3};
1503  ConstTensor recurrentToForgetWeights(TensorInfo(
1504  4, recurrentToForgetWeightsDimensions.data(), DataType::QSymmS8), recurrentToForgetWeightsData);
1505 
1506  std::vector<uint8_t> recurrentToCellWeightsData = {1, 2, 3, 4, 5, 6, 7, 8, 9};
1507  std::vector<unsigned int> recurrentToCellWeightsDimensions = {1, 1, 3, 3};
1508  ConstTensor recurrentToCellWeights(TensorInfo(
1509  4, recurrentToCellWeightsDimensions.data(), DataType::QSymmS8), recurrentToCellWeightsData);
1510 
1511  std::vector<uint8_t> recurrentToOutputWeightsData = {1, 2, 3, 4, 5, 6, 7, 8, 9};
1512  std::vector<unsigned int> recurrentToOutputWeightsDimensions = {1, 1, 3, 3};
1513  ConstTensor recurrentToOutputWeights(TensorInfo(
1514  4, recurrentToOutputWeightsDimensions.data(), DataType::QSymmS8), recurrentToOutputWeightsData);
1515 
1516  std::vector<int32_t> forgetGateBiasData = {1, 2, 3, 4, 5, 6, 7, 8, 9};
1517  std::vector<unsigned int> forgetGateBiasDimensions = {1, 1, 3, 3};
1518  ConstTensor forgetGateBias(TensorInfo(
1519  4, forgetGateBiasDimensions.data(), DataType::Signed32), forgetGateBiasData);
1520 
1521  std::vector<int32_t> cellBiasData = {1, 2, 3, 4, 5, 6, 7, 8, 9};
1522  std::vector<unsigned int> cellBiasDimensions = {1, 1, 3, 3};
1523  ConstTensor cellBias(TensorInfo(
1524  4, cellBiasDimensions.data(), DataType::Signed32), cellBiasData);
1525 
1526  std::vector<int32_t> outputGateBiasData = {1, 2, 3, 4, 5, 6, 7, 8, 9};
1527  std::vector<unsigned int> outputGateBiasDimensions = {1, 1, 3, 3};
1528  ConstTensor outputGateBias(TensorInfo(
1529  4, outputGateBiasDimensions.data(), DataType::Signed32), outputGateBiasData);
1530 
1531  LstmInputParams params;
1532  params.m_InputToForgetWeights = &inputToForgetWeights;
1533  params.m_InputToCellWeights = &inputToCellWeights;
1534  params.m_InputToOutputWeights = &inputToOutputWeights;
1535  params.m_RecurrentToForgetWeights = &recurrentToForgetWeights;
1536  params.m_RecurrentToCellWeights = &recurrentToCellWeights;
1537  params.m_RecurrentToOutputWeights = &recurrentToOutputWeights;
1538  params.m_ForgetGateBias = &forgetGateBias;
1539  params.m_CellBias = &cellBias;
1540  params.m_OutputGateBias = &outputGateBias;
1541 
1542  TestQLstmLayerVisitor visitor(descriptor, params);
1543 
1544  NetworkImpl net;
1545 
1546  IConnectableLayer* const layer = net.AddQLstmLayer(descriptor, params);
1547  layer->Accept(visitor);
1548 }
1549 
1550 TEST_CASE("CheckNamedQLstmLayerBasic")
1551 {
1552  const char* layerName = "QLstmLayer";
1553  QLstmDescriptor descriptor;
1554  descriptor.m_ProjectionClip = 0.5f;
1555  descriptor.m_CellClip = 0.3f;
1556  descriptor.m_CifgEnabled = true;
1557 
1558  // Basic params ONLY
1559  std::vector<uint8_t> inputToForgetWeightsData = {1, 2, 3, 4, 5, 6, 7, 8, 9};
1560  std::vector<unsigned int> inputToForgetWeightsDimensions = {1, 1, 3, 3};
1561  ConstTensor inputToForgetWeights(
1562  TensorInfo(4, inputToForgetWeightsDimensions.data(), DataType::QSymmS8), inputToForgetWeightsData);
1563 
1564  std::vector<uint8_t> inputToCellWeightsData = {1, 2, 3, 4, 5, 6, 7, 8, 9};
1565  std::vector<unsigned int> inputToCellWeightsDimensions = {1, 1, 3, 3};
1566  ConstTensor inputToCellWeights(
1567  TensorInfo(4, inputToCellWeightsDimensions.data(), DataType::QSymmS8), inputToCellWeightsData);
1568 
1569  std::vector<uint8_t> inputToOutputWeightsData = {1, 2, 3, 4, 5, 6, 7, 8, 9};
1570  std::vector<unsigned int> inputToOutputWeightsDimensions = {1, 1, 3, 3};
1571  ConstTensor inputToOutputWeights(
1572  TensorInfo(4, inputToOutputWeightsDimensions.data(), DataType::QSymmS8), inputToOutputWeightsData);
1573 
1574  std::vector<uint8_t> recurrentToForgetWeightsData = {1, 2, 3, 4, 5, 6, 7, 8, 9};
1575  std::vector<unsigned int> recurrentToForgetWeightsDimensions = {1, 1, 3, 3};
1576  ConstTensor recurrentToForgetWeights(TensorInfo(
1577  4, recurrentToForgetWeightsDimensions.data(), DataType::QSymmS8), recurrentToForgetWeightsData);
1578 
1579  std::vector<uint8_t> recurrentToCellWeightsData = {1, 2, 3, 4, 5, 6, 7, 8, 9};
1580  std::vector<unsigned int> recurrentToCellWeightsDimensions = {1, 1, 3, 3};
1581  ConstTensor recurrentToCellWeights(TensorInfo(
1582  4, recurrentToCellWeightsDimensions.data(), DataType::QSymmS8), recurrentToCellWeightsData);
1583 
1584  std::vector<uint8_t> recurrentToOutputWeightsData = {1, 2, 3, 4, 5, 6, 7, 8, 9};
1585  std::vector<unsigned int> recurrentToOutputWeightsDimensions = {1, 1, 3, 3};
1586  ConstTensor recurrentToOutputWeights(TensorInfo(
1587  4, recurrentToOutputWeightsDimensions.data(), DataType::QSymmS8), recurrentToOutputWeightsData);
1588 
1589  std::vector<int32_t> forgetGateBiasData = {1, 2, 3, 4, 5, 6, 7, 8, 9};
1590  std::vector<unsigned int> forgetGateBiasDimensions = {1, 1, 3, 3};
1591  ConstTensor forgetGateBias(TensorInfo(
1592  4, forgetGateBiasDimensions.data(), DataType::Signed32), forgetGateBiasData);
1593 
1594  std::vector<int32_t> cellBiasData = {1, 2, 3, 4, 5, 6, 7, 8, 9};
1595  std::vector<unsigned int> cellBiasDimensions = {1, 1, 3, 3};
1596  ConstTensor cellBias(TensorInfo(
1597  4, cellBiasDimensions.data(), DataType::Signed32), cellBiasData);
1598 
1599  std::vector<int32_t> outputGateBiasData = {1, 2, 3, 4, 5, 6, 7, 8, 9};
1600  std::vector<unsigned int> outputGateBiasDimensions = {1, 1, 3, 3};
1601  ConstTensor outputGateBias(TensorInfo(
1602  4, outputGateBiasDimensions.data(), DataType::Signed32), outputGateBiasData);
1603 
1604  LstmInputParams params;
1605  params.m_InputToForgetWeights = &inputToForgetWeights;
1606  params.m_InputToCellWeights = &inputToCellWeights;
1607  params.m_InputToOutputWeights = &inputToOutputWeights;
1608  params.m_RecurrentToForgetWeights = &recurrentToForgetWeights;
1609  params.m_RecurrentToCellWeights = &recurrentToCellWeights;
1610  params.m_RecurrentToOutputWeights = &recurrentToOutputWeights;
1611  params.m_ForgetGateBias = &forgetGateBias;
1612  params.m_CellBias = &cellBias;
1613  params.m_OutputGateBias = &outputGateBias;
1614 
1615  TestQLstmLayerVisitor visitor(descriptor, params, layerName);
1616 
1617  NetworkImpl net;
1618 
1619  IConnectableLayer* const layer = net.AddQLstmLayer(descriptor, params, layerName);
1620  layer->Accept(visitor);
1621 }
1622 
1623 TEST_CASE("CheckQLstmLayerCifgDisabled")
1624 {
1625  QLstmDescriptor descriptor;
1626  descriptor.m_ProjectionClip = 0.5f;
1627  descriptor.m_CellClip = 0.3f;
1628  descriptor.m_CifgEnabled = false;
1629 
1630  // Basic params
1631  std::vector<uint8_t> inputToForgetWeightsData = {1, 2, 3, 4, 5, 6, 7, 8, 9};
1632  std::vector<unsigned int> inputToForgetWeightsDimensions = {1, 1, 3, 3};
1633  ConstTensor inputToForgetWeights(
1634  TensorInfo(4, inputToForgetWeightsDimensions.data(), DataType::QSymmS8), inputToForgetWeightsData);
1635 
1636  std::vector<uint8_t> inputToCellWeightsData = {1, 2, 3, 4, 5, 6, 7, 8, 9};
1637  std::vector<unsigned int> inputToCellWeightsDimensions = {1, 1, 3, 3};
1638  ConstTensor inputToCellWeights(
1639  TensorInfo(4, inputToCellWeightsDimensions.data(), DataType::QSymmS8), inputToCellWeightsData);
1640 
1641  std::vector<uint8_t> inputToOutputWeightsData = {1, 2, 3, 4, 5, 6, 7, 8, 9};
1642  std::vector<unsigned int> inputToOutputWeightsDimensions = {1, 1, 3, 3};
1643  ConstTensor inputToOutputWeights(
1644  TensorInfo(4, inputToOutputWeightsDimensions.data(), DataType::QSymmS8), inputToOutputWeightsData);
1645 
1646  std::vector<uint8_t> recurrentToForgetWeightsData = {1, 2, 3, 4, 5, 6, 7, 8, 9};
1647  std::vector<unsigned int> recurrentToForgetWeightsDimensions = {1, 1, 3, 3};
1648  ConstTensor recurrentToForgetWeights(TensorInfo(
1649  4, recurrentToForgetWeightsDimensions.data(), DataType::QSymmS8), recurrentToForgetWeightsData);
1650 
1651  std::vector<uint8_t> recurrentToCellWeightsData = {1, 2, 3, 4, 5, 6, 7, 8, 9};
1652  std::vector<unsigned int> recurrentToCellWeightsDimensions = {1, 1, 3, 3};
1653  ConstTensor recurrentToCellWeights(TensorInfo(
1654  4, recurrentToCellWeightsDimensions.data(), DataType::QSymmS8), recurrentToCellWeightsData);
1655 
1656  std::vector<uint8_t> recurrentToOutputWeightsData = {1, 2, 3, 4, 5, 6, 7, 8, 9};
1657  std::vector<unsigned int> recurrentToOutputWeightsDimensions = {1, 1, 3, 3};
1658  ConstTensor recurrentToOutputWeights(TensorInfo(
1659  4, recurrentToOutputWeightsDimensions.data(), DataType::QSymmS8), recurrentToOutputWeightsData);
1660 
1661  std::vector<int32_t> forgetGateBiasData = {1, 2, 3, 4, 5, 6, 7, 8, 9};
1662  std::vector<unsigned int> forgetGateBiasDimensions = {1, 1, 3, 3};
1663  ConstTensor forgetGateBias(TensorInfo(
1664  4, forgetGateBiasDimensions.data(), DataType::Signed32), forgetGateBiasData);
1665 
1666  std::vector<int32_t> cellBiasData = {1, 2, 3, 4, 5, 6, 7, 8, 9};
1667  std::vector<unsigned int> cellBiasDimensions = {1, 1, 3, 3};
1668  ConstTensor cellBias(TensorInfo(
1669  4, cellBiasDimensions.data(), DataType::Signed32), cellBiasData);
1670 
1671  std::vector<int32_t> outputGateBiasData = {1, 2, 3, 4, 5, 6, 7, 8, 9};
1672  std::vector<unsigned int> outputGateBiasDimensions = {1, 1, 3, 3};
1673  ConstTensor outputGateBias(TensorInfo(
1674  4, outputGateBiasDimensions.data(), DataType::Signed32), outputGateBiasData);
1675 
1676  // CIFG disabled params
1677  std::vector<uint8_t> inputToInputWeightsData = {1, 2, 3, 4, 5, 6, 7, 8, 9};
1678  std::vector<unsigned int> inputToInputWeightsDimensions = {1, 1, 3, 3};
1679  ConstTensor inputToInputWeights(
1680  TensorInfo(4, inputToInputWeightsDimensions.data(), DataType::QSymmS8), inputToInputWeightsData);
1681 
1682  std::vector<uint8_t> recurrentToInputWeightsData = {1, 2, 3, 4, 5, 6, 7, 8, 9};
1683  std::vector<unsigned int> recurrentToInputWeightsDimensions = {1, 1, 3, 3};
1684  ConstTensor recurrentToInputWeights(TensorInfo(
1685  4, recurrentToInputWeightsDimensions.data(), DataType::QSymmS8), recurrentToInputWeightsData);
1686 
1687  std::vector<int32_t> inputGateBiasData = {1, 2, 3, 4, 5, 6, 7, 8, 9};
1688  std::vector<unsigned int> inputGateBiasDimensions = {1, 1, 3, 3};
1689  ConstTensor inputGateBias(
1690  TensorInfo(4, inputGateBiasDimensions.data(), DataType::Signed32), inputGateBiasData);
1691 
1692  LstmInputParams params;
1693 
1694  // Basic params
1695  params.m_InputToForgetWeights = &inputToForgetWeights;
1696  params.m_InputToCellWeights = &inputToCellWeights;
1697  params.m_InputToOutputWeights = &inputToOutputWeights;
1698  params.m_RecurrentToForgetWeights = &recurrentToForgetWeights;
1699  params.m_RecurrentToCellWeights = &recurrentToCellWeights;
1700  params.m_RecurrentToOutputWeights = &recurrentToOutputWeights;
1701  params.m_ForgetGateBias = &forgetGateBias;
1702  params.m_CellBias = &cellBias;
1703  params.m_OutputGateBias = &outputGateBias;
1704 
1705  // CIFG disabled params
1706  params.m_InputToInputWeights = &inputToInputWeights;
1707  params.m_RecurrentToInputWeights = &recurrentToInputWeights;
1708  params.m_InputGateBias = &inputGateBias;
1709 
1710  TestQLstmLayerVisitor visitor(descriptor, params);
1711 
1712  NetworkImpl net;
1713 
1714  IConnectableLayer* const layer = net.AddQLstmLayer(descriptor, params);
1715  layer->Accept(visitor);
1716 }
1717 
1718 TEST_CASE("CheckQLstmLayerCifgDisabledPeepholeEnabled")
1719 {
1720  QLstmDescriptor descriptor;
1721  descriptor.m_ProjectionClip = 0.5f;
1722  descriptor.m_CellClip = 0.3f;
1723  descriptor.m_CifgEnabled = false;
1724  descriptor.m_PeepholeEnabled = true;
1725 
1726  // Basic params
1727  std::vector<uint8_t> inputToForgetWeightsData = {1, 2, 3, 4, 5, 6, 7, 8, 9};
1728  std::vector<unsigned int> inputToForgetWeightsDimensions = {1, 1, 3, 3};
1729  ConstTensor inputToForgetWeights(
1730  TensorInfo(4, inputToForgetWeightsDimensions.data(), DataType::QSymmS8), inputToForgetWeightsData);
1731 
1732  std::vector<uint8_t> inputToCellWeightsData = {1, 2, 3, 4, 5, 6, 7, 8, 9};
1733  std::vector<unsigned int> inputToCellWeightsDimensions = {1, 1, 3, 3};
1734  ConstTensor inputToCellWeights(
1735  TensorInfo(4, inputToCellWeightsDimensions.data(), DataType::QSymmS8), inputToCellWeightsData);
1736 
1737  std::vector<uint8_t> inputToOutputWeightsData = {1, 2, 3, 4, 5, 6, 7, 8, 9};
1738  std::vector<unsigned int> inputToOutputWeightsDimensions = {1, 1, 3, 3};
1739  ConstTensor inputToOutputWeights(
1740  TensorInfo(4, inputToOutputWeightsDimensions.data(), DataType::QSymmS8), inputToOutputWeightsData);
1741 
1742  std::vector<uint8_t> recurrentToForgetWeightsData = {1, 2, 3, 4, 5, 6, 7, 8, 9};
1743  std::vector<unsigned int> recurrentToForgetWeightsDimensions = {1, 1, 3, 3};
1744  ConstTensor recurrentToForgetWeights(TensorInfo(
1745  4, recurrentToForgetWeightsDimensions.data(), DataType::QSymmS8), recurrentToForgetWeightsData);
1746 
1747  std::vector<uint8_t> recurrentToCellWeightsData = {1, 2, 3, 4, 5, 6, 7, 8, 9};
1748  std::vector<unsigned int> recurrentToCellWeightsDimensions = {1, 1, 3, 3};
1749  ConstTensor recurrentToCellWeights(TensorInfo(
1750  4, recurrentToCellWeightsDimensions.data(), DataType::QSymmS8), recurrentToCellWeightsData);
1751 
1752  std::vector<uint8_t> recurrentToOutputWeightsData = {1, 2, 3, 4, 5, 6, 7, 8, 9};
1753  std::vector<unsigned int> recurrentToOutputWeightsDimensions = {1, 1, 3, 3};
1754  ConstTensor recurrentToOutputWeights(TensorInfo(
1755  4, recurrentToOutputWeightsDimensions.data(), DataType::QSymmS8), recurrentToOutputWeightsData);
1756 
1757  std::vector<int32_t> forgetGateBiasData = {1, 2, 3, 4, 5, 6, 7, 8, 9};
1758  std::vector<unsigned int> forgetGateBiasDimensions = {1, 1, 3, 3};
1759  ConstTensor forgetGateBias(TensorInfo(
1760  4, forgetGateBiasDimensions.data(), DataType::Signed32), forgetGateBiasData);
1761 
1762  std::vector<int32_t> cellBiasData = {1, 2, 3, 4, 5, 6, 7, 8, 9};
1763  std::vector<unsigned int> cellBiasDimensions = {1, 1, 3, 3};
1764  ConstTensor cellBias(TensorInfo(
1765  4, cellBiasDimensions.data(), DataType::Signed32), cellBiasData);
1766 
1767  std::vector<int32_t> outputGateBiasData = {1, 2, 3, 4, 5, 6, 7, 8, 9};
1768  std::vector<unsigned int> outputGateBiasDimensions = {1, 1, 3, 3};
1769  ConstTensor outputGateBias(TensorInfo(
1770  4, outputGateBiasDimensions.data(), DataType::Signed32), outputGateBiasData);
1771 
1772  // CIFG disabled params
1773  std::vector<uint8_t> inputToInputWeightsData = {1, 2, 3, 4, 5, 6, 7, 8, 9};
1774  std::vector<unsigned int> inputToInputWeightsDimensions = {1, 1, 3, 3};
1775  ConstTensor inputToInputWeights(
1776  TensorInfo(4, inputToInputWeightsDimensions.data(), DataType::QSymmS8), inputToInputWeightsData);
1777 
1778  std::vector<uint8_t> recurrentToInputWeightsData = {1, 2, 3, 4, 5, 6, 7, 8, 9};
1779  std::vector<unsigned int> recurrentToInputWeightsDimensions = {1, 1, 3, 3};
1780  ConstTensor recurrentToInputWeights(TensorInfo(
1781  4, recurrentToInputWeightsDimensions.data(), DataType::QSymmS8), recurrentToInputWeightsData);
1782 
1783  std::vector<int32_t> inputGateBiasData = {1, 2, 3, 4, 5, 6, 7, 8, 9};
1784  std::vector<unsigned int> inputGateBiasDimensions = {1, 1, 3, 3};
1785  ConstTensor inputGateBias(
1786  TensorInfo(4, inputGateBiasDimensions.data(), DataType::Signed32), inputGateBiasData);
1787 
1788  // Peephole enabled, CIFG disabled params
1789  std::vector<int16_t> cellToInputWeightsData = {1, 2, 3, 4, 5, 6, 7, 8, 9};
1790  std::vector<unsigned int> cellToInputWeightsDimensions = {1, 1, 3, 3};
1791  ConstTensor cellToInputWeights(
1792  TensorInfo(4, cellToInputWeightsDimensions.data(), DataType::QSymmS16), cellToInputWeightsData);
1793 
1794  std::vector<int16_t> cellToForgetWeightsData = {1, 2, 3, 4, 5, 6, 7, 8, 9};
1795  std::vector<unsigned int> cellToForgetWeightsDimensions = {1, 1, 3, 3};
1796  ConstTensor cellToForgetWeights(
1797  TensorInfo(4, cellToForgetWeightsDimensions.data(), DataType::QSymmS16), cellToForgetWeightsData);
1798 
1799  std::vector<int16_t> cellToOutputWeightsData = {1, 2, 3, 4, 5, 6, 7, 8, 9};
1800  std::vector<unsigned int> cellToOutputWeightsDimensions = {1, 1, 3, 3};
1801  ConstTensor cellToOutputWeights(
1802  TensorInfo(4, cellToOutputWeightsDimensions.data(), DataType::QSymmS16), cellToOutputWeightsData);
1803 
1804  LstmInputParams params;
1805 
1806  // Basic params
1807  params.m_InputToForgetWeights = &inputToForgetWeights;
1808  params.m_InputToCellWeights = &inputToCellWeights;
1809  params.m_InputToOutputWeights = &inputToOutputWeights;
1810  params.m_RecurrentToForgetWeights = &recurrentToForgetWeights;
1811  params.m_RecurrentToCellWeights = &recurrentToCellWeights;
1812  params.m_RecurrentToOutputWeights = &recurrentToOutputWeights;
1813  params.m_ForgetGateBias = &forgetGateBias;
1814  params.m_CellBias = &cellBias;
1815  params.m_OutputGateBias = &outputGateBias;
1816 
1817  // CIFG disabled params
1818  params.m_InputToInputWeights = &inputToInputWeights;
1819  params.m_RecurrentToInputWeights = &recurrentToInputWeights;
1820  params.m_InputGateBias = &inputGateBias;
1821 
1822  // Peephole enabled, CIFG disabled params
1823  params.m_CellToInputWeights = &cellToInputWeights;
1824  params.m_CellToForgetWeights = &cellToForgetWeights;
1825  params.m_CellToOutputWeights = &cellToOutputWeights;
1826 
1827  TestQLstmLayerVisitor visitor(descriptor, params);
1828 
1829  NetworkImpl net;
1830 
1831  IConnectableLayer* const layer = net.AddQLstmLayer(descriptor, params);
1832  layer->Accept(visitor);
1833 }
1834 
1835 TEST_CASE("CheckQLstmLayerCifgEnabledPeepholeEnabled")
1836 {
1837  QLstmDescriptor descriptor;
1838  descriptor.m_ProjectionClip = 0.5f;
1839  descriptor.m_CellClip = 0.3f;
1840  descriptor.m_CifgEnabled = true;
1841  descriptor.m_PeepholeEnabled = true;
1842 
1843  // Basic params
1844  std::vector<uint8_t> inputToForgetWeightsData = {1, 2, 3, 4, 5, 6, 7, 8, 9};
1845  std::vector<unsigned int> inputToForgetWeightsDimensions = {1, 1, 3, 3};
1846  ConstTensor inputToForgetWeights(
1847  TensorInfo(4, inputToForgetWeightsDimensions.data(), DataType::QSymmS8), inputToForgetWeightsData);
1848 
1849  std::vector<uint8_t> inputToCellWeightsData = {1, 2, 3, 4, 5, 6, 7, 8, 9};
1850  std::vector<unsigned int> inputToCellWeightsDimensions = {1, 1, 3, 3};
1851  ConstTensor inputToCellWeights(
1852  TensorInfo(4, inputToCellWeightsDimensions.data(), DataType::QSymmS8), inputToCellWeightsData);
1853 
1854  std::vector<uint8_t> inputToOutputWeightsData = {1, 2, 3, 4, 5, 6, 7, 8, 9};
1855  std::vector<unsigned int> inputToOutputWeightsDimensions = {1, 1, 3, 3};
1856  ConstTensor inputToOutputWeights(
1857  TensorInfo(4, inputToOutputWeightsDimensions.data(), DataType::QSymmS8), inputToOutputWeightsData);
1858 
1859  std::vector<uint8_t> recurrentToForgetWeightsData = {1, 2, 3, 4, 5, 6, 7, 8, 9};
1860  std::vector<unsigned int> recurrentToForgetWeightsDimensions = {1, 1, 3, 3};
1861  ConstTensor recurrentToForgetWeights(TensorInfo(
1862  4, recurrentToForgetWeightsDimensions.data(), DataType::QSymmS8), recurrentToForgetWeightsData);
1863 
1864  std::vector<uint8_t> recurrentToCellWeightsData = {1, 2, 3, 4, 5, 6, 7, 8, 9};
1865  std::vector<unsigned int> recurrentToCellWeightsDimensions = {1, 1, 3, 3};
1866  ConstTensor recurrentToCellWeights(TensorInfo(
1867  4, recurrentToCellWeightsDimensions.data(), DataType::QSymmS8), recurrentToCellWeightsData);
1868 
1869  std::vector<uint8_t> recurrentToOutputWeightsData = {1, 2, 3, 4, 5, 6, 7, 8, 9};
1870  std::vector<unsigned int> recurrentToOutputWeightsDimensions = {1, 1, 3, 3};
1871  ConstTensor recurrentToOutputWeights(TensorInfo(
1872  4, recurrentToOutputWeightsDimensions.data(), DataType::QSymmS8), recurrentToOutputWeightsData);
1873 
1874  std::vector<int32_t> forgetGateBiasData = {1, 2, 3, 4, 5, 6, 7, 8, 9};
1875  std::vector<unsigned int> forgetGateBiasDimensions = {1, 1, 3, 3};
1876  ConstTensor forgetGateBias(TensorInfo(
1877  4, forgetGateBiasDimensions.data(), DataType::Signed32), forgetGateBiasData);
1878 
1879  std::vector<int32_t> cellBiasData = {1, 2, 3, 4, 5, 6, 7, 8, 9};
1880  std::vector<unsigned int> cellBiasDimensions = {1, 1, 3, 3};
1881  ConstTensor cellBias(TensorInfo(
1882  4, cellBiasDimensions.data(), DataType::Signed32), cellBiasData);
1883 
1884  std::vector<int32_t> outputGateBiasData = {1, 2, 3, 4, 5, 6, 7, 8, 9};
1885  std::vector<unsigned int> outputGateBiasDimensions = {1, 1, 3, 3};
1886  ConstTensor outputGateBias(TensorInfo(
1887  4, outputGateBiasDimensions.data(), DataType::Signed32), outputGateBiasData);
1888 
1889  // Peephole enabled and CIFG enabled params
1890  std::vector<int16_t> cellToForgetWeightsData = {1, 2, 3, 4, 5, 6, 7, 8, 9};
1891  std::vector<unsigned int> cellToForgetWeightsDimensions = {1, 1, 3, 3};
1892  ConstTensor cellToForgetWeights(
1893  TensorInfo(4, cellToForgetWeightsDimensions.data(), DataType::QSymmS16), cellToForgetWeightsData);
1894 
1895  std::vector<int16_t> cellToOutputWeightsData = {1, 2, 3, 4, 5, 6, 7, 8, 9};
1896  std::vector<unsigned int> cellToOutputWeightsDimensions = {1, 1, 3, 3};
1897  ConstTensor cellToOutputWeights(
1898  TensorInfo(4, cellToOutputWeightsDimensions.data(), DataType::QSymmS16), cellToOutputWeightsData);
1899 
1900  LstmInputParams params;
1901 
1902  // Basic params
1903  params.m_InputToForgetWeights = &inputToForgetWeights;
1904  params.m_InputToCellWeights = &inputToCellWeights;
1905  params.m_InputToOutputWeights = &inputToOutputWeights;
1906  params.m_RecurrentToForgetWeights = &recurrentToForgetWeights;
1907  params.m_RecurrentToCellWeights = &recurrentToCellWeights;
1908  params.m_RecurrentToOutputWeights = &recurrentToOutputWeights;
1909  params.m_ForgetGateBias = &forgetGateBias;
1910  params.m_CellBias = &cellBias;
1911  params.m_OutputGateBias = &outputGateBias;
1912 
1913  // Peephole enabled and CIFG enabled params
1914  params.m_CellToForgetWeights = &cellToForgetWeights;
1915  params.m_CellToOutputWeights = &cellToOutputWeights;
1916 
1917  TestQLstmLayerVisitor visitor(descriptor, params);
1918 
1919  NetworkImpl net;
1920 
1921  IConnectableLayer* const layer = net.AddQLstmLayer(descriptor, params);
1922  layer->Accept(visitor);
1923 }
1924 
1925 TEST_CASE("CheckQLstmLayerProjectionEnabled")
1926 {
1927  QLstmDescriptor descriptor;
1928  descriptor.m_ProjectionClip = 0.5f;
1929  descriptor.m_CellClip = 0.3f;
1930  descriptor.m_CifgEnabled = true;
1931  descriptor.m_ProjectionEnabled = true;
1932 
1933  // Basic params ONLY
1934  std::vector<uint8_t> inputToForgetWeightsData = {1, 2, 3, 4, 5, 6, 7, 8, 9};
1935  std::vector<unsigned int> inputToForgetWeightsDimensions = {1, 1, 3, 3};
1936  ConstTensor inputToForgetWeights(
1937  TensorInfo(4, inputToForgetWeightsDimensions.data(), DataType::QSymmS8), inputToForgetWeightsData);
1938 
1939  std::vector<uint8_t> inputToCellWeightsData = {1, 2, 3, 4, 5, 6, 7, 8, 9};
1940  std::vector<unsigned int> inputToCellWeightsDimensions = {1, 1, 3, 3};
1941  ConstTensor inputToCellWeights(
1942  TensorInfo(4, inputToCellWeightsDimensions.data(), DataType::QSymmS8), inputToCellWeightsData);
1943 
1944  std::vector<uint8_t> inputToOutputWeightsData = {1, 2, 3, 4, 5, 6, 7, 8, 9};
1945  std::vector<unsigned int> inputToOutputWeightsDimensions = {1, 1, 3, 3};
1946  ConstTensor inputToOutputWeights(
1947  TensorInfo(4, inputToOutputWeightsDimensions.data(), DataType::QSymmS8), inputToOutputWeightsData);
1948 
1949  std::vector<uint8_t> recurrentToForgetWeightsData = {1, 2, 3, 4, 5, 6, 7, 8, 9};
1950  std::vector<unsigned int> recurrentToForgetWeightsDimensions = {1, 1, 3, 3};
1951  ConstTensor recurrentToForgetWeights(TensorInfo(
1952  4, recurrentToForgetWeightsDimensions.data(), DataType::QSymmS8), recurrentToForgetWeightsData);
1953 
1954  std::vector<uint8_t> recurrentToCellWeightsData = {1, 2, 3, 4, 5, 6, 7, 8, 9};
1955  std::vector<unsigned int> recurrentToCellWeightsDimensions = {1, 1, 3, 3};
1956  ConstTensor recurrentToCellWeights(TensorInfo(
1957  4, recurrentToCellWeightsDimensions.data(), DataType::QSymmS8), recurrentToCellWeightsData);
1958 
1959  std::vector<uint8_t> recurrentToOutputWeightsData = {1, 2, 3, 4, 5, 6, 7, 8, 9};
1960  std::vector<unsigned int> recurrentToOutputWeightsDimensions = {1, 1, 3, 3};
1961  ConstTensor recurrentToOutputWeights(TensorInfo(
1962  4, recurrentToOutputWeightsDimensions.data(), DataType::QSymmS8), recurrentToOutputWeightsData);
1963 
1964  std::vector<int32_t> forgetGateBiasData = {1, 2, 3, 4, 5, 6, 7, 8, 9};
1965  std::vector<unsigned int> forgetGateBiasDimensions = {1, 1, 3, 3};
1966  ConstTensor forgetGateBias(TensorInfo(
1967  4, forgetGateBiasDimensions.data(), DataType::Signed32), forgetGateBiasData);
1968 
1969  std::vector<int32_t> cellBiasData = {1, 2, 3, 4, 5, 6, 7, 8, 9};
1970  std::vector<unsigned int> cellBiasDimensions = {1, 1, 3, 3};
1971  ConstTensor cellBias(TensorInfo(
1972  4, cellBiasDimensions.data(), DataType::Signed32), cellBiasData);
1973 
1974  std::vector<int32_t> outputGateBiasData = {1, 2, 3, 4, 5, 6, 7, 8, 9};
1975  std::vector<unsigned int> outputGateBiasDimensions = {1, 1, 3, 3};
1976  ConstTensor outputGateBias(TensorInfo(
1977  4, outputGateBiasDimensions.data(), DataType::Signed32), outputGateBiasData);
1978 
1979  // Projection enabled params
1980  std::vector<uint8_t> projectionWeightsData = {1, 2, 3, 4, 5, 6, 7, 8, 9};
1981  std::vector<unsigned int> projectionWeightsDimensions = {1, 1, 3, 3};
1982  ConstTensor projectionWeights(TensorInfo(
1983  4, projectionWeightsDimensions.data(), DataType::QSymmS8), projectionWeightsData);
1984 
1985  std::vector<int32_t> projectionBiasData = {1, 2, 3, 4, 5, 6, 7, 8, 9};
1986  std::vector<unsigned int> projectionBiasDimensions = {1, 1, 3, 3};
1987  ConstTensor projectionBias(TensorInfo(
1988  4, projectionBiasDimensions.data(), DataType::Signed32), projectionBiasData);
1989 
1990  LstmInputParams params;
1991 
1992  // Basic params
1993  params.m_InputToForgetWeights = &inputToForgetWeights;
1994  params.m_InputToCellWeights = &inputToCellWeights;
1995  params.m_InputToOutputWeights = &inputToOutputWeights;
1996  params.m_RecurrentToForgetWeights = &recurrentToForgetWeights;
1997  params.m_RecurrentToCellWeights = &recurrentToCellWeights;
1998  params.m_RecurrentToOutputWeights = &recurrentToOutputWeights;
1999  params.m_ForgetGateBias = &forgetGateBias;
2000  params.m_CellBias = &cellBias;
2001  params.m_OutputGateBias = &outputGateBias;
2002 
2003  // Projection enabled params
2004  params.m_ProjectionWeights = &projectionWeights;
2005  params.m_ProjectionBias = &projectionBias;
2006 
2007  TestQLstmLayerVisitor visitor(descriptor, params);
2008 
2009  NetworkImpl net;
2010 
2011  IConnectableLayer* const layer = net.AddQLstmLayer(descriptor, params);
2012  layer->Accept(visitor);
2013 }
2014 
2015 TEST_CASE("CheckQLstmLayerCifgDisabledLayerNormEnabled")
2016 {
2017  QLstmDescriptor descriptor;
2018  descriptor.m_ProjectionClip = 0.5f;
2019  descriptor.m_CellClip = 0.3f;
2020  descriptor.m_CifgEnabled = false;
2021  descriptor.m_LayerNormEnabled = true;
2022 
2023  // Basic params
2024  std::vector<uint8_t> inputToForgetWeightsData = {1, 2, 3, 4, 5, 6, 7, 8, 9};
2025  std::vector<unsigned int> inputToForgetWeightsDimensions = {1, 1, 3, 3};
2026  ConstTensor inputToForgetWeights(
2027  TensorInfo(4, inputToForgetWeightsDimensions.data(), DataType::QSymmS8), inputToForgetWeightsData);
2028 
2029  std::vector<uint8_t> inputToCellWeightsData = {1, 2, 3, 4, 5, 6, 7, 8, 9};
2030  std::vector<unsigned int> inputToCellWeightsDimensions = {1, 1, 3, 3};
2031  ConstTensor inputToCellWeights(
2032  TensorInfo(4, inputToCellWeightsDimensions.data(), DataType::QSymmS8), inputToCellWeightsData);
2033 
2034  std::vector<uint8_t> inputToOutputWeightsData = {1, 2, 3, 4, 5, 6, 7, 8, 9};
2035  std::vector<unsigned int> inputToOutputWeightsDimensions = {1, 1, 3, 3};
2036  ConstTensor inputToOutputWeights(
2037  TensorInfo(4, inputToOutputWeightsDimensions.data(), DataType::QSymmS8), inputToOutputWeightsData);
2038 
2039  std::vector<uint8_t> recurrentToForgetWeightsData = {1, 2, 3, 4, 5, 6, 7, 8, 9};
2040  std::vector<unsigned int> recurrentToForgetWeightsDimensions = {1, 1, 3, 3};
2041  ConstTensor recurrentToForgetWeights(TensorInfo(
2042  4, recurrentToForgetWeightsDimensions.data(), DataType::QSymmS8), recurrentToForgetWeightsData);
2043 
2044  std::vector<uint8_t> recurrentToCellWeightsData = {1, 2, 3, 4, 5, 6, 7, 8, 9};
2045  std::vector<unsigned int> recurrentToCellWeightsDimensions = {1, 1, 3, 3};
2046  ConstTensor recurrentToCellWeights(TensorInfo(
2047  4, recurrentToCellWeightsDimensions.data(), DataType::QSymmS8), recurrentToCellWeightsData);
2048 
2049  std::vector<uint8_t> recurrentToOutputWeightsData = {1, 2, 3, 4, 5, 6, 7, 8, 9};
2050  std::vector<unsigned int> recurrentToOutputWeightsDimensions = {1, 1, 3, 3};
2051  ConstTensor recurrentToOutputWeights(TensorInfo(
2052  4, recurrentToOutputWeightsDimensions.data(), DataType::QSymmS8), recurrentToOutputWeightsData);
2053 
2054  std::vector<int32_t> forgetGateBiasData = {1, 2, 3, 4, 5, 6, 7, 8, 9};
2055  std::vector<unsigned int> forgetGateBiasDimensions = {1, 1, 3, 3};
2056  ConstTensor forgetGateBias(TensorInfo(
2057  4, forgetGateBiasDimensions.data(), DataType::Signed32), forgetGateBiasData);
2058 
2059  std::vector<int32_t> cellBiasData = {1, 2, 3, 4, 5, 6, 7, 8, 9};
2060  std::vector<unsigned int> cellBiasDimensions = {1, 1, 3, 3};
2061  ConstTensor cellBias(TensorInfo(
2062  4, cellBiasDimensions.data(), DataType::Signed32), cellBiasData);
2063 
2064  std::vector<int32_t> outputGateBiasData = {1, 2, 3, 4, 5, 6, 7, 8, 9};
2065  std::vector<unsigned int> outputGateBiasDimensions = {1, 1, 3, 3};
2066  ConstTensor outputGateBias(TensorInfo(
2067  4, outputGateBiasDimensions.data(), DataType::Signed32), outputGateBiasData);
2068 
2069  // CIFG disabled params
2070  std::vector<uint8_t> inputToInputWeightsData = {1, 2, 3, 4, 5, 6, 7, 8, 9};
2071  std::vector<unsigned int> inputToInputWeightsDimensions = {1, 1, 3, 3};
2072  ConstTensor inputToInputWeights(
2073  TensorInfo(4, inputToInputWeightsDimensions.data(), DataType::QSymmS8), inputToInputWeightsData);
2074 
2075  std::vector<uint8_t> recurrentToInputWeightsData = {1, 2, 3, 4, 5, 6, 7, 8, 9};
2076  std::vector<unsigned int> recurrentToInputWeightsDimensions = {1, 1, 3, 3};
2077  ConstTensor recurrentToInputWeights(TensorInfo(
2078  4, recurrentToInputWeightsDimensions.data(), DataType::QSymmS8), recurrentToInputWeightsData);
2079 
2080  std::vector<int32_t> inputGateBiasData = {1, 2, 3, 4, 5, 6, 7, 8, 9};
2081  std::vector<unsigned int> inputGateBiasDimensions = {1, 1, 3, 3};
2082  ConstTensor inputGateBias(
2083  TensorInfo(4, inputGateBiasDimensions.data(), DataType::Signed32), inputGateBiasData);
2084 
2085  // Layer Norm enabled, CIFG disabled params
2086  std::vector<int16_t> inputLayerNormWeightsData = {1, 2, 3, 4, 5, 6, 7, 8, 9};
2087  std::vector<unsigned int> inputLayerNormWeightsDimensions = {1, 1, 3, 3};
2088  ConstTensor inputLayerNormWeights(
2089  TensorInfo(4, inputLayerNormWeightsDimensions.data(), DataType::QSymmS16), inputLayerNormWeightsData);
2090 
2091  std::vector<int16_t> forgetLayerNormWeightsData = {1, 2, 3, 4, 5, 6, 7, 8, 9};
2092  std::vector<unsigned int> forgetLayerNormWeightsDimensions = {1, 1, 3, 3};
2093  ConstTensor forgetLayerNormWeights(
2094  TensorInfo(4, forgetLayerNormWeightsDimensions.data(), DataType::QSymmS16), forgetLayerNormWeightsData);
2095 
2096  std::vector<int16_t> cellLayerNormWeightsData = {1, 2, 3, 4, 5, 6, 7, 8, 9};
2097  std::vector<unsigned int> cellLayerNormWeightsDimensions = {1, 1, 3, 3};
2098  ConstTensor cellLayerNormWeights(
2099  TensorInfo(4, cellLayerNormWeightsDimensions.data(), DataType::QSymmS16), cellLayerNormWeightsData);
2100 
2101  std::vector<int16_t> outputLayerNormWeightsData = {1, 2, 3, 4, 5, 6, 7, 8, 9};
2102  std::vector<unsigned int> outputLayerNormWeightsDimensions = {1, 1, 3, 3};
2103  ConstTensor outputLayerNormWeights(
2104  TensorInfo(4, outputLayerNormWeightsDimensions.data(), DataType::QSymmS16), outputLayerNormWeightsData);
2105 
2106  LstmInputParams params;
2107 
2108  // Basic params
2109  params.m_InputToForgetWeights = &inputToForgetWeights;
2110  params.m_InputToCellWeights = &inputToCellWeights;
2111  params.m_InputToOutputWeights = &inputToOutputWeights;
2112  params.m_RecurrentToForgetWeights = &recurrentToForgetWeights;
2113  params.m_RecurrentToCellWeights = &recurrentToCellWeights;
2114  params.m_RecurrentToOutputWeights = &recurrentToOutputWeights;
2115  params.m_ForgetGateBias = &forgetGateBias;
2116  params.m_CellBias = &cellBias;
2117  params.m_OutputGateBias = &outputGateBias;
2118 
2119  // CIFG disabled params
2120  params.m_InputToInputWeights = &inputToInputWeights;
2121  params.m_RecurrentToInputWeights = &recurrentToInputWeights;
2122  params.m_InputGateBias = &inputGateBias;
2123 
2124  // Layer Norm enabled, CIFG disabled params
2125  params.m_InputLayerNormWeights = &inputLayerNormWeights;
2126  params.m_ForgetLayerNormWeights = &forgetLayerNormWeights;
2127  params.m_CellLayerNormWeights = &cellLayerNormWeights;
2128  params.m_OutputLayerNormWeights = &outputLayerNormWeights;
2129 
2130  TestQLstmLayerVisitor visitor(descriptor, params);
2131 
2132  NetworkImpl net;
2133 
2134  IConnectableLayer* const layer = net.AddQLstmLayer(descriptor, params);
2135  layer->Accept(visitor);
2136 }
2137 
2138 
2139 TEST_CASE("CheckQuantizedLstmLayer")
2140 {
2141  std::vector<uint8_t> inputToInputWeightsData = {1, 2, 3, 4, 5, 6, 7, 8, 9};
2142  std::vector<unsigned int> inputToInputWeightsDimensions = {1, 1, 3, 3};
2143  ConstTensor inputToInputWeights(
2144  TensorInfo(4, inputToInputWeightsDimensions.data(), DataType::QSymmS8), inputToInputWeightsData);
2145 
2146  std::vector<uint8_t> inputToForgetWeightsData = {1, 2, 3, 4, 5, 6, 7, 8, 9};
2147  std::vector<unsigned int> inputToForgetWeightsDimensions = {1, 1, 3, 3};
2148  ConstTensor inputToForgetWeights(
2149  TensorInfo(4, inputToForgetWeightsDimensions.data(), DataType::QSymmS8), inputToForgetWeightsData);
2150 
2151  std::vector<uint8_t> inputToCellWeightsData = {1, 2, 3, 4, 5, 6, 7, 8, 9};
2152  std::vector<unsigned int> inputToCellWeightsDimensions = {1, 1, 3, 3};
2153  ConstTensor inputToCellWeights(
2154  TensorInfo(4, inputToCellWeightsDimensions.data(), DataType::QSymmS8), inputToCellWeightsData);
2155 
2156  std::vector<uint8_t> inputToOutputWeightsData = {1, 2, 3, 4, 5, 6, 7, 8, 9};
2157  std::vector<unsigned int> inputToOutputWeightsDimensions = {1, 1, 3, 3};
2158  ConstTensor inputToOutputWeights(
2159  TensorInfo(4, inputToOutputWeightsDimensions.data(), DataType::QSymmS8), inputToOutputWeightsData);
2160 
2161 
2162  std::vector<uint8_t> recurrentToInputWeightsData = {1, 2, 3, 4, 5, 6, 7, 8, 9};
2163  std::vector<unsigned int> recurrentToInputWeightsDimensions = {1, 1, 3, 3};
2164  ConstTensor recurrentToInputWeights(TensorInfo(
2165  4, recurrentToInputWeightsDimensions.data(), DataType::QSymmS8), recurrentToInputWeightsData);
2166 
2167  std::vector<uint8_t> recurrentToForgetWeightsData = {1, 2, 3, 4, 5, 6, 7, 8, 9};
2168  std::vector<unsigned int> recurrentToForgetWeightsDimensions = {1, 1, 3, 3};
2169  ConstTensor recurrentToForgetWeights(TensorInfo(
2170  4, recurrentToForgetWeightsDimensions.data(), DataType::QSymmS8), recurrentToForgetWeightsData);
2171 
2172  std::vector<uint8_t> recurrentToCellWeightsData = {1, 2, 3, 4, 5, 6, 7, 8, 9};
2173  std::vector<unsigned int> recurrentToCellWeightsDimensions = {1, 1, 3, 3};
2174  ConstTensor recurrentToCellWeights(TensorInfo(
2175  4, recurrentToCellWeightsDimensions.data(), DataType::QSymmS8), recurrentToCellWeightsData);
2176 
2177  std::vector<uint8_t> recurrentToOutputWeightsData = {1, 2, 3, 4, 5, 6, 7, 8, 9};
2178  std::vector<unsigned int> recurrentToOutputWeightsDimensions = {1, 1, 3, 3};
2179  ConstTensor recurrentToOutputWeights(TensorInfo(
2180  4, recurrentToOutputWeightsDimensions.data(), DataType::QSymmS8), recurrentToOutputWeightsData);
2181 
2182 
2183  std::vector<int32_t> inputGateBiasData = {1, 2, 3, 4, 5, 6, 7, 8, 9};
2184  std::vector<unsigned int> inputGateBiasDimensions = {1, 1, 3, 3};
2185  ConstTensor inputGateBias(
2186  TensorInfo(4, inputGateBiasDimensions.data(), DataType::Signed32), inputGateBiasData);
2187 
2188  std::vector<int32_t> forgetGateBiasData = {1, 2, 3, 4, 5, 6, 7, 8, 9};
2189  std::vector<unsigned int> forgetGateBiasDimensions = {1, 1, 3, 3};
2190  ConstTensor forgetGateBias(TensorInfo(
2191  4, forgetGateBiasDimensions.data(), DataType::Signed32), forgetGateBiasData);
2192 
2193  std::vector<int32_t> cellBiasData = {1, 2, 3, 4, 5, 6, 7, 8, 9};
2194  std::vector<unsigned int> cellBiasDimensions = {1, 1, 3, 3};
2195  ConstTensor cellBias(TensorInfo(
2196  4, cellBiasDimensions.data(), DataType::Signed32), cellBiasData);
2197 
2198  std::vector<int32_t> outputGateBiasData = {1, 2, 3, 4, 5, 6, 7, 8, 9};
2199  std::vector<unsigned int> outputGateBiasDimensions = {1, 1, 3, 3};
2200  ConstTensor outputGateBias(TensorInfo(
2201  4, outputGateBiasDimensions.data(), DataType::Signed32), outputGateBiasData);
2202 
2203  QuantizedLstmInputParams params;
2204 
2205  params.m_InputToInputWeights = &inputToInputWeights;
2206  params.m_InputToForgetWeights = &inputToForgetWeights;
2207  params.m_InputToCellWeights = &inputToCellWeights;
2208  params.m_InputToOutputWeights = &inputToOutputWeights;
2209 
2210  params.m_RecurrentToInputWeights = &recurrentToInputWeights;
2211  params.m_RecurrentToForgetWeights = &recurrentToForgetWeights;
2212  params.m_RecurrentToCellWeights = &recurrentToCellWeights;
2213  params.m_RecurrentToOutputWeights = &recurrentToOutputWeights;
2214 
2215  params.m_InputGateBias = &inputGateBias;
2216  params.m_ForgetGateBias = &forgetGateBias;
2217  params.m_CellBias = &cellBias;
2218  params.m_OutputGateBias = &outputGateBias;
2219 
2220  TestQuantizedLstmLayerVisitor visitor(params);
2221 
2222  NetworkImpl net;
2223 
2224  IConnectableLayer* const layer = net.AddQuantizedLstmLayer(params);
2225  layer->Accept(visitor);
2226 }
2227 
2228 TEST_CASE("CheckNamedQuantizedLstmLayer")
2229 {
2230  const char* layerName = "LstmLayer";
2231  std::vector<uint8_t> inputToInputWeightsData = {1, 2, 3, 4, 5, 6, 7, 8, 9};
2232  std::vector<unsigned int> inputToInputWeightsDimensions = {1, 1, 3, 3};
2233  ConstTensor inputToInputWeights(
2234  TensorInfo(4, inputToInputWeightsDimensions.data(), DataType::QAsymmU8), inputToInputWeightsData);
2235 
2236  std::vector<uint8_t> inputToForgetWeightsData = {1, 2, 3, 4, 5, 6, 7, 8, 9};
2237  std::vector<unsigned int> inputToForgetWeightsDimensions = {1, 1, 3, 3};
2238  ConstTensor inputToForgetWeights(
2239  TensorInfo(4, inputToForgetWeightsDimensions.data(), DataType::QAsymmU8), inputToForgetWeightsData);
2240 
2241  std::vector<uint8_t> inputToCellWeightsData = {1, 2, 3, 4, 5, 6, 7, 8, 9};
2242  std::vector<unsigned int> inputToCellWeightsDimensions = {1, 1, 3, 3};
2243  ConstTensor inputToCellWeights(
2244  TensorInfo(4, inputToCellWeightsDimensions.data(), DataType::QAsymmU8), inputToCellWeightsData);
2245 
2246  std::vector<uint8_t> inputToOutputWeightsData = {1, 2, 3, 4, 5, 6, 7, 8, 9};
2247  std::vector<unsigned int> inputToOutputWeightsDimensions = {1, 1, 3, 3};
2248  ConstTensor inputToOutputWeights(
2249  TensorInfo(4, inputToOutputWeightsDimensions.data(), DataType::QAsymmU8), inputToOutputWeightsData);
2250 
2251 
2252  std::vector<uint8_t> recurrentToInputWeightsData = {1, 2, 3, 4, 5, 6, 7, 8, 9};
2253  std::vector<unsigned int> recurrentToInputWeightsDimensions = {1, 1, 3, 3};
2254  ConstTensor recurrentToInputWeights(TensorInfo(
2255  4, recurrentToInputWeightsDimensions.data(), DataType::QAsymmU8), recurrentToInputWeightsData);
2256 
2257  std::vector<uint8_t> recurrentToForgetWeightsData = {1, 2, 3, 4, 5, 6, 7, 8, 9};
2258  std::vector<unsigned int> recurrentToForgetWeightsDimensions = {1, 1, 3, 3};
2259  ConstTensor recurrentToForgetWeights(TensorInfo(
2260  4, recurrentToForgetWeightsDimensions.data(), DataType::QAsymmU8), recurrentToForgetWeightsData);
2261 
2262  std::vector<uint8_t> recurrentToCellWeightsData = {1, 2, 3, 4, 5, 6, 7, 8, 9};
2263  std::vector<unsigned int> recurrentToCellWeightsDimensions = {1, 1, 3, 3};
2264  ConstTensor recurrentToCellWeights(TensorInfo(
2265  4, recurrentToCellWeightsDimensions.data(), DataType::QAsymmU8), recurrentToCellWeightsData);
2266 
2267  std::vector<uint8_t> recurrentToOutputWeightsData = {1, 2, 3, 4, 5, 6, 7, 8, 9};
2268  std::vector<unsigned int> recurrentToOutputWeightsDimensions = {1, 1, 3, 3};
2269  ConstTensor recurrentToOutputWeights(TensorInfo(
2270  4, recurrentToOutputWeightsDimensions.data(), DataType::QAsymmU8), recurrentToOutputWeightsData);
2271 
2272 
2273  std::vector<int32_t> inputGateBiasData = {1, 2, 3, 4, 5, 6, 7, 8, 9};
2274  std::vector<unsigned int> inputGateBiasDimensions = {1, 1, 3, 3};
2275  ConstTensor inputGateBias(
2276  TensorInfo(4, inputGateBiasDimensions.data(), DataType::Signed32), inputGateBiasData);
2277 
2278  std::vector<int32_t> forgetGateBiasData = {1, 2, 3, 4, 5, 6, 7, 8, 9};
2279  std::vector<unsigned int> forgetGateBiasDimensions = {1, 1, 3, 3};
2280  ConstTensor forgetGateBias(TensorInfo(
2281  4, forgetGateBiasDimensions.data(), DataType::Signed32), forgetGateBiasData);
2282 
2283  std::vector<int32_t> cellBiasData = {1, 2, 3, 4, 5, 6, 7, 8, 9};
2284  std::vector<unsigned int> cellBiasDimensions = {1, 1, 3, 3};
2285  ConstTensor cellBias(TensorInfo(
2286  4, cellBiasDimensions.data(), DataType::Signed32), cellBiasData);
2287 
2288  std::vector<int32_t> outputGateBiasData = {1, 2, 3, 4, 5, 6, 7, 8, 9};
2289  std::vector<unsigned int> outputGateBiasDimensions = {1, 1, 3, 3};
2290  ConstTensor outputGateBias(TensorInfo(
2291  4, outputGateBiasDimensions.data(), DataType::Signed32), outputGateBiasData);
2292 
2293  QuantizedLstmInputParams params;
2294 
2295  params.m_InputToInputWeights = &inputToInputWeights;
2296  params.m_InputToForgetWeights = &inputToForgetWeights;
2297  params.m_InputToCellWeights = &inputToCellWeights;
2298  params.m_InputToOutputWeights = &inputToOutputWeights;
2299 
2300  params.m_RecurrentToInputWeights = &recurrentToInputWeights;
2301  params.m_RecurrentToForgetWeights = &recurrentToForgetWeights;
2302  params.m_RecurrentToCellWeights = &recurrentToCellWeights;
2303  params.m_RecurrentToOutputWeights = &recurrentToOutputWeights;
2304 
2305  params.m_InputGateBias = &inputGateBias;
2306  params.m_ForgetGateBias = &forgetGateBias;
2307  params.m_CellBias = &cellBias;
2308  params.m_OutputGateBias = &outputGateBias;
2309 
2310  TestQuantizedLstmLayerVisitor visitor(params, layerName);
2311 
2312  NetworkImpl net;
2313 
2314  IConnectableLayer* const layer = net.AddQuantizedLstmLayer(params, layerName);
2315  layer->Accept(visitor);
2316 }
2317 
2318 }
2319 
2320 } // namespace armnn
TEST_SUITE("TestConstTensorLayerVisitor")
void CheckDescriptor(const BatchNormalizationDescriptor &descriptor)
void CheckDescriptor(const QLstmDescriptor &descriptor)
uint32_t m_PadBottom
Padding bottom value in the height dimension.
bool m_BiasEnabled
Enable/disable bias.
void CheckConstTensorPtrs(const std::string &name, const ConstTensor *expected, const ConstTensor *actual)
bool m_ProjectionEnabled
Enable/disable the projection layer.
DataLayout m_DataLayout
The data layout to be used (NCHW, NHWC).
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:61
const ConstTensor * m_CellBias
Definition: LstmParams.hpp:53
bool m_BiasEnabled
Enable/disable bias.
const ConstTensor * m_RecurrentToOutputWeights
uint32_t m_PadBottom
Padding bottom value in the height dimension.
float m_ClippingThresProj
Clipping threshold value for the projection.
const ConstTensor * m_CellToOutputWeights
Definition: LstmParams.hpp:50
const ConstTensor * m_RecurrentToForgetWeights
DataLayout m_DataLayout
The data layout to be used (NCHW, NHWC).
bool m_TransposeWeightMatrix
Enable/disable transpose weight matrix.
void CheckDescriptor(const FullyConnectedDescriptor &descriptor)
bool m_PeepholeEnabled
Enable/disable peephole.
A Convolution2dDescriptor for the Convolution2dLayer.
uint32_t m_PadLeft
Padding left value in the width dimension.
IConnectableLayer * AddQuantizedLstmLayer(const QuantizedLstmInputParams &params, const char *name=nullptr)
Definition: Network.cpp:2496
const ConstTensor * m_CellToInputWeights
Definition: LstmParams.hpp:48
IConnectableLayer * AddConstantLayer(const ConstTensor &input, const char *name=nullptr)
Definition: Network.cpp:2204
float m_Eps
Value to add to the variance. Used to avoid dividing by zero.
const ConstTensor * m_InputGateBias
Definition: LstmParams.hpp:51
DataLayout m_DataLayout
The data layout to be used (NCHW, NHWC).
const ConstTensor * m_RecurrentToCellWeights
Definition: LstmParams.hpp:46
uint32_t m_PadRight
Padding right value in the width dimension.
const ConstTensor * m_ForgetLayerNormWeights
Definition: LstmParams.hpp:58
const ConstTensor * m_CellToForgetWeights
Definition: LstmParams.hpp:49
Copyright (c) 2021 ARM Limited and Contributors.
IConnectableLayer * AddDepthwiseConvolution2dLayer(const DepthwiseConvolution2dDescriptor &convolution2dDescriptor, const ConstTensor &weights, const Optional< ConstTensor > &biases, const char *name=nullptr)
Definition: Network.cpp:2012
Private implementation of INetwork.
Definition: Network.hpp:31
const ConstTensor * m_OutputGateBias
Definition: LstmParams.hpp:54
void CheckConstTensors(const ConstTensor &expected, const ConstTensor &actual)
uint32_t m_PadTop
Padding top value in the height dimension.
uint32_t m_StrideX
Stride value when proceeding through input for the width dimension.
IConnectableLayer * AddQLstmLayer(const QLstmDescriptor &descriptor, const LstmInputParams &params, const char *name=nullptr)
Definition: Network.cpp:2534
const ConstTensor * m_InputLayerNormWeights
Definition: LstmParams.hpp:57
uint32_t m_StrideX
Stride value when proceeding through input for the width dimension.
void CheckInputParameters(const LstmInputParams &inputParams)
bool m_LayerNormEnabled
Enable/disable layer normalization.
const ConstTensor * m_RecurrentToOutputWeights
Definition: LstmParams.hpp:47
An LstmDescriptor for the LstmLayer.
uint32_t m_PadTop
Padding top value in the height dimension.
void CheckDescriptor(const LstmDescriptor &descriptor)
const ConstTensor * m_ProjectionBias
Definition: LstmParams.hpp:56
const ConstTensor * m_InputToForgetWeights
float m_ProjectionClip
Clipping threshold value for the projection.
A FullyConnectedDescriptor for the FullyConnectedLayer.
bool m_BiasEnabled
Enable/disable bias.
A tensor defined by a TensorInfo (shape and data type) and an immutable backing store.
Definition: Tensor.hpp:327
bool m_PeepholeEnabled
Enable/disable peephole.
void CheckDescriptor(const Convolution2dDescriptor &convolution2dDescriptor)
A QLstmDescriptor for the QLstmLayer.
void CheckInputParameters(const LstmInputParams &inputParams)
void CheckInputParameters(const QuantizedLstmInputParams &inputParams)
uint32_t m_ActivationFunc
The activation function to use.
uint32_t m_StrideY
Stride value when proceeding through input for the height dimension.
void CheckDescriptor(const DepthwiseConvolution2dDescriptor &convolution2dDescriptor)
const ConstTensor * m_RecurrentToInputWeights
float m_ClippingThresCell
Clipping threshold value for the cell state.
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
float m_CellClip
Clipping threshold value for the cell state.
bool m_CifgEnabled
Enable/disable cifg (coupled input & forget gate).
EmptyOptional is used to initialize the Optional class in case we want to have default value for an O...
Definition: Optional.hpp:32
const ConstTensor * m_RecurrentToForgetWeights
Definition: LstmParams.hpp:45
uint32_t m_StrideY
Stride value when proceeding through input for the height dimension.
IConnectableLayer * AddFullyConnectedLayer(const FullyConnectedDescriptor &fullyConnectedDescriptor, const char *name=nullptr)
Definition: Network.cpp:1839
virtual void Accept(ILayerVisitor &visitor) const =0
Apply a visitor to this layer.
bool m_ProjectionEnabled
Enable/disable the projection layer.
const ConstTensor * m_RecurrentToCellWeights
virtual const IInputSlot & GetInputSlot(unsigned int index) const =0
Get a const input slot handle by slot index.
const ConstTensor * m_RecurrentToInputWeights
Definition: LstmParams.hpp:44
const ConstTensor * m_InputToOutputWeights
void CheckConstTensorPtrs(const std::string &name, const ConstTensor *expected, const ConstTensor *actual)
virtual const IOutputSlot & GetOutputSlot(unsigned int index) const =0
Get the const output slot handle by slot index.
IConnectableLayer * AddBatchNormalizationLayer(const BatchNormalizationDescriptor &desc, const ConstTensor &mean, const ConstTensor &variance, const ConstTensor &beta, const ConstTensor &gamma, const char *name=nullptr)
Definition: Network.cpp:2134
virtual int Connect(IInputSlot &destination)=0
const ConstTensor * m_OutputLayerNormWeights
Definition: LstmParams.hpp:60
void CheckConstTensorPtrs(const std::string &name, const ConstTensor *expected, const ConstTensor *actual)
IConnectableLayer * AddConvolution2dLayer(const Convolution2dDescriptor &convolution2dDescriptor, const ConstTensor &weights, const Optional< ConstTensor > &biases, const char *name=nullptr)
Definition: Network.cpp:1958
IConnectableLayer * AddLstmLayer(const LstmDescriptor &descriptor, const LstmInputParams &params, const char *name=nullptr)
Definition: Network.cpp:2236
bool m_CifgEnabled
Enable/disable CIFG (coupled input & forget gate).
A DepthwiseConvolution2dDescriptor for the DepthwiseConvolution2dLayer.
A BatchNormalizationDescriptor for the BatchNormalizationLayer.
uint32_t m_PadLeft
Padding left value in the width dimension.
const ConstTensor * m_InputToForgetWeights
Definition: LstmParams.hpp:41
uint32_t m_PadRight
Padding right value in the width dimension.
bool m_ConstantWeights
Enable/disable constant weights and biases.
const ConstTensor * m_InputToInputWeights
Definition: LstmParams.hpp:40