diff --git a/src/methods/approx_kfn/approx_kfn.pl b/src/methods/approx_kfn/approx_kfn.pl index e426b096e133e6f5bbddcb5798e24597c97586a6..78bbf176ffc5f2d18ee4550f1c96581577d3cf89 100644 --- a/src/methods/approx_kfn/approx_kfn.pl +++ b/src/methods/approx_kfn/approx_kfn.pl @@ -31,7 +31,7 @@ %% --Output-- %% %% --Description-- -%% Initiates the DrusillaSearch Model but doesn’t train it. +%% Initiates the DrusillaSearch Model but doesnt train it. %% trainDrusilla has to be used before searchDrusilla can be used. %% foreign(initDrusillaModelNoTrain, c, initDrusillaModelNoTrain(+integer, +integer)). @@ -90,7 +90,7 @@ foreign(trainDrusilla, c, trainDrusilla(+pointer(float_array), +integer, +intege %% --Output-- %% %% --Description-- -%% Initiates the QDAFNSearch Model but doesn’t train it. +%% Initiates the QDAFNSearch Model but doesnt train it. %% trainQDAFN has to be used before searchQDAFN can be used. %% foreign(initQDAFNModelNoTrain, c, initQDAFNModelNoTrain(+integer, +integer)). diff --git a/src/methods/bayesian_linear_regression/bayesian_linear_regression.cpp b/src/methods/bayesian_linear_regression/bayesian_linear_regression.cpp index 3177d62254e0920e43332ff5bafa1591669fc0ea..67751451be589f0547459a38a561a9ea3d92b95e 100644 --- a/src/methods/bayesian_linear_regression/bayesian_linear_regression.cpp +++ b/src/methods/bayesian_linear_regression/bayesian_linear_regression.cpp @@ -17,8 +17,11 @@ 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 +// input: const bool centerData, +// const bool scaleData, +// const size_t nIterMax, +// const double tol +// output: void initModel(SP_integer centerData, SP_integer scaleData, SP_integer nIterMax, double tol) { regressor = new BayesianLinearRegression((centerData == 1), (scaleData == 1), nIterMax, tol); @@ -39,119 +42,129 @@ double beta() } // input: -// output: const arma::colvec & -float * dataOffset(SP_integer *arraySize) +// output: const arma::colvec & dataOffset +void dataOffset(float **dataOffsetArr, SP_integer *dataOffsetArrSize) { - // save the DataOffset output in colvec - colvec armaDataOffset = regressor.DataOffset(); - - *arraySize = armaDataOffset.n_elem; - - return convertToArray(armaDataOffset); + // create the ReturnVector + rowvec dataOffsetReturnVector = regressor.DataOffset(); + + // return the Vector + returnVectorInformation(dataOffsetReturnVector, dataOffsetArr, dataOffsetArrSize); } // input: -// output: const arma::colvec & -float * dataScale(SP_integer *arraySize) +// output: const arma::colvec & dataScale +void dataScale(float **dataScaleArr, SP_integer *dataScaleArrSize) { - // save the DataScale output in colvec - colvec armaDataScale = regressor.DataScale(); - - *arraySize = armaDataScale.n_elem; - - return convertToArray(armaDataScale); + // create the ReturnVector + rowvec dataScaleReturnVector = regressor.DataScale(); + + // return the Vector + returnVectorInformation(dataScaleReturnVector, dataScaleArr, dataScaleArrSize); } // input: -// output: const arma::colvec & -float * omega(SP_integer *arraySize) +// output: const arma::colvec & omega +void omega(float **omegaArr, SP_integer *omegaArrSize) { - // save the Omega output in colvec - colvec armaOmega = regressor.Omega(); - - *arraySize = armaOmega.n_elem; - - return convertToArray(armaOmega); + // create the ReturnVector + rowvec omegaReturnVector = regressor.Omega(); + + // return the Vector + returnVectorInformation(omegaReturnVector, omegaArr, omegaArrSize); } -// input: const arma::mat &points, arma::rowvec &predictions +// input: const arma::mat &points, +// arma::rowvec &predictions // output: -void predict(float *pointsArr, SP_integer pointsSize, SP_integer pointsRowNum, float **predicArr, SP_integer *predicSize) +void predict(float *pointsMatArr, SP_integer pointsMatSize, SP_integer pointsMatRowNum, float **predictionsArr, SP_integer *predictionsArrSize) { - // convert the Prolog arrays to std::vec for easy conversion to arma::mat - mat data = convertArrayToMat(pointsArr, pointsSize, pointsRowNum); + // convert the Prolog array to arma::mat + mat points = convertArrayToMat(pointsMatArr, pointsMatSize, pointsMatRowNum); + + // create the ReturnVector + rowvec predictionsReturnVector; + // run the prediction and save the result in arma::rowvec - rowvec predictions; - regressor.Predict(data, predictions); - + regressor.Predict(points, predictionsReturnVector); - // give back the sizes and the converted results as arrays - *predicSize = predictions.n_elem; - *predicArr = convertToArray(predictions); + // return the Vector + returnVectorInformation(predictionsReturnVector, predictionsArr, predictionsArrSize); } -// input: const arma::mat &points, arma::rowvec &predictions, arma::rowvec &std +// 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) +void predictWithStd(float *pointsMatArr, SP_integer pointsMatSize, SP_integer pointsMatRowNum, float **predictionsArr, SP_integer *predictionsArrSize, float **stdArr, SP_integer *stdArrSize) { - // convert the Prolog arrays to std::vec for easy conversion to arma::mat - mat data = convertArrayToMat(pointsArr, pointsSize, pointsRowNum); + // convert the Prolog array to arma::mat + mat points = convertArrayToMat(pointsMatArr, pointsMatSize, pointsMatRowNum); + + // create the ReturnVectors + rowvec predictionsReturnVector; + rowvec stdReturnVector; + - // run the prediction and save the results in arma::rowvecs - rowvec predictions; - rowvec std; - regressor.Predict(data, predictions, std); + // run the prediction and save the result in arma::rowvec + regressor.Predict(points, predictionsReturnVector, stdReturnVector); - // give back the sizes and the converted results as arrays - *predicSize = predictions.n_elem; - *stdSize = std.n_elem; - *predicArr = convertToArray(predictions); - *stdArr = convertToArray(std); + // return the Vectors + returnVectorInformation(predictionsReturnVector, predictionsArr, predictionsArrSize); + returnVectorInformation(stdReturnVector, stdArr, stdArrSize); } // input: // output: double -SP_integer responsesOffset() +double responsesOffset() { return regressor.ResponsesOffset(); } -// input: const arma::mat &data, const arma::rowvec &responses +// 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) +double rmse(float *dataMatArr, SP_integer dataMatSize, SP_integer dataMatRowNum, float *responsesArr, SP_integer responsesArrSize) { - // convert the Prolog arrays to arma::rowvec and arma::mat - rowvec responses = convertArrayToRowvec(arr, vecSize); - mat data = convertArrayToMat(matrix, matSize, matRowNum); + // convert the Prolog array to arma::mat + mat data = convertArrayToMat(dataMatArr, dataMatSize, dataMatRowNum); + + // convert the Prolog array to arma::rowvec + rowvec responsesVector = convertArrayToRowvec(responsesArr, responsesArrSize); + // run the model function and return the error - return regressor.RMSE(data, responses); + return regressor.RMSE(data, responsesVector); } -// input: const arma::mat &data, const arma::rowvec &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) +void train(float *dataMatArr, SP_integer dataMatSize, SP_integer dataMatRowNum, float *responsesArr, SP_integer responsesArrSize) { - if(matSize / matRowNum != vecSize) + if(dataMatSize / dataMatRowNum != responsesArrSize) { 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); + // convert the Prolog array to arma::mat + mat data = convertArrayToMat(dataMatArr, dataMatSize, dataMatRowNum); + + // convert the Prolog array to arma::rowvec + rowvec responsesVector = convertArrayToRowvec(responsesArr, responsesArrSize); + // run the model function - regressor.Train(data, responses); + regressor.Train(data, responsesVector); } // input: // output: double -SP_integer variance() +double variance() { return regressor.Variance(); } diff --git a/src/methods/bayesian_linear_regression/bayesian_linear_regression.pl b/src/methods/bayesian_linear_regression/bayesian_linear_regression.pl index 396a631403c2cd69315b1c15de06aa063c7159f9..ca2f5dbbe83842eeb1c176fe104b2944af496d2a 100644 --- a/src/methods/bayesian_linear_regression/bayesian_linear_regression.pl +++ b/src/methods/bayesian_linear_regression/bayesian_linear_regression.pl @@ -76,7 +76,7 @@ foreign(beta, c, beta([-float32])). %% --Description-- %% Get the mean vector computed on the features over the training points. %% -foreign(dataOffset, c, dataOffset(-integer, [-pointer(float_array)])). +foreign(dataOffset, c, dataOffset(-pointer(float_array), -integer)). %% --Input-- @@ -87,7 +87,7 @@ foreign(dataOffset, c, dataOffset(-integer, [-pointer(float_array)])). %% --Description-- %% Get the vector of standard deviations computed on the features over the training points. %% -foreign(dataScale, c, dataScale(-integer, [-pointer(float_array)])). +foreign(dataScale, c, dataScale(-pointer(float_array), -integer)). %% --Input-- @@ -98,7 +98,7 @@ foreign(dataScale, c, dataScale(-integer, [-pointer(float_array)])). %% --Description-- %% Get the solution vector. %% -foreign(omega, c, omega(-integer, [-pointer(float_array)])). +foreign(omega, c, omega(-pointer(float_array), -integer)). %% --Input-- @@ -141,7 +141,7 @@ foreign(predictWithStd, c, predictWithStd( +pointer(float_array), +integer, %% foreign(rmse, c, rmse( +pointer(float_array), +integer, +integer, +pointer(float_array), +integer, - [-integer])). + [-float32])). %% --Input-- @@ -152,7 +152,7 @@ foreign(rmse, c, rmse( +pointer(float_array), +integer, +integer, %% %% --Description-- %% Run BayesianLinearRegression. -%% The input matrix (like all mlpack matrices) should be column-major – each column is an observation and each row is a dimension. +%% The input matrix (like all mlpack matrices) should be column-major each column is an observation and each row is a dimension. %% foreign(train, c, train( +pointer(float_array), +integer, +integer, +pointer(float_array), +integer)). @@ -167,7 +167,7 @@ foreign(train, c, train( +pointer(float_array), +integer, +integer, %% Get the estimate variance. %% train/5 should be called before. %% -foreign(variance, c, variance([-integer])). +foreign(variance, c, variance([-float32])). %% Defines what functions should be connected from main.cpp foreign_resource(bayesian_linear_regression, [ initModel, diff --git a/src/methods/dbscan/dbscan.cpp b/src/methods/dbscan/dbscan.cpp index c0a1c2ddd2f277b7dfcdb17263e8031153f424fe..54a8f4609054fbdc5c0796044b535034f24b1ba6 100644 --- a/src/methods/dbscan/dbscan.cpp +++ b/src/methods/dbscan/dbscan.cpp @@ -192,52 +192,4 @@ void dbscan(double epsilon, SP_integer minPoints, SP_integer batchMode, char con cout << "wrong selectionType input" << endl; } -} - - -void takeNumberFunction(SP_integer integerNumber, double doubleNumber, char const *string) -{ - -} - -SP_integer returnNumberFunction() -{ - return 7; -} - -void takeMatrixFunction(float *givenMatArr, SP_integer givenMatSize, SP_integer givenMatRowNum) -{ - // convert the Prolog arrays to arma::mat - mat data = convertArrayToMat(givenMatArr, givenMatSize, givenMatRowNum); -} - -void takeArrayFunction(float *givenArr, SP_integer givenArrSize) -{ - // convert the Prolog arrays to arma::rowvec - rowvec givenVector = convertArrayToRowvec(givenArr, givenArrSize); -} - -void returnMatrixFunction(float **returnMatArr, SP_integer *returnMatColNum, SP_integer *returnMatRowNum) -{ - // get the ReturnMat - mat toReturnMat = rowvec(3, 3, fill::ones); - - // return the Matrix dimensions - *returnMatColNum = toReturnMat.n_cols; - *returnMatRowNum = toReturnMat.n_rows; - - // return the Matrix as one long Array - *returnMatArr = convertToArray(toReturnMat); -} - -void returnArrayFunction(float **returnArr, SP_integer *returnArrSize) -{ - // get the ReturnVector - rowvec toReturnVector = rowvec(3, fill::ones); - - // return the Vector lenght - *returnArrSize = toReturnVector.n_elem; - - // return the Vector as Array - *returnArr = convertToArray(toReturnVector); } \ No newline at end of file diff --git a/src/methods/kernel_pca/kernel_pca.cpp b/src/methods/kernel_pca/kernel_pca.cpp index 9dad7df4b073b2cf85d32a56da83b7903fa4086e..579945cc4b6d895a5616b1eaebd65587cc6dc6d2 100644 --- a/src/methods/kernel_pca/kernel_pca.cpp +++ b/src/methods/kernel_pca/kernel_pca.cpp @@ -11,7 +11,7 @@ #include <mlpack/methods/nystroem_method/ordered_selection.hpp> #include <mlpack/methods/nystroem_method/random_selection.hpp> -// including helper functions for converting between arma structures and arrays +// including helper functions for converting between arma structures and #include "../../helper_files/helper.hpp" // some of the most used namespaces @@ -64,16 +64,14 @@ void kernel_pca(char const *kernel, SP_integer centerTranformedData, SP_integer float **eigvecMatArr, SP_integer *eigvecMatColNum, SP_integer *eigvecMatRowNum, SP_integer *newDimension) { - // convert the Prolog arrays to arma::mat + // convert the Prolog array to arma::mat mat data = convertArrayToMat(dataMatArr, dataMatSize, dataMatRowNum); // create the ReturnMat mat transformedDataReturnMat; - // create the ReturnVector vec eigvalReturnVector; - // create the ReturnMat mat eigvecReturnMat; diff --git a/src/methods/kfn/kfn.cpp b/src/methods/kfn/kfn.cpp index 53a683db9c03f0c883c6253ccda3b68ab05bad69..3fb1f7c870499e89d59e9044d1d035b5bb44c7c2 100644 --- a/src/methods/kfn/kfn.cpp +++ b/src/methods/kfn/kfn.cpp @@ -35,7 +35,8 @@ void initAndBuildModel(char const *treeType, char const *algorithm, mat reference = convertArrayToMat(referenceMatArr, referenceMatSize, referenceMatRowNum); - // select the treeType + // used a good part of how it was used in the .main file + // select the treeType NSModel<FurthestNS>::TreeTypes tree = NSModel<FurthestNS>::KD_TREE; if (strcmp(treeType, "kd") == 0) @@ -110,8 +111,6 @@ void searchWithQuery( float *queryMatArr, SP_integer queryMatSize, SP_integer // create the ReturnMat Mat< size_t > neighborsReturnMat; - - // create the ReturnMat mat distancesReturnMat; @@ -136,19 +135,15 @@ void searchNoQuery( SP_integer k, float **neighborsMatArr, SP_integer *neighborsMatColNum, SP_integer *neighborsMatRowNum, float **distancesMatArr, SP_integer *distancesMatColNum, SP_integer *distancesMatRowNum) { - // create the ReturnMat + // create the ReturnMats Mat< size_t > neighborsReturnMat; - - // create the ReturnMat mat distancesReturnMat; nsModelObj.Search((size_t)k, neighborsReturnMat, distancesReturnMat); - // return the Matrix + // return the Matrices returnMatrixInformation(neighborsReturnMat, neighborsMatArr, neighborsMatColNum, neighborsMatRowNum); - - // return the Matrix returnMatrixInformation(distancesReturnMat, distancesMatArr, distancesMatColNum, distancesMatRowNum); } \ No newline at end of file diff --git a/src/methods/knn/knn.cpp b/src/methods/knn/knn.cpp index 34a4234a84e06c4d16a59fd9640bce4c62095fca..7c14966a0a8663e2ee75daced5cab95fd7edf001 100644 --- a/src/methods/knn/knn.cpp +++ b/src/methods/knn/knn.cpp @@ -37,7 +37,8 @@ void initAndBuildModel(char const *treeType, char const *algorithm, mat reference = convertArrayToMat(referenceMatArr, referenceMatSize, referenceMatRowNum); - // select the treeType + // used a good part of how it was used in the .main file + // select the treeType NSModel<NearestNS>::TreeTypes tree = NSModel<NearestNS>::KD_TREE; if (strcmp(treeType, "kd") == 0) @@ -115,18 +116,14 @@ void searchWithQuery( float *queryMatArr, SP_integer queryMatSize, SP_integer // create the ReturnMat Mat< size_t > neighborsReturnMat; - - // create the ReturnMat mat distancesReturnMat; nsModelObj.Search(move(query), (size_t)k, neighborsReturnMat, distancesReturnMat); - // return the Matrix + // return the Matrices returnMatrixInformation(neighborsReturnMat, neighborsMatArr, neighborsMatColNum, neighborsMatRowNum); - - // return the Matrix returnMatrixInformation(distancesReturnMat, distancesMatArr, distancesMatColNum, distancesMatRowNum); } @@ -143,8 +140,6 @@ void searchNoQuery( SP_integer k, { // create the ReturnMat Mat< size_t > neighborsReturnMat; - - // create the ReturnMat mat distancesReturnMat; diff --git a/src/methods/linear_regression/linear_regression.cpp b/src/methods/linear_regression/linear_regression.cpp index 2fa7ec55068e97a9e0e702b45bd6db5d4d42a507..c0c18529859c1d56bfa6226965b93e5bf5680956 100644 --- a/src/methods/linear_regression/linear_regression.cpp +++ b/src/methods/linear_regression/linear_regression.cpp @@ -17,136 +17,171 @@ 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 +// 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, double lambda, SP_integer bool_intercept) +void initModel(float *dataMatArr, SP_integer dataMatSize, SP_integer dataMatRowNum, + float *responsesArr, SP_integer responsesArrSize, + double lambda, + SP_integer bool_intercept) { - if(matSize / matRowNum != vecSize) + if(dataMatSize / dataMatRowNum != responsesArrSize) { 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); + // convert the Prolog array to arma::mat + mat data = convertArrayToMat(dataMatArr, dataMatSize, dataMatRowNum); + + // convert the Prolog array to arma::rowvec + rowvec responsesVector = convertArrayToRowvec(responsesArr, responsesArrSize); - regressor = LinearRegression(data, responses, lambda, bool_intercept); + + regressor = LinearRegression(data, responsesVector, lambda, bool_intercept); } -// input: const arma::mat &data, const arma::rowvec &responses, const arma::rowvec &weights, const double lambda, const 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, double lambda, SP_integer bool_intercept) +void initModelWithWeights(float *dataMatArr, SP_integer dataMatSize, SP_integer dataMatRowNum, + float *responsesArr, SP_integer responsesArrSize, + float *weightsArr, SP_integer weightsArrSize, + double lambda, + SP_integer bool_intercept) { - if(matSize / matRowNum != vecSize) + if(dataMatSize / dataMatRowNum != responsesArrSize) { 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); + // convert the Prolog array to arma::mat + mat data = convertArrayToMat(dataMatArr, dataMatSize, dataMatRowNum); + // convert the Prolog array to arma::rowvec + rowvec responsesVector = convertArrayToRowvec(responsesArr, responsesArrSize); + // convert the Prolog array to arma::rowvec + rowvec weightsVector = convertArrayToRowvec(weightsArr, weightsArrSize); + - regressor = LinearRegression(data, responses, weights, lambda, bool_intercept); + regressor = LinearRegression(data, responsesVector, weightsVector, lambda, bool_intercept); } -// input: const arma::mat &points, const arma::rowvec &responses +// input: const arma::mat &points, +// const arma::rowvec &responses // output: double L2SquardError -double computeError(float *points_mat_arr, SP_integer matSize, SP_integer matRowNum, float *responses_arr, SP_integer vecSize) +double computeError(float *pointsMatArr, SP_integer pointsMatSize, SP_integer pointsMatRowNum, + float *responsesArr, SP_integer responsesArrSize) { - if(matSize / matRowNum != vecSize) + if(pointsMatSize / pointsMatRowNum != responsesArrSize) { 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); + // convert the Prolog array to arma::mat + mat points = convertArrayToMat(pointsMatArr, pointsMatSize, pointsMatRowNum); + // convert the Prolog array to arma::rowvec + rowvec responsesVector = convertArrayToRowvec(responsesArr, responsesArrSize); + // run the model function - return regressor.ComputeError(data, responses); + return regressor.ComputeError(points, responsesVector); } // input: // output: const arma::vec & parameters b vector -float * parameters(SP_integer *arraySize) +void parameters(float **bArr, SP_integer *bArrSize) { - // 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); + // create the ReturnVector + rowvec bReturnVector = regressor.Parameters(); + + // return the Vector + returnVectorInformation(bReturnVector, bArr, bArrSize); } // input: arma::vec & new b vector // output: -void modifyParameters(float *paramArr, SP_integer paramSize) +void modifyParameters(float *newBArr, SP_integer newBArrSize) { - // convert array to arma:: vec - rowvec new_B_Vector = convertArrayToRowvec(paramArr, paramSize); + // convert the Prolog array to arma::rowvec + vec newBVector = convertArrayToRowvec(newBArr, newBArrSize); + // get parameter b vector ref vec& bVector = regressor.Parameters(); // set new b vector - bVector = new_B_Vector; + bVector = newBVector; } -// input: const arma::mat &points, arma::rowvec &predictions +// input: const arma::mat &points, +// arma::rowvec &predictions // output: -void predict(float *pointsArr, SP_integer pointsSize, SP_integer pointsRowNum, float **predicArr, SP_integer *predicSize) +void predict(float *pointsMatArr, SP_integer pointsMatSize, SP_integer pointsMatRowNum, + float **predicArr, SP_integer *predicArrSize) { - // convert the Prolog arrays to std::vec for easy conversion to arma::mat - mat data = convertArrayToMat(pointsArr, pointsSize, pointsRowNum); + // convert the Prolog array to arma::mat + mat points = convertArrayToMat(pointsMatArr, pointsMatSize, pointsMatRowNum); - // run the prediction and save the result in arma::rowvec - rowvec predictions; - regressor.Predict(data, predictions); + // create the ReturnVector + rowvec predicReturnVector; + + // run the predict function on the model + regressor.Predict(points, predicReturnVector); + - // give back the sizes and the converted results as arrays - *predicSize = predictions.n_elem; - - *predicArr = convertToArray(predictions); + // return the Vector + returnVectorInformation(predicReturnVector, predicArr, predicArrSize); } -// input: const arma::mat &data, const arma::rowvec &responses, const bool intercept +// input: const arma::mat &data, +// const arma::rowvec &responses, +// const bool intercept // output: -double train(float *matrix, SP_integer matSize, SP_integer matRowNum, float *responses_arr, SP_integer vecSize, SP_integer bool_intercept) +double train(float *dataMatArr, SP_integer dataMatSize, SP_integer dataMatRowNum, + float *responsesArr, SP_integer responsesArrSize, + SP_integer bool_intercept) { - if(matSize / matRowNum != vecSize) + if(dataMatSize / dataMatRowNum != responsesArrSize) { 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); + // convert the Prolog array to arma::mat + mat data = convertArrayToMat(dataMatArr, dataMatSize, dataMatRowNum); + // convert the Prolog array to arma::rowvec + rowvec responsesVector = convertArrayToRowvec(responsesArr, responsesArrSize); + // run the model train function - return regressor.Train(data, responses, (bool_intercept == 1)); + return regressor.Train(data, responsesVector, (bool_intercept == 1)); } -// input: const arma::mat &data, const arma::rowvec &responses, const arma::rowvec &weights, const bool intercept +// input: const arma::mat &data, +// const arma::rowvec &responses, +// const arma::rowvec &weights, +// const bool intercept // output: -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) +double trainWithWeights(float *dataMatArr, SP_integer dataMatSize, SP_integer dataMatRowNum, + float *responsesArr, SP_integer responsesArrSize, + float *weightsArr, SP_integer weightsArrSize, + SP_integer bool_intercept) { - if(matSize / matRowNum != vecSize) + if(dataMatSize / dataMatRowNum != responsesArrSize) { 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); + // convert the Prolog array to arma::mat + mat data = convertArrayToMat(dataMatArr, dataMatSize, dataMatRowNum); + // convert the Prolog array to arma::rowvec + rowvec responsesVector = convertArrayToRowvec(responsesArr, responsesArrSize); + rowvec weightsVector = convertArrayToRowvec(weightsArr, weightsArrSize); // run the model train function - return regressor.Train(data, responses, weights, (bool_intercept == 1)); + return regressor.Train(data, responsesVector, weightsVector, (bool_intercept == 1)); } diff --git a/src/methods/linear_regression/linear_regression.pl b/src/methods/linear_regression/linear_regression.pl index 7bc477e97a3f51382b063d63a4292edc8e1bebcb..7dbd8143622af46393042c3a56f757f99bacfc1e 100644 --- a/src/methods/linear_regression/linear_regression.pl +++ b/src/methods/linear_regression/linear_regression.pl @@ -82,7 +82,7 @@ foreign(computeError, c, computeError( +pointer(float_array), +integer, +intege %% --Description-- %% Get the parameters (the b vector). %% -foreign(parameters, c, parameters([-pointer(float_array)], -integer)). +foreign(parameters, c, parameters(-pointer(float_array), -integer)). %% --Input-- diff --git a/src/methods/lsh/lsh.cpp b/src/methods/lsh/lsh.cpp index 0780526289440cd33f3597b3bfc0c7bca5b929d8..f3d2f342795508671e64e64c482677331c17ecc5 100644 --- a/src/methods/lsh/lsh.cpp +++ b/src/methods/lsh/lsh.cpp @@ -29,7 +29,8 @@ LSHSearch lshSearch; // const size_t bucketSize = 500 // output: // description: -void initModel(float *referenceMatArr, SP_integer referenceMatSize, SP_integer referenceMatRowNum, SP_integer numProj, SP_integer numTables, double hashWidth, SP_integer secondHashSize, SP_integer bucketSize) +void initModel(float *referenceMatArr, SP_integer referenceMatSize, SP_integer referenceMatRowNum, + SP_integer numProj, SP_integer numTables, double hashWidth, SP_integer secondHashSize, SP_integer bucketSize) { // convert the Prolog arrays to arma::mat mat reference = convertArrayToMat(referenceMatArr, referenceMatSize, referenceMatRowNum); @@ -42,7 +43,8 @@ void initModel(float *referenceMatArr, SP_integer referenceMatSize, SP_integer r // const arma::Mat< size_t > & realNeighbors // output: double recall percentage [0, 1] // description: -double computeRecall(float *foundNeighborsMatArr, SP_integer foundNeighborsMatSize, SP_integer foundNeighborsMatRowNum, float *realNeighborsMatArr, SP_integer realNeighborsMatSize, SP_integer realNeighborsMatRowNum) +double computeRecall(float *foundNeighborsMatArr, SP_integer foundNeighborsMatSize, SP_integer foundNeighborsMatRowNum, + float *realNeighborsMatArr, SP_integer realNeighborsMatSize, SP_integer realNeighborsMatRowNum) { // convert the Prolog arrays to arma::mat Mat< size_t > foundNeighbors = conv_to<Mat< size_t >>::from(convertArrayToMat(foundNeighborsMatArr, foundNeighborsMatSize, foundNeighborsMatRowNum)); diff --git a/src/methods/mean_shift/mean_shift.cpp b/src/methods/mean_shift/mean_shift.cpp index 2280445ad4f0dd56cb539d863e8dd0cacc65cac7..7db14fbb0fff1698f6f72e92a8a6658bf12be387 100644 --- a/src/methods/mean_shift/mean_shift.cpp +++ b/src/methods/mean_shift/mean_shift.cpp @@ -30,30 +30,26 @@ using namespace mlpack::meanshift; // bool useSeeds = true // output: // description: -void meanShift(double radius, SP_integer maxIterations, float *dataMatArr, SP_integer dataMatSize, SP_integer dataMatRowNum, float **assignmentsArr, SP_integer *assignmentsArrSize, - float **centroidsMatArr, SP_integer *centroidsMatColNum, SP_integer *centroidsMatRowNum, SP_integer forceConvergence, SP_integer useSeeds) +void meanShift(double radius, SP_integer maxIterations, + float *dataMatArr, SP_integer dataMatSize, SP_integer dataMatRowNum, + float **assignmentsArr, SP_integer *assignmentsArrSize, + float **centroidsMatArr, SP_integer *centroidsMatColNum, SP_integer *centroidsMatRowNum, + SP_integer forceConvergence, + SP_integer useSeeds) { - // convert the Prolog arrays to arma::mat + // convert the Prolog array to arma::mat mat data = convertArrayToMat(dataMatArr, dataMatSize, dataMatRowNum); + // create the ReturnVector + arma::Row<size_t> assignmentsReturnVector; + // create the ReturnMat + mat centroidsReturnMat; - // get the ReturnVector - arma::Row<size_t> toReturnVector; - // get the ReturnMat - mat toReturnMat; + MeanShift<>(radius, maxIterations).Cluster(data, assignmentsReturnVector, centroidsReturnMat, (forceConvergence == 1), (useSeeds == 1)); - MeanShift<>(radius, maxIterations).Cluster(data, toReturnVector, toReturnMat, (forceConvergence == 1), (useSeeds == 1)); - // return the Vector lenght - *assignmentsArrSize = toReturnVector.n_elem; - - // return the Vector as Array - *assignmentsArr = convertToArray(toReturnVector); - - // return the Matrix dimensions - *centroidsMatColNum = toReturnMat.n_cols; - *centroidsMatRowNum = toReturnMat.n_rows; - - // return the Matrix as one long Array - *centroidsMatArr = convertToArray(toReturnMat); + // return the Matrix + returnMatrixInformation(centroidsReturnMat, centroidsMatArr, centroidsMatColNum, centroidsMatRowNum); + // return the Vector + returnVectorInformation(assignmentsReturnVector, assignmentsArr, assignmentsArrSize); } diff --git a/src/methods/nmf/nmf.cpp b/src/methods/nmf/nmf.cpp index de77a08d98784c422d08c327951e3e6044091693..4ecb455736330589714961f4e5e9490e36560dbd 100644 --- a/src/methods/nmf/nmf.cpp +++ b/src/methods/nmf/nmf.cpp @@ -39,10 +39,8 @@ void nmf(char const *updateRule, SP_integer maxIterations, double minResidue, // convert the Prolog arrays to arma::mat mat data = convertArrayToMat(dataMatArr, dataMatSize, dataMatRowNum); - // create the ReturnMat + // create the ReturnMats mat WReturnMat; - - // create the ReturnMat mat HReturnMat; // decide which update rule to use @@ -66,9 +64,7 @@ void nmf(char const *updateRule, SP_integer maxIterations, double minResidue, cout << "wrong updateRule input" << endl; } - // return the Matrix + // return the Matrices returnMatrixInformation(WReturnMat, WMatArr, WMatColNum, WMatRowNum); - - // return the Matrix returnMatrixInformation(HReturnMat, HMatArr, HMatColNum, HMatRowNum); } diff --git a/src/methods/pca/pca.cpp b/src/methods/pca/pca.cpp index 8ff5908542fb462dac01bbe09e926be4e5ffebf8..f08c5a805526bf8ee2ffc9d6f7d845f54d06898a 100644 --- a/src/methods/pca/pca.cpp +++ b/src/methods/pca/pca.cpp @@ -35,18 +35,17 @@ void pca(SP_integer scaleData, char const *decompositionPolicy, float **eigValArr, SP_integer *eigValArrSize, float **eigVecMatArr, SP_integer *eigVecMatColNum, SP_integer *eigVecMatRowNum) { - // convert the Prolog arrays to arma::mat + // convert the Prolog array to arma::mat mat data = convertArrayToMat(dataMatArr, dataMatSize, dataMatRowNum); // create the ReturnMat mat transformedReturnMat; - // create the ReturnVector vec eigValReturnVector; - // create the ReturnMat mat eigVecReturnMat; + // decide for the decomposition Policy if (strcmp(decompositionPolicy, "exact") == 0) { @@ -69,12 +68,11 @@ void pca(SP_integer scaleData, char const *decompositionPolicy, cout << "wrong decompositionPolicy input" << endl; } + // return the Matrix returnMatrixInformation(transformedReturnMat, transformedMatArr, transformedMatColNum, transformedMatRowNum); - // return the Vector returnVectorInformation(eigValReturnVector, eigValArr, eigValArrSize); - // return the Matrix returnMatrixInformation(eigVecReturnMat, eigVecMatArr, eigVecMatColNum, eigVecMatRowNum); } @@ -91,11 +89,12 @@ double pcaDimReduction(SP_integer scaleData, char const *decompositionPolicy, SP_integer newDimension, float **transformedMatArr, SP_integer *transformedMatColNum, SP_integer *transformedMatRowNum) { - // convert the Prolog arrays to arma::mat + // convert the Prolog array to arma::mat mat data = convertArrayToMat(dataMatArr, dataMatSize, dataMatRowNum); double returnValue; + // decide for the decomposition Policy if (strcmp(decompositionPolicy, "exact") == 0) { @@ -119,6 +118,7 @@ double pcaDimReduction(SP_integer scaleData, char const *decompositionPolicy, returnValue = -1.0; } + // return the Matrix returnMatrixInformation(data, transformedMatArr, transformedMatColNum, transformedMatRowNum); @@ -137,11 +137,12 @@ double pcaVarianceDimReduction(SP_integer scaleData, char const *decompositionPo double varRetained, float **transformedMatArr, SP_integer *transformedMatColNum, SP_integer *transformedMatRowNum) { - // convert the Prolog arrays to arma::mat + // convert the Prolog array to arma::mat mat data = convertArrayToMat(dataMatArr, dataMatSize, dataMatRowNum); double returnValue; + // decide for the decomposition Policy if (strcmp(decompositionPolicy, "exact") == 0) { @@ -165,6 +166,7 @@ double pcaVarianceDimReduction(SP_integer scaleData, char const *decompositionPo returnValue = -1.0; } + // return the Matrix returnMatrixInformation(data, transformedMatArr, transformedMatColNum, transformedMatRowNum); diff --git a/src/methods/pca/pca_test.pl b/src/methods/pca/pca_test.pl index 190603f4e28181e218e06d935c24f322abc299b5..adc117cd53f19f59047e2667f78161565f7b15cb 100644 --- a/src/methods/pca/pca_test.pl +++ b/src/methods/pca/pca_test.pl @@ -3,54 +3,17 @@ :- use_module(pca). :- 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). +test(alpha_after_train) :- + open('/home/afkjakhes/eclipse-workspace/prolog-mlpack-libary/src/data_csv/iris.csv', read, A), + take_csv_row(A, 10, B), + convert_list_to_float_array(B , 10, array(Xsize, Xrownum, X)), + pca(0, randomized, X, Xsize, Xrownum, Tansfomed, TCols, TRows, EigVal, EigValSize, EigVec, EigVecCols, EigVecRows), + convert_float_array_to_2d_list(Tansfomed, TCols, TRows, TOut), + convert_float_array_to_list(EigVal, EigValSize, EigValOut), + convert_float_array_to_2d_list(EigVec, EigVecCols, EigVecRows, EigVecOut), + print(TOut). -%% 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 diff --git a/src/methods/radical/radical.cpp b/src/methods/radical/radical.cpp index bc814228adb343d29622d5db5ffcaddfaa83f456..e2e9ce7912f4677915defc8ef8631ee374e59ac9 100644 --- a/src/methods/radical/radical.cpp +++ b/src/methods/radical/radical.cpp @@ -38,25 +38,23 @@ void initModel(double noiseStdDev, SP_integer replicates, SP_integer angles, SP_ // util::Timers & timers = IO::GetTimers() // output: // description: -void doRadical(float *xMatArr, SP_integer xMatSize, SP_integer xMatRowNum, float **yMatArr, SP_integer *yMatColNum, SP_integer *yMatRowNum, float **wMatArr, SP_integer *wMatColNum, SP_integer *wMatRowNum) +void doRadical(float *xMatArr, SP_integer xMatSize, SP_integer xMatRowNum, + float **yMatArr, SP_integer *yMatColNum, SP_integer *yMatRowNum, + float **wMatArr, SP_integer *wMatColNum, SP_integer *wMatRowNum) { - // convert the Prolog arrays to arma::mat + // convert the Prolog array to arma::mat mat x = convertArrayToMat(xMatArr, xMatSize, xMatRowNum); - // create the ReturnMat + // create the ReturnMats mat yReturnMat; - - // create the ReturnMat mat wReturnMat; radicalObj.DoRadical(x, yReturnMat, wReturnMat); - // return the Matrix + // return the Matrices returnMatrixInformation(yReturnMat, yMatArr, yMatColNum, yMatRowNum); - - // return the Matrix returnMatrixInformation(wReturnMat, wMatArr, wMatColNum, wMatRowNum); } @@ -68,7 +66,7 @@ void doRadical(float *xMatArr, SP_integer xMatSize, SP_integer xMatRowNum, float // description: double doRadical2D(float *xMatArr, SP_integer xMatSize, SP_integer xMatRowNum) { - // convert the Prolog arrays to arma::mat + // convert the Prolog array to arma::mat mat x = convertArrayToMat(xMatArr, xMatSize, xMatRowNum); return radicalObj.DoRadical2D(x); diff --git a/src/methods/random_forest/random_forest.cpp b/src/methods/random_forest/random_forest.cpp index 1ba759cbed1a23fd3d12652f1f069374dd8f6504..cd23eacee8229a82e4983dd68a3009192e66f2c0 100644 --- a/src/methods/random_forest/random_forest.cpp +++ b/src/methods/random_forest/random_forest.cpp @@ -65,13 +65,13 @@ void initModelWithTrainNoWeights(float *dataMatArr, SP_integer dataMatSize, SP_i void initModelWithTrainWithWeights(float *dataMatArr, SP_integer dataMatSize, SP_integer dataMatRowNum, float *labelsArr, SP_integer labelsArrSize, SP_integer numClasses, float *weightsArr, SP_integer weightsArrSize, SP_integer numTrees, SP_integer minimumLeafSize, double minimumGainSplit, SP_integer maximumDepth) { - // convert the Prolog arrays to arma::mat + // convert the Prolog array to arma::mat mat data = convertArrayToMat(dataMatArr, dataMatSize, dataMatRowNum); - // convert the Prolog arrays to arma::rowvec + // convert the Prolog array to arma::rowvec Row< size_t > labelsVector = convertArrayToVec(labelsArr, labelsArrSize); - // convert the Prolog arrays to arma::rowvec + // convert the Prolog array to arma::rowvec rowvec weightsVector = convertArrayToRowvec(weightsArr, weightsArrSize); @@ -86,7 +86,7 @@ void initModelWithTrainWithWeights(float *dataMatArr, SP_integer dataMatSize, SP // description: void classifyPoint(float *pointArr, SP_integer pointArrSize, SP_integer *prediction, float **probsArr, SP_integer *probsArrSize) { - // convert the Prolog arrays to arma::rowvec + // convert the Prolog array to arma::rowvec rowvec pointVector = convertArrayToRowvec(pointArr, pointArrSize); // create the ReturnVector diff --git a/src/methods/softmax_regression/softmax_regression.cpp b/src/methods/softmax_regression/softmax_regression.cpp index 56049bc9897f2c6a8f1a52ea1a78a7d5ccdf9aff..f369c2c4413966226baee6ce119e03176f2c70e7 100644 --- a/src/methods/softmax_regression/softmax_regression.cpp +++ b/src/methods/softmax_regression/softmax_regression.cpp @@ -24,7 +24,8 @@ SoftmaxRegression softmaxRegression; // const bool fitIntercept = false// // output: // description: -void initModelNoTrain(SP_integer inputSize, SP_integer numClasses, SP_integer fitIntercept) +void initModelNoTrain(SP_integer inputSize, SP_integer numClasses, + SP_integer fitIntercept) { softmaxRegression = SoftmaxRegression(inputSize, numClasses, (fitIntercept == 1)); } diff --git a/src/methods/sparse_coding/sparse_coding.cpp b/src/methods/sparse_coding/sparse_coding.cpp index fe2bbeaac3996c522a25bb1defbf3948db17b208..dda7851ed5ad938df8eb07a969afd7a4e08c7d81 100644 --- a/src/methods/sparse_coding/sparse_coding.cpp +++ b/src/methods/sparse_coding/sparse_coding.cpp @@ -32,9 +32,10 @@ SparseCoding sparseCoding; void initModelWithTrain(float *dataMatArr, SP_integer dataMatSize, SP_integer dataMatRowNum, SP_integer atoms, double lambda1, double lambda2, SP_integer maxIterations, double objTolerance, double newtonTolerance) { - // convert the Prolog arrays to arma::mat + // convert the Prolog array to arma::mat mat data = convertArrayToMat(dataMatArr, dataMatSize, dataMatRowNum); + sparseCoding = SparseCoding(data, atoms, lambda1, lambda2, maxIterations, objTolerance, newtonTolerance, RandomInitializer()); } @@ -60,14 +61,16 @@ void initModelNoTrain(SP_integer atoms, double lambda1, double lambda2, SP_integ void encode(float *dataMatArr, SP_integer dataMatSize, SP_integer dataMatRowNum, float **codesMatArr, SP_integer *codesMatColNum, SP_integer *codesMatRowNum) { - // convert the Prolog arrays to arma::mat + // convert the Prolog array to arma::mat mat data = convertArrayToMat(dataMatArr, dataMatSize, dataMatRowNum); // create the ReturnMat mat codesReturnMat; + sparseCoding.Encode(data, codesReturnMat); + // return the Matrix returnMatrixInformation(codesReturnMat, codesMatArr, codesMatColNum, codesMatRowNum); } @@ -80,8 +83,9 @@ void encode(float *dataMatArr, SP_integer dataMatSize, SP_integer dataMatRowNum, // description: double train(float *dataMatArr, SP_integer dataMatSize, SP_integer dataMatRowNum) { - // convert the Prolog arrays to arma::mat + // convert the Prolog array to arma::mat mat data = convertArrayToMat(dataMatArr, dataMatSize, dataMatRowNum); + return sparseCoding.Train(data, RandomInitializer()); } \ No newline at end of file