15 #include <boost/numeric/conversion/cast.hpp> 25 template<
typename T,
typename TParseElementFunc>
26 std::vector<T> ParseArrayImpl(std::istream& stream, TParseElementFunc parseElementFunc,
const char * chars =
"\t ,:")
28 std::vector<T> result;
31 while (std::getline(stream, line))
34 for (
const std::string& token : tokens)
40 result.push_back(parseElementFunc(token));
42 catch (
const std::exception&)
44 ARMNN_LOG(error) <<
"'" << token <<
"' is not a valid number. It has been ignored.";
53 template<armnn::DataType NonQuantizedType>
54 auto ParseDataArray(std::istream & stream);
56 template<armnn::DataType QuantizedType>
57 auto ParseDataArray(std::istream& stream,
58 const float& quantizationScale,
59 const int32_t& quantizationOffset);
64 inline auto ParseDataArray<armnn::DataType::Float32>(std::istream & stream)
66 return ParseArrayImpl<float>(stream, [](
const std::string& s) {
return std::stof(s); });
70 inline auto ParseDataArray<armnn::DataType::Signed32>(std::istream & stream)
72 return ParseArrayImpl<int>(stream, [](
const std::string & s) {
return std::stoi(s); });
76 inline auto ParseDataArray<armnn::DataType::QAsymmU8>(std::istream& stream,
77 const float& quantizationScale,
78 const int32_t& quantizationOffset)
80 return ParseArrayImpl<uint8_t>(stream,
81 [&quantizationScale, &quantizationOffset](
const std::string & s)
84 armnn::Quantize<uint8_t>(std::stof(s),
90 struct DeepSpeechV1TestCaseData
92 DeepSpeechV1TestCaseData(
93 const LstmInput& inputData,
94 const LstmInput& expectedOutputData)
95 : m_InputData(inputData)
96 , m_ExpectedOutputData(expectedOutputData)
99 LstmInput m_InputData;
100 LstmInput m_ExpectedOutputData;
103 class DeepSpeechV1Database
106 explicit DeepSpeechV1Database(
const std::string& inputSeqDir,
const std::string& prevStateHDir,
107 const std::string& prevStateCDir,
const std::string& logitsDir,
108 const std::string& newStateHDir,
const std::string& newStateCDir);
110 std::unique_ptr<DeepSpeechV1TestCaseData> GetTestCaseData(
unsigned int testCaseId);
113 std::string m_InputSeqDir;
114 std::string m_PrevStateHDir;
115 std::string m_PrevStateCDir;
116 std::string m_LogitsDir;
117 std::string m_NewStateHDir;
118 std::string m_NewStateCDir;
121 DeepSpeechV1Database::DeepSpeechV1Database(
const std::string& inputSeqDir,
const std::string& prevStateHDir,
122 const std::string& prevStateCDir,
const std::string& logitsDir,
123 const std::string& newStateHDir,
const std::string& newStateCDir)
124 : m_InputSeqDir(inputSeqDir)
125 , m_PrevStateHDir(prevStateHDir)
126 , m_PrevStateCDir(prevStateCDir)
127 , m_LogitsDir(logitsDir)
128 , m_NewStateHDir(newStateHDir)
129 , m_NewStateCDir(newStateCDir)
132 std::unique_ptr<DeepSpeechV1TestCaseData> DeepSpeechV1Database::GetTestCaseData(
unsigned int testCaseId)
135 const std::string inputSeqPath = m_InputSeqDir +
"input_node_0_flat.txt";
136 const std::string prevStateCPath = m_PrevStateCDir +
"previous_state_c_0.txt";
137 const std::string prevStateHPath = m_PrevStateHDir +
"previous_state_h_0.txt";
139 std::vector<float> inputSeqData;
140 std::vector<float> prevStateCData;
141 std::vector<float> prevStateHData;
143 std::ifstream inputSeqFile(inputSeqPath);
144 std::ifstream prevStateCTensorFile(prevStateCPath);
145 std::ifstream prevStateHTensorFile(prevStateHPath);
149 inputSeqData = ParseDataArray<armnn::DataType::Float32>(inputSeqFile);
150 prevStateCData = ParseDataArray<armnn::DataType::Float32>(prevStateCTensorFile);
151 prevStateHData = ParseDataArray<armnn::DataType::Float32>(prevStateHTensorFile);
155 ARMNN_LOG(fatal) <<
"Failed to load image for test case " << testCaseId <<
". Error: " << e.
what();
160 const std::string logitsPath = m_LogitsDir +
"logits.txt";
161 const std::string newStateCPath = m_NewStateCDir +
"new_state_c.txt";
162 const std::string newStateHPath = m_NewStateHDir +
"new_state_h.txt";
164 std::vector<float> logitsData;
165 std::vector<float> expectedNewStateCData;
166 std::vector<float> expectedNewStateHData;
168 std::ifstream logitsTensorFile(logitsPath);
169 std::ifstream newStateCTensorFile(newStateCPath);
170 std::ifstream newStateHTensorFile(newStateHPath);
174 logitsData = ParseDataArray<armnn::DataType::Float32>(logitsTensorFile);
175 expectedNewStateCData = ParseDataArray<armnn::DataType::Float32>(newStateCTensorFile);
176 expectedNewStateHData = ParseDataArray<armnn::DataType::Float32>(newStateHTensorFile);
180 ARMNN_LOG(fatal) <<
"Failed to load image for test case " << testCaseId <<
". Error: " << e.
what();
185 LstmInput inputDataSingleTest(inputSeqData, prevStateHData, prevStateCData);
187 LstmInput expectedOutputsSingleTest(logitsData, expectedNewStateHData, expectedNewStateCData);
189 return std::make_unique<DeepSpeechV1TestCaseData>(inputDataSingleTest, expectedOutputsSingleTest);
std::vector< std::string > StringTokenizer(const std::string &str, const char *delimiters, bool tokenCompression=true)
Function to take a string and a list of delimiters and split the string into tokens based on those de...
virtual const char * what() const noexcept override
#define ARMNN_LOG(severity)
std::enable_if_t< std::is_unsigned< Source >::value &&std::is_unsigned< Dest >::value, Dest > numeric_cast(Source source)