/*
 * Copyright (c) 2021 Arm Limited. All rights reserved.
 * 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.
 * You may obtain a copy of the License at
 *
 *     http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */
#ifndef ASR_CLASSIFIER_HPP
#define ASR_CLASSIFIER_HPP

#include "Classifier.hpp"

namespace arm {
namespace app {

    class AsrClassifier : public Classifier {
    public:
        /**
         * @brief       Gets the top N classification results from the
         *              output vector.
         * @param[in]   outputTensor   Inference output tensor from an NN model.
         * @param[out]  vecResults     A vector of classification results
         *                             populated by this function.
         * @param[in]   labels         Labels vector to match classified classes
         * @param[in]   topNCount      Number of top classifications to pick.
         * @return      true if successful, false otherwise.
         **/
        bool GetClassificationResults(
            TfLiteTensor* outputTensor,
            std::vector<ClassificationResult>& vecResults,
            const std::vector <std::string>& labels, uint32_t topNCount) override;

    private:
        /**
         * @brief       Utility function that gets the top 1 classification results from the
         *              output tensor (vector of vector).
         * @param[in]   tensor       Inference output tensor from an NN model.
         * @param[out]  vecResults   Vector of classification results populated by this function.
         * @param[in]   labels       Labels vector to match classified classes.
         * @param[in]   scale        Quantization scale.
         * @param[in]   zeroPoint    Quantization zero point.
         * @return      true if successful, false otherwise.
         **/
        template<typename T>
        bool _GetTopResults(TfLiteTensor* tensor,
                            std::vector<ClassificationResult>& vecResults,
                            const std::vector <std::string>& labels, double scale, double zeroPoint);
    };

} /* namespace app */
} /* namespace arm */

#endif /* ASR_CLASSIFIER_HPP */