From 484dd9d096ce86ecb126077263f92dd9ee0d9ba7 Mon Sep 17 00:00:00 2001 From: Dean Samuel Schmitz <dean.schmitz@hhu.de> Date: Tue, 4 Oct 2022 21:11:55 +0000 Subject: [PATCH] Update documentation --- .../linear_regression/linear_regression.cpp | 41 +----- .../linear_regression/linear_regression.pl | 139 ++++++++++++------ .../logistic_regression.cpp | 2 +- .../logistic_regression.pl | 95 +++++++++--- 4 files changed, 174 insertions(+), 103 deletions(-) diff --git a/src/methods/linear_regression/linear_regression.cpp b/src/methods/linear_regression/linear_regression.cpp index 47b9ea2..2fa7ec5 100644 --- a/src/methods/linear_regression/linear_regression.cpp +++ b/src/methods/linear_regression/linear_regression.cpp @@ -19,7 +19,7 @@ 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) +void initModel(float *matrix, SP_integer matSize, SP_integer matRowNum, float *responses_arr, SP_integer vecSize, double lambda, SP_integer bool_intercept) { if(matSize / matRowNum != vecSize) { @@ -35,7 +35,7 @@ void initModel(float *matrix, SP_integer matSize, SP_integer matRowNum, float *r // 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) +void initModelWithWeights(float *matrix, SP_integer matSize, SP_integer matRowNum, float *responses_arr, SP_integer vecSize, float *weights_arr, SP_integer weightsSize, double lambda, SP_integer bool_intercept) { if(matSize / matRowNum != vecSize) { @@ -50,16 +50,9 @@ void initModelWithWeights(float *matrix, SP_integer matSize, SP_integer matRowNu 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) +double computeError(float *points_mat_arr, SP_integer matSize, SP_integer matRowNum, float *responses_arr, SP_integer vecSize) { if(matSize / matRowNum != vecSize) { @@ -74,30 +67,6 @@ SP_integer computeError(float *points_mat_arr, SP_integer matSize, SP_integer ma 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) @@ -149,7 +118,7 @@ void predict(float *pointsArr, SP_integer pointsSize, SP_integer pointsRowNum, f // 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) +double train(float *matrix, SP_integer matSize, SP_integer matRowNum, float *responses_arr, SP_integer vecSize, SP_integer bool_intercept) { if(matSize / matRowNum != vecSize) { @@ -166,7 +135,7 @@ SP_integer train(float *matrix, SP_integer matSize, SP_integer matRowNum, float // 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) +double 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) { diff --git a/src/methods/linear_regression/linear_regression.pl b/src/methods/linear_regression/linear_regression.pl index 9e25233..7bc477e 100644 --- a/src/methods/linear_regression/linear_regression.pl +++ b/src/methods/linear_regression/linear_regression.pl @@ -1,4 +1,12 @@ -:- module(linear_regression, [initModel/7, initModelWithWeights/9, initModelEmpty/1, computeError/6, intercept/1, lambda/1, modifyLambda/1, parameters/2, modifyParameters/2, predict/5, train/7, trainWithWeights/9]). + +:- module(linear_regression, [ initModel/7, + initModelWithWeights/9, + computeError/6, + parameters/2, + modifyParameters/2, + predict/5, + train/7, + trainWithWeights/9]). :- load_files(library(str_decl), [when(compile_time), if(changed)]). @@ -9,111 +17,146 @@ %% type definitions for the float array :- foreign_type - float32 = float_32, - float_array = array(float32). - -%% TODO: update Comment docs + float32 = float_32, + float_array = array(float32). %% definitions for the connected function and what there inputs and output arguments are -%% TODO: -%% --Input-- -%% -%% --Output-- -%% -%% --Description-- -foreign(initModel, c, initModel(+pointer(float_array), +integer, +integer, +pointer(float_array), +integer, +integer, +integer)). -%% TODO: %% --Input-- +%% mat data, +%% vec responses, +%% float32 lambda => 0.0, +%% bool intercept => (1)true / (0)false => true, %% %% --Output-- %% %% --Description-- -foreign(initModelWithWeights, c, initModelWithWeights(+pointer(float_array), +integer, +integer, +pointer(float_array), +integer, +pointer(float_array), +integer, +integer, +integer)). - -%% TODO: -%% --Input-- +%% Initializes the linear_regression model and trains it but doesnt include weights. %% -%% --Output-- -%% -%% --Description-- -foreign(initModelEmpty, c, initModelEmpty(+integer)). +foreign(initModel, c, initModel( +pointer(float_array), +integer, +integer, + +pointer(float_array), +integer, + +float32, + +integer)). -%% TODO: -%% --Input-- -%% -%% --Output-- -%% -%% --Description-- -foreign(computeError, c, computeError(+pointer(float_array), +integer, +integer, +pointer(float_array), +integer, [-integer])). -%% TODO: %% --Input-- +%% mat data, +%% vec responses, +%% vec weights, +%% float32 lambda => 0.0, +%% bool intercept => (1)true / (0)false => true, %% %% --Output-- %% %% --Description-- -foreign(intercept, c, intercept([-integer])). - -%% TODO: -%% --Input-- +%% Initializes the linear_regression model, trains it and adds weights to it. %% -%% --Output-- -%% -%% --Description-- -foreign(lambda, c, lambda([-integer])). +foreign(initModelWithWeights, c, initModelWithWeights( +pointer(float_array), +integer, +integer, + +pointer(float_array), +integer, + +pointer(float_array), +integer, + +float32, + +integer)). + -%% TODO: %% --Input-- +%% mat points, +%% vec responses %% %% --Output-- +%% float32 error %% %% --Description-- -foreign(modifyLambda, c, modifyLambda(+integer)). +%% Calculate the L2 squared error on the given predictors and responses using this linear regression model. +%% +foreign(computeError, c, computeError( +pointer(float_array), +integer, +integer, + +pointer(float_array), +integer, + [-float32])). + -%% TODO: %% --Input-- %% %% --Output-- +%% vec parameters %% %% --Description-- +%% Get the parameters (the b vector). +%% foreign(parameters, c, parameters([-pointer(float_array)], -integer)). -%% TODO: + %% --Input-- +%% vec parameters %% %% --Output-- %% %% --Description-- +%% Modify the parameters (the b vector). +%% foreign(modifyParameters, c, modifyParameters(+pointer(float_array), +integer)). -%% TODO: + %% --Input-- +%% mat points %% %% --Output-- +%% vec responses %% %% --Description-- -foreign(predict, c, predict(+pointer(float_array), +integer, +integer, -pointer(float_array), -integer)). +%% Calculate y_i for each data point in points. +%% +foreign(predict, c, predict( +pointer(float_array), +integer, +integer, + -pointer(float_array), -integer)). + -%% TODO: %% --Input-- +%% mat data, +%% vec responses, +%% bool intercept => (1)true / (0)false => true, %% %% --Output-- +%% float32 least quares error after training %% %% --Description-- -foreign(train, c, train(+pointer(float_array), +integer, +integer, +pointer(float_array), +integer, +integer, [-integer])). +%% Train the linear_regression model on the given data. +%% Careful! +%% This will completely ignore and overwrite the existing model. This particular implementation does not have an incremental training algorithm. +%% +foreign(train, c, train( +pointer(float_array), +integer, +integer, + +pointer(float_array), +integer, + +integer, + [-float32])). + -%% TODO: %% --Input-- +%% mat data, +%% vec responses, +%% vec weights, +%% bool intercept => (1)true / (0)false => true, %% %% --Output-- +%% float32 least quares error after training %% %% --Description-- -foreign(trainWithWeights, c, trainWithWeights(+pointer(float_array), +integer, +integer, +pointer(float_array), +integer, +pointer(float_array), +integer, +integer, [-integer])). +%% Train the linear_regression model on the given data and weights. +%% Careful! +%% This will completely ignore and overwrite the existing model. This particular implementation does not have an incremental training algorithm. +%% +foreign(trainWithWeights, c, trainWithWeights( +pointer(float_array), +integer, +integer, + +pointer(float_array), +integer, + +pointer(float_array), +integer, + +integer, + [-float32])). %% Defines what functions should be connected from main.cpp -foreign_resource(linear_regression, [initModel, initModelWithWeights, initModelEmpty, computeError, intercept, lambda, modifyLambda, parameters, modifyParameters, predict, train, trainWithWeights]). +foreign_resource(linear_regression, [ initModel, + initModelWithWeights, + computeError, + parameters, + modifyParameters, + predict, + train, + trainWithWeights]). :- load_foreign_resource(linear_regression). diff --git a/src/methods/logistic_regression/logistic_regression.cpp b/src/methods/logistic_regression/logistic_regression.cpp index 4f79bf1..f206bda 100644 --- a/src/methods/logistic_regression/logistic_regression.cpp +++ b/src/methods/logistic_regression/logistic_regression.cpp @@ -183,4 +183,4 @@ void train(float *predictorsMatArr, SP_integer predictorsMatSize, SP_integer pre { cout << "Wrong optimizer input" << endl; } -} \ No newline at end of file +} diff --git a/src/methods/logistic_regression/logistic_regression.pl b/src/methods/logistic_regression/logistic_regression.pl index 8a1ab26..ea7b70a 100644 --- a/src/methods/logistic_regression/logistic_regression.pl +++ b/src/methods/logistic_regression/logistic_regression.pl @@ -1,3 +1,4 @@ + :- module(logistic_regression, [ initModelNoOptimizer/6, initModelWithOptimizer/7, classifyPoint/4, @@ -17,74 +18,132 @@ %% type definitions for the float array :- foreign_type - float32 = float_32, - float_array = array(float32). + float32 = float_32, + float_array = array(float32). %% definitions for the connected function -%% TODO: + %% --Input-- +%% mat data, +%% vec responses, +%% float32 lambda => 0.0 %% %% --Output-- %% %% --Description-- -foreign(initModelNoOptimizer, c, initModelNoOptimizer(+pointer(float_array), +integer, +integer, +pointer(float_array), +integer, +float32)). +%% Initialize the logistic_regression model without specifing a optimizer. +%% +foreign(initModelNoOptimizer, c, initModelNoOptimizer( +pointer(float_array), +integer, +integer, + +pointer(float_array), +integer, + +float32)). + -%% TODO: %% --Input-- +%% mat data, +%% vec responses, +%% string optimizer => "lbfgs", "psgd" => lbfgs, +%% float32 lambda => 0.0 %% %% --Output-- %% %% --Description-- -foreign(initModelWithOptimizer, c, initModelWithOptimizer(+pointer(float_array), +integer, +integer, +pointer(float_array), +integer, +string, +float32)). +%% Initialize the logistic_regression model and specify the optimizer. +%% +foreign(initModelWithOptimizer, c, initModelWithOptimizer( +pointer(float_array), +integer, +integer, + +pointer(float_array), +integer, + +string, + +float32)). + -%% TODO: %% --Input-- +%% vec point, +%% float32 decisionBoundary => 0.5 %% %% --Output-- +%% int predicLabel %% %% --Description-- -foreign(classifyPoint, c, classifyPoint(+pointer(float_array), +integer, +float32, [-integer])). +%% Classify the given point. +%% +foreign(classifyPoint, c, classifyPoint(+pointer(float_array), +integer, + +float32, + [-integer])). + -%% TODO: %% --Input-- +%% mat data, +%% float32 decisionBoundary => 0.5 %% %% --Output-- +%% vec predicLabels %% %% --Description-- -foreign(classifyLabels, c, classifyLabels(+pointer(float_array), +integer, +integer, -pointer(float_array), -integer, +float32)). +%% Classify the given points, returning the predicted labels for each point. +%% +foreign(classifyLabels, c, classifyLabels( +pointer(float_array), +integer, +integer, + -pointer(float_array), -integer, + +float32)). + -%% TODO: %% --Input-- +%% mat data %% %% --Output-- +%% mat probabilities %% %% --Description-- -foreign(classifyProbs, c, classifyProbs(+pointer(float_array), +integer, +integer, -pointer(float_array), -integer, -integer)). +%% Classify the given points, returning class probabilities for each point. +%% +foreign(classifyProbs, c, classifyProbs(+pointer(float_array), +integer, +integer, + -pointer(float_array), -integer, -integer)). + -%% TODO: %% --Input-- +%% mat data, +%% vec responses, +%% float32 decisionBoundary => 0.5 %% %% --Output-- +%% float32 accuracy %% %% --Description-- -foreign(computeAccuracy, c, computeAccuracy(+pointer(float_array), +integer, +integer, +pointer(float_array), +integer, +float32, [-float32])). +%% Compute the accuracy of the model on the given predictors and responses, using the given decision boundary. +%% +foreign(computeAccuracy, c, computeAccuracy( +pointer(float_array), +integer, +integer, + +pointer(float_array), +integer, + +float32, + [-float32])). + -%% TODO: %% --Input-- +%% mat data, +%% vec responses, %% %% --Output-- +%% float32 error %% %% --Description-- -foreign(computeError, c, computeError(+pointer(float_array), +integer, +integer, +pointer(float_array), +integer, [-float32])). +%% Compute the error of the model. +%% +foreign(computeError, c, computeError( +pointer(float_array), +integer, +integer, + +pointer(float_array), +integer, + [-float32])). + -%% TODO: %% --Input-- +%% mat data, +%% vec responses, +%% string optimizer => "lbfgs", "psgd" => lbfgs %% %% --Output-- %% %% --Description-- -foreign(train, c, train(+pointer(float_array), +integer, +integer, +pointer(float_array), +integer, +string)). +%% Train the logistic_regression model on the given input data. +%% +foreign(train, c, train(+pointer(float_array), +integer, +integer, + +pointer(float_array), +integer, + +string)). %% Defines the functions that get connected from main.cpp -- GitLab