diff options
Diffstat (limited to 'source/application')
6 files changed, 47 insertions, 61 deletions
diff --git a/source/application/api/common/include/DataStructures.hpp b/source/application/api/common/include/DataStructures.hpp index 04c00e7..13bf694 100644 --- a/source/application/api/common/include/DataStructures.hpp +++ b/source/application/api/common/include/DataStructures.hpp @@ -1,6 +1,6 @@ /* - * SPDX-FileCopyrightText: Copyright 2021 Arm Limited and/or its affiliates <open-source-office@arm.com> - * SPDX-License-Identifier: Apache-2.0 + * SPDX-FileCopyrightText: Copyright 2021, 2023 Arm Limited and/or its affiliates + * <open-source-office@arm.com> SPDX-License-Identifier: Apache-2.0 * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -18,6 +18,7 @@ #define DATA_STRUCTURES_HPP #include <iterator> +#include <vector> namespace arm { namespace app { @@ -49,21 +50,17 @@ namespace app { { if (rows == 0 || cols == 0) { printf("Array2d constructor has 0 size.\n"); - m_data = nullptr; return; } - m_data = new T[rows * cols]; + m_data = std::vector<T>(rows * cols); } - ~Array2d() - { - delete[] m_data; - } + ~Array2d() = default; T& operator() (unsigned int row, unsigned int col) { #if defined(DEBUG) - if (row >= m_rows || col >= m_cols || m_data == nullptr) { + if (row >= m_rows || col >= m_cols || m_data.empty()) { printf_err("Array2d subscript out of bounds.\n"); } #endif /* defined(DEBUG) */ @@ -73,7 +70,7 @@ namespace app { T operator() (unsigned int row, unsigned int col) const { #if defined(DEBUG) - if (row >= m_rows || col >= m_cols || m_data == nullptr) { + if (row >= m_rows || col >= m_cols || m_data.empty()) { printf_err("const Array2d subscript out of bounds.\n"); } #endif /* defined(DEBUG) */ @@ -84,7 +81,7 @@ namespace app { * @brief Gets rows number of the current array2d. * @return Number of rows. */ - size_t size(size_t dim) + size_t dimSize(size_t dim) { switch (dim) { @@ -111,15 +108,15 @@ namespace app { using iterator=T*; using const_iterator=T const*; - iterator begin() { return m_data; } - iterator end() { return m_data + totalSize(); } - const_iterator begin() const { return m_data; } - const_iterator end() const { return m_data + totalSize(); }; + iterator begin() { return m_data.data(); } + iterator end() { return m_data.data() + totalSize(); } + const_iterator begin() const { return m_data.data(); } + const_iterator end() const { return m_data.data() + totalSize(); }; private: size_t m_rows; size_t m_cols; - T* m_data; + std::vector<T> m_data; }; } /* namespace app */ diff --git a/source/application/api/common/include/Model.hpp b/source/application/api/common/include/Model.hpp index ed2b4c1..1728e1f 100644 --- a/source/application/api/common/include/Model.hpp +++ b/source/application/api/common/include/Model.hpp @@ -1,5 +1,5 @@ /* - * SPDX-FileCopyrightText: Copyright 2021-2022 Arm Limited and/or its affiliates <open-source-office@arm.com> + * SPDX-FileCopyrightText: Copyright 2021-2023 Arm Limited and/or its affiliates <open-source-office@arm.com> * SPDX-License-Identifier: Apache-2.0 * * Licensed under the Apache License, Version 2.0 (the "License"); @@ -134,7 +134,7 @@ namespace app { private: const tflite::Model* m_pModel{nullptr}; /* Tflite model pointer. */ - tflite::MicroInterpreter* m_pInterpreter{nullptr}; /* Tflite interpreter. */ + std::unique_ptr<tflite::MicroInterpreter> m_pInterpreter{nullptr}; /* Tflite interpreter. */ tflite::MicroAllocator* m_pAllocator{nullptr}; /* Tflite micro allocator. */ bool m_inited{false}; /* Indicates whether this object has been initialised. */ const uint8_t* m_modelAddr{nullptr}; /* Model address */ diff --git a/source/application/api/common/source/Model.cc b/source/application/api/common/source/Model.cc index f365c89..da8f46b 100644 --- a/source/application/api/common/source/Model.cc +++ b/source/application/api/common/source/Model.cc @@ -18,18 +18,13 @@ #include "log_macros.h" #include <cinttypes> +#include <memory> -/* Initialise the model */ -arm::app::Model::~Model() -{ - delete this->m_pInterpreter; - /** - * No clean-up function available for allocator in TensorFlow Lite Micro yet. - **/ -} +arm::app::Model::~Model() = default; arm::app::Model::Model() : m_inited(false), m_type(kTfLiteNoType) {} +/* Initialise the model */ bool arm::app::Model::Init(uint8_t* tensorArenaAddr, uint32_t tensorArenaSize, const uint8_t* nnModelAddr, @@ -83,8 +78,8 @@ bool arm::app::Model::Init(uint8_t* tensorArenaAddr, debug("Using existing allocator @ 0x%p\n", this->m_pAllocator); } - this->m_pInterpreter = - new ::tflite::MicroInterpreter(this->m_pModel, this->GetOpResolver(), this->m_pAllocator); + this->m_pInterpreter = std::make_unique<tflite::MicroInterpreter>( + this->m_pModel, this->GetOpResolver(), this->m_pAllocator); if (!this->m_pInterpreter) { printf_err("Failed to allocate interpreter\n"); @@ -97,8 +92,6 @@ bool arm::app::Model::Init(uint8_t* tensorArenaAddr, if (allocate_status != kTfLiteOk) { printf_err("tensor allocation failed!\n"); - delete this->m_pInterpreter; - this->m_pInterpreter = nullptr; return false; } diff --git a/source/application/api/use_case/asr/include/Wav2LetterPreprocess.hpp b/source/application/api/use_case/asr/include/Wav2LetterPreprocess.hpp index c1fec72..2f29fb0 100644 --- a/source/application/api/use_case/asr/include/Wav2LetterPreprocess.hpp +++ b/source/application/api/use_case/asr/include/Wav2LetterPreprocess.hpp @@ -1,6 +1,6 @@ /* - * SPDX-FileCopyrightText: Copyright 2021-2022 Arm Limited and/or its affiliates <open-source-office@arm.com> - * SPDX-License-Identifier: Apache-2.0 + * SPDX-FileCopyrightText: Copyright 2021-2023 Arm Limited and/or its affiliates + * <open-source-office@arm.com> SPDX-License-Identifier: Apache-2.0 * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -124,7 +124,7 @@ namespace app { const int quantOffset) { /* Check the output size will fit everything. */ - if (outputBufSz < (this->m_mfccBuf.size(0) * 3 * sizeof(T))) { + if (outputBufSz < (this->m_mfccBuf.dimSize(0) * 3 * sizeof(T))) { printf_err("Tensor size too small for features\n"); return false; } diff --git a/source/application/api/use_case/asr/src/Wav2LetterPreprocess.cc b/source/application/api/use_case/asr/src/Wav2LetterPreprocess.cc index 99e769c..1794894 100644 --- a/source/application/api/use_case/asr/src/Wav2LetterPreprocess.cc +++ b/source/application/api/use_case/asr/src/Wav2LetterPreprocess.cc @@ -1,6 +1,6 @@ /* - * SPDX-FileCopyrightText: Copyright 2021-2022 Arm Limited and/or its affiliates <open-source-office@arm.com> - * SPDX-License-Identifier: Apache-2.0 + * SPDX-FileCopyrightText: Copyright 2021-2023 Arm Limited and/or its affiliates + * <open-source-office@arm.com> SPDX-License-Identifier: Apache-2.0 * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -63,7 +63,7 @@ namespace app { mfccWindow, mfccWindow + this->m_mfccWindowLen); auto mfcc = this->m_mfcc.MfccCompute(mfccAudioData); - for (size_t i = 0; i < this->m_mfccBuf.size(0); ++i) { + for (size_t i = 0; i < this->m_mfccBuf.dimSize(0); ++i) { this->m_mfccBuf(i, mfccBufIdx) = mfcc[i]; } ++mfccBufIdx; @@ -126,16 +126,16 @@ namespace app { -0.03679654, -0.04329004, -0.03679654, -0.01731602, 0.01515152, 0.06060606}; - if (delta1.size(0) == 0 || delta2.size(0) != delta1.size(0) || - mfcc.size(0) == 0 || mfcc.size(1) == 0) { + if (delta1.dimSize(0) == 0 || delta2.dimSize(0) != delta1.dimSize(0) || + mfcc.dimSize(0) == 0 || mfcc.dimSize(1) == 0) { return false; } /* Get the middle index; coeff vec len should always be odd. */ const size_t coeffLen = delta1Coeffs.size(); const size_t fMidIdx = (coeffLen - 1)/2; - const size_t numFeatures = mfcc.size(0); - const size_t numFeatVectors = mfcc.size(1); + const size_t numFeatures = mfcc.dimSize(0); + const size_t numFeatVectors = mfcc.dimSize(1); /* Iterate through features in MFCC vector. */ for (size_t i = 0; i < numFeatures; ++i) { @@ -169,7 +169,7 @@ namespace app { void AsrPreProcess::StandardizeVecF32(Array2d<float>& vec) { - auto mean = math::MathUtils::MeanF32(vec.begin(), vec.totalSize()); + auto mean = math::MathUtils::MeanF32(vec.begin(), vec.totalSize()); auto stddev = math::MathUtils::StdDevF32(vec.begin(), vec.totalSize(), mean); debug("Mean: %f, Stddev: %f\n", mean, stddev); diff --git a/source/application/main/include/AppContext.hpp b/source/application/main/include/AppContext.hpp index 2f028d5..aae1944 100644 --- a/source/application/main/include/AppContext.hpp +++ b/source/application/main/include/AppContext.hpp @@ -1,6 +1,6 @@ /* - * SPDX-FileCopyrightText: Copyright 2021 Arm Limited and/or its affiliates <open-source-office@arm.com> - * SPDX-License-Identifier: Apache-2.0 + * SPDX-FileCopyrightText: Copyright 2021, 2023 Arm Limited and/or its affiliates + * <open-source-office@arm.com> SPDX-License-Identifier: Apache-2.0 * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -17,9 +17,9 @@ #ifndef APP_CTX_HPP #define APP_CTX_HPP -#include <string> #include <map> - +#include <memory> +#include <string> namespace arm { namespace app { @@ -58,13 +58,11 @@ namespace app { template<typename T> void Set(const std::string &name, T object) { - /* check if we have already the attribute allocated. */ - if( true == this->Has(name) ){ - //delete its value - delete this->m_attributes[name]; + /* Attribute exists; reset the smart pointer */ + if (this->Has(name)) { + this->m_attributes.at(name).reset(); } - /* allocate new value */ - this->m_attributes[name] = new Attribute<T>(object); + this->m_attributes[name] = std::make_unique<Attribute<T>>(object); } /** @@ -73,11 +71,13 @@ namespace app { * @param[in] name Context attribute name. * @return Value saved in the context. */ - template<typename T> - T Get(const std::string &name) + + template <typename T> + T Get(const std::string& name) { - auto a = (Attribute<T>*)m_attributes[name]; - return a->Get(); + //TODO Add logic to handle access of non-existent attribute + auto attributeValue = (Attribute<T>*)m_attributes.at(name).get(); + return attributeValue->Get(); } /** @@ -92,14 +92,10 @@ namespace app { ApplicationContext() = default; - ~ApplicationContext() { - for (auto& attribute : m_attributes) - delete attribute.second; + ~ApplicationContext() = default; - this->m_attributes.clear(); - } private: - std::map<std::string, IAttribute*> m_attributes; + std::map<std::string, std::unique_ptr<IAttribute>> m_attributes; }; } /* namespace app */ |