diff --git a/Makefile b/Makefile index c26c27042dae4be62ea2aea2eeb9a27e133c1584..c82eb0ecdc9acd711b3cf44310c35e5fb00954b7 100644 --- a/Makefile +++ b/Makefile @@ -5,6 +5,7 @@ all: make -C src/methods/ada_boost splfr=$(SPLFR_PATH) make -C src/methods/bayesian_linear_regression splfr=$(SPLFR_PATH) make -C src/methods/dbscan splfr=$(SPLFR_PATH) + make -C src/methods/emst splfr=$(SPLFR_PATH) make -C src/methods/kmeans splfr=$(SPLFR_PATH) make -C src/methods/lars splfr=$(SPLFR_PATH) make -C src/methods/linear_regression splfr=$(SPLFR_PATH) @@ -20,6 +21,7 @@ clean: make -C src/methods/ada_boost clean make -C src/methods/bayesian_linear_regression clean make -C src/methods/dbscan clean + make -C src/methods/emst clean make -C src/methods/kmeans clean make -C src/methods/lars clean make -C src/methods/linear_regression clean diff --git a/src/methods/emst/Makefile b/src/methods/emst/Makefile new file mode 100644 index 0000000000000000000000000000000000000000..8dc7eeb79a3e2e2311e023be2f19a742a43acfee --- /dev/null +++ b/src/methods/emst/Makefile @@ -0,0 +1,8 @@ +splfr=/usr/local/sicstus4.7.1/bin/splfr + +METHOD_NAME=emst + +$(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 diff --git a/src/methods/emst/emst.cpp b/src/methods/emst/emst.cpp new file mode 100644 index 0000000000000000000000000000000000000000..d55001e940415a95f068465c961a0b5c603e72c2 --- /dev/null +++ b/src/methods/emst/emst.cpp @@ -0,0 +1,42 @@ +#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 "emst_glue.h" +#include <mlpack/methods/emst/dtb.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::emst; + + + +// TODO: +// input: const MatType & dataset, +// const bool naive = false, +// const MetricType metric = MetricType(), +// arma::mat & results <- +// output: +// description: +void emst(float *dataMatArr, SP_integer dataMatSize, SP_integer dataMatRowNum, SP_integer naive, float **resultsMatArr, SP_integer *resultsMatColNum, SP_integer *resultsMatRowNum) +{ + // convert the Prolog arrays to arma::mat + mat data = convertArrayToMat(dataMatArr, dataMatSize, dataMatRowNum); + // create the ReturnMat + mat resultsReturnMat; + + DualTreeBoruvka(data, (naive == 1)).ComputeMST(resultsReturnMat); + + // return the Matrix dimensions + *resultsMatColNum = resultsReturnMat.n_cols; + *resultsMatRowNum = resultsReturnMat.n_rows; + + // return the Matrix as one long Array + *resultsMatArr = convertToArray(resultsReturnMat); +} \ No newline at end of file diff --git a/src/methods/emst/emst.pl b/src/methods/emst/emst.pl new file mode 100644 index 0000000000000000000000000000000000000000..2cc37b23f94964128c26636980d0185eede7230e --- /dev/null +++ b/src/methods/emst/emst.pl @@ -0,0 +1,46 @@ +:- module(emst, [emst/7]). + +%% 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-- +%% +%% --Output-- +%% +%% --Description-- +foreign(emst, c, emst(+pointer(float_array), +integer, +integer, +integer, -pointer(float_array), -integer, -integer)). + + + +%% +integer , +float32, +string +%% [-integer] , [-float32], [-string] + +%% matrix input +%% +pointer(float_array), +integer, +integer + +%% array input +%% +pointer(float_array), +integer + +%% matrix return +%% -pointer(float_array), -integer, -integer + +%% array return +%% -pointer(float_array), -integer + +%% Defines the functions that get connected from main.cpp +foreign_resource(emst, [emst]). + +:- load_foreign_resource(emst). \ No newline at end of file diff --git a/src/methods/emst/emst_test.pl b/src/methods/emst/emst_test.pl new file mode 100644 index 0000000000000000000000000000000000000000..9a56d68a1b576b085eccfdfa6e1a8c2f5058ba73 --- /dev/null +++ b/src/methods/emst/emst_test.pl @@ -0,0 +1,56 @@ +:- use_module(library(plunit)). + +:- use_module(emst). +:- 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