15 #include <boost/format.hpp> 23 template<
typename TParser>
37 const std::string& inputName,
38 const std::string& outputName);
41 const std::string& inputName,
42 const std::string& outputName);
43 void Setup(
const std::map<std::string, armnn::TensorShape>& inputShapes,
44 const std::vector<std::string>& requestedOutputs);
47 const std::map<std::string,armnn::TensorShape>& inputShapes,
48 const std::vector<std::string>& requestedOutputs);
53 template <std::
size_t NumOutputDimensions>
54 void RunTest(
const std::vector<float>& inputData,
const std::vector<float>& expectedOutputData);
58 template <std::
size_t NumOutputDimensions>
59 void RunComparisonTest(
const std::map<std::string, std::vector<float>>& inputData,
60 const std::map<std::string, std::vector<uint8_t>>& expectedOutputData);
64 template <std::
size_t NumOutputDimensions,
typename T =
float>
65 void RunTest(
const std::map<std::string, std::vector<float>>& inputData,
66 const std::map<std::string, std::vector<T>>& expectedOutputData);
69 std::unique_ptr<TParser, void(*)(TParser* parser)>
m_Parser;
85 template<
typename TParser>
87 const std::string& outputName)
92 Setup({ }, { outputName });
95 template<
typename TParser>
97 const std::string& inputName,
98 const std::string& outputName)
103 Setup({ { inputName, inputTensorShape } }, { outputName });
106 template<
typename TParser>
109 const std::string& inputName,
110 const std::string& outputName)
117 Setup({ { inputName, inputTensorShape } }, { outputName });
120 template<
typename TParser>
122 const std::vector<std::string>& requestedOutputs)
124 std::string errorMessage;
133 boost::format(
"LoadNetwork failed with error: '%1%' %2%")
139 template<
typename TParser>
142 std::string errorMessage;
151 boost::format(
"LoadNetwork failed with error: '%1%' %2%")
157 template<
typename TParser>
159 const std::map<std::string,armnn::TensorShape>& inputShapes,
160 const std::vector<std::string>& requestedOutputs)
168 template<
typename TParser>
169 template <std::
size_t NumOutputDimensions>
171 const std::vector<float>& expectedOutputData)
176 template<
typename TParser>
177 template <std::
size_t NumOutputDimensions>
179 const std::map<std::string, std::vector<uint8_t>>&
182 RunTest<NumOutputDimensions, uint8_t>(inputData, expectedOutputData);
185 template<
typename TParser>
186 template <std::
size_t NumOutputDimensions,
typename T>
188 const std::map<std::string, std::vector<T>>& expectedOutputData)
192 for (
auto&& it : inputData)
195 inputTensors.push_back({ bindingInfo.first,
armnn::ConstTensor(bindingInfo.second, it.second.data()) });
199 std::map<std::string, boost::multi_array<T, NumOutputDimensions>> outputStorage;
201 for (
auto&& it : expectedOutputData)
204 outputStorage.emplace(it.first, MakeTensor<T, NumOutputDimensions>(bindingInfo.second));
205 outputTensors.push_back(
206 { bindingInfo.first,
armnn::Tensor(bindingInfo.second, outputStorage.at(it.first).data()) });
212 for (
auto&& it : expectedOutputData)
215 if (bindingInfo.second.GetNumElements() != it.second.size())
218 boost::str(boost::format(
"Output tensor %1% is expected to have %2% elements. " 219 "%3% elements supplied. %4%") %
221 bindingInfo.second.GetNumElements() %
230 if (bindingInfo.second.GetShape().GetNumDimensions() == NumOutputDimensions &&
238 boost::str(boost::format(
"Output tensor %1% is expected to have %2% shape. " 239 "%3% shape supplied. %4%") %
241 bindingInfo.second.GetShape() %
250 boost::str(boost::format(
"Output tensor %1% is expected to have %2% dimensions. " 251 "%3% dimensions supplied. %4%") %
253 bindingInfo.second.GetShape().GetNumDimensions() %
254 NumOutputDimensions %
259 auto outputExpected = MakeTensor<T, NumOutputDimensions>(bindingInfo.second, it.second);
260 if (std::is_same<T, uint8_t>::value)
262 BOOST_TEST(
CompareTensors(outputExpected, outputStorage[it.first],
true));
266 BOOST_TEST(
CompareTensors(outputExpected, outputStorage[it.first]));
void SetupSingleInputSingleOutput(const std::string &inputName, const std::string &outputName)
unsigned int GetNumDimensions() const
A tensor defined by a TensorInfo (shape and data type) and an immutable backing store.
std::unique_ptr< TParser, void(*)(TParser *parser)> m_Parser
std::vector< std::pair< LayerBindingId, class Tensor > > OutputTensors
armnn::IRuntimePtr m_Runtime
IOptimizedNetworkPtr Optimize(const INetwork &network, const std::vector< BackendId > &backendPreferences, const IDeviceSpec &deviceSpec, const OptimizerOptions &options=OptimizerOptions(), Optional< std::vector< std::string > &> messages=EmptyOptional())
std::string m_SingleInputName
std::pair< armnn::LayerBindingId, armnn::TensorInfo > BindingPointInfo
void RunTest(const std::vector< float > &inputData, const std::vector< float > &expectedOutputData)
armnn::NetworkId m_NetworkIdentifier
A tensor defined by a TensorInfo (shape and data type) and a mutable backing store.
armnn::IOptimizedNetworkPtr SetupOptimizedNetwork(const std::map< std::string, armnn::TensorShape > &inputShapes, const std::vector< std::string > &requestedOutputs)
std::vector< std::pair< LayerBindingId, class ConstTensor > > InputTensors
void RunComparisonTest(const std::map< std::string, std::vector< float >> &inputData, const std::map< std::string, std::vector< uint8_t >> &expectedOutputData)
Base class for all ArmNN exceptions so that users can filter to just those.
std::unique_ptr< INetwork, void(*)(INetwork *network)> INetworkPtr
CPU Execution: Reference C++ kernels.
std::unique_ptr< IOptimizedNetwork, void(*)(IOptimizedNetwork *network)> IOptimizedNetworkPtr
std::string m_SingleOutputName
std::unique_ptr< IRuntime, void(*)(IRuntime *runtime)> IRuntimePtr
boost::test_tools::predicate_result CompareTensors(const boost::multi_array< T, n > &a, const boost::multi_array< T, n > &b, bool compareBoolean=false)
armnn::TensorShape m_SingleOutputShape