ArmNN
 23.05
BaseIterator.hpp
Go to the documentation of this file.
1 //
2 // Copyright © 2017 Arm Ltd. All rights reserved.
3 // SPDX-License-Identifier: MIT
4 //
5 
6 #pragma once
7 
8 #include <armnn/TypesUtils.hpp>
14 
15 #include <ResolveType.hpp>
16 
17 namespace armnn
18 {
19 
21 {
22 public:
24 
25  virtual ~BaseIterator() {}
26 
27  virtual BaseIterator& operator++() = 0;
28 
29  virtual BaseIterator& operator+=(const unsigned int increment) = 0;
30 
31  virtual BaseIterator& operator-=(const unsigned int increment) = 0;
32 
33  virtual BaseIterator& operator[](const unsigned int index) = 0;
34 };
35 
36 template<typename IType>
37 class Decoder : public BaseIterator
38 {
39 public:
40  Decoder() {}
41 
42  virtual ~Decoder() {}
43 
44  virtual void Reset(void*) = 0;
45 
46  virtual IType Get() const = 0;
47 
48  virtual std::vector<float>
49  DecodeTensor(const TensorShape &tensorShape,
50  bool isDepthwise = false) = 0;
51 };
52 
53 template<typename IType>
54 class Encoder : public BaseIterator
55 {
56 public:
57  Encoder() {}
58 
59  virtual ~Encoder() {}
60 
61  virtual void Reset(void*) = 0;
62 
63  virtual void Set(IType right) = 0;
64 
65  virtual IType Get() const = 0;
66 };
67 
68 template<typename T, typename Base>
69 class TypedIterator : public Base
70 {
71 public:
72  TypedIterator(T* data = nullptr)
73  : m_Iterator(data), m_Start(data)
74  {}
75 
76  void Reset(void* data) override
77  {
78  m_Iterator = reinterpret_cast<T*>(data);
80  }
81 
83  {
85  ++m_Iterator;
86  return *this;
87  }
88 
89  TypedIterator& operator+=(const unsigned int increment) override
90  {
92  m_Iterator += increment;
93  return *this;
94  }
95 
96  TypedIterator& operator-=(const unsigned int increment) override
97  {
99  m_Iterator -= increment;
100  return *this;
101  }
102 
103  TypedIterator& operator[](const unsigned int index) override
104  {
106  m_Iterator = m_Start + index;
107  return *this;
108  }
109 
110 protected:
113 };
114 
115 class QASymm8Decoder : public TypedIterator<const uint8_t, Decoder<float>>
116 {
117 public:
118  QASymm8Decoder(const uint8_t* data, const float scale, const int32_t offset)
119  : TypedIterator(data), m_Scale(scale), m_Offset(offset) {}
120 
121  QASymm8Decoder(const float scale, const int32_t offset)
122  : QASymm8Decoder(nullptr, scale, offset) {}
123 
124  float Get() const override
125  {
126  return armnn::Dequantize(*m_Iterator, m_Scale, m_Offset);
127  }
128  std::vector<float> DecodeTensor (const TensorShape& tensorShape,
129  const bool isDepthwise) override
130  {
131  IgnoreUnused(isDepthwise);
132 
133  const unsigned int size = tensorShape.GetNumElements();
134  std::vector<float> decodedTensor;
135  decodedTensor.reserve(size);
136 
137  for (uint32_t i = 0; i < size; ++i)
138  {
139  this->operator[](i);
140  decodedTensor.emplace_back(armnn::Dequantize(*m_Iterator, m_Scale, m_Offset));
141  }
142 
143  return decodedTensor;
144  }
145 
146 private:
147 
148  const float m_Scale;
149  const int32_t m_Offset;
150 };
151 
152 class QASymmS8Decoder : public TypedIterator<const int8_t, Decoder<float>>
153 {
154 public:
155  QASymmS8Decoder(const int8_t* data, const float scale, const int32_t offset)
156  : TypedIterator(data), m_Scale(scale), m_Offset(offset) {}
157 
158  QASymmS8Decoder(const float scale, const int32_t offset)
159  : QASymmS8Decoder(nullptr, scale, offset) {}
160 
161  float Get() const override
162  {
163  return armnn::Dequantize(*m_Iterator, m_Scale, m_Offset);
164  }
165  std::vector<float> DecodeTensor (const TensorShape& tensorShape,
166  const bool isDepthwise) override
167  {
168  IgnoreUnused(isDepthwise);
169 
170  const unsigned int size = tensorShape.GetNumElements();
171  std::vector<float> decodedTensor;
172  decodedTensor.reserve(size);
173 
174  for (uint32_t i = 0; i < size; ++i)
175  {
176  this->operator[](i);
177  decodedTensor.emplace_back(armnn::Dequantize(*m_Iterator, m_Scale, m_Offset));
178  }
179 
180  return decodedTensor;
181  }
182 
183 private:
184  const float m_Scale;
185  const int32_t m_Offset;
186 
187 };
188 
189 class QSymmS8Decoder : public TypedIterator<const int8_t, Decoder<float>>
190 {
191 public:
192  QSymmS8Decoder(const int8_t* data, const float scale, const int32_t offset)
193  : TypedIterator(data), m_Scale(scale), m_Offset(offset) {}
194 
195  QSymmS8Decoder(const float scale, const int32_t offset)
196  : QSymmS8Decoder(nullptr, scale, offset) {}
197 
198  float Get() const override
199  {
200  return armnn::Dequantize(*m_Iterator, m_Scale, m_Offset);
201  }
202  std::vector<float> DecodeTensor (const TensorShape& tensorShape,
203  const bool isDepthwise) override
204  {
205  IgnoreUnused(isDepthwise);
206 
207  const unsigned int size = tensorShape.GetNumElements();
208  std::vector<float> decodedTensor;
209  decodedTensor.reserve(size);
210 
211  for (uint32_t i = 0; i < size; ++i)
212  {
213  this->operator[](i);
214  decodedTensor.emplace_back(armnn::Dequantize(*m_Iterator, m_Scale, m_Offset));
215  }
216 
217  return decodedTensor;
218  }
219 
220 private:
221  const float m_Scale;
222  const int32_t m_Offset;
223 
224 };
225 
226 class QSymm16Decoder : public TypedIterator<const int16_t, Decoder<float>>
227 {
228 public:
229  QSymm16Decoder(const int16_t* data, const float scale, const int32_t offset)
230  : TypedIterator(data), m_Scale(scale), m_Offset(offset) {}
231 
232  QSymm16Decoder(const float scale, const int32_t offset)
233  : QSymm16Decoder(nullptr, scale, offset) {}
234 
235  float Get() const override
236  {
237  return armnn::Dequantize(*m_Iterator, m_Scale, m_Offset);
238  }
239  std::vector<float> DecodeTensor (const TensorShape& tensorShape,
240  const bool isDepthwise) override
241  {
242  IgnoreUnused(isDepthwise);
243 
244  const unsigned int size = tensorShape.GetNumElements();
245  std::vector<float> decodedTensor;
246  decodedTensor.reserve(size);
247 
248  for (uint32_t i = 0; i < size; ++i)
249  {
250  this->operator[](i);
251  decodedTensor.emplace_back(armnn::Dequantize(*m_Iterator, m_Scale, m_Offset));
252  }
253 
254  return decodedTensor;
255  }
256 
257 private:
258  const float m_Scale;
259  const int32_t m_Offset;
260 
261 };
262 
263 class Float16Decoder : public TypedIterator<const Half, Decoder<float>>
264 {
265 public:
266  Float16Decoder(const Half* data)
267  : TypedIterator(data) {}
268 
270  : Float16Decoder(nullptr) {}
271 
272  float Get() const override
273  {
274  float val = 0.f;
276  return val;
277  }
278  std::vector<float> DecodeTensor (const TensorShape& tensorShape,
279  const bool isDepthwise) override
280  {
281  IgnoreUnused(isDepthwise);
282 
283  const unsigned int size = tensorShape.GetNumElements();
284  std::vector<float> decodedTensor;
285  decodedTensor.reserve(size);
286 
287  for (uint32_t i = 0; i < size; ++i)
288  {
289  float val = 0.f;
290  this->operator[](i);
292  decodedTensor.emplace_back(val);
293  }
294 
295  return decodedTensor;
296  }
297 
298 
299 };
300 
301 class Float32Decoder : public TypedIterator<const float, Decoder<float>>
302 {
303 public:
304  Float32Decoder(const float* data)
305  : TypedIterator(data) {}
306 
308  : Float32Decoder(nullptr) {}
309 
310  float Get() const override
311  {
312  return *m_Iterator;
313  }
314  std::vector<float> DecodeTensor (const TensorShape& tensorShape,
315  const bool isDepthwise) override
316  {
317  IgnoreUnused(isDepthwise);
318  const unsigned int size = tensorShape.GetNumElements();
319  std::vector<float> decodedTensor;
320 
321  decodedTensor.reserve(size);
322  decodedTensor.assign(m_Start, m_Start + size);
323 
324  return decodedTensor;
325  }
326 };
327 
328 class ScaledInt32Decoder : public TypedIterator<const int32_t, Decoder<float>>
329 {
330 public:
331  ScaledInt32Decoder(const int32_t* data, const float scale)
332  : TypedIterator(data), m_Scale(scale) {}
333 
334  ScaledInt32Decoder(const float scale)
335  : ScaledInt32Decoder(nullptr, scale) {}
336 
337  float Get() const override
338  {
339  return static_cast<float>(*m_Iterator) * m_Scale;
340  }
341  std::vector<float> DecodeTensor (const TensorShape& tensorShape,
342  const bool isDepthwise) override
343  {
344  IgnoreUnused(isDepthwise);
345 
346  const unsigned int size = tensorShape.GetNumElements();
347  std::vector<float> decodedTensor;
348  decodedTensor.reserve(size);
349 
350  for (uint32_t i = 0; i < size; ++i)
351  {
352  this->operator[](i);
353  decodedTensor.emplace_back(static_cast<float>(*m_Iterator) * m_Scale);
354  }
355 
356  return decodedTensor;
357  }
358 
359 private:
360  const float m_Scale;
361 
362 };
363 
364 class Int32Decoder : public TypedIterator<const int32_t, Decoder<float>>
365 {
366 public:
367  Int32Decoder(const int32_t* data)
368  : TypedIterator(data) {}
369 
371  : Int32Decoder(nullptr) {}
372 
373  float Get() const override
374  {
375  return static_cast<float>(*m_Iterator);
376  }
377  std::vector<float> DecodeTensor (const TensorShape& tensorShape,
378  const bool isDepthwise) override
379  {
380  IgnoreUnused(isDepthwise);
381 
382  const unsigned int size = tensorShape.GetNumElements();
383  std::vector<float> decodedTensor;
384  decodedTensor.reserve(size);
385 
386  for (uint32_t i = 0; i < size; ++i)
387  {
388  this->operator[](i);
389  decodedTensor.emplace_back(static_cast<float>(*m_Iterator));
390  }
391 
392  return decodedTensor;
393  }
394 };
395 
396 class Int32ToInt32tDecoder : public TypedIterator<const int32_t, Decoder<int32_t>>
397 {
398 public:
399  Int32ToInt32tDecoder(const int32_t* data)
400  : TypedIterator(data){}
401 
403  : Int32ToInt32tDecoder(nullptr) {}
404 
405  int32_t Get() const override
406  {
407  return *m_Iterator;
408  }
409  std::vector<float> DecodeTensor (const TensorShape& tensorShape,
410  const bool isDepthwise) override
411  {
412  IgnoreUnused(isDepthwise);
413 
414  const unsigned int size = tensorShape.GetNumElements();
415  std::vector<float> decodedTensor;
416  decodedTensor.reserve(size);
417 
418  for (uint32_t i = 0; i < size; ++i)
419  {
420  this->operator[](i);
421  decodedTensor.emplace_back(static_cast<float>(*m_Iterator));
422  }
423 
424  return decodedTensor;
425  }
426 };
427 
428 class BooleanDecoder : public TypedIterator<const uint8_t, Decoder<float>>
429 {
430 public:
431  BooleanDecoder(const uint8_t* data)
432  : TypedIterator(data) {}
433 
435  : BooleanDecoder(nullptr) {}
436 
437  float Get() const override
438  {
439  return *m_Iterator;
440  }
441  std::vector<float> DecodeTensor (const TensorShape& tensorShape,
442  const bool isDepthwise) override
443  {
444  IgnoreUnused(isDepthwise);
445 
446  const unsigned int size = tensorShape.GetNumElements();
447  std::vector<float> decodedTensor;
448  decodedTensor.reserve(size);
449 
450  for (uint32_t i = 0; i < size; ++i)
451  {
452  this->operator[](i);
453  decodedTensor.emplace_back(*m_Iterator);
454  }
455 
456  return decodedTensor;
457  }
458 };
459 
460 class BooleanDecoderBool : public TypedIterator<const uint8_t, Decoder<bool>>
461 {
462 public:
463  BooleanDecoderBool(const uint8_t* data)
464  : TypedIterator(data) {}
465 
467  : BooleanDecoderBool(nullptr) {}
468 
469  bool Get() const override
470  {
471  return *m_Iterator;
472  }
473 
474  std::vector<float> DecodeTensor(const TensorShape& tensorShape,
475  const bool isDepthwise) override
476  {
477  IgnoreUnused(isDepthwise);
478 
479  const unsigned int size = tensorShape.GetNumElements();
480  std::vector<float> decodedTensor;
481  decodedTensor.reserve(size);
482 
483  for (uint32_t i = 0; i < size; ++i)
484  {
485  this->operator[](i);
486  decodedTensor.emplace_back(*m_Iterator);
487  }
488 
489  return decodedTensor;
490  }
491 };
492 
493 class QASymm8Encoder : public TypedIterator<uint8_t, Encoder<float>>
494 {
495 public:
496  QASymm8Encoder(uint8_t* data, const float scale, const int32_t offset)
497  : TypedIterator(data), m_Scale(scale), m_Offset(offset) {}
498 
499  QASymm8Encoder(const float scale, const int32_t offset)
500  : QASymm8Encoder(nullptr, scale, offset) {}
501 
502  void Set(float right) override
503  {
504  *m_Iterator = armnn::Quantize<uint8_t>(right, m_Scale, m_Offset);
505  }
506 
507  float Get() const override
508  {
509  return armnn::Dequantize(*m_Iterator, m_Scale, m_Offset);
510  }
511 
512 private:
513  const float m_Scale;
514  const int32_t m_Offset;
515 };
516 
517 class QASymmS8Encoder : public TypedIterator<int8_t, Encoder<float>>
518 {
519 public:
520  QASymmS8Encoder(int8_t* data, const float scale, const int32_t offset)
521  : TypedIterator(data), m_Scale(scale), m_Offset(offset) {}
522 
523  QASymmS8Encoder(const float scale, const int32_t offset)
524  : QASymmS8Encoder(nullptr, scale, offset) {}
525 
526  void Set(float right) override
527  {
528  *m_Iterator = armnn::Quantize<int8_t>(right, m_Scale, m_Offset);
529  }
530 
531  float Get() const override
532  {
533  return armnn::Dequantize(*m_Iterator, m_Scale, m_Offset);
534  }
535 
536 private:
537  const float m_Scale;
538  const int32_t m_Offset;
539 };
540 
541 class QSymmS8Encoder : public TypedIterator<int8_t, Encoder<float>>
542 {
543 public:
544  QSymmS8Encoder(int8_t* data, const float scale, const int32_t offset)
545  : TypedIterator(data), m_Scale(scale), m_Offset(offset) {}
546 
547  QSymmS8Encoder(const float scale, const int32_t offset)
548  : QSymmS8Encoder(nullptr, scale, offset) {}
549 
550  void Set(float right) override
551  {
552  *m_Iterator = armnn::Quantize<int8_t>(right, m_Scale, m_Offset);
553  }
554 
555  float Get() const override
556  {
557  return armnn::Dequantize(*m_Iterator, m_Scale, m_Offset);
558  }
559 
560 private:
561  const float m_Scale;
562  const int32_t m_Offset;
563 };
564 
565 class QSymm16Encoder : public TypedIterator<int16_t, Encoder<float>>
566 {
567 public:
568  QSymm16Encoder(int16_t* data, const float scale, const int32_t offset)
569  : TypedIterator(data), m_Scale(scale), m_Offset(offset) {}
570 
571  QSymm16Encoder(const float scale, const int32_t offset)
572  : QSymm16Encoder(nullptr, scale, offset) {}
573 
574  void Set(float right) override
575  {
576  *m_Iterator = armnn::Quantize<int16_t>(right, m_Scale, m_Offset);
577  }
578 
579  float Get() const override
580  {
581  return armnn::Dequantize(*m_Iterator, m_Scale, m_Offset);
582  }
583 
584 private:
585  const float m_Scale;
586  const int32_t m_Offset;
587 };
588 
589 class Float16Encoder : public TypedIterator<Half, Encoder<float>>
590 {
591 public:
593  : TypedIterator(data) {}
594 
596  : Float16Encoder(nullptr) {}
597 
598  void Set(float right) override
599  {
601  }
602 
603  float Get() const override
604  {
605  float val = 0.f;
607  return val;
608  }
609 };
610 
611 class Float32Encoder : public TypedIterator<float, Encoder<float>>
612 {
613 public:
614  Float32Encoder(float* data)
615  : TypedIterator(data) {}
616 
618  : Float32Encoder(nullptr) {}
619 
620  void Set(float right) override
621  {
622  *m_Iterator = right;
623  }
624 
625  float Get() const override
626  {
627  return *m_Iterator;
628  }
629 };
630 
631 class Int32Encoder : public TypedIterator<int32_t, Encoder<float>>
632 {
633 public:
634  Int32Encoder(int32_t* data)
635  : TypedIterator(data) {}
636 
638  : Int32Encoder(nullptr) {}
639 
640  void Set(float right) override
641  {
642  *m_Iterator = static_cast<int32_t>(right);
643  }
644 
645  float Get() const override
646  {
647  return static_cast<float>(*m_Iterator);
648  }
649 };
650 
651 class Int32ToInt32tEncoder : public TypedIterator<int32_t, Encoder<int32_t>>
652 {
653 public:
654  Int32ToInt32tEncoder(int32_t* data)
655  : TypedIterator(data){}
656 
658  : Int32ToInt32tEncoder(nullptr) {}
659 
660  void Set(int32_t right) override
661  {
662  *m_Iterator = right;
663  }
664 
665  int32_t Get() const override
666  {
667  return *m_Iterator;
668  }
669 };
670 
671 class BooleanEncoder : public TypedIterator<uint8_t, Encoder<bool>>
672 {
673 public:
674  BooleanEncoder(uint8_t* data)
675  : TypedIterator(data) {}
676 
678  : BooleanEncoder(nullptr) {}
679 
680  void Set(bool right) override
681  {
682  *m_Iterator = right;
683  }
684 
685  bool Get() const override
686  {
687  return *m_Iterator;
688  }
689 };
690 
691 /// PerAxisIterator for per-axis quantization. Iterates over a tensor as layed out in memory and keeps track
692 /// of the axis index.
693 template<typename T, typename Base>
694 class PerAxisIterator : public Base
695 {
696 public:
697  PerAxisIterator(T* data = nullptr,
698  unsigned int axisFactor = 0,
699  unsigned int axisDimensionality=0)
700  : m_Iterator(data),
701  m_Start(data),
702  m_AxisIndex(0), // iterates over the dimension of axis
703  m_AxisDimensionality(axisDimensionality), // tensorShape[quantization_dim]
704  m_AxisFactor(axisFactor),
705  m_Index(0)
706  {}
707 
708  PerAxisIterator(T* data = nullptr,
709  const armnn::TensorShape& tensorShape = TensorShape(),
710  const unsigned int axis = 0)
711  : m_Iterator(data),
712  m_Start(data),
713  m_AxisIndex(0),
714  m_Index(0)
715  {
716  m_AxisDimensionality = tensorShape[axis];
717  m_AxisFactor = armnnUtils::GetNumElementsAfter(tensorShape, axis);
718  }
719 
720  void Reset(void* data) override
721  {
722  m_Iterator = reinterpret_cast<T*>(data);
724  m_AxisIndex = 0;
725  m_Index = 0;
726  }
727 
729  {
730  ++m_Index;
731  this -> operator[](m_Index);
732  return *this;
733  }
734 
735  PerAxisIterator& operator+=(const unsigned int increment) override
736  {
737  m_Index += increment;
738  this -> operator[](m_Index);
739  return *this;
740  }
741 
742  PerAxisIterator& operator-=(const unsigned int decrement) override
743  {
744  m_Index -= decrement;
745  this -> operator[](m_Index);
746  return *this;
747  }
748 
749 
750  inline PerAxisIterator& SetIndexOnMem(const unsigned int index)
751  {
753  m_Iterator = m_Start + index;
754  if (index < m_AxisFactor)
755  {
756  m_AxisIndex = 0;
757  }
758  else
759  {
761  }
762  m_Index = index;
763  return *this;
764  }
765 
766  PerAxisIterator& operator[](const unsigned int index) override
767  {
768  SetIndexOnMem(index);
769  return *this;
770  }
771 
772  protected:
775  unsigned int m_AxisIndex;
776  unsigned int m_AxisDimensionality; // tensorShape[quantization_dim]
777  unsigned int m_AxisFactor;
778  unsigned int m_Index;
779 };
780 
781 class QSymm8PerAxisDecoder : public PerAxisIterator<const int8_t, Decoder<float>>
782 {
783 public:
784  QSymm8PerAxisDecoder(const int8_t* data, const armnn::TensorInfo& tensorInfo)
785  : PerAxisIterator(data, tensorInfo.GetShape(), tensorInfo.GetQuantizationDim().value()),
786  m_Scales(tensorInfo.GetQuantizationScales())
787  {}
788 
789  float Get() const override
790  {
791  return armnn::Dequantize(*m_Iterator, GetScale(), 0);
792  }
793 
794  // Get scale of the current value
795  float GetScale() const
796  {
797  return m_Scales[m_AxisIndex];
798  }
799 
800  std::vector<float> DecodeTensor(const TensorShape &tensorShape,
801  bool isDepthwise) override
802  {
803  IgnoreUnused(isDepthwise);
804 
805  const unsigned int size = tensorShape.GetNumElements();
806  std::vector<float> decodedTensor;
807  decodedTensor.reserve(size);
808 
809  for (uint32_t i = 0; i < size; ++i)
810  {
811  SetIndexOnMem(i);
812  decodedTensor.emplace_back(armnn::Dequantize(*m_Iterator, GetScale(), 0));
813  }
814  return decodedTensor;
815  }
816 
817 private:
818  std::vector<float> m_Scales;
819 };
820 
821 class QSymm8PerAxisEncoder : public PerAxisIterator<int8_t, Encoder<float>>
822 {
823 public:
824  QSymm8PerAxisEncoder(int8_t* data, const std::vector<float>& scale, unsigned int axisFactor)
825  : PerAxisIterator(data, axisFactor), m_Scale(scale) {}
826 
827  void Set(float right)
828  {
829  *m_Iterator = armnn::Quantize<int8_t>(right, m_Scale[m_AxisIndex], 0);
830  }
831 
832  float Get() const
833  {
834  return armnn::Dequantize(*m_Iterator, m_Scale[m_AxisIndex], 0);
835  }
836 
837  // Get scale of the current value
838  float GetScale() const
839  {
840  return m_Scale[m_AxisIndex];
841  }
842 
843 private:
844  std::vector<float> m_Scale;
845 };
846 
847 class ScaledInt32PerAxisDecoder : public PerAxisIterator<const int32_t, Decoder<float>>
848 {
849 public:
850  ScaledInt32PerAxisDecoder(const int32_t* data, const armnn::TensorInfo tensorInfo)
851  : PerAxisIterator(data, tensorInfo.GetShape(), tensorInfo.GetQuantizationDim().value()),
852  m_Scales(tensorInfo.GetQuantizationScales())
853  {}
854 
855  float Get() const override
856  {
857  return armnn::Dequantize(*m_Iterator, m_Scales[m_AxisIndex], 0);
858  }
859 
860  // Get scale of the current value
861  float GetScale() const
862  {
863  return m_Scales[m_AxisIndex];
864  }
865 
866  std::vector<float> DecodeTensor(const TensorShape &tensorShape,
867  bool isDepthwise) override
868  {
869  const uint32_t size = tensorShape.GetNumElements();
870 
871  const uint32_t stepSize = isDepthwise ?
872  tensorShape[2] * tensorShape[3] : tensorShape.GetNumElements() / tensorShape[0];
873 
874  const uint32_t stepNum = size / stepSize;
875 
876  std::vector<float> decodedTensor;
877  decodedTensor.reserve(size);
878 
879  // channelMultiplier is only used in depthwise convolutions and in other cases will have no effect
880  // stepSize is the length of a contiguous area sharing a quantization scale within a tensor
881  // stepNum is the number of those steps/blocks in the tensor
882  for (uint32_t step = 0; step < stepNum; ++step)
883  {
884  //scale = (channelMultiplier * step + mult) % scaleSize;
885  for (uint32_t i = 0; i < stepSize; ++i)
886  {
887  unsigned int index = step * stepSize + i;
888  this->operator[](index);
889  decodedTensor.emplace_back(armnn::Dequantize(*m_Iterator, m_Scales[step], 0));
890  }
891  }
892  return decodedTensor;
893  }
894 
895 private:
896  std::vector<float> m_Scales;
897 };
898 
899 } // namespace armnn
armnn::QASymmS8Decoder::DecodeTensor
std::vector< float > DecodeTensor(const TensorShape &tensorShape, const bool isDepthwise) override
Definition: BaseIterator.hpp:165
armnn::BooleanDecoderBool::DecodeTensor
std::vector< float > DecodeTensor(const TensorShape &tensorShape, const bool isDepthwise) override
Definition: BaseIterator.hpp:474
armnn::Int32ToInt32tEncoder::Get
int32_t Get() const override
Definition: BaseIterator.hpp:665
armnn::Int32Encoder::Int32Encoder
Int32Encoder()
Definition: BaseIterator.hpp:637
armnn::Encoder::Encoder
Encoder()
Definition: BaseIterator.hpp:57
armnn::TypedIterator::Reset
void Reset(void *data) override
Definition: BaseIterator.hpp:76
armnn::Int32Decoder::Get
float Get() const override
Definition: BaseIterator.hpp:373
armnn::QSymm8PerAxisEncoder::QSymm8PerAxisEncoder
QSymm8PerAxisEncoder(int8_t *data, const std::vector< float > &scale, unsigned int axisFactor)
Definition: BaseIterator.hpp:824
armnn::Float32Encoder::Float32Encoder
Float32Encoder()
Definition: BaseIterator.hpp:617
armnn::BooleanEncoder::BooleanEncoder
BooleanEncoder(uint8_t *data)
Definition: BaseIterator.hpp:674
armnn::Encoder::Get
virtual IType Get() const =0
armnn::BooleanDecoder::BooleanDecoder
BooleanDecoder()
Definition: BaseIterator.hpp:434
armnn::BaseIterator::BaseIterator
BaseIterator()
Definition: BaseIterator.hpp:23
armnn::Int32ToInt32tEncoder
Definition: BaseIterator.hpp:651
armnn::BooleanDecoder::DecodeTensor
std::vector< float > DecodeTensor(const TensorShape &tensorShape, const bool isDepthwise) override
Definition: BaseIterator.hpp:441
armnn::BaseIterator::~BaseIterator
virtual ~BaseIterator()
Definition: BaseIterator.hpp:25
armnn::QSymm16Decoder::DecodeTensor
std::vector< float > DecodeTensor(const TensorShape &tensorShape, const bool isDepthwise) override
Definition: BaseIterator.hpp:239
armnn::QSymm16Encoder::Get
float Get() const override
Definition: BaseIterator.hpp:579
armnn::QASymmS8Decoder
Definition: BaseIterator.hpp:152
armnn::PerAxisIterator
PerAxisIterator for per-axis quantization.
Definition: BaseIterator.hpp:694
armnn::QSymm16Encoder::QSymm16Encoder
QSymm16Encoder(int16_t *data, const float scale, const int32_t offset)
Definition: BaseIterator.hpp:568
armnn::Int32Decoder::DecodeTensor
std::vector< float > DecodeTensor(const TensorShape &tensorShape, const bool isDepthwise) override
Definition: BaseIterator.hpp:377
armnn::PerAxisIterator::operator-=
PerAxisIterator & operator-=(const unsigned int decrement) override
Definition: BaseIterator.hpp:742
armnn::TypedIterator::operator++
TypedIterator & operator++() override
Definition: BaseIterator.hpp:82
armnn::TensorShape::GetNumElements
unsigned int GetNumElements() const
Function that calculates the tensor elements by multiplying all dimension size which are Specified.
Definition: Tensor.cpp:181
armnn::Float32Encoder::Get
float Get() const override
Definition: BaseIterator.hpp:625
armnn::Int32ToInt32tDecoder::Int32ToInt32tDecoder
Int32ToInt32tDecoder(const int32_t *data)
Definition: BaseIterator.hpp:399
armnn::Float32Encoder::Float32Encoder
Float32Encoder(float *data)
Definition: BaseIterator.hpp:614
armnn::Encoder
Definition: BaseIterator.hpp:54
armnn::BaseIterator
Definition: BaseIterator.hpp:20
armnn::QASymmS8Decoder::QASymmS8Decoder
QASymmS8Decoder(const float scale, const int32_t offset)
Definition: BaseIterator.hpp:158
TensorUtils.hpp
armnn::QSymmS8Encoder::Get
float Get() const override
Definition: BaseIterator.hpp:555
armnn::IgnoreUnused
void IgnoreUnused(Ts &&...)
Definition: IgnoreUnused.hpp:14
armnn::QASymm8Encoder::QASymm8Encoder
QASymm8Encoder(const float scale, const int32_t offset)
Definition: BaseIterator.hpp:499
armnn::QSymm8PerAxisEncoder::Set
void Set(float right)
Definition: BaseIterator.hpp:827
Assert.hpp
armnn::Int32ToInt32tDecoder::Int32ToInt32tDecoder
Int32ToInt32tDecoder()
Definition: BaseIterator.hpp:402
armnn::TypedIterator::m_Start
T * m_Start
Definition: BaseIterator.hpp:112
armnn::Encoder::Reset
virtual void Reset(void *)=0
armnn::TypedIterator
Definition: BaseIterator.hpp:69
armnn::QSymm8PerAxisDecoder::QSymm8PerAxisDecoder
QSymm8PerAxisDecoder(const int8_t *data, const armnn::TensorInfo &tensorInfo)
Definition: BaseIterator.hpp:784
armnn::QASymmS8Encoder::QASymmS8Encoder
QASymmS8Encoder(const float scale, const int32_t offset)
Definition: BaseIterator.hpp:523
armnn::PerAxisIterator::m_Iterator
T * m_Iterator
Definition: BaseIterator.hpp:773
armnn::Encoder::~Encoder
virtual ~Encoder()
Definition: BaseIterator.hpp:59
armnn::BaseIterator::operator+=
virtual BaseIterator & operator+=(const unsigned int increment)=0
armnn::Float32Decoder::Get
float Get() const override
Definition: BaseIterator.hpp:310
armnn::BooleanEncoder::BooleanEncoder
BooleanEncoder()
Definition: BaseIterator.hpp:677
armnn::TypedIterator::m_Iterator
T * m_Iterator
Definition: BaseIterator.hpp:111
armnn::QSymmS8Decoder::DecodeTensor
std::vector< float > DecodeTensor(const TensorShape &tensorShape, const bool isDepthwise) override
Definition: BaseIterator.hpp:202
armnn::QASymm8Encoder::Get
float Get() const override
Definition: BaseIterator.hpp:507
armnn::PerAxisIterator::m_AxisIndex
unsigned int m_AxisIndex
Definition: BaseIterator.hpp:775
armnn::ScaledInt32Decoder::Get
float Get() const override
Definition: BaseIterator.hpp:337
armnn::TypedIterator::operator[]
TypedIterator & operator[](const unsigned int index) override
Definition: BaseIterator.hpp:103
armnn
Copyright (c) 2021 ARM Limited and Contributors.
Definition: 01_00_quick_start.dox:6
armnnUtils::FloatingPointConverter::ConvertFloat32To16
static void ConvertFloat32To16(const float *srcFloat32Buffer, size_t numElements, void *dstFloat16Buffer)
Converts a buffer of FP32 values to FP16, and stores in the given dstFloat16Buffer.
Definition: FloatingPointConverter.cpp:16
armnn::QASymmS8Encoder::Set
void Set(float right) override
Definition: BaseIterator.hpp:526
armnn::ScaledInt32PerAxisDecoder::DecodeTensor
std::vector< float > DecodeTensor(const TensorShape &tensorShape, bool isDepthwise) override
Definition: BaseIterator.hpp:866
armnn::Float32Decoder::Float32Decoder
Float32Decoder(const float *data)
Definition: BaseIterator.hpp:304
armnn::Float16Encoder::Get
float Get() const override
Definition: BaseIterator.hpp:603
armnn::PerAxisIterator::m_Index
unsigned int m_Index
Definition: BaseIterator.hpp:778
armnn::BooleanDecoderBool
Definition: BaseIterator.hpp:460
armnn::QSymmS8Encoder::Set
void Set(float right) override
Definition: BaseIterator.hpp:550
armnnUtils::GetNumElementsAfter
unsigned int GetNumElementsAfter(const armnn::TensorShape &shape, unsigned int axis)
Definition: TensorUtils.cpp:234
armnn::Int32ToInt32tEncoder::Set
void Set(int32_t right) override
Definition: BaseIterator.hpp:660
armnn::QASymmS8Decoder::Get
float Get() const override
Definition: BaseIterator.hpp:161
armnn::Int32ToInt32tDecoder::Get
int32_t Get() const override
Definition: BaseIterator.hpp:405
armnn::BooleanEncoder::Get
bool Get() const override
Definition: BaseIterator.hpp:685
armnn::Float16Decoder::Float16Decoder
Float16Decoder(const Half *data)
Definition: BaseIterator.hpp:266
armnn::TensorShape
Definition: Tensor.hpp:20
armnn::Half
half_float::half Half
Definition: Half.hpp:22
armnn::QSymm16Encoder::QSymm16Encoder
QSymm16Encoder(const float scale, const int32_t offset)
Definition: BaseIterator.hpp:571
armnn::BooleanEncoder
Definition: BaseIterator.hpp:671
armnn::BaseIterator::operator++
virtual BaseIterator & operator++()=0
armnn::Float32Encoder
Definition: BaseIterator.hpp:611
armnn::QASymm8Encoder::QASymm8Encoder
QASymm8Encoder(uint8_t *data, const float scale, const int32_t offset)
Definition: BaseIterator.hpp:496
armnn::QASymmS8Encoder
Definition: BaseIterator.hpp:517
armnn::QASymmS8Encoder::QASymmS8Encoder
QASymmS8Encoder(int8_t *data, const float scale, const int32_t offset)
Definition: BaseIterator.hpp:520
armnn::QSymm8PerAxisDecoder::DecodeTensor
std::vector< float > DecodeTensor(const TensorShape &tensorShape, bool isDepthwise) override
Definition: BaseIterator.hpp:800
armnn::TypedIterator::TypedIterator
TypedIterator(T *data=nullptr)
Definition: BaseIterator.hpp:72
armnn::Float16Decoder
Definition: BaseIterator.hpp:263
armnn::Int32ToInt32tEncoder::Int32ToInt32tEncoder
Int32ToInt32tEncoder()
Definition: BaseIterator.hpp:657
armnn::QSymm8PerAxisDecoder::GetScale
float GetScale() const
Definition: BaseIterator.hpp:795
armnn::Decoder::Reset
virtual void Reset(void *)=0
armnn::Float16Decoder::Get
float Get() const override
Definition: BaseIterator.hpp:272
armnn::TypedIterator::operator+=
TypedIterator & operator+=(const unsigned int increment) override
Definition: BaseIterator.hpp:89
armnn::ScaledInt32Decoder::ScaledInt32Decoder
ScaledInt32Decoder(const float scale)
Definition: BaseIterator.hpp:334
armnn::Decoder
Definition: BaseIterator.hpp:37
armnn::TensorInfo
Definition: Tensor.hpp:152
armnn::ScaledInt32PerAxisDecoder::GetScale
float GetScale() const
Definition: BaseIterator.hpp:861
armnn::PerAxisIterator::operator+=
PerAxisIterator & operator+=(const unsigned int increment) override
Definition: BaseIterator.hpp:735
armnn::Int32Encoder::Int32Encoder
Int32Encoder(int32_t *data)
Definition: BaseIterator.hpp:634
armnn::QSymm8PerAxisDecoder
Definition: BaseIterator.hpp:781
armnn::BooleanDecoder::BooleanDecoder
BooleanDecoder(const uint8_t *data)
Definition: BaseIterator.hpp:431
armnn::PerAxisIterator::operator++
PerAxisIterator & operator++() override
Definition: BaseIterator.hpp:728
armnn::Decoder::Decoder
Decoder()
Definition: BaseIterator.hpp:40
armnn::Float16Encoder::Set
void Set(float right) override
Definition: BaseIterator.hpp:598
armnn::QSymm16Encoder::Set
void Set(float right) override
Definition: BaseIterator.hpp:574
armnn::QASymmS8Decoder::QASymmS8Decoder
QASymmS8Decoder(const int8_t *data, const float scale, const int32_t offset)
Definition: BaseIterator.hpp:155
armnn::QSymmS8Decoder::QSymmS8Decoder
QSymmS8Decoder(const int8_t *data, const float scale, const int32_t offset)
Definition: BaseIterator.hpp:192
armnn::QASymm8Encoder::Set
void Set(float right) override
Definition: BaseIterator.hpp:502
armnn::Float32Decoder::DecodeTensor
std::vector< float > DecodeTensor(const TensorShape &tensorShape, const bool isDepthwise) override
Definition: BaseIterator.hpp:314
armnn::BooleanDecoderBool::BooleanDecoderBool
BooleanDecoderBool()
Definition: BaseIterator.hpp:466
armnn::QASymm8Decoder::Get
float Get() const override
Definition: BaseIterator.hpp:124
armnn::Float16Decoder::Float16Decoder
Float16Decoder()
Definition: BaseIterator.hpp:269
armnn::TypedIterator::operator-=
TypedIterator & operator-=(const unsigned int increment) override
Definition: BaseIterator.hpp:96
armnn::Int32ToInt32tDecoder
Definition: BaseIterator.hpp:396
armnn::BaseIterator::operator[]
virtual BaseIterator & operator[](const unsigned int index)=0
armnn::ScaledInt32PerAxisDecoder::Get
float Get() const override
Definition: BaseIterator.hpp:855
armnn::BooleanDecoder::Get
float Get() const override
Definition: BaseIterator.hpp:437
armnn::Encoder::Set
virtual void Set(IType right)=0
armnn::QSymm16Decoder::QSymm16Decoder
QSymm16Decoder(const float scale, const int32_t offset)
Definition: BaseIterator.hpp:232
armnn::QSymmS8Encoder
Definition: BaseIterator.hpp:541
armnn::Float16Encoder::Float16Encoder
Float16Encoder()
Definition: BaseIterator.hpp:595
armnn::PerAxisIterator::Reset
void Reset(void *data) override
Definition: BaseIterator.hpp:720
armnn::BooleanDecoder
Definition: BaseIterator.hpp:428
armnn::QASymm8Decoder::QASymm8Decoder
QASymm8Decoder(const float scale, const int32_t offset)
Definition: BaseIterator.hpp:121
armnn::PerAxisIterator::m_AxisDimensionality
unsigned int m_AxisDimensionality
Definition: BaseIterator.hpp:776
armnn::QASymm8Decoder::DecodeTensor
std::vector< float > DecodeTensor(const TensorShape &tensorShape, const bool isDepthwise) override
Definition: BaseIterator.hpp:128
armnn::BooleanDecoderBool::BooleanDecoderBool
BooleanDecoderBool(const uint8_t *data)
Definition: BaseIterator.hpp:463
ARMNN_ASSERT
#define ARMNN_ASSERT(COND)
Definition: Assert.hpp:14
armnn::PerAxisIterator::m_Start
T * m_Start
Definition: BaseIterator.hpp:774
armnn::QASymm8Decoder
Definition: BaseIterator.hpp:115
armnn::QSymmS8Decoder::QSymmS8Decoder
QSymmS8Decoder(const float scale, const int32_t offset)
Definition: BaseIterator.hpp:195
armnn::Int32Decoder::Int32Decoder
Int32Decoder(const int32_t *data)
Definition: BaseIterator.hpp:367
armnn::ScaledInt32Decoder::DecodeTensor
std::vector< float > DecodeTensor(const TensorShape &tensorShape, const bool isDepthwise) override
Definition: BaseIterator.hpp:341
FloatingPointConverter.hpp
armnn::QSymmS8Encoder::QSymmS8Encoder
QSymmS8Encoder(const float scale, const int32_t offset)
Definition: BaseIterator.hpp:547
armnn::PerAxisIterator::PerAxisIterator
PerAxisIterator(T *data=nullptr, unsigned int axisFactor=0, unsigned int axisDimensionality=0)
Definition: BaseIterator.hpp:697
armnn::Int32Encoder
Definition: BaseIterator.hpp:631
armnn::QSymm16Decoder::Get
float Get() const override
Definition: BaseIterator.hpp:235
armnn::ScaledInt32Decoder
Definition: BaseIterator.hpp:328
armnn::PerAxisIterator::PerAxisIterator
PerAxisIterator(T *data=nullptr, const armnn::TensorShape &tensorShape=TensorShape(), const unsigned int axis=0)
Definition: BaseIterator.hpp:708
armnn::QSymmS8Encoder::QSymmS8Encoder
QSymmS8Encoder(int8_t *data, const float scale, const int32_t offset)
Definition: BaseIterator.hpp:544
armnn::Int32ToInt32tEncoder::Int32ToInt32tEncoder
Int32ToInt32tEncoder(int32_t *data)
Definition: BaseIterator.hpp:654
armnn::Float32Encoder::Set
void Set(float right) override
Definition: BaseIterator.hpp:620
ResolveType.hpp
armnn::Int32Encoder::Get
float Get() const override
Definition: BaseIterator.hpp:645
armnn::Int32ToInt32tDecoder::DecodeTensor
std::vector< float > DecodeTensor(const TensorShape &tensorShape, const bool isDepthwise) override
Definition: BaseIterator.hpp:409
armnn::Float16Decoder::DecodeTensor
std::vector< float > DecodeTensor(const TensorShape &tensorShape, const bool isDepthwise) override
Definition: BaseIterator.hpp:278
armnn::Decoder::Get
virtual IType Get() const =0
NumericCast.hpp
armnn::Float32Decoder::Float32Decoder
Float32Decoder()
Definition: BaseIterator.hpp:307
armnn::PerAxisIterator::m_AxisFactor
unsigned int m_AxisFactor
Definition: BaseIterator.hpp:777
armnn::QASymm8Decoder::QASymm8Decoder
QASymm8Decoder(const uint8_t *data, const float scale, const int32_t offset)
Definition: BaseIterator.hpp:118
armnn::ScaledInt32Decoder::ScaledInt32Decoder
ScaledInt32Decoder(const int32_t *data, const float scale)
Definition: BaseIterator.hpp:331
armnn::BooleanEncoder::Set
void Set(bool right) override
Definition: BaseIterator.hpp:680
IgnoreUnused.hpp
TypesUtils.hpp
armnn::QSymm16Decoder::QSymm16Decoder
QSymm16Decoder(const int16_t *data, const float scale, const int32_t offset)
Definition: BaseIterator.hpp:229
armnn::Decoder::DecodeTensor
virtual std::vector< float > DecodeTensor(const TensorShape &tensorShape, bool isDepthwise=false)=0
armnn::Decoder::~Decoder
virtual ~Decoder()
Definition: BaseIterator.hpp:42
armnn::BaseIterator::operator-=
virtual BaseIterator & operator-=(const unsigned int increment)=0
armnn::QSymm8PerAxisDecoder::Get
float Get() const override
Definition: BaseIterator.hpp:789
armnn::BooleanDecoderBool::Get
bool Get() const override
Definition: BaseIterator.hpp:469
armnn::Dequantize
float Dequantize(QuantizedType value, float scale, int32_t offset)
Dequantize an 8-bit data type into a floating point data type.
Definition: TypesUtils.cpp:46
armnn::QASymmS8Encoder::Get
float Get() const override
Definition: BaseIterator.hpp:531
armnn::QSymmS8Decoder
Definition: BaseIterator.hpp:189
armnn::QSymmS8Decoder::Get
float Get() const override
Definition: BaseIterator.hpp:198
armnnUtils::FloatingPointConverter::ConvertFloat16To32
static void ConvertFloat16To32(const void *srcFloat16Buffer, size_t numElements, float *dstFloat32Buffer)
Definition: FloatingPointConverter.cpp:31
armnn::QSymm16Decoder
Definition: BaseIterator.hpp:226
armnn::Int32Encoder::Set
void Set(float right) override
Definition: BaseIterator.hpp:640
armnn::ScaledInt32PerAxisDecoder
Definition: BaseIterator.hpp:847
armnn::PerAxisIterator::SetIndexOnMem
PerAxisIterator & SetIndexOnMem(const unsigned int index)
Definition: BaseIterator.hpp:750
armnn::Int32Decoder
Definition: BaseIterator.hpp:364
armnn::Int32Decoder::Int32Decoder
Int32Decoder()
Definition: BaseIterator.hpp:370
armnn::QASymm8Encoder
Definition: BaseIterator.hpp:493
armnn::Float32Decoder
Definition: BaseIterator.hpp:301
armnn::Float16Encoder
Definition: BaseIterator.hpp:589
armnn::ScaledInt32PerAxisDecoder::ScaledInt32PerAxisDecoder
ScaledInt32PerAxisDecoder(const int32_t *data, const armnn::TensorInfo tensorInfo)
Definition: BaseIterator.hpp:850
armnn::QSymm8PerAxisEncoder::GetScale
float GetScale() const
Definition: BaseIterator.hpp:838
armnn::QSymm8PerAxisEncoder::Get
float Get() const
Definition: BaseIterator.hpp:832
armnn::Float16Encoder::Float16Encoder
Float16Encoder(Half *data)
Definition: BaseIterator.hpp:592
armnn::QSymm8PerAxisEncoder
Definition: BaseIterator.hpp:821
armnn::PerAxisIterator::operator[]
PerAxisIterator & operator[](const unsigned int index) override
Definition: BaseIterator.hpp:766
armnn::QSymm16Encoder
Definition: BaseIterator.hpp:565