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

Adding kde

parent f24e4143
No related branches found
No related tags found
No related merge requests found
splfr=/usr/local/sicstus4.7.1/bin/splfr
METHOD_NAME=kde
$(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 "kde_glue.h"
#include <mlpack/methods/kde/kde_model.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::kde;
// Global Variable of the KDEModel object so it can be accessed from all functions
KDEModel kdeModel;
// TODO:
// input: const double bandwidth = 1.0,
// const double relError = KDEDefaultParams::relError,
// const double absError = KDEDefaultParams::absError,
// const KernelTypes kernelType = KernelTypes::GAUSSIAN_KERNEL,
// const TreeTypes treeType = TreeTypes::KD_TREE,
// const bool monteCarlo = KDEDefaultParams::mode,
// const double mcProb = KDEDefaultParams::mcProb,
// const size_t initialSampleSize = KDEDefaultParams::initialSampleSize,
// const double mcEntryCoef = KDEDefaultParams::mcEntryCoef,
// const double mcBreakCoef = KDEDefaultParams::mcBreakCoef,
// arma::mat && referenceSet,
// output:
// description:
void initAndBuildModel(double bandwidth, double relError, double absError,
char const *kernelType, char const *treeType, char const *algorithm,
SP_integer monteCarlo, double mcProb, SP_integer initialSampleSize, double mcEntryCoef, double mcBreakCoef,
float *referenceMatArr, SP_integer referenceMatSize, SP_integer referenceMatRowNum)
{
// convert the Prolog arrays to arma::mat
mat reference = convertArrayToMat(referenceMatArr, referenceMatSize, referenceMatRowNum);
// select the kernelType
mlpack::kde::KDEModel::KernelTypes kernelT;
if (strcmp(kernelType, "gaussian") == 0)
{
kernelT = KDEModel::GAUSSIAN_KERNEL;
}
else if (strcmp(kernelType, "epanechnikov") == 0)
{
kernelT = KDEModel::EPANECHNIKOV_KERNEL;
}
else if (strcmp(kernelType, "laplacian") == 0)
{
kernelT = KDEModel::LAPLACIAN_KERNEL;
}
else if (strcmp(kernelType, "spherical") == 0)
{
kernelT = KDEModel::SPHERICAL_KERNEL;
}
else if (strcmp(kernelType, "triangular") == 0)
{
kernelT = KDEModel::TRIANGULAR_KERNEL;
}
else
{
cout << "wrong kernelType input" << endl;
}
// select the treeType
mlpack::kde::KDEModel::TreeTypes treeT;
if (strcmp(treeType, "kd-tree") == 0)
{
treeT = KDEModel::KD_TREE;
}
else if (strcmp(treeType, "ball-tree") == 0)
{
treeT = KDEModel::BALL_TREE;
}
else if (strcmp(treeType, "cover-tree") == 0)
{
treeT = KDEModel::COVER_TREE;
}
else if (strcmp(treeType, "octree") == 0)
{
treeT = KDEModel::OCTREE;
}
else if (strcmp(treeType, "r-tree") == 0)
{
treeT = KDEModel::R_TREE;
}
else
{
cout << "wrong treeType input" << endl;
}
kdeModel = KDEModel(bandwidth, relError, absError, kernelT, treeT, (monteCarlo == 1), mcProb, initialSampleSize, mcEntryCoef, mcBreakCoef);
if (strcmp(algorithm, "dual-tree") == 0)
{
KDEMode& mode = kdeModel.Mode();
mode = KDEMode::DUAL_TREE_MODE;
}
else if (strcmp(algorithm, "single-tree") == 0)
{
KDEMode& mode = kdeModel.Mode();
mode = KDEMode::SINGLE_TREE_MODE;
}
else
{
cout << "wrong algorithm input" << endl;
}
kdeModel.BuildModel(move(reference));
}
// TODO:
// input: arma::mat && querySet,
// arma::vec & estimations <-
// output:
// description:
void evaluateWithQuery(float *querySetMatArr, SP_integer querySetMatSize, SP_integer querySetMatRowNum, float **estimationsArr, SP_integer *estimationsArrSize)
{
// convert the Prolog arrays to arma::mat
mat querySet = convertArrayToMat(querySetMatArr, querySetMatSize, querySetMatRowNum);
// create the ReturnVector
vec estimationsReturnVector;
kdeModel.Evaluate(move(querySet), estimationsReturnVector);
// return the Vector
returnVectorInformation(estimationsReturnVector, estimationsArr, estimationsArrSize);
}
// TODO:
// input: arma::vec & estimations <-
// output:
// description:
void evaluateNoQuery(float **estimationsArr, SP_integer *estimationsArrSize)
{
// create the ReturnVector
vec estimationsReturnVector;
kdeModel.Evaluate(estimationsReturnVector);
// return the Vector
returnVectorInformation(estimationsReturnVector, estimationsArr, estimationsArrSize);
}
\ No newline at end of file
:- module(kde, [ initAndBuildModel/14,
evaluateWithQuery/5,
evaluateNoQuery/2]).
%% 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--
%% float32 bandwidth => 1.0,
%% float32 relError => 0.05,
%% float32 absError => 0.0,
%% string kernelType "gaussian", "epanechnikov", "laplacian", "spherical", "triangular",
%% string treeType "kd-tree", "ball-tree", "cover-tree", "octree", "r-tree",
%% string algorithm "dual-tree", "single-tree",
%% bool monteCarlo (1)true / (0)false => false,
%% float32 mcProb => 0.95,
%% int initialSampleSize => 100,
%% float32 mcEntryCoef => 3.0,
%% float32 mcBreakCoef => 0.4,
%% mat referenceSet
%%
%% --Output--
%%
%% --Description--
foreign(initAndBuildModel, c, initAndBuildModel(+float32, +float32, +float32, +string, +string, +string, +integer, +float32, +integer, +float32, +float32, +pointer(float_array), +integer, +integer)).
%% TODO:
%% --Input--
%% mat querySet
%%
%% --Output--
%% vec estimations
%%
%% --Description--
foreign(evaluateWithQuery, c, evaluateWithQuery(+pointer(float_array), +integer, +integer, -pointer(float_array), -integer)).
%% TODO:
%% --Input--
%%
%% --Output--
%% vec estimations
%%
%% --Description--
foreign(evaluateNoQuery, c, evaluateNoQuery(-pointer(float_array), -integer)).
%% Defines the functions that get connected from main.cpp
foreign_resource(kde, [ initAndBuildModel,
evaluateWithQuery,
evaluateNoQuery]).
:- load_foreign_resource(kde).
\ No newline at end of file
:- use_module(library(plunit)).
:- use_module(kde).
:- 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