ArmNN
 21.02
SerializerTestUtils.hpp
Go to the documentation of this file.
1 //
2 // Copyright © 2021 Arm Ltd and Contributors. All rights reserved.
3 // SPDX-License-Identifier: MIT
4 //
5 
6 #include <armnn/Descriptors.hpp>
7 #include <armnn/INetwork.hpp>
8 #include <armnn/TypesUtils.hpp>
11 
12 #include <random>
13 #include <vector>
14 
15 #include <boost/test/unit_test.hpp>
16 
17 
18 armnn::INetworkPtr DeserializeNetwork(const std::string& serializerString);
19 
20 std::string SerializeNetwork(const armnn::INetwork& network);
21 
22 void CompareConstTensor(const armnn::ConstTensor& tensor1, const armnn::ConstTensor& tensor2);
23 
25 {
26 public:
27  LayerVerifierBase(const std::string& layerName,
28  const std::vector<armnn::TensorInfo>& inputInfos,
29  const std::vector<armnn::TensorInfo>& outputInfos);
30 
31  void ExecuteStrategy(const armnn::IConnectableLayer* layer,
32  const armnn::BaseDescriptor& descriptor,
33  const std::vector<armnn::ConstTensor>& constants,
34  const char* name,
35  const armnn::LayerBindingId id = 0) override;
36 
37 protected:
38  void VerifyNameAndConnections(const armnn::IConnectableLayer* layer, const char* name);
39 
40  void VerifyConstTensors(const std::string& tensorName,
41  const armnn::ConstTensor* expectedPtr,
42  const armnn::ConstTensor* actualPtr);
43 
44 private:
45  std::string m_LayerName;
46  std::vector<armnn::TensorInfo> m_InputTensorInfos;
47  std::vector<armnn::TensorInfo> m_OutputTensorInfos;
48 };
49 
50 template<typename Descriptor>
52 {
53 public:
54  LayerVerifierBaseWithDescriptor(const std::string& layerName,
55  const std::vector<armnn::TensorInfo>& inputInfos,
56  const std::vector<armnn::TensorInfo>& outputInfos,
57  const Descriptor& descriptor)
58  : LayerVerifierBase(layerName, inputInfos, outputInfos)
59  , m_Descriptor(descriptor) {}
60 
62  const armnn::BaseDescriptor& descriptor,
63  const std::vector<armnn::ConstTensor>& constants,
64  const char* name,
65  const armnn::LayerBindingId id = 0) override
66  {
67  armnn::IgnoreUnused(constants, id);
68  switch (layer->GetType())
69  {
70  case armnn::LayerType::Input: break;
71  case armnn::LayerType::Output: break;
72  default:
73  {
74  VerifyNameAndConnections(layer, name);
75  const Descriptor& internalDescriptor = static_cast<const Descriptor&>(descriptor);
76  VerifyDescriptor(internalDescriptor);
77  break;
78  }
79  }
80  }
81 
82 protected:
83  void VerifyDescriptor(const Descriptor& descriptor)
84  {
85  BOOST_CHECK(descriptor == m_Descriptor);
86  }
87 
88  Descriptor m_Descriptor;
89 };
90 
91 template<typename T>
92 void CompareConstTensorData(const void* data1, const void* data2, unsigned int numElements)
93 {
94  T typedData1 = static_cast<T>(data1);
95  T typedData2 = static_cast<T>(data2);
96  BOOST_CHECK(typedData1);
97  BOOST_CHECK(typedData2);
98 
99  for (unsigned int i = 0; i < numElements; i++)
100  {
101  BOOST_TEST(typedData1[i] == typedData2[i]);
102  }
103 }
104 
105 
106 template <typename Descriptor>
108 {
109 public:
110  LayerVerifierBaseWithDescriptorAndConstants(const std::string& layerName,
111  const std::vector<armnn::TensorInfo>& inputInfos,
112  const std::vector<armnn::TensorInfo>& outputInfos,
113  const Descriptor& descriptor,
114  const std::vector<armnn::ConstTensor>& constants)
115  : LayerVerifierBaseWithDescriptor<Descriptor>(layerName, inputInfos, outputInfos, descriptor)
116  , m_Constants(constants) {}
117 
119  const armnn::BaseDescriptor& descriptor,
120  const std::vector<armnn::ConstTensor>& constants,
121  const char* name,
122  const armnn::LayerBindingId id = 0) override
123  {
125 
126  switch (layer->GetType())
127  {
128  case armnn::LayerType::Input: break;
129  case armnn::LayerType::Output: break;
130  default:
131  {
132  this->VerifyNameAndConnections(layer, name);
133  const Descriptor& internalDescriptor = static_cast<const Descriptor&>(descriptor);
134  this->VerifyDescriptor(internalDescriptor);
135 
136  for(std::size_t i = 0; i < constants.size(); i++)
137  {
138  CompareConstTensor(constants[i], m_Constants[i]);
139  }
140  }
141  }
142  }
143 
144 private:
145  std::vector<armnn::ConstTensor> m_Constants;
146 };
147 
148 template<typename DataType>
149 static std::vector<DataType> GenerateRandomData(size_t size)
150 {
151  constexpr bool isIntegerType = std::is_integral<DataType>::value;
152  using Distribution =
153  typename std::conditional<isIntegerType,
154  std::uniform_int_distribution<DataType>,
155  std::uniform_real_distribution<DataType>>::type;
156 
157  static constexpr DataType lowerLimit = std::numeric_limits<DataType>::min();
158  static constexpr DataType upperLimit = std::numeric_limits<DataType>::max();
159 
160  static Distribution distribution(lowerLimit, upperLimit);
161  static std::default_random_engine generator;
162 
163  std::vector<DataType> randomData(size);
164  std::generate(randomData.begin(), randomData.end(), []() { return distribution(generator); });
165 
166  return randomData;
167 }
std::string SerializeNetwork(const armnn::INetwork &network)
Interface for a layer that is connectable to other layers via InputSlots and OutputSlots.
Definition: INetwork.hpp:62
void VerifyDescriptor(const Descriptor &descriptor)
Main network class which provides the interface for building up a neural network. ...
Definition: INetwork.hpp:178
LayerVerifierBaseWithDescriptor(const std::string &layerName, const std::vector< armnn::TensorInfo > &inputInfos, const std::vector< armnn::TensorInfo > &outputInfos, const Descriptor &descriptor)
void ExecuteStrategy(const armnn::IConnectableLayer *layer, const armnn::BaseDescriptor &descriptor, const std::vector< armnn::ConstTensor > &constants, const char *name, const armnn::LayerBindingId id=0) override
void IgnoreUnused(Ts &&...)
int LayerBindingId
Type of identifiers for bindable layers (inputs, outputs).
Definition: Types.hpp:210
armnn::INetworkPtr DeserializeNetwork(const std::string &serializerString)
Base class for all descriptors.
Definition: Descriptors.hpp:22
DataType
Definition: Types.hpp:32
void ExecuteStrategy(const armnn::IConnectableLayer *layer, const armnn::BaseDescriptor &descriptor, const std::vector< armnn::ConstTensor > &constants, const char *name, const armnn::LayerBindingId id=0) override
void VerifyNameAndConnections(const armnn::IConnectableLayer *layer, const char *name)
A tensor defined by a TensorInfo (shape and data type) and an immutable backing store.
Definition: Tensor.hpp:314
void CompareConstTensorData(const void *data1, const void *data2, unsigned int numElements)
LayerVerifierBase(const std::string &layerName, const std::vector< armnn::TensorInfo > &inputInfos, const std::vector< armnn::TensorInfo > &outputInfos)
LayerVerifierBaseWithDescriptorAndConstants(const std::string &layerName, const std::vector< armnn::TensorInfo > &inputInfos, const std::vector< armnn::TensorInfo > &outputInfos, const Descriptor &descriptor, const std::vector< armnn::ConstTensor > &constants)
void VerifyConstTensors(const std::string &tensorName, const armnn::ConstTensor *expectedPtr, const armnn::ConstTensor *actualPtr)
virtual LayerType GetType() const =0
Returns the armnn::LayerType of this layer.
std::unique_ptr< INetwork, void(*)(INetwork *network)> INetworkPtr
Definition: INetwork.hpp:173
void CompareConstTensor(const armnn::ConstTensor &tensor1, const armnn::ConstTensor &tensor2)
void ExecuteStrategy(const armnn::IConnectableLayer *layer, const armnn::BaseDescriptor &descriptor, const std::vector< armnn::ConstTensor > &constants, const char *name, const armnn::LayerBindingId id=0) override