/*
 * 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   A 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 */