//
// Copyright © 2017 Arm Ltd. All rights reserved.
// SPDX-License-Identifier: MIT
//
#include "../YoloInferenceTest.hpp"
#include "armnnCaffeParser/ICaffeParser.hpp"
#include "armnn/TypesUtils.hpp"

int main(int argc, char* argv[])
{
    armnn::TensorShape inputTensorShape{ { 1, 3, YoloImageHeight, YoloImageWidth } };

    using YoloInferenceModel = InferenceModel<armnnCaffeParser::ICaffeParser,
        float>;

    int retVal = EXIT_FAILURE;
    try
    {
        // Coverity fix: InferenceTestMain() may throw uncaught exceptions.
        retVal = InferenceTestMain(argc, argv, { 0 },
            [&inputTensorShape]()
            {
                return make_unique<YoloTestCaseProvider<YoloInferenceModel>>(
                    [&]
                    (typename YoloInferenceModel::CommandLineOptions modelOptions)
                    {
                        if (!ValidateDirectory(modelOptions.m_ModelDir))
                        {
                            return std::unique_ptr<YoloInferenceModel>();
                        }

                        typename YoloInferenceModel::Params modelParams;
                        modelParams.m_ModelPath = modelOptions.m_ModelDir + "yolov1_tiny_voc2007_model.caffemodel";
                        modelParams.m_InputBindings = { "data" };
                        modelParams.m_OutputBindings = { "fc12" };
                        modelParams.m_InputShapes = { inputTensorShape };
                        modelParams.m_IsModelBinary = true;
                        modelParams.m_ComputeDevices = modelOptions.GetComputeDevicesAsBackendIds();
                        modelParams.m_VisualizePostOptimizationModel = modelOptions.m_VisualizePostOptimizationModel;
                        modelParams.m_EnableFp16TurboMode = modelOptions.m_EnableFp16TurboMode;

                        return std::make_unique<YoloInferenceModel>(modelParams);
                });
            });
    }
    catch (const std::exception& e)
    {
        // Coverity fix: BOOST_LOG_TRIVIAL (typically used to report errors) may throw an
        // exception of type std::length_error.
        // Using stderr instead in this context as there is no point in nesting try-catch blocks here.
        std::cerr << "WARNING: CaffeYolo-Armnn: An error has occurred when running "
                     "the classifier inference tests: " << e.what() << std::endl;
    }
    return retVal;
}
