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

Adding approx_kfn tests

parent 545c0a64
No related branches found
No related tags found
No related merge requests found
...@@ -18,160 +18,241 @@ using namespace mlpack::neighbor; ...@@ -18,160 +18,241 @@ using namespace mlpack::neighbor;
// Global Variable of the DrusillaSelect object so it can be accessed from all functions // Global Variable of the DrusillaSelect object so it can be accessed from all functions
DrusillaSelect<mat> drusillaSelect = DrusillaSelect(1,1); DrusillaSelect<mat> drusillaSelect = DrusillaSelect(1,1);
bool isDrusillaTrained = false;
// Global Variable of the QDAFN object so it can be accessed from all functions // Global Variable of the QDAFN object so it can be accessed from all functions
QDAFN<mat> qdafn = QDAFN(1,1); QDAFN<mat> qdafn = QDAFN(1,1);
bool isQDAFNTrained = false;
// TODO:
// input: const size_t l, // input: const size_t l,
// const size_t m // const size_t m
// output: // output:
// description: // description:
// Initiates the DrusillaSearch Model but doesnt train it.
//
void initDrusillaModelNoTrain(SP_integer l, SP_integer m) void initDrusillaModelNoTrain(SP_integer l, SP_integer m)
{ {
drusillaSelect = DrusillaSelect(l, m); drusillaSelect = DrusillaSelect(l, m);
isDrusillaTrained = false;
} }
// TODO:
// input: const MatType & referenceSet, // input: const MatType & referenceSet,
// const size_t l, // const size_t l,
// const size_t m // const size_t m
// output: // output:
// description: // description:
void initDrusillaModelWithTrain(float *referenceSetMatArr, SP_integer referenceSetMatSize, SP_integer referenceSetMatRowNum, SP_integer l, SP_integer m) // Initiates the DrusillaSearch Model and trains it with the given reference Set.
//
void initDrusillaModelWithTrain(float *referenceSetMatArr, SP_integer referenceSetMatSize, SP_integer referenceSetMatRowNum,
SP_integer l, SP_integer m)
{ {
// convert the Prolog arrays to arma::mat // convert the Prolog arrays to arma::mat
mat referenceSet = convertArrayToMat(referenceSetMatArr, referenceSetMatSize, referenceSetMatRowNum); mat referenceSet = convertArrayToMat(referenceSetMatArr, referenceSetMatSize, referenceSetMatRowNum);
try
{
drusillaSelect = DrusillaSelect(referenceSet, l, m); drusillaSelect = DrusillaSelect(referenceSet, l, m);
} }
catch(const std::exception& e)
{
raisePrologSystemExeption(e.what());
return;
}
isDrusillaTrained = true;
}
// TODO:
// input: const MatType & querySet, // input: const MatType & querySet,
// const size_t k, // const size_t k,
// arma::Mat< size_t > & neighbors, // arma::Mat< size_t > & neighbors,
// arma::mat & distances // arma::mat & distances
// output: // output:
// description: // description:
// Run Search on the given Queryset with the Drusilla Search Policy.
//
void searchDrusilla(float *querySetMatArr, SP_integer querySetMatSize, SP_integer querySetMatRowNum, void searchDrusilla(float *querySetMatArr, SP_integer querySetMatSize, SP_integer querySetMatRowNum,
SP_integer k, SP_integer k,
float **neighborsMatArr, SP_integer *neighborsMatColNum, SP_integer *neighborsMatRowNum, float **neighborsMatArr, SP_integer *neighborsMatColNum, SP_integer *neighborsMatRowNum,
float **distancesMatArr, SP_integer *distancesMatColNum, SP_integer *distancesMatRowNum) float **distancesMatArr, SP_integer *distancesMatColNum, SP_integer *distancesMatRowNum)
{ {
if (!isDrusillaTrained)
{
raisePrologSystemExeption("The Model is not Trained!");
return;
}
// convert the Prolog arrays to arma::mat // convert the Prolog arrays to arma::mat
mat querySet = convertArrayToMat(querySetMatArr, querySetMatSize, querySetMatRowNum); mat querySet = convertArrayToMat(querySetMatArr, querySetMatSize, querySetMatRowNum);
// create the ReturnMat // create the ReturnMat
Mat< size_t > neighborsReturnMat; Mat< size_t > neighborsReturnMat;
// create the ReturnMat
mat distancesReturnMat; 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 try
*neighborsMatArr = convertToArray(neighborsReturnMat); {
drusillaSelect.Search(querySet, k, neighborsReturnMat, distancesReturnMat);
}
catch(const std::exception& e)
{
raisePrologSystemExeption(e.what());
return;
}
// return the Matrix dimensions
*distancesMatColNum = distancesReturnMat.n_cols;
*distancesMatRowNum = distancesReturnMat.n_rows;
// return the Matrix as one long Array // return the Matrices
*distancesMatArr = convertToArray(distancesReturnMat); returnMatrixInformation(neighborsReturnMat, neighborsMatArr, neighborsMatColNum, neighborsMatRowNum);
returnMatrixInformation(distancesReturnMat, distancesMatArr, distancesMatColNum, distancesMatRowNum);
} }
// TODO:
// input: const MatType & referenceSet, // input: const MatType & referenceSet,
// const size_t l = 0, // const size_t l = 0,
// const size_t m = 0 // const size_t m = 0
// output: // output:
// description: // description:
void trainDrusilla(float *referenceSetMatArr, SP_integer referenceSetMatSize, SP_integer referenceSetMatRowNum, SP_integer l, SP_integer m) // Trains the DrusillaSearch Model with the given reference Set.
//
void trainDrusilla(float *referenceSetMatArr, SP_integer referenceSetMatSize, SP_integer referenceSetMatRowNum,
SP_integer l, SP_integer m)
{ {
// convert the Prolog arrays to arma::mat // convert the Prolog arrays to arma::mat
mat referenceSet = convertArrayToMat(referenceSetMatArr, referenceSetMatSize, referenceSetMatRowNum); mat referenceSet = convertArrayToMat(referenceSetMatArr, referenceSetMatSize, referenceSetMatRowNum);
try
{
drusillaSelect.Train(referenceSet, l, m); drusillaSelect.Train(referenceSet, l, m);
} }
catch(const std::exception& e)
{
raisePrologSystemExeption(e.what());
return;
}
isDrusillaTrained = true;
}
// TODO:
// input: const size_t l, // input: const size_t l,
// const size_t m // const size_t m
// output: // output:
// description: // description:
// Initiates the QDAFNSearch Model but doesnt train it.
//
void initQDAFNModelNoTrain(SP_integer l, SP_integer m) void initQDAFNModelNoTrain(SP_integer l, SP_integer m)
{ {
qdafn = QDAFN(l, m); qdafn = QDAFN(l, m);
isQDAFNTrained = false;
} }
// TODO:
// input: const MatType & referenceSet, // input: const MatType & referenceSet,
// const size_t l, // const size_t l,
// const size_t m // const size_t m
// output: // output:
// description: // description:
void initQDAFNModelWithTrain(float *referenceSetMatArr, SP_integer referenceSetMatSize, SP_integer referenceSetMatRowNum, SP_integer l, SP_integer m) // Initiates the QDAFNSearch Model and trains it with the given reference Set.
//
void initQDAFNModelWithTrain(float *referenceSetMatArr, SP_integer referenceSetMatSize, SP_integer referenceSetMatRowNum,
SP_integer l, SP_integer m)
{ {
// convert the Prolog arrays to arma::mat // convert the Prolog arrays to arma::mat
mat referenceSet = convertArrayToMat(referenceSetMatArr, referenceSetMatSize, referenceSetMatRowNum); mat referenceSet = convertArrayToMat(referenceSetMatArr, referenceSetMatSize, referenceSetMatRowNum);
try
{
qdafn = QDAFN(referenceSet, l, m); qdafn = QDAFN(referenceSet, l, m);
} }
catch(const std::out_of_range& e)
{
raisePrologSystemExeption("l*m must be smaller than the number of points in the dataset.");
return;
}
catch(const std::exception& e)
{
raisePrologSystemExeption(e.what());
return;
}
isQDAFNTrained = true;
}
// TODO:
// input: const MatType & querySet, // input: const MatType & querySet,
// const size_t k, // const size_t k,
// arma::Mat< size_t > & neighbors, // arma::Mat< size_t > & neighbors,
// arma::mat & distances // arma::mat & distances
// output: // output:
// description: // description:
// Run Search on the given Queryset with the QDAFN Search Policy.
//
void searchQDAFN(float *querySetMatArr, SP_integer querySetMatSize, SP_integer querySetMatRowNum, void searchQDAFN(float *querySetMatArr, SP_integer querySetMatSize, SP_integer querySetMatRowNum,
SP_integer k, SP_integer k,
float **neighborsMatArr, SP_integer *neighborsMatColNum, SP_integer *neighborsMatRowNum, float **neighborsMatArr, SP_integer *neighborsMatColNum, SP_integer *neighborsMatRowNum,
float **distancesMatArr, SP_integer *distancesMatColNum, SP_integer *distancesMatRowNum) float **distancesMatArr, SP_integer *distancesMatColNum, SP_integer *distancesMatRowNum)
{ {
if (!isQDAFNTrained)
{
raisePrologSystemExeption("The Model is not Trained!");
return;
}
// convert the Prolog arrays to arma::mat // convert the Prolog arrays to arma::mat
mat querySet = convertArrayToMat(querySetMatArr, querySetMatSize, querySetMatRowNum); mat querySet = convertArrayToMat(querySetMatArr, querySetMatSize, querySetMatRowNum);
// create the ReturnMat // create the ReturnMat
Mat< size_t > neighborsReturnMat; Mat< size_t > neighborsReturnMat;
// create the ReturnMat
mat distancesReturnMat; 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 try
*neighborsMatArr = convertToArray(neighborsReturnMat); {
qdafn.Search(querySet, k, neighborsReturnMat, distancesReturnMat);
// return the Matrix dimensions }
*distancesMatColNum = distancesReturnMat.n_cols; catch(const std::exception& e)
*distancesMatRowNum = distancesReturnMat.n_rows; {
raisePrologSystemExeption(e.what());
return;
}
// return the Matrix as one long Array
*distancesMatArr = convertToArray(distancesReturnMat);
// return the Matrices
returnMatrixInformation(neighborsReturnMat, neighborsMatArr, neighborsMatColNum, neighborsMatRowNum);
returnMatrixInformation(distancesReturnMat, distancesMatArr, distancesMatColNum, distancesMatRowNum);
} }
// TODO:
// input: const MatType & referenceSet, // input: const MatType & referenceSet,
// const size_t l = 0, // const size_t l = 0,
// const size_t m = 0 // const size_t m = 0
// output: // output:
// description: // description:
void trainQDAFN(float *referenceSetMatArr, SP_integer referenceSetMatSize, SP_integer referenceSetMatRowNum, SP_integer l, SP_integer m) // Trains the QDAFNSearch Model with the given reference Set.
//
void trainQDAFN(float *referenceSetMatArr, SP_integer referenceSetMatSize, SP_integer referenceSetMatRowNum,
SP_integer l, SP_integer m)
{ {
// convert the Prolog arrays to arma::mat // convert the Prolog arrays to arma::mat
mat referenceSet = convertArrayToMat(referenceSetMatArr, referenceSetMatSize, referenceSetMatRowNum); mat referenceSet = convertArrayToMat(referenceSetMatArr, referenceSetMatSize, referenceSetMatRowNum);
try
{
qdafn.Train(referenceSet, l, m); qdafn.Train(referenceSet, l, m);
} }
catch(const std::out_of_range& e)
{
raisePrologSystemExeption("l*m must be smaller than the number of points in the dataset.");
return;
}
catch(const std::exception& e)
{
raisePrologSystemExeption(e.what());
return;
}
isQDAFNTrained = true;
}
:- module(approx_kfn, [ initDrusillaModelNoTrain/2, :- module(approx_kfn, [ initDrusillaModelNoTrain/2,
initDrusillaModelWithTrain/5, initDrusillaModelWithTrain/4,
searchDrusilla/10, searchDrusilla/7,
trainDrusilla/5, trainDrusilla/4,
initQDAFNModelNoTrain/2, initQDAFNModelNoTrain/2,
initQDAFNModelWithTrain/5, initQDAFNModelWithTrain/4,
searchQDAFN/10, searchQDAFN/7,
trainQDAFN/5]). trainQDAFN/4]).
%% requirements of library(struct) %% requirements of library(struct)
:- load_files(library(str_decl), :- load_files(library(str_decl),
...@@ -34,7 +34,12 @@ ...@@ -34,7 +34,12 @@
%% Initiates the DrusillaSearch Model but doesnt train it. %% Initiates the DrusillaSearch Model but doesnt train it.
%% trainDrusilla has to be used before searchDrusilla can be used. %% trainDrusilla has to be used before searchDrusilla can be used.
%% %%
foreign(initDrusillaModelNoTrain, c, initDrusillaModelNoTrain(+integer, +integer)). initDrusillaModelNoTrain(L, M) :-
L > 0,
M > 0,
initDrusillaModelNoTrainI(L, M).
foreign(initDrusillaModelNoTrain, c, initDrusillaModelNoTrainI(+integer, +integer)).
%% --Input-- %% --Input--
...@@ -48,7 +53,13 @@ foreign(initDrusillaModelNoTrain, c, initDrusillaModelNoTrain(+integer, +integer ...@@ -48,7 +53,13 @@ foreign(initDrusillaModelNoTrain, c, initDrusillaModelNoTrain(+integer, +integer
%% Initiates the DrusillaSearch Model and trains it with the given reference Set. %% Initiates the DrusillaSearch Model and trains it with the given reference Set.
%% Afterwards searchDrusilla can be used. %% Afterwards searchDrusilla can be used.
%% %%
foreign(initDrusillaModelWithTrain, c, initDrusillaModelWithTrain( +pointer(float_array), +integer, +integer, initDrusillaModelWithTrain(DataList, DataRows, L, M) :-
L > 0,
M > 0,
convert_list_to_float_array(DataList, DataRows, array(Xsize, Xrownum, X)),
initDrusillaModelWithTrainI(X, Xsize, Xrownum, L, M).
foreign(initDrusillaModelWithTrain, c, initDrusillaModelWithTrainI( +pointer(float_array), +integer, +integer,
+integer, +integer)). +integer, +integer)).
...@@ -61,9 +72,16 @@ foreign(initDrusillaModelWithTrain, c, initDrusillaModelWithTrain( +pointer ...@@ -61,9 +72,16 @@ foreign(initDrusillaModelWithTrain, c, initDrusillaModelWithTrain( +pointer
%% mat distances %% mat distances
%% %%
%% --Description-- %% --Description--
%% Run Search on the given Queryset with the Drusilla Search Policy.
%% %%
%% searchDrusilla(DataList, DataRows, K, NeighborsList, YCols, DistancesList, ZCols) :-
foreign(searchDrusilla, c, searchDrusilla( +pointer(float_array), +integer, +integer, K > 0,
convert_list_to_float_array(DataList, DataRows, array(Xsize, Xrownum, X)),
searchDrusillaI(X, Xsize, Xrownum, K, Y, YCols, YRows, Z, ZCols, ZRows),
convert_float_array_to_2d_list(Y, YCols, YRows, NeighborsList),
convert_float_array_to_2d_list(Z, ZCols, ZRows, DistancesList).
foreign(searchDrusilla, c, searchDrusillaI( +pointer(float_array), +integer, +integer,
+integer, +integer,
-pointer(float_array), -integer, -integer, -pointer(float_array), -integer, -integer,
-pointer(float_array), -integer, -integer)). -pointer(float_array), -integer, -integer)).
...@@ -79,7 +97,13 @@ foreign(searchDrusilla, c, searchDrusilla( +pointer(float_array), +integer, ...@@ -79,7 +97,13 @@ foreign(searchDrusilla, c, searchDrusilla( +pointer(float_array), +integer,
%% --Description-- %% --Description--
%% Trains the DrusillaSearch Model with the given reference Set. %% Trains the DrusillaSearch Model with the given reference Set.
%% %%
foreign(trainDrusilla, c, trainDrusilla(+pointer(float_array), +integer, +integer, trainDrusilla(DataList, DataRows, L, M) :-
L > 0,
M > 0,
convert_list_to_float_array(DataList, DataRows, array(Xsize, Xrownum, X)),
trainDrusillaI(X, Xsize, Xrownum, L, M).
foreign(trainDrusilla, c, trainDrusillaI( +pointer(float_array), +integer, +integer,
+integer, +integer)). +integer, +integer)).
...@@ -93,7 +117,12 @@ foreign(trainDrusilla, c, trainDrusilla(+pointer(float_array), +integer, +intege ...@@ -93,7 +117,12 @@ foreign(trainDrusilla, c, trainDrusilla(+pointer(float_array), +integer, +intege
%% Initiates the QDAFNSearch Model but doesnt train it. %% Initiates the QDAFNSearch Model but doesnt train it.
%% trainQDAFN has to be used before searchQDAFN can be used. %% trainQDAFN has to be used before searchQDAFN can be used.
%% %%
foreign(initQDAFNModelNoTrain, c, initQDAFNModelNoTrain(+integer, +integer)). initQDAFNModelNoTrain(L, M) :-
L > 0,
M > 0,
initQDAFNModelNoTrainI(L, M).
foreign(initQDAFNModelNoTrain, c, initQDAFNModelNoTrainI(+integer, +integer)).
%% --Input-- %% --Input--
...@@ -107,7 +136,13 @@ foreign(initQDAFNModelNoTrain, c, initQDAFNModelNoTrain(+integer, +integer)). ...@@ -107,7 +136,13 @@ foreign(initQDAFNModelNoTrain, c, initQDAFNModelNoTrain(+integer, +integer)).
%% Initiates the QDAFNSearch Model and trains it with the given reference Set. %% Initiates the QDAFNSearch Model and trains it with the given reference Set.
%% Afterwards searchQDAFN can be used. %% Afterwards searchQDAFN can be used.
%% %%
foreign(initQDAFNModelWithTrain, c, initQDAFNModelWithTrain( +pointer(float_array), +integer, +integer, initQDAFNModelWithTrain(DataList, DataRows, L, M) :-
L > 0,
M > 0,
convert_list_to_float_array(DataList, DataRows, array(Xsize, Xrownum, X)),
initQDAFNModelWithTrainI(X, Xsize, Xrownum, L, M).
foreign(initQDAFNModelWithTrain, c, initQDAFNModelWithTrainI( +pointer(float_array), +integer, +integer,
+integer, +integer)). +integer, +integer)).
...@@ -120,14 +155,21 @@ foreign(initQDAFNModelWithTrain, c, initQDAFNModelWithTrain( +pointer(float_a ...@@ -120,14 +155,21 @@ foreign(initQDAFNModelWithTrain, c, initQDAFNModelWithTrain( +pointer(float_a
%% mat distances %% mat distances
%% %%
%% --Description-- %% --Description--
%% Run Search on the given Queryset with the QDAFN Search Policy.
%% %%
%% searchQDAFN(DataList, DataRows, K, NeighborsList, YCols, DistancesList, ZCols) :-
foreign(searchQDAFN, c, searchQDAFN( +pointer(float_array), +integer, +integer, K > 0,
convert_list_to_float_array(DataList, DataRows, array(Xsize, Xrownum, X)),
searchQDAFNI(X, Xsize, Xrownum, K, Y, YCols, YRows, Z, ZCols, ZRows),
convert_float_array_to_2d_list(Y, YCols, YRows, NeighborsList),
convert_float_array_to_2d_list(Z, ZCols, ZRows, DistancesList).
foreign(searchQDAFN, c, searchQDAFNI( +pointer(float_array), +integer, +integer,
+integer, +integer,
-pointer(float_array), -integer, -integer, -pointer(float_array), -integer, -integer,
-pointer(float_array), -integer, -integer)). -pointer(float_array), -integer, -integer)).
%% TODO:
%% --Input-- %% --Input--
%% mat referenceSet, %% mat referenceSet,
%% int l => 0, %% int l => 0,
...@@ -138,7 +180,13 @@ foreign(searchQDAFN, c, searchQDAFN( +pointer(float_array), +integer, +intege ...@@ -138,7 +180,13 @@ foreign(searchQDAFN, c, searchQDAFN( +pointer(float_array), +integer, +intege
%% --Description-- %% --Description--
%% Trains the QDAFNSearch Model with the given reference Set. %% Trains the QDAFNSearch Model with the given reference Set.
%% %%
foreign(trainQDAFN, c, trainQDAFN( +pointer(float_array), +integer, +integer, trainQDAFN(DataList, DataRows, L, M) :-
L > 0,
M > 0,
convert_list_to_float_array(DataList, DataRows, array(Xsize, Xrownum, X)),
trainQDAFNI(X, Xsize, Xrownum, L, M).
foreign(trainQDAFN, c, trainQDAFNI( +pointer(float_array), +integer, +integer,
+integer, +integer)). +integer, +integer)).
......
...@@ -6,38 +6,298 @@ ...@@ -6,38 +6,298 @@
:- use_module(approx_kfn). :- use_module(approx_kfn).
:- use_module('../../helper_files/helper.pl'). :- use_module('../../helper_files/helper.pl').
reset_Model :- reset_DrusillaModel_NoTrain :-
initModel(1,0,50,0.0001). initDrusillaModelNoTrain(2, 2).
reset_DrusillaModel_WithTrain :-
initDrusillaModelWithTrain([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, 2, 2).
reset_QDAFNModel_NoTrain :-
initQDAFNModelNoTrain(2, 2).
reset_QDAFNModel_WithTrain :-
initQDAFNModelWithTrain([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, 2, 2).
%%
%% TESTING predicate initDrusillaModelNoTrain/2
%%
:- begin_tests(initDrusillaModelNoTrain).
%% Failure Tests
test(approx_KFN_InitDrusillaNoTrain_Negative_L, fail) :-
initDrusillaModelNoTrain(-5,5).
test(approx_KFN_InitDrusillaNoTrain_Negative_M, fail) :-
initDrusillaModelNoTrain(5,-5).
%% Successful Tests
test(approx_KFN_InitDrusillaNoTrain_Normal) :-
initDrusillaModelNoTrain(5,5).
test(approx_KFN_InitDrusillaNoTrain_Alternative) :-
initDrusillaModelNoTrain(10,3).
:- end_tests(initDrusillaModelNoTrain).
%%
%% TESTING predicate initDrusillaModelWithTrain/4
%%
:- begin_tests(initDrusillaModelWithTrain).
%% Failure Tests
test(approx_KFN_InitDrusillaWithTrain_Negative_L, fail) :-
initDrusillaModelWithTrain([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, -5, 5).
test(approx_KFN_InitDrusillaWithTrain_Negative_M, fail) :-
initDrusillaModelWithTrain([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, 5, -5).
test(approx_KFN_InitDrusillaWithTrain_Normal,
[error(_,system_error('DrusillaSelect::Train(): l and m are too large! Choose smaller values. l*m must be smaller than the number of points in the dataset.'))]) :-
initDrusillaModelWithTrain([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, 5, 5).
%% Successful Tests
test(approx_KFN_InitDrusillaWithTrain_Normal) :-
initDrusillaModelWithTrain([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, 2, 2).
test(approx_KFN_InitDrusillaWithTrain_Alternative) :-
open('src/data_csv/iris2.csv', read, File),
take_csv_row(File, skipFirstRow,10, Data),
initDrusillaModelWithTrain(Data, 4, 5, 2).
:- end_tests(initDrusillaModelWithTrain).
%% %%
%% TESTING predicate predicate/10 %% TESTING predicate searchDrusilla/7
%%
:- begin_tests(searchDrusilla).
%% Failure Tests
test(approx_KFN_SearchDrusilla_Negative_K, fail) :-
reset_DrusillaModel_WithTrain,
searchDrusilla([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, -2, _, _, _, _).
test(approx_KFN_SearchDrusilla_Diffrent_Query_Dims, [error(_,system_error('subtraction: incompatible matrix dimensions: 4x1 and 3x1'))]) :-
reset_DrusillaModel_WithTrain,
open('src/data_csv/iris2.csv', read, File),
take_csv_row(File, skipFirstRow,10, Data),
searchDrusilla(Data, 4, 2, _, _, _, _).
test(approx_KFN_SearchDrusilla_Befor_Train, [error(_,system_error('The Model is not Trained!'))]) :-
reset_DrusillaModel_NoTrain,
searchDrusilla([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, 2, _, _, _, _).
%% Successful Tests
test(approx_KFN_SearchDrusilla_Normal) :-
reset_DrusillaModel_WithTrain,
searchDrusilla([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, 2, NeighborsList, _, DistancesList, _),
print('\nNeighbors: '),
print(NeighborsList),
print('\nDistances: '),
print(DistancesList).
test(approx_KFN_SearchDrusilla_Alternative) :-
open('src/data_csv/iris2.csv', read, File),
take_csv_row(File, skipFirstRow,10, Data),
initDrusillaModelWithTrain(Data, 4, 2, 5),
searchDrusilla(Data, 4, 3, NeighborsList, _, DistancesList, _),
print('\nNeighbors: '),
print(NeighborsList),
print('\nDistances: '),
print(DistancesList).
:- end_tests(searchDrusilla).
%% TESTING predicate trainDrusilla/4
%% %%
:- begin_tests(predicate). :- begin_tests(trainDrusilla).
%% Failure Tests %% Failure Tests
test(testDescription, [error(domain_error('expectation' , culprit), _)]) :- test(approx_KFN_TrainDrusilla_Negative_L, fail) :-
reset_Model_No_Train(perceptron), reset_DrusillaModel_NoTrain,
train([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, [0,0,0,0], 2, culprit, 50, 0.0001, _). trainDrusilla([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, -5, 5).
test(approx_KFN_TrainDrusilla_Negative_M, fail) :-
reset_DrusillaModel_NoTrain,
trainDrusilla([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, 5, -5).
test(approx_KFN_TrainDrusilla_Too_Large_M_And_L,
[error(_,system_error('DrusillaSelect::Train(): l and m are too large! Choose smaller values. l*m must be smaller than the number of points in the dataset.'))]) :-
reset_DrusillaModel_NoTrain,
trainDrusilla([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, 5, 5).
%% Successful Tests
test(approx_KFN_TrainDrusilla_Normal) :-
reset_DrusillaModel_NoTrain,
trainDrusilla([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, 2, 1).
test(approx_KFN_TrainDrusilla_Alternative) :-
reset_DrusillaModel_NoTrain,
open('src/data_csv/iris2.csv', read, File),
take_csv_row(File, skipFirstRow,10, Data),
trainDrusilla(Data, 4, 2, 3).
:- end_tests(trainDrusilla).
%%
%% TESTING predicate initQDAFNModelNoTrain/2
%%
:- begin_tests(initQDAFNModelNoTrain).
%% Failure Tests
test(approx_KFN_InitQDAFNNoTrain_Negative_L, fail) :-
initQDAFNModelNoTrain(-5,5).
test(approx_KFN_InitQDAFNNoTrain_Negative_M, fail) :-
initQDAFNModelNoTrain(5,-5).
%% Successful Tests
test(approx_KFN_InitQDAFNNoTrain_Normal) :-
initQDAFNModelNoTrain(5,5).
test(approx_KFN_InitQDAFNNoTrain_Alternative) :-
initQDAFNModelNoTrain(10,3).
:- end_tests(initQDAFNModelNoTrain).
%%
%% TESTING predicate initQDAFNModelWithTrain/4
%%
:- begin_tests(initQDAFNModelWithTrain).
%% Failure Tests
test(approx_KFN_InitQDAFNWithTrain_Negative_L, fail) :-
initQDAFNModelWithTrain([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, -5, 5).
test(approx_KFN_InitQDAFNWithTrain_Negative_M, fail) :-
initQDAFNModelWithTrain([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, 5, -5).
test(approx_KFN_InitQDAFNWithTrain_Too_Large_L_And_M, [error(_,system_error('l*m must be smaller than the number of points in the dataset.'))]) :-
initQDAFNModelWithTrain([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, 5, 5).
%% Successful Tests
test(approx_KFN_InitQDAFNWithTrain_Normal) :-
initQDAFNModelWithTrain([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, 1, 2).
test(approx_KFN_InitQDAFNWithTrain_Alternative) :-
open('src/data_csv/iris2.csv', read, File),
take_csv_row(File, skipFirstRow,10, Data),
initQDAFNModelWithTrain(Data, 4, 5, 2).
:- end_tests(initQDAFNModelWithTrain).
%%
%% TESTING predicate searchQDAFN/7
%%
:- begin_tests(searchQDAFN).
%% Failure Tests
test(approx_KFN_SearchQDAFN_Negative_K, fail) :-
reset_QDAFNModel_WithTrain,
searchQDAFN([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, -2, _, _, _, _).
test(approx_KFN_SearchQDAFN_Diffrent_Query_Dims, [error(_,system_error('dot(): objects must have the same number of elements'))]) :-
reset_QDAFNModel_WithTrain,
open('src/data_csv/iris2.csv', read, File),
take_csv_row(File, skipFirstRow,10, Data),
searchQDAFN(Data, 4, 2, _, _, _, _).
test(approx_KFN_SearchQDAFN_Befor_Train, [error(_,system_error('The Model is not Trained!'))]) :-
reset_QDAFNModel_NoTrain,
searchQDAFN([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, 2, _, _, _, _).
test(approx_KFN_SearchQDAFN_Too_Large_K, [error(_,system_error('QDAFN::Search(): requested k is greater than value of m!'))]) :-
reset_QDAFNModel_WithTrain,
searchQDAFN([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, 3, _, _, _, _).
%% Successful Tests
test(approx_KFN_SearchQDAFN_Normal) :-
reset_QDAFNModel_WithTrain,
searchQDAFN([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, 2, NeighborsList, _, DistancesList, _),
print('\nNeighbors: '),
print(NeighborsList),
print('\nDistances: '),
print(DistancesList).
test(approx_KFN_SearchQDAFN_Alternative) :-
open('src/data_csv/iris2.csv', read, File),
take_csv_row(File, skipFirstRow,10, Data),
initQDAFNModelWithTrain(Data, 4, 2, 3),
searchQDAFN(Data, 4, 2, NeighborsList, _, DistancesList, _),
print('\nNeighbors: '),
print(NeighborsList),
print('\nDistances: '),
print(DistancesList).
:- end_tests(searchQDAFN).
%% TESTING predicate trainQDAFN/4
%%
:- begin_tests(trainQDAFN).
%% Failure Tests
test(approx_KFN_TrainQDAFN_Negative_L, fail) :-
reset_QDAFNModel_NoTrain,
trainQDAFN([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, -5, 5).
test(approx_KFN_TrainQDAFN_Negative_M, fail) :-
reset_QDAFNModel_NoTrain,
trainQDAFN([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, 5, -5).
test(testDescription2, [error(_,system_error('The values of the Label have to start at 0 and be >= 0 and < the given numClass!'))]) :- test(approx_KFN_TrainQDAFN_Too_Large_M_And_L,
reset_Model_No_Train(perceptron), [error(_,system_error('l*m must be smaller than the number of points in the dataset.'))]) :-
train([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, [0,1,0,2], 2, perceptron, 50, 0.0001, _). reset_QDAFNModel_NoTrain,
trainQDAFN([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, 5, 5).
%% Successful Tests %% Successful Tests
test(testDescription3, [true(Error =:= 1)]) :- test(approx_KFN_TrainQDAFN_Normal) :-
reset_Model_No_Train(perceptron), reset_QDAFNModel_NoTrain,
train([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, [0,0,0,0], 2, perceptron, 50, 0.0001, Error). trainQDAFN([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, 2, 1).
test(testDescription4, [true(Error =:= 0.9797958971132711)]) :- test(approx_KFN_TrainQDAFN_Alternative) :-
reset_Model_No_Train(perceptron), reset_QDAFNModel_NoTrain,
open('src/data_csv/iris2.csv', read, File), open('src/data_csv/iris2.csv', read, File),
take_csv_row(File, skipFirstRow,10, Data), take_csv_row(File, skipFirstRow,10, Data),
train(Data, 4, [0,1,0,1,1,0,1,1,1,0], 2, perceptron, 50, 0.0001, Error). trainQDAFN(Data, 4, 2, 3).
:- end_tests(predicate). :- end_tests(trainQDAFN).
run_approx_kfn_tests :- run_approx_kfn_tests :-
run_tests. run_tests.
......
...@@ -12,7 +12,7 @@ ...@@ -12,7 +12,7 @@
:- use_module('src/methods/adaboost/adaboost_test.pl'). :- use_module('src/methods/adaboost/adaboost_test.pl').
%%:- use_module('src/methods/approx_kfn/approx_kfn_test.pl'). :- use_module('src/methods/approx_kfn/approx_kfn_test.pl').
%%:- use_module('src/methods/bayesian_linear_regression/bayesian_linear_regression_test.pl'). %%:- use_module('src/methods/bayesian_linear_regression/bayesian_linear_regression_test.pl').
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment