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

Adding pca

parent 7913021e
Branches
No related tags found
No related merge requests found
splfr=/usr/local/sicstus4.7.1/bin/splfr
METHOD_NAME=pca
$(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 "pca_glue.h"
#include <mlpack/methods/pca/pca.hpp>
#include <mlpack/core.hpp>
#include <mlpack/methods/pca/decomposition_policies/randomized_svd_method.hpp>
#include <mlpack/methods/pca/decomposition_policies/randomized_block_krylov_method.hpp>
#include <mlpack/methods/pca/decomposition_policies/quic_svd_method.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::pca;
// TODO:
// input: const bool scaleData = false,
// const DecompositionPolicy & decomposition = DecompositionPolicy(),
// const arma::mat & data,
// arma::mat & transformedData,
// arma::vec & eigVal,
// arma::mat & eigvec
// output:
// description:
void pca(SP_integer scaleData, char const *decompositionPolicy,
float *dataMatArr, SP_integer dataMatSize, SP_integer dataMatRowNum,
float **transformedMatArr, SP_integer *transformedMatColNum, SP_integer *transformedMatRowNum,
float **eigValArr, SP_integer *eigValArrSize,
float **eigVecMatArr, SP_integer *eigVecMatColNum, SP_integer *eigVecMatRowNum)
{
// convert the Prolog arrays 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)
{
PCA<ExactSVDPolicy>((scaleData == 1)).Apply(data, transformedReturnMat, eigValReturnVector, eigVecReturnMat);
}
else if (strcmp(decompositionPolicy, "randomized") == 0)
{
PCA<RandomizedSVDPolicy>((scaleData == 1)).Apply(data, transformedReturnMat, eigValReturnVector, eigVecReturnMat);
}
else if (strcmp(decompositionPolicy, "randomized-block-krylov") == 0)
{
PCA<RandomizedBlockKrylovSVDPolicy>((scaleData == 1)).Apply(data, transformedReturnMat, eigValReturnVector, eigVecReturnMat);
}
else if (strcmp(decompositionPolicy, "quic") == 0)
{
PCA<QUICSVDPolicy>((scaleData == 1)).Apply(data, transformedReturnMat, eigValReturnVector, eigVecReturnMat);
}
else
{
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);
}
// TODO:
// input: const bool scaleData = false,
// const DecompositionPolicy & decomposition = DecompositionPolicy(),
// arma::mat & data,
// const size_t newDimension
// output:
// description:
double pcaDimReduction(SP_integer scaleData, char const *decompositionPolicy,
float *dataMatArr, SP_integer dataMatSize, SP_integer dataMatRowNum,
SP_integer newDimension,
float **transformedMatArr, SP_integer *transformedMatColNum, SP_integer *transformedMatRowNum)
{
// convert the Prolog arrays to arma::mat
mat data = convertArrayToMat(dataMatArr, dataMatSize, dataMatRowNum);
double returnValue;
// decide for the decomposition Policy
if (strcmp(decompositionPolicy, "exact") == 0)
{
returnValue = PCA<ExactSVDPolicy>((scaleData == 1)).Apply(data, (size_t)newDimension);
}
else if (strcmp(decompositionPolicy, "randomized") == 0)
{
returnValue = PCA<RandomizedSVDPolicy>((scaleData == 1)).Apply(data, (size_t)newDimension);
}
else if (strcmp(decompositionPolicy, "randomized-block-krylov") == 0)
{
returnValue = PCA<RandomizedBlockKrylovSVDPolicy>((scaleData == 1)).Apply(data, (size_t)newDimension);
}
else if (strcmp(decompositionPolicy, "quic") == 0)
{
returnValue = PCA<QUICSVDPolicy>((scaleData == 1)).Apply(data, (size_t)newDimension);
}
else
{
cout << "wrong decompositionPolicy input" << endl;
returnValue = -1.0;
}
// return the Matrix
returnMatrixInformation(data, transformedMatArr, transformedMatColNum, transformedMatRowNum);
return returnValue;
}
// TODO:
// input: const bool scaleData = false,
// const DecompositionPolicy & decomposition = DecompositionPolicy(),
// arma::mat & data,
// const double varRetained
// output:
// description:
double pcaVarianceDimReduction(SP_integer scaleData, char const *decompositionPolicy,
float *dataMatArr, SP_integer dataMatSize, SP_integer dataMatRowNum,
double varRetained,
float **transformedMatArr, SP_integer *transformedMatColNum, SP_integer *transformedMatRowNum)
{
// convert the Prolog arrays to arma::mat
mat data = convertArrayToMat(dataMatArr, dataMatSize, dataMatRowNum);
double returnValue;
// decide for the decomposition Policy
if (strcmp(decompositionPolicy, "exact") == 0)
{
returnValue = PCA<ExactSVDPolicy>((scaleData == 1)).Apply(data, varRetained);
}
else if (strcmp(decompositionPolicy, "randomized") == 0)
{
returnValue = PCA<RandomizedSVDPolicy>((scaleData == 1)).Apply(data, varRetained);
}
else if (strcmp(decompositionPolicy, "randomized-block-krylov") == 0)
{
returnValue = PCA<RandomizedBlockKrylovSVDPolicy>((scaleData == 1)).Apply(data, varRetained);
}
else if (strcmp(decompositionPolicy, "quic") == 0)
{
returnValue = PCA<QUICSVDPolicy>((scaleData == 1)).Apply(data, varRetained);
}
else
{
cout << "wrong decompositionPolicy input" << endl;
returnValue = -1.0;
}
// return the Matrix
returnMatrixInformation(data, transformedMatArr, transformedMatColNum, transformedMatRowNum);
return returnValue;
}
\ No newline at end of file
:- module(pca, [pca/13,
pcaDimReduction/10,
pcaVarianceDimReduction/10]).
%% 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--
%% bool scaleData => (1)true / (0)false,
%% string decompositionPolicy "exact", "randomized", "randomized-block-krylov", "quic",
%% mat data,
%%
%% --Output--
%% mat transformedData,
%% vec eigValues,
%% mat eigVectors
%%
%% --Description--
foreign(pca, c, pca( +integer, +string,
+pointer(float_array), +integer, +integer,
-pointer(float_array), -integer, -integer,
-pointer(float_array), -integer,
-pointer(float_array), -integer, -integer)).
%% TODO:
%% --Input--
%% bool scaleData => (1)true / (0)false,
%% string decompositionPolicy "exact", "randomized", "randomized-block-krylov", "quic",
%% mat data,
%% int newDimension
%%
%% --Output--
%% mat transformedData,
%% float32 Amount of Variance retained => [0,1]
%%
%% --Description--
foreign(pcaDimReduction, c, pcaDimReduction( +integer, +string,
+pointer(float_array), +integer, +integer,
+integer,
-pointer(float_array), -integer, -integer,
[-float32])).
%% TODO:
%% --Input--
%% bool scaleData => (1)true / (0)false,
%% string decompositionPolicy "exact", "randomized", "randomized-block-krylov", "quic",
%% mat data,
%% float32 varRetained => [0,1]
%%
%% --Output--
%% mat transformedData,
%% float32 Amount of Variance retained => [0,1]
%%
%% --Description--
foreign(pcaVarianceDimReduction, c, pcaVarianceDimReduction( +integer, +string,
+pointer(float_array), +integer, +integer,
+float32,
-pointer(float_array), -integer, -integer,
[-float32])).
%% Defines the functions that get connected from main.cpp
foreign_resource(pca, [ pca,
pcaDimReduction,
pcaVarianceDimReduction]).
:- load_foreign_resource(pca).
\ No newline at end of file
:- use_module(library(plunit)).
:- 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).
%% 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