Skip to content
Snippets Groups Projects
Commit 2950f7b1 authored by dean.schmitz@hhu.de's avatar dean.schmitz@hhu.de
Browse files

Updating lars implementation

parent 5f2cb41d
No related branches found
No related tags found
No related merge requests found
......@@ -3,7 +3,7 @@
// Extra functions to reduce some code for the conversion between arma and float *array
float *convertArmaToArray(colvec vec)
float *convertToArray(colvec vec)
{
vector<float> vectorData = conv_to<vector<float>>::from(vec);
int vectorSize = vectorData.size();
......@@ -18,10 +18,16 @@ float *convertArmaToArray(colvec vec)
}
return arr;
}
float *convertArmaToArray(rowvec vec)
float *convertToArray(rowvec vec)
{
colvec newVec = conv_to<colvec>::from(vec);
return convertArmaToArray(newVec);
return convertToArray(newVec);
}
float *convertToArray(vector<size_t> vec)
{
colvec newVec = conv_to<colvec>::from(vec);
return convertToArray(newVec);
}
rowvec convertArrayToRowvec(float *arr, int vecSize)
......
......@@ -7,9 +7,14 @@ using namespace arma;
using namespace mlpack;
using namespace std;
float *convertArmaToArray(colvec vec);
float *convertToArray(colvec vec);
float *convertToArray(rowvec vec);
float *convertToArray(mat matrix);
float *convertToArray(vector<size_t> vec);
float *convertArmaToArray(rowvec vec);
rowvec convertArrayToRowvec(float *arr, int vecSize);
......
......@@ -47,7 +47,7 @@ float * dataOffset(SP_integer *arraySize)
*arraySize = armaDataOffset.n_elem;
return convertArmaToArray(armaDataOffset);
return convertToArray(armaDataOffset);
}
// input:
......@@ -59,7 +59,7 @@ float * dataScale(SP_integer *arraySize)
*arraySize = armaDataScale.n_elem;
return convertArmaToArray(armaDataScale);
return convertToArray(armaDataScale);
}
// input:
......@@ -71,7 +71,7 @@ float * omega(SP_integer *arraySize)
*arraySize = armaOmega.n_elem;
return convertArmaToArray(armaOmega);
return convertToArray(armaOmega);
}
// input: const arma::mat &points, arma::rowvec &predictions
......@@ -89,7 +89,7 @@ void predict(float *pointsArr, SP_integer pointsSize, SP_integer pointsRowNum, f
// give back the sizes and the converted results as arrays
*predicSize = predictions.n_elem;
*predicArr = convertArmaToArray(predictions);
*predicArr = convertToArray(predictions);
}
// input: const arma::mat &points, arma::rowvec &predictions, arma::rowvec &std
......@@ -108,8 +108,8 @@ void predictWithStd(float *pointsArr, SP_integer pointsSize, SP_integer pointsRo
*predicSize = predictions.n_elem;
*stdSize = std.n_elem;
*predicArr = convertArmaToArray(predictions);
*stdArr = convertArmaToArray(std);
*predicArr = convertToArray(predictions);
*stdArr = convertToArray(std);
}
......
#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 "lars_glue.h"
#include <mlpack/methods/lars/lars.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 Lars regressor object so it can be accessed from all functions
LARS regressor;
// input: const bool useCholesky, const double lambda1, const double lambda2, const double tolerance
// output:
void initModelNoDataNoGram(SP_integer useCholesky, double lambda1, double lambda2, double tol)
{
regressor = new LARS((useCholesky == 1), lambda1, lambda2, tol);
}
// input: const bool useCholesky, const arma::mat & gramMatrix, const double lambda1, const double lambda2, const double tolerance
// output:
void initModelNoDataWithGram(SP_integer useCholesky, float *gramArr, SP_integer gramSize, SP_integer gramRowNum, SP_integer lambda1, SP_integer lambda2, double tol)
{
mat gramMatrix = convertArrayToMat(gramArr, gramSize, gramRowNum);
regressor = new LARS((useCholesky == 1), gramMatrix, lambda1, lambda2, tol);
}
// input: const arma::mat & dataMatrix, const arma::rowvec & responses, const bool transposeData, const bool useCholesky, const double lambda1, const double lambda2, const double tolerance
// output:
void initModelWithDataNoGram(float *dataArr, SP_integer dataSize, SP_integer dataRowNum, float *responsesArr, SP_integer responsesSize, SP_integer transposeData,
SP_integer useCholesky, SP_integer lambda1, SP_integer lambda2, double tol)
{
if(dataSize / dataRowNum != responsesSize)
{
cout << "Target dim doesnt fit to the Data dim" << endl;
return;
}
// convert the Prolog arrays to arma::rowvec and arma::mat
mat data = convertArrayToMat(dataArr, dataSize, dataRowNum);
rowvec responses = convertArrayToRowvec(responsesArr, responsesSize);
regressor = new LARS(data, responses, (transposedata == 1), (useCholesky == 1), lambda1, lambda2, tol);
}
// input: const arma::mat & dataMatrix, const arma::rowvec & responses, const bool transposeData, const bool useCholesky, const arma::mat & gramMatrix, const double lambda1, const double lambda2, const double tolerance
// output:
void initModelWithDataWithGram(float *dataArr, SP_integer dataSize, SP_integer dataRowNum, float *responsesArr, SP_integer responsesSize, SP_integer transposeData,
SP_integer useCholesky, float *gramArr, SP_integer gramSize, SP_integer gramRowNum, SP_integer lambda1, SP_integer lambda2, double tol)
{
if(dataSize / dataRowNum != responsesSize)
{
cout << "Target dim doesnt fit to the Data dim" << endl;
return;
}
// convert the Prolog arrays to arma::rowvec and arma::mat
mat data = convertArrayToMat(dataArr, dataSize, dataRowNum);
rowvec responses = convertArrayToRowvec(responsesArr, responsesSize);
mat gramMatrix = convertArrayToMat(gramArr, gramSize, gramRowNum);
regressor = new LARS(data, responses, (transposedata == 1), (useCholesky == 1), gramMatrix, lambda1, lambda2, tol);
}
// TODO: conversion of std::vector to array
// input:
// output: const std::vector<size_t>&
void activeSet(SP_integer a)
{
vector<size_t> active = regressor.ActiveSet();
for (size_t i = 0; i < active.size(); i++)
{
cout << active[i] << endl;
}
}
// input:
// output: arma::vec&
void beta( float **betaArr, SP_integer *betaSize)
{
rowvec betasolution = regressor.Beta();
*betaSize = betasolution.n_elem;
*betaArr = convertToArray(betasolution);
}
// TODO: adding matrix as a return
// input:
// output: std::vector<arma::vec>&
void betaPath()
{
}
// input: const arma::mat &data, const arma::rowvec &responses, const bool rowMajor
// output: double minimum cost error
SP_integer computeError(float *points_mat_arr, SP_integer dataSize, SP_integer dataRowNum, float *responses_arr, SP_integer responsesSize, SP_integer rowMajor)
{
if(dataSize / dataRowNum != responsesSize)
{
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, dataSize, dataRowNum);
rowvec responses = convertArrayToRowvec(responses_arr, responsesSize);
// run the model function
return regressor.ComputeError(data, responses);
}
// TODO: conversion of vector to array
// input:
// output: std::vector<double>&
void lambdaPath()
{
}
// TODO: adding matrix as a return
// input:
// output: arma::mat& upper triangular cholesky factor
void matUtriCholFactor()
{
mat UtriCholFact = regressor.MatUtriCholFactor();
}
// input: const arma::mat &points, arma::rowvec &predictions, const bool rowMajor
// output:
void predict(float *pointsArr, SP_integer pointsSize, SP_integer pointsRowNum, float **predicArr, SP_integer *predicSize, SP_integer rowMajor)
{
// 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, arma::vec& beta, const bool transposeData
// output: double minimum cost error
void train(float *dataArr, SP_integer dataSize, SP_integer dataRowNum, float *responsesArr, SP_integer responsesSize, float **betaArr, SP_integer *betaSize, SP_integer transposeData)
{
if(dataSize / dataRowNum != responsesSize)
{
cout << "Target dim doesnt fit to the Data dim" << endl;
return;
}
// convert the Prolog arrays to arma::rowvec and arma::mat
mat data = convertArrayToMat(dataArr, dataSize, dataRowNum);
rowvec responses = convertArrayToRowvec(responsesArr, responsesSize);
// run the model function
regressor.Train(data, responses);
}
// input: const arma::mat &data, const arma::rowvec &responses, const bool transposeData
// output: double minimum cost error
void trainNoBetaReturn(float *dataArr, SP_integer dataSize, SP_integer dataRowNum, float *responsesArr, SP_integer responsesSize, SP_integer transposeData)
{
if(dataSize / dataRowNum != responsesSize)
{
cout << "Target dim doesnt fit to the Data dim" << endl;
return;
}
// convert the Prolog arrays to arma::rowvec and arma::mat
rowvec responses = convertArrayToRowvec(responsesArr, responsesSize);
mat data = convertArrayToMat(dataArr, dataSize, dataRowNum);
// run the model function
regressor.Train(data, responses);
}
\ No newline at end of file
:- module(lars, [function/4, function/1, function/2, function/6]).
:- load_files(library(str_decl),
[when(compile_time), if(changed)]).
%% needed for using the array type and for reading from csv
:- use_module(library(structs)).
:- use_module('../../helper_files/helper.pl').
%% type definitions for the float array
:- foreign_type
float32 = float_32,
float_array = array(float32).
%% definitions for the connected function and what there inputs and output arguments are
%% Funktion const bool useCholesky, const double lambda1, const double lambda2, const double tolerance
foreign(initModelNoDataNoGram, c, initModelNoDataNoGram(+integer, +float32, +float32, +float32)).
%% Funktion const bool useCholesky, const arma::mat & gramMatrix, const double lambda1, const double lambda2, const double tolerance
foreign(initModelNoDataWithGram, c, initModelNoDataWithGram(+integer, +pointer(float_array), +integer, +integer, +float32, +float32, +float32)).
%% Funktion const arma::mat & dataMatrix, const arma::rowvec & responses, const bool transposeData, const bool useCholesky, const double lambda1, const double lambda2, const double tolerance
foreign(initModelWithDataNoGram, c, initModelWithDataNoGram(+pointer(float_array), +integer, +pointer(float_array), +integer, +integer, +integer, +float32, +float32, +float32)).
%% Funktion const arma::mat & dataMatrix, const arma::rowvec & responses, const bool transposeData, const bool useCholesky, const arma::mat & gramMatrix, const double lambda1, const double lambda2, const double tolerance
foreign(initModelWithDataWithGram, c, initModelWithDataWithGram(+pointer(float_array), +integer, +pointer(float_array), +integer, +integer, +integer, +pointer(float_array), +integer, +integer, +float32, +float32, +float32)).
%% TODO:
%% Funktion that takes data from Prolog
%% input
%% output const std::vector<size_t>&
foreign(activeSet, c, activeSet(+integer, +integer, +integer, +float32)).
%% Funktion that takes data from Prolog
%% input
%% output arma::vec&
foreign(beta, c, beta(+integer, +integer, +integer, +float32)).
%% TODO:
%% Funktion that takes data from Prolog
%% input
%% output std::vector<arma::vec>&
foreign(betaPath, c, betaPath(+integer, +integer, +integer, +float32)).
%% Funktion that takes data from Prolog
%% input: const arma::mat &data, const arma::rowvec &responses, const bool rowMajor
%% output: double minimum cost error
foreign(computeError, c, computeError(+pointer(float_array), +integer, +integer, +pointer(float_array), +integer, +integer, [-float32])).
%% TODO:
%% Funktion that takes data from Prolog
%% input
%% output std::vector<double>&
foreign(lambdaPath, c, lambdaPath(+integer, +integer, +integer, +float32)).
%% TODO:
%% Funktion that takes data from Prolog
%% input
%% output arma::mat& upper triangular cholesky factor
foreign(matUtriCholFactor, c, matUtriCholFactor(+integer)).
%% Funktion that takes data from Prolog
%% input const arma::mat &points, arma::rowvec &predictions, const bool rowMajor
%% output
foreign(predict, c, predict(+pointer(float_array), +integer, +integer, -pointer(float_array), -integer, +integer)).
%% Funktion that takes data from Prolog
%% input const arma::mat &data, const arma::rowvec &responses, arma::vec& beta, const bool transposeData
%% output double minimum cost error
foreign(train, c, train(+pointer(float_array), +integer, +integer, +pointer(float_array), +integer, -pointer(float_array), -integer, +integer, [-integer])).
%% Funktion that takes data from Prolog
%% input const arma::mat &data, const arma::rowvec &responses, const bool transposeData
%% output double minimum cost error
foreign(trainNoBetaReturn, c, trainNoBetaReturn(+pointer(float_array), +integer, +integer, +pointer(float_array), +integer, +integer, [-integer])).
%% Funktion that takes data from Prolog
%% input
%% output
foreign(function, c, function(+integer, +integer, +integer, +float32)).
%% Funktion that return data to Prolog
foreign(function, c, function([-integer])).
%% Funktion that returns a array
foreign(function, c, function(-integer, [-pointer(float_array)])).
%% Funktion that takes a Matrix and a Array
foreign(function, c, function(+pointer(float_array), +integer, +integer, +pointer(float_array), +integer, [-integer])).
%% Defines what functions should be connected from main.cpp
foreign_resource(lars, [
initModelNoDataNoGram,
initModelNoDataWithGram,
initModelWithDataNoGram,
initModelWithDataWithGram,
activeSet,
beta,
betaPath,
computeError,
lambdaPath,
matUtriCholFactor,
predict,
train,
trainNoBetaReturn]).
:- load_foreign_resource(lars).
\ No newline at end of file
#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 "new_method_glue.h"
#include <mlpack/methods/new_method.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 BayesianLinearRegression object so it can be accessed from all functions
BayesianLinearRegression regressor;
// input: const bool , const bool , const size_t , const double
// output: double
void initModel(SP_integer centerData, SP_integer scaleData, SP_integer nIterMax, double tol)
{
regressor = new BayesianLinearRegression((centerData == 1), (scaleData == 1), nIterMax, tol);
}
// input:
// output: double
SP_integer alpha()
{
return regressor.Alpha();
}
// input:
// output: double
SP_integer beta()
{
return regressor.Beta();
}
// input:
// output: const arma::colvec &
float * dataOffset(SP_integer *arraySize)
{
// save the DataOffset output in colvec
colvec armaDataOffset = regressor.DataOffset();
*arraySize = armaDataOffset.n_elem;
return convertArmaToArray(armaDataOffset);
}
// input:
// output: const arma::colvec &
float * dataScale(SP_integer *arraySize)
{
// save the DataScale output in colvec
colvec armaDataScale = regressor.DataScale();
*arraySize = armaDataScale.n_elem;
return convertArmaToArray(armaDataScale);
}
// input:
// output: const arma::colvec &
float * omega(SP_integer *arraySize)
{
// save the Omega output in colvec
colvec armaOmega = regressor.Omega();
*arraySize = armaOmega.n_elem;
return convertArmaToArray(armaOmega);
}
// 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 = convertArmaToArray(predictions);
}
// input: const arma::mat &points, arma::rowvec &predictions, arma::rowvec &std
// output:
void predictWithStd(float *pointsArr, SP_integer pointsSize, SP_integer pointsRowNum, float **predicArr, SP_integer *predicSize, float **stdArr, SP_integer *stdSize)
{
// 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 results in arma::rowvecs
rowvec predictions;
rowvec std;
regressor.Predict(data, predictions, std);
// give back the sizes and the converted results as arrays
*predicSize = predictions.n_elem;
*stdSize = std.n_elem;
*predicArr = convertArmaToArray(predictions);
*stdArr = convertArmaToArray(std);
}
// input:
// output: double
SP_integer responsesOffset()
{
return regressor.ResponsesOffset();
}
// input: const arma::mat &data, const arma::rowvec &responses
// output: double
SP_integer rmse(float *matrix, SP_integer matSize, SP_integer matRowNum, float *arr, SP_integer vecSize)
{
// convert the Prolog arrays to arma::rowvec and arma::mat
rowvec responses = convertArrayToRowvec(arr, vecSize);
mat data = convertArrayToMat(matrix, matSize, matRowNum);
// run the model function and return the error
return regressor.RMSE(data, responses);
}
// input: const arma::mat &data, const arma::rowvec &responses
// output:
void train(float *matrix, SP_integer matSize, SP_integer matRowNum, float *arr, SP_integer vecSize)
{
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
rowvec responses = convertArrayToRowvec(arr, vecSize);
mat data = convertArrayToMat(matrix, matSize, matRowNum);
// run the model function
regressor.Train(data, responses);
}
// input:
// output: double
SP_integer variance()
{
return regressor.Variance();
}
/*
void testing()
{
// load the iris data
mat dataset;
bool loaded = mlpack::data::Load("iris.csv", dataset);
// split the data into train and test
mat trainData = dataset.cols(1, 4);
trainData.shed_row(trainData.n_rows - 1);
rowvec trainTarget = trainData.row(trainData.n_rows - 1);
trainData.shed_row(trainData.n_rows - 1);
mat testData = dataset.col(dataset.n_cols - 1);
testData.shed_row(testData.n_rows - 1);
rowvec testTarget = testData.row(testData.n_rows - 1);
testData.shed_row(testData.n_rows - 1);
// init the bayesian linear regressor model
// train the model
regressor.Train(trainData, trainTarget);
// predict with the test data
rowvec prediction;
regressor.Predict(testData, prediction);
// compare test target and prediction
cout << "Train Data: " << trainData << endl;
cout << "Train Target: " << trainTarget << endl;
cout << "Alpha" << alpha() << endl;
cout << "Beta" << beta() << endl;
}
*/
:- module(new_method, [function/4, function/1, function/2, function/6]).
:- load_files(library(str_decl),
[when(compile_time), if(changed)]).
%% needed for using the array type and for reading from csv
:- use_module(library(structs)).
:- use_module('../../helper_files/helper.pl').
%% type definitions for the float array
:- foreign_type
float32 = float_32,
float_array = array(float32).
%% definitions for the connected function and what there inputs and output arguments are
%% Funktion that takes data from Prolog
foreign(function, c, function(+integer, +integer, +integer, +float32)).
%% Funktion that return data to Prolog
foreign(function, c, function([-integer])).
%% Funktion that returns a array
foreign(function, c, function(-integer, [-pointer(float_array)])).
%% Funktion that takes a Matrix and a Array
foreign(function, c, function(+pointer(float_array), +integer, +integer, +pointer(float_array), +integer, [-integer])).
%% Defines what functions should be connected from main.cpp
foreign_resource(new_method, [function, function, function, function]).
:- load_foreign_resource(new_method).
\ No newline at end of file
......@@ -112,7 +112,7 @@ float * parameters(SP_integer *arraySize)
*arraySize = armaDataOffset.n_elem;
// convert b vector to array and return
return convertArmaToArray(armaDataOffset);
return convertToArray(armaDataOffset);
}
// input: arma::vec & new b vector
......@@ -144,7 +144,7 @@ void predict(float *pointsArr, SP_integer pointsSize, SP_integer pointsRowNum, f
// give back the sizes and the converted results as arrays
*predicSize = predictions.n_elem;
*predicArr = convertArmaToArray(predictions);
*predicArr = convertToArray(predictions);
}
// input: const arma::mat &data, const arma::rowvec &responses, const bool intercept
......
......@@ -48,7 +48,7 @@ float * dataOffset(SP_integer *arraySize)
*arraySize = armaDataOffset.n_elem;
return convertArmaToArray(armaDataOffset);
return convertToArray(armaDataOffset);
}
// input:
......@@ -60,7 +60,7 @@ float * dataScale(SP_integer *arraySize)
*arraySize = armaDataScale.n_elem;
return convertArmaToArray(armaDataScale);
return convertToArray(armaDataScale);
}
// input:
......@@ -72,7 +72,7 @@ float * omega(SP_integer *arraySize)
*arraySize = armaOmega.n_elem;
return convertArmaToArray(armaOmega);
return convertToArray(armaOmega);
}
// input: const arma::mat &points, arma::rowvec &predictions
......@@ -90,7 +90,7 @@ void predict(float *pointsArr, SP_integer pointsSize, SP_integer pointsRowNum, f
// give back the sizes and the converted results as arrays
*predicSize = predictions.n_elem;
*predicArr = convertArmaToArray(predictions);
*predicArr = convertToArray(predictions);
}
// input: const arma::mat &points, arma::rowvec &predictions, arma::rowvec &std
......@@ -109,8 +109,8 @@ void predictWithStd(float *pointsArr, SP_integer pointsSize, SP_integer pointsRo
*predicSize = predictions.n_elem;
*stdSize = std.n_elem;
*predicArr = convertArmaToArray(predictions);
*stdArr = convertArmaToArray(std);
*predicArr = convertToArray(predictions);
*stdArr = convertToArray(std);
}
......
......@@ -15,13 +15,24 @@
%% definitions for the connected function and what there inputs and output arguments are
%% Funktion that takes data from Prolog
foreign(function, c, function(+integer, +integer, +integer, +float32)).
%% Funktion that return data to Prolog
foreign(function, c, function([-integer])).
%% Funktion that returns a array
foreign(function, c, function(-integer, [-pointer(float_array)])).
%% Funktion that takes a Matrix and a Array
foreign(function, c, function(+pointer(float_array), +integer, +integer, +pointer(float_array), +integer, [-integer])).
%% input
%% output
foreign(function, c, function(arguments)).
%% +integer , +float32
%% [-integer] , [-float32]
%% matrix input
%% +pointer(float_array), +integer, +integer
%% array input
%% +pointer(float_array), +integer
%% matrix return
%% -pointer(float_array), -integer, -integer
%% array return
%% -pointer(float_array), -integer
%% Defines what functions should be connected from main.cpp
foreign_resource(new_method, [function, function, function, function]).
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment