﻿//
// Copyright © 2017 Arm Ltd. All rights reserved.
// SPDX-License-Identifier: MIT
//
#include "Cifar10Database.hpp"

#include <boost/numeric/conversion/cast.hpp>
#include <boost/log/trivial.hpp>
#include <fstream>
#include <vector>

constexpr unsigned int g_kCifar10ImageByteSize = 1 + 3 * 32 * 32;

Cifar10Database::Cifar10Database(const std::string& binaryFileDirectory, bool rgbPack)
    : m_BinaryDirectory(binaryFileDirectory), m_RgbPack(rgbPack)
{
}

std::unique_ptr<Cifar10Database::TTestCaseData> Cifar10Database::GetTestCaseData(unsigned int testCaseId)
{
    std::vector<unsigned char> I(g_kCifar10ImageByteSize);

    std::string fullpath = m_BinaryDirectory + std::string("test_batch.bin");

    std::ifstream fileStream(fullpath, std::ios::binary);
    if (!fileStream.is_open())
    {
        BOOST_LOG_TRIVIAL(fatal) << "Failed to load " << fullpath;
        return nullptr;
    }

    fileStream.seekg(testCaseId * g_kCifar10ImageByteSize, std::ios_base::beg);
    fileStream.read(reinterpret_cast<char*>(&I[0]), g_kCifar10ImageByteSize);

    if (!fileStream.good())
    {
        BOOST_LOG_TRIVIAL(fatal) << "Failed to read " << fullpath;
        return nullptr;
    }


    std::vector<float> inputImageData;
    inputImageData.resize(g_kCifar10ImageByteSize - 1);

    unsigned int step;
    unsigned int countR_o;
    unsigned int countG_o;
    unsigned int countB_o;
    unsigned int countR = 1;
    unsigned int countG = 1 + 32 * 32;
    unsigned int countB = 1 + 2 * 32 * 32;

    if (m_RgbPack)
    {
        countR_o = 0;
        countG_o = 1;
        countB_o = 2;
        step = 3;
    }
    else
    {
        countR_o = 0;
        countG_o = 32 * 32;
        countB_o = 2 * 32 * 32;
        step = 1;
    }

    for (unsigned int h = 0; h < 32; h++)
    {
        for (unsigned int w = 0; w < 32; w++)
        {
            inputImageData[countR_o] = boost::numeric_cast<float>(I[countR++]);
            inputImageData[countG_o] = boost::numeric_cast<float>(I[countG++]);
            inputImageData[countB_o] = boost::numeric_cast<float>(I[countB++]);

            countR_o += step;
            countG_o += step;
            countB_o += step;
        }
    }

    const unsigned int label = boost::numeric_cast<unsigned int>(I[0]);
    return std::make_unique<TTestCaseData>(label, std::move(inputImageData));
}
