Skip to content
Snippets Groups Projects
Select Git revision
  • 2950f7b1cd4a38ae62b2be050ba0877c4b775327
  • main default protected
2 results

linear_regression.cpp

Blame
  • user avatar
    dean.schmitz@hhu.de authored
    2950f7b1
    History
    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));
    }