Skip to content
Snippets Groups Projects
Commit ed1f506a authored by Jakhes's avatar Jakhes
Browse files

Adding logistic_regression

parent 7e6c7755
No related branches found
No related tags found
No related merge requests found
splfr=/usr/local/sicstus4.7.1/bin/splfr
METHOD_NAME=logistic_regression
$(METHOD_NAME).so: $(METHOD_NAME).pl $(METHOD_NAME).cpp
$(splfr) -larmadillo -fopenmp -lmlpack -lstdc++ -cxx --struct $(METHOD_NAME).pl $(METHOD_NAME).cpp ../../helper_files/helper.cpp
clean:
rm $(METHOD_NAME).so
#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 "logistic_regression_glue.h"
#include <mlpack/methods/logistic_regression/logistic_regression.hpp>
#include <mlpack/core.hpp>
// including helper functions for converting between arma structures and arrays
#include "../../helper_files/helper.hpp"
// some of the most used namespaces
using namespace arma;
using namespace mlpack;
using namespace std;
using namespace mlpack::regression;
// Global Variable of the LogisticRegression object so it can be accessed from all functions
LogisticRegression logisticRegression;
// TODO:
// input: const MatType & predictors,
// const arma::Row< size_t > & responses,
// const arma::rowvec & initialPoint,
// const double lambda = 0
// output:
// description:
void initModelNoOptimizer(float *predictorsMatArr, SP_integer predictorsMatSize, SP_integer predictorsMatRowNum, float *responsesArr, SP_integer responsesArrSize, double lambda)
{
// convert the Prolog arrays to arma::mat
mat predictors = convertArrayToMat(predictorsMatArr, predictorsMatSize, predictorsMatRowNum);
// convert the Prolog arrays to arma::rowvec
arma::Row<size_t> responsesVector = convertArrayToVec(responsesArr, responsesArrSize);
logisticRegression = LogisticRegression(predictors, responsesVector, lambda);
}
// TODO:
// input: const MatType & predictors,
// const arma::Row< size_t > & responses,
// OptimizerType & optimizer,
// const double lambda
// output:
// description:
void initModelWithOptimizer(float *predictorsMatArr, SP_integer predictorsMatSize, SP_integer predictorsMatRowNum, float *responsesArr, SP_integer responsesArrSize, char const *optimizer, double lambda)
{
// convert the Prolog arrays to arma::mat
mat predictors = convertArrayToMat(predictorsMatArr, predictorsMatSize, predictorsMatRowNum);
// convert the Prolog arrays to arma::rowvec
arma::Row<size_t> responsesVector = convertArrayToVec(responsesArr, responsesArrSize);
logisticRegression = LogisticRegression<>(predictors.n_cols, lambda);
if (strcmp(optimizer, "lbfgs") == 0)
{
logisticRegression.Train(predictors,responsesVector);
}
else if (strcmp(optimizer, "psgd") == 0)
{
logisticRegression.Train(predictors,responsesVector, ens::ParallelSGD(100,64));
}
else
{
cout << "Wrong optimizer input" << endl;
}
}
// TODO:
// input: const VecType & point,
// const double decisionBoundary = 0.5
//
// output: size_t predicted point label
// description:
SP_integer classifyPoint(float *pointArr, SP_integer pointArrSize, double decisionBoundary)
{
// convert the Prolog arrays to arma::rowvec
rowvec pointVector = convertArrayToRowvec(pointArr, pointArrSize);
return logisticRegression.Classify(pointVector, decisionBoundary);
}
// TODO:
// input: const MatType & dataset,
// arma::Row< size_t > & labels <-,
// const double decisionBoundary = 0.5
// output:
// description:
void classifyLabels(float *dataMatArr, SP_integer dataMatSize, SP_integer dataMatRowNum, float **labelsArr, SP_integer *labelsArrSize, double decisionBoundary)
{
// convert the Prolog arrays to arma::mat
mat data = convertArrayToMat(dataMatArr, dataMatSize, dataMatRowNum);
// get the ReturnVector
Row<size_t> labelsReturnVector;
logisticRegression.Classify(data, labelsReturnVector, decisionBoundary);
// return the Vector lenght
*labelsArrSize = labelsReturnVector.n_elem;
// return the Vector as Array
*labelsArr = convertToArray(labelsReturnVector);
}
// TODO:
// input: const MatType & dataset,
// arma::mat & probabilities <-
// output:
// description:
void classifyProbs(float *dataMatArr, SP_integer dataMatSize, SP_integer dataMatRowNum, float **probsMatArr, SP_integer *probsMatColNum, SP_integer *probsMatRowNum)
{
// convert the Prolog arrays to arma::mat
mat data = convertArrayToMat(dataMatArr, dataMatSize, dataMatRowNum);
// get the ReturnMat
mat probsReturnMat;
logisticRegression.Classify(data, probsReturnMat);
// return the Matrix dimensions
*probsMatColNum = probsReturnMat.n_cols;
*probsMatRowNum = probsReturnMat.n_rows;
// return the Matrix as one long Array
*probsMatArr = convertToArray(probsReturnMat);
}
// TODO:
// input: const MatType & predictors,
// const arma::Row< size_t > & responses,
// const double decisionBoundary = 0.5
//
// output: double accuracy
// description:
double computeAccuracy(float *predictorsMatArr, SP_integer predictorsMatSize, SP_integer predictorsMatRowNum, float *responsesArr, SP_integer responsesArrSize, double decisionBoundary)
{
// convert the Prolog arrays to arma::mat
mat predictors = convertArrayToMat(predictorsMatArr, predictorsMatSize, predictorsMatRowNum);
// convert the Prolog arrays to arma::rowvec
arma::Row<size_t> responsesVector = convertArrayToVec(responsesArr, responsesArrSize);
return logisticRegression.ComputeAccuracy(predictors, responsesVector, decisionBoundary);
}
// TODO:
// input: const MatType & predictors,
// const arma::Row< size_t > & responses
//
// output: double error
// description:
double computeError(float *predictorsMatArr, SP_integer predictorsMatSize, SP_integer predictorsMatRowNum, float *responsesArr, SP_integer responsesArrSize)
{
// convert the Prolog arrays to arma::mat
mat predictors = convertArrayToMat(predictorsMatArr, predictorsMatSize, predictorsMatRowNum);
// convert the Prolog arrays to arma::rowvec
arma::Row<size_t> responsesVector = convertArrayToVec(responsesArr, responsesArrSize);
return logisticRegression.ComputeError(predictors, responsesVector);
}
// TODO:
// input: const MatType & predictors,
// const arma::Row< size_t > & responses,
// OptimizerType & optimizer,
// CallbackTypes &&... callbacks
// output:
// description:
void train(float *predictorsMatArr, SP_integer predictorsMatSize, SP_integer predictorsMatRowNum, float *responsesArr, SP_integer responsesArrSize, char const *optimizer)
{
// convert the Prolog arrays to arma::mat
mat predictors = convertArrayToMat(predictorsMatArr, predictorsMatSize, predictorsMatRowNum);
// convert the Prolog arrays to arma::rowvec
arma::Row<size_t> responsesVector = convertArrayToVec(responsesArr, responsesArrSize);
if (strcmp(optimizer, "lbfgs") == 0)
{
logisticRegression.Train(predictors,responsesVector);
}
else if (strcmp(optimizer, "psgd") == 0)
{
logisticRegression.Train(predictors,responsesVector, ens::ParallelSGD(100,64));
}
else
{
cout << "Wrong optimizer input" << endl;
}
}
\ No newline at end of file
:- module(logistic_regression, [ initModelNoOptimizer/6,
initModelWithOptimizer/7,
classifyPoint/4,
classifyLabels/6,
classifyProbs/6,
computeAccuracy/7,
computeError/6,
train/6]).
%% requirements of library(struct)
:- load_files(library(str_decl),
[when(compile_time), if(changed)]).
%% needed for using the array type
:- 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
%% TODO:
%% input:
%% output:
%% description:
foreign(initModelNoOptimizer, c, initModelNoOptimizer(+pointer(float_array), +integer, +integer, +pointer(float_array), +integer, +float32)).
%% TODO:
%% input:
%% output:
%% description:
foreign(initModelWithOptimizer, c, initModelWithOptimizer(+pointer(float_array), +integer, +integer, +pointer(float_array), +integer, +string, +float32)).
%% TODO:
%% input:
%% output:
%% description:
foreign(classifyPoint, c, classifyPoint(+pointer(float_array), +integer, +float32, [-integer])).
%% TODO:
%% input:
%% output:
%% description:
foreign(classifyLabels, c, classifyLabels(+pointer(float_array), +integer, +integer, -pointer(float_array), -integer, +float32)).
%% TODO:
%% input:
%% output:
%% description:
foreign(classifyProbs, c, classifyProbs(+pointer(float_array), +integer, +integer, -pointer(float_array), -integer, -integer)).
%% TODO:
%% input:
%% output:
%% description:
foreign(computeAccuracy, c, computeAccuracy(+pointer(float_array), +integer, +integer, +pointer(float_array), +integer, +float32, [-float32])).
%% TODO:
%% input:
%% output:
%% description:
foreign(computeError, c, computeError(+pointer(float_array), +integer, +integer, +pointer(float_array), +integer, [-float32])).
%% TODO:
%% input:
%% output:
%% description:
foreign(train, c, train(+pointer(float_array), +integer, +integer, +pointer(float_array), +integer, +string)).
%% Defines the functions that get connected from main.cpp
foreign_resource(logistic_regression, [ initModelNoOptimizer,
initModelWithOptimizer,
classifyPoint,
classifyLabels,
classifyProbs,
computeAccuracy,
computeError,
train]).
:- load_foreign_resource(logistic_regression).
\ No newline at end of file
:- use_module(library(plunit)).
:- use_module(logistic_regression).
:- use_module('../../helper_files/helper.pl').
reset_Model :-
initModel(1,0,50,0.0001).
:- begin_tests(lists).
%% alpha tests
test(alpha_std_init) :-
reset_Model,
alpha(0).
test(alpha_wrong_input, fail) :-
reset_Model,
alpha(1).
test(alpha_after_train, A =:= 9223372036854775808) :-
reset_Model,
convert_list_to_float_array([5.1,3.5,1.4,4.9,3.0,1.4,4.7,3.2,1.3,4.6,3.1,1.5],3, array(Xsize, Xrownum, X)),
convert_list_to_float_array([0.2,0.2,0.2,0.2], array(Ysize, Y)),
train(X,Xsize, Xrownum,Y, Ysize),
alpha(A).
%% train tests
test(correct_train) :-
reset_Model,
convert_list_to_float_array([5.1,3.5,1.4,4.9,3.0,1.4,4.7,3.2,1.3,4.6,3.1,1.5],3, array(Xsize, Xrownum, X)),
convert_list_to_float_array([0.2,0.2,0.2,0.2], array(Ysize, Y)),
train(X,Xsize, Xrownum,Y, Ysize).
test(false_train, fail) :-
reset_Model,
convert_list_to_float_array([],3, array(Xsize, Xrownum, X)),
convert_list_to_float_array([0.2,0.2,0.2,0.2], array(Ysize, Y)),
train(X,Xsize, Xrownum,Y, Ysize).
test(false_train2, fail) :-
reset_Model,
convert_list_to_float_array([],0, array(Xsize, Xrownum, X)),
convert_list_to_float_array([0.2,0.2,0.2,0.2], array(Ysize, Y)),
train(X,Xsize, Xrownum,Y, Ysize).
test(false_train3, fail) :-
reset_Model,
convert_list_to_float_array([1,2],0, array(Xsize, Xrownum, X)),
convert_list_to_float_array([0.2,0.2,0.2,0.2], array(Ysize, Y)),
train(X,Xsize, Xrownum,Y, Ysize).
test(false_train3, fail) :-
reset_Model,
convert_list_to_float_array([1,2,44,3],3, array(Xsize, Xrownum, X)),
convert_list_to_float_array([0.2,0.2,0.2,0.2], array(Ysize, Y)),
train(X,Xsize, Xrownum,Y, Ysize).
test(false_train4) :-
reset_Model,
convert_list_to_float_array([1,2,44,3],2, array(Xsize, Xrownum, X)),
convert_list_to_float_array([0.2,0.2,0.2,0.2], array(Ysize, Y)),
train(X,Xsize, Xrownum,Y, Ysize).
:- end_tests(lists).
\ No newline at end of file
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment