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

Adding ApproxKNF

parent 164bec64
Branches
No related tags found
No related merge requests found
...@@ -16,6 +16,7 @@ all: ...@@ -16,6 +16,7 @@ all:
make -C src/methods/perceptron splfr=$(SPLFR_PATH) make -C src/methods/perceptron splfr=$(SPLFR_PATH)
make -C src/methods/random_forest 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/softmac_regression splfr=$(SPLFR_PATH)
make -C src/methods/approx_kfn splfr=$(SPLFR_PATH)
clean: clean:
make -C src/methods/ada_boost clean make -C src/methods/ada_boost clean
...@@ -32,3 +33,6 @@ clean: ...@@ -32,3 +33,6 @@ clean:
make -C src/methods/perceptron clean make -C src/methods/perceptron clean
make -C src/methods/random_forest clean make -C src/methods/random_forest clean
make -C src/methods/softmac_regression 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