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

Adding ApproxKNF

parent 164bec64
No related branches found
No related tags found
No related merge requests found
......@@ -16,6 +16,7 @@ all:
make -C src/methods/perceptron splfr=$(SPLFR_PATH)
make -C src/methods/random_forest splfr=$(SPLFR_PATH)
make -C src/methods/softmac_regression splfr=$(SPLFR_PATH)
make -C src/methods/approx_kfn splfr=$(SPLFR_PATH)
clean:
make -C src/methods/ada_boost clean
......@@ -32,3 +33,6 @@ clean:
make -C src/methods/perceptron clean
make -C src/methods/random_forest clean
make -C src/methods/softmac_regression clean
make -C src/methods/approx_kfn clean
\ No newline at end of file
splfr=/usr/local/sicstus4.7.1/bin/splfr
METHOD_NAME=approx_kfn
$(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 "approx_kfn_glue.h"
#include <mlpack/methods/approx_kfn/drusilla_select.hpp>
#include <mlpack/methods/approx_kfn/qdafn.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::neighbor;
// Global Variable of the DrusillaSelect object so it can be accessed from all functions
DrusillaSelect drusillaSelect;
// Global Variable of the QDAFN object so it can be accessed from all functions
QDAFN qdafn;
// TODO:
// input: const size_t l,
// const size_t m
// output:
// description:
void initDrusillaModelNoTrain(SP_integer l, SP_integer m)
{
drusillaSelect = DrusillaSelect(l, m);
}
// TODO:
// input: const MatType & referenceSet,
// const size_t l,
// const size_t m
// output:
// description:
void initDrusillaModelWithTrain(float *referenceSetMatArr, SP_integer referenceSetMatSize, SP_integer referenceSetMatRowNum, SP_integer l, SP_integer m)
{
// convert the Prolog arrays to arma::mat
mat referenceSet = convertArrayToMat(referenceSetMatArr, referenceSetMatSize, referenceSetMatRowNum);
drusillaSelect = DrusillaSelect(referenceSet, l, m);
}
// TODO:
// input: const MatType & querySet,
// const size_t k,
// arma::Mat< size_t > & neighbors,
// arma::mat & distances
// output:
// description:
void searchDrusilla(float *querySetMatArr, SP_integer querySetMatSize, SP_integer querySetMatRowNum,
SP_integer k,
float **neighborsMatArr, SP_integer *neighborsMatColNum, SP_integer *neighborsMatRowNum,
float **distancesMatArr, SP_integer *distancesMatColNum, SP_integer *distancesMatRowNum)
{
// convert the Prolog arrays to arma::mat
mat querySet = convertArrayToMat(querySetMatArr, querySetMatSize, querySetMatRowNum);
// create the ReturnMat
mat neighborsReturnMat;
// create the ReturnMat
mat distancesReturnMat;
drusillaSelect.Search(querySet, k, neighborsReturnMat, distancesReturnMat);
// return the Matrix dimensions
*neighborsMatColNum = neighborsReturnMat.n_cols;
*neighborsMatRowNum = neighborsReturnMat.n_rows;
// return the Matrix as one long Array
*neighborsMatArr = convertToArray(neighborsReturnMat);
// return the Matrix dimensions
*distancesMatColNum = distancesReturnMat.n_cols;
*distancesMatRowNum = distancesReturnMat.n_rows;
// return the Matrix as one long Array
*distancesMatArr = convertToArray(distancesReturnMat);
}
// TODO:
// input: const MatType & referenceSet,
// const size_t l = 0,
// const size_t m = 0
// output:
// description:
void trainDrusilla(float *referenceSetMatArr, SP_integer referenceSetMatSize, SP_integer referenceSetMatRowNum, SP_integer l, SP_integer m)
{
// convert the Prolog arrays to arma::mat
mat referenceSet = convertArrayToMat(referenceSetMatArr, referenceSetMatSize, referenceSetMatRowNum);
drusillaSelect.Train(referenceSet, l, m);
}
// TODO:
// input: const size_t l,
// const size_t m
// output:
// description:
void initQDAFNModelNoTrain(SP_integer l, SP_integer m)
{
qdafn = QDAFN(l, m);
}
// TODO:
// input: const MatType & referenceSet,
// const size_t l,
// const size_t m
// output:
// description:
void initQDAFNModelWithTrain(float *referenceSetMatArr, SP_integer referenceSetMatSize, SP_integer referenceSetMatRowNum, SP_integer l, SP_integer m)
{
// convert the Prolog arrays to arma::mat
mat referenceSet = convertArrayToMat(referenceSetMatArr, referenceSetMatSize, referenceSetMatRowNum);
qdafn = QDAFN(referenceSet, l, m);
}
// TODO:
// input: const MatType & querySet,
// const size_t k,
// arma::Mat< size_t > & neighbors,
// arma::mat & distances
// output:
// description:
void searchQDAFN(float *querySetMatArr, SP_integer querySetMatSize, SP_integer querySetMatRowNum,
SP_integer k,
float **neighborsMatArr, SP_integer *neighborsMatColNum, SP_integer *neighborsMatRowNum,
float **distancesMatArr, SP_integer *distancesMatColNum, SP_integer *distancesMatRowNum)
{
// convert the Prolog arrays to arma::mat
mat querySet = convertArrayToMat(querySetMatArr, querySetMatSize, querySetMatRowNum);
// create the ReturnMat
mat neighborsReturnMat;
// create the ReturnMat
mat distancesReturnMat;
qdafn.Search(querySet, k, neighborsReturnMat, distancesReturnMat);
// return the Matrix dimensions
*neighborsMatColNum = neighborsReturnMat.n_cols;
*neighborsMatRowNum = neighborsReturnMat.n_rows;
// return the Matrix as one long Array
*neighborsMatArr = convertToArray(neighborsReturnMat);
// return the Matrix dimensions
*distancesMatColNum = distancesReturnMat.n_cols;
*distancesMatRowNum = distancesReturnMat.n_rows;
// return the Matrix as one long Array
*distancesMatArr = convertToArray(distancesReturnMat);
}
// TODO:
// input: const MatType & referenceSet,
// const size_t l = 0,
// const size_t m = 0
// output:
// description:
void trainQDAFN(float *referenceSetMatArr, SP_integer referenceSetMatSize, SP_integer referenceSetMatRowNum, SP_integer l, SP_integer m)
{
// convert the Prolog arrays to arma::mat
mat referenceSet = convertArrayToMat(referenceSetMatArr, referenceSetMatSize, referenceSetMatRowNum);
qdafn.Train(referenceSet, l, m);
}
\ No newline at end of file
:- module(approx_kfn, [ initDrusillaModelNoTrain/2,
initDrusillaModelWithTrain/5,
searchDrusilla/10,
trainDrusilla/5,
initQDAFNModelNoTrain/2,
initQDAFNModelWithTrain/5,
searchQDAFN/10,
trainQDAFN/5]).
%% 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--
%% int l,
%% int m
%%
%% --Output--
%%
%% --Description--
foreign(initDrusillaModelNoTrain, c, initDrusillaModelNoTrain(+integer, +integer)).
%% TODO:
%% --Input--
%% mat referenceSet,
%% int l,
%% int m
%%
%% --Output--
%%
%% --Description--
foreign(initDrusillaModelWithTrain, c, initDrusillaModelWithTrain(+pointer(float_array), +integer, +integer, +integer, +integer)).
%% TODO:
%% --Input--
%% mat querySet,
%% int k
%%
%% --Output--
%% mat neighbors,
%% mat distances
%%
%% --Description--
foreign(searchDrusilla, c, searchDrusilla(+pointer(float_array), +integer, +integer, +integer, -pointer(float_array), -integer, -integer, -pointer(float_array), -integer, -integer)).
%% TODO:
%% --Input--
%% mat referenceSet,
%% int l => 0,
%% int m => 0
%%
%% --Output--
%%
%% --Description--
foreign(trainDrusilla, c, trainDrusilla(+pointer(float_array), +integer, +integer, +integer, +integer)).
%% TODO:
%% --Input--
%% int l,
%% int m
%%
%% --Output--
%%
%% --Description--
foreign(initQDAFNModelNoTrain, c, initQDAFNModelNoTrain(+integer, +integer)).
%% TODO:
%% --Input--
%% mat referenceSet,
%% int l,
%% int m
%%
%% --Output--
%%
%% --Description--
foreign(initQDAFNModelWithTrain, c, initQDAFNModelWithTrain(+pointer(float_array), +integer, +integer, +integer, +integer)).
%% TODO:
%% --Input--
%% mat querySet,
%% int k
%%
%% --Output--
%% mat neighbors,
%% mat distances
%%
%% --Description--
foreign(searchQDAFN, c, searchQDAFN(+pointer(float_array), +integer, +integer, +integer, -pointer(float_array), -integer, -integer, -pointer(float_array), -integer, -integer)).
%% TODO:
%% --Input--
%% mat referenceSet,
%% int l => 0,
%% int m => 0
%%
%% --Output--
%%
%% --Description--
foreign(trainQDAFN, c, trainQDAFN(+pointer(float_array), +integer, +integer, +integer, +integer)).
%% Defines the functions that get connected from main.cpp
foreign_resource(approx_kfn, [ initDrusillaModelNoTrain,
initDrusillaModelWithTrain,
searchDrusilla,
trainDrusilla,
initQDAFNModelNoTrain,
initQDAFNModelWithTrain,
searchQDAFN,
trainQDAFN]).
:- load_foreign_resource(approx_kfn).
\ No newline at end of file
:- use_module(library(plunit)).
:- use_module(approx_kfn).
:- 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