#ifndef HELPER_HEADER
#define HELPER_HEADER

#include <mlpack/core.hpp>

using namespace arma;
using namespace mlpack;
using namespace std;


// conversion from arma datatypes to arrays usable by prolog

float *convertToArray(colvec vec);

float *convertToArray(rowvec vec);

float *convertToArray(mat matrix);

float *convertToArray(arma::Mat< size_t > matrix);

float *convertToArray(vector<size_t> vec);

float *convertToArray(vector<double> vec);

float *convertToArray(Row<size_t> vec);

float *convertToArray(vector<vec> vec);


// conversion from arrays to arma datatypes

rowvec convertArrayToRowvec(float *arr, int vecSize);

colvec convertArrayToColvec(float *arr, int vecSize);

Row<size_t> convertArrayToVec(float *arr, int vecSize);

mat convertArrayToMat(float *arr, int vecSize, int rowCount);


// insert the Vector and Matrix informations into the prolog Variables

void returnMatrixInformation(mat matrix, float **mat, SP_integer *matColNum, SP_integer *matRowNum);

void returnMatrixInformation(Mat< size_t > matrix, float **mat, SP_integer *matColNum, SP_integer *matRowNum);

void returnVectorInformation(rowvec vector, float **vecArr, SP_integer *vecArrSize);

void returnVectorInformation(vec vector, float **vecArr, SP_integer *vecArrSize);

void returnVectorInformation(Row< size_t > vector, float **vecArr, SP_integer *vecArrSize);


// prolog exeption caller functions

void raisePrologSystemExeption(const char *message);

void raisePrologDomainExeption(double target, int argNumber, const char *expectation, const char *predicateName);

void raisePrologDomainExeption(SP_integer target, int argNumber, const char *expectation, const char *predicateName);

void raisePrologDomainExeption(const char * target, int argNumber, const char *expectation, const char *predicateName);

#endif