#include "./core/omp_config.h"

#include "./utils/utils.h"
#include "./numerics/numerics.h"
#include "./decomp/decomp.h"


#include "./modules/mesh/mesh.h"
#include "modules/fluids/fluids.h"

#include "./modules/neural_networks/neural_networks.h"



//#include <iostream>
//#include <stdexcept>
//#include <chrono>





int main(int argc, char const *argv[])
{   

    utils::Mf X(10,2, 0);
    utils::Vd y(10, 0);


    neural_networks::create_spital_data(100, 3, X, y);

    neural_networks::dense_layer<float> dense1(2, 3);
    neural_networks::activation_ReLU<float> activation1;
    neural_networks::dense_layer<float> dense2(3, 3);
    neural_networks::activation_softmax<float> activation2;

    dense1.forward(X);
    activation1.forward(dense1.outputs);
    dense2.forward(activation1.outputs);
    activation2.forward(dense2.outputs);

 

    for (int i = 0; i < 5; ++i){
        std::cout << activation2.outputs.get_row(i) << std::endl;
    }













    /*
    utils::Vd a = utils::linspace<double>(1, 10, 10, true);
    a.print();
    mesh::Mesh1D<double> mesh(a);
    mesh.generate_vertices(0.5, 10.5);
    double Gamma = 1.0;

    
    utils::Md A;
    utils::Vd b, s(10,1);


    core::Configs<double>& cfg = core::Configs<double>::defaults();
    cfg.grid = core::GridKind::Uniform;
    cfg.left = {core::FDKind::Forward, core::BCKind::Neumann, 0.0};
    cfg.right = {core::FDKind::Backward, core::BCKind::Neumann, 0.0};
    cfg.solver    = core::SolverKind::LU;


    fluids::Diffusion1D<double> diffusion(cfg, mesh, Gamma);
    diffusion.assemble(A, b, s);
*/
    
    return 0;
}