Select Git revision
linear_regression.cpp
Code owners
Assign users and groups as approvers for specific file changes. Learn more.
linear_regression.cpp 5.84 KiB
#include <sicstus/sicstus.h>
/* ex_glue.h is generated by splfr from the foreign/[2,3] facts.
Always include the glue header in your foreign resource code.
*/
#include "linear_regression_glue.h"
#include <mlpack/methods/linear_regression/linear_regression.hpp>
#include <mlpack/core.hpp>
// including helper functions for converting between arma structures and arrays
#include "../../helper_files/helper.hpp"
using namespace arma;
using namespace mlpack;
using namespace std;
using namespace mlpack::regression;
// Global Variable of the LinearRegression object so it can be accessed from all functions
LinearRegression regressor;
// input: const arma::mat &data, const arma::rowvec &responses, const double lambda, const bool intercept
// output:
void initModel(float *matrix, SP_integer matSize, SP_integer matRowNum, float *responses_arr, SP_integer vecSize, SP_integer lambda, SP_integer bool_intercept)
{
if(matSize / matRowNum != vecSize)
{
cout << "Target dim doesnt fit to the Data dim" << endl;
return;
}
// convert the Prolog arrays to arma::rowvec and arma::mat
mat data = convertArrayToMat(matrix, matSize, matRowNum);
rowvec responses = convertArrayToRowvec(responses_arr, vecSize);
regressor = LinearRegression(data, responses, lambda, bool_intercept);
}
// input: const arma::mat &data, const arma::rowvec &responses, const arma::rowvec &weights, const double lambda, const bool intercept
// output:
void initModelWithWeights(float *matrix, SP_integer matSize, SP_integer matRowNum, float *responses_arr, SP_integer vecSize, float *weights_arr, SP_integer weightsSize, SP_integer lambda, SP_integer bool_intercept)
{
if(matSize / matRowNum != vecSize)
{
cout << "Target dim doesnt fit to the Data dim" << endl;
return;
}
// convert the Prolog arrays to arma::rowvec and arma::mat
mat data = convertArrayToMat(matrix, matSize, matRowNum);
rowvec responses = convertArrayToRowvec(responses_arr, vecSize);
rowvec weights = convertArrayToRowvec(weights_arr, weightsSize);
regressor = LinearRegression(data, responses, weights, lambda, bool_intercept);
}
// input:
// output:
void initModelEmpty(SP_integer)
{
regressor = LinearRegression();
}
// input: const arma::mat &points, const arma::rowvec &responses
// output: double L2SquardError
SP_integer computeError(float *points_mat_arr, SP_integer matSize, SP_integer matRowNum, float *responses_arr, SP_integer vecSize)
{
if(matSize / matRowNum != vecSize)
{
cout << "Target dim doesnt fit to the Data dim" << endl;
return 0;
}
// convert the Prolog arrays to arma::rowvec and arma::mat
mat data = convertArrayToMat(points_mat_arr, matSize, matRowNum);
rowvec responses = convertArrayToRowvec(responses_arr, vecSize);
// run the model function
return regressor.ComputeError(data, responses);
}
// input:
// output: double
SP_integer intercept()
{
if(regressor.Intercept()) {return 1;}
else {return 0;}
}
// input:
// output: double Tikhonov regularization parameter
SP_integer lambda()
{
return regressor.Lambda();;
}
// input: double new Tikhonov regularization parameter
// output:
void modifyLambda(SP_integer new_lambda)
{
double& lambda_ref = regressor.Lambda();
lambda_ref = new_lambda;
}
// input:
// output: const arma::vec & parameters b vector
float * parameters(SP_integer *arraySize)
{
// get b vector
colvec armaDataOffset = regressor.Parameters();
cout << regressor.Parameters() << endl;
cout << armaDataOffset << endl;
// set the b vector length
*arraySize = armaDataOffset.n_elem;
// convert b vector to array and return
return convertToArray(armaDataOffset);
}
// input: arma::vec & new b vector
// output:
void modifyParameters(float *paramArr, SP_integer paramSize)
{
// convert array to arma:: vec
rowvec new_B_Vector = convertArrayToRowvec(paramArr, paramSize);
// get parameter b vector ref
vec& bVector = regressor.Parameters();
// set new b vector
bVector = new_B_Vector;
}
// input: const arma::mat &points, arma::rowvec &predictions
// output:
void predict(float *pointsArr, SP_integer pointsSize, SP_integer pointsRowNum, float **predicArr, SP_integer *predicSize)
{
// convert the Prolog arrays to std::vec for easy conversion to arma::mat
mat data = convertArrayToMat(pointsArr, pointsSize, pointsRowNum);
// run the prediction and save the result in arma::rowvec
rowvec predictions;
regressor.Predict(data, predictions);
// give back the sizes and the converted results as arrays
*predicSize = predictions.n_elem;
*predicArr = convertToArray(predictions);
}
// input: const arma::mat &data, const arma::rowvec &responses, const bool intercept
// output:
SP_integer train(float *matrix, SP_integer matSize, SP_integer matRowNum, float *responses_arr, SP_integer vecSize, SP_integer bool_intercept)
{
if(matSize / matRowNum != vecSize)
{
cout << "Target dim doesnt fit to the Data dim" << endl;
return 0;
}
// convert the Prolog arrays to arma::rowvec and arma::mat
rowvec responses = convertArrayToRowvec(responses_arr, vecSize);
mat data = convertArrayToMat(matrix, matSize, matRowNum);
// run the model train function
return regressor.Train(data, responses, (bool_intercept == 1));
}
// input: const arma::mat &data, const arma::rowvec &responses, const arma::rowvec &weights, const bool intercept
// output:
SP_integer trainWithWeights(float *matrix, SP_integer matSize, SP_integer matRowNum, float *responses_arr, SP_integer vecSize, float *weights_arr, SP_integer weightsSize, SP_integer bool_intercept)
{
if(matSize / matRowNum != vecSize)
{
cout << "Target dim doesnt fit to the Data dim" << endl;
return 0;
}
// convert the Prolog arrays to arma::rowvec and arma::mat
mat data = convertArrayToMat(matrix, matSize, matRowNum);
rowvec responses = convertArrayToRowvec(responses_arr, vecSize);
rowvec weights = convertArrayToRowvec(weights_arr, weightsSize);
// run the model train function
return regressor.Train(data, responses, weights, (bool_intercept == 1));
}