24 template<
typename T,
typename TParseElementFunc>
25 std::vector<T>
ParseArrayImpl(std::istream& stream, TParseElementFunc parseElementFunc,
const char * chars =
"\t ,:")
27 std::vector<T> result;
30 while (std::getline(stream, line))
33 for (
const std::string& token : tokens)
39 result.push_back(parseElementFunc(token));
41 catch (
const std::exception&)
43 ARMNN_LOG(error) <<
"'" << token <<
"' is not a valid number. It has been ignored.";
52 template<armnn::DataType NonQuantizedType>
55 template<armnn::DataType QuantizedType>
57 const float& quantizationScale,
58 const int32_t& quantizationOffset);
63 inline auto ParseDataArray<armnn::DataType::Float32>(std::istream & stream)
65 return ParseArrayImpl<float>(stream, [](
const std::string& s) {
return std::stof(s); });
69 inline auto ParseDataArray<armnn::DataType::Signed32>(std::istream & stream)
71 return ParseArrayImpl<int>(stream, [](
const std::string & s) {
return std::stoi(s); });
75 inline auto ParseDataArray<armnn::DataType::QAsymmU8>(std::istream& stream,
76 const float& quantizationScale,
77 const int32_t& quantizationOffset)
79 return ParseArrayImpl<uint8_t>(stream,
80 [&quantizationScale, &quantizationOffset](
const std::string & s)
83 armnn::Quantize<uint8_t>(std::stof(s),
89 struct DeepSpeechV1TestCaseData
91 DeepSpeechV1TestCaseData(
92 const LstmInput& inputData,
93 const LstmInput& expectedOutputData)
94 : m_InputData(inputData)
95 , m_ExpectedOutputData(expectedOutputData)
98 LstmInput m_InputData;
99 LstmInput m_ExpectedOutputData;
102 class DeepSpeechV1Database
105 explicit DeepSpeechV1Database(
const std::string& inputSeqDir,
const std::string& prevStateHDir,
106 const std::string& prevStateCDir,
const std::string& logitsDir,
107 const std::string& newStateHDir,
const std::string& newStateCDir);
109 std::unique_ptr<DeepSpeechV1TestCaseData> GetTestCaseData(
unsigned int testCaseId);
112 std::string m_InputSeqDir;
113 std::string m_PrevStateHDir;
114 std::string m_PrevStateCDir;
115 std::string m_LogitsDir;
116 std::string m_NewStateHDir;
117 std::string m_NewStateCDir;
120 DeepSpeechV1Database::DeepSpeechV1Database(
const std::string& inputSeqDir,
const std::string& prevStateHDir,
121 const std::string& prevStateCDir,
const std::string& logitsDir,
122 const std::string& newStateHDir,
const std::string& newStateCDir)
123 : m_InputSeqDir(inputSeqDir)
124 , m_PrevStateHDir(prevStateHDir)
125 , m_PrevStateCDir(prevStateCDir)
126 , m_LogitsDir(logitsDir)
127 , m_NewStateHDir(newStateHDir)
128 , m_NewStateCDir(newStateCDir)
131 std::unique_ptr<DeepSpeechV1TestCaseData> DeepSpeechV1Database::GetTestCaseData(
unsigned int testCaseId)
134 const std::string inputSeqPath = m_InputSeqDir +
"input_node_0_flat.txt";
135 const std::string prevStateCPath = m_PrevStateCDir +
"previous_state_c_0.txt";
136 const std::string prevStateHPath = m_PrevStateHDir +
"previous_state_h_0.txt";
138 std::vector<float> inputSeqData;
139 std::vector<float> prevStateCData;
140 std::vector<float> prevStateHData;
142 std::ifstream inputSeqFile(inputSeqPath);
143 std::ifstream prevStateCTensorFile(prevStateCPath);
144 std::ifstream prevStateHTensorFile(prevStateHPath);
148 inputSeqData = ParseDataArray<armnn::DataType::Float32>(inputSeqFile);
149 prevStateCData = ParseDataArray<armnn::DataType::Float32>(prevStateCTensorFile);
150 prevStateHData = ParseDataArray<armnn::DataType::Float32>(prevStateHTensorFile);
154 ARMNN_LOG(fatal) <<
"Failed to load image for test case " << testCaseId <<
". Error: " << e.
what();
159 const std::string logitsPath = m_LogitsDir +
"logits.txt";
160 const std::string newStateCPath = m_NewStateCDir +
"new_state_c.txt";
161 const std::string newStateHPath = m_NewStateHDir +
"new_state_h.txt";
163 std::vector<float> logitsData;
164 std::vector<float> expectedNewStateCData;
165 std::vector<float> expectedNewStateHData;
167 std::ifstream logitsTensorFile(logitsPath);
168 std::ifstream newStateCTensorFile(newStateCPath);
169 std::ifstream newStateHTensorFile(newStateHPath);
173 logitsData = ParseDataArray<armnn::DataType::Float32>(logitsTensorFile);
174 expectedNewStateCData = ParseDataArray<armnn::DataType::Float32>(newStateCTensorFile);
175 expectedNewStateHData = ParseDataArray<armnn::DataType::Float32>(newStateHTensorFile);
179 ARMNN_LOG(fatal) <<
"Failed to load image for test case " << testCaseId <<
". Error: " << e.
what();
184 LstmInput inputDataSingleTest(inputSeqData, prevStateHData, prevStateCData);
186 LstmInput expectedOutputsSingleTest(logitsData, expectedNewStateHData, expectedNewStateCData);
188 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)
auto ParseDataArray(std::istream &stream)
std::vector< T > ParseArrayImpl(std::istream &stream, TParseElementFunc parseElementFunc, const char *chars="\,:")
std::enable_if_t< std::is_unsigned< Source >::value &&std::is_unsigned< Dest >::value, Dest > numeric_cast(Source source)