From 9a2bcf4d6ecf859c865fa38183cc478063da3ac4 Mon Sep 17 00:00:00 2001
From: Dean Samuel Schmitz <dean.schmitz@hhu.de>
Date: Thu, 27 Oct 2022 19:00:05 +0000
Subject: [PATCH] Adding nbc tests

---
 .../naive_bayes_classifier.pl                 |   3 +
 .../naive_bayes_classifier_test.pl            | 254 ++++++++++++++++--
 2 files changed, 240 insertions(+), 17 deletions(-)

diff --git a/src/methods/naive_bayes_classifier/naive_bayes_classifier.pl b/src/methods/naive_bayes_classifier/naive_bayes_classifier.pl
index da5521a..898624d 100644
--- a/src/methods/naive_bayes_classifier/naive_bayes_classifier.pl
+++ b/src/methods/naive_bayes_classifier/naive_bayes_classifier.pl
@@ -61,6 +61,8 @@ foreign(initModelWithTrain, c, initModelWithTrainI(     +pointer(float_array), +
 %%              All of the parameters of the model will be initialized to zero. Be sure to use train before calling classify, otherwise the results may be meaningless.
 %%
 initModelNoTrain(NumClasses, IncrementalVar, Epsilon) :-
+        NumClasses >= 0,
+        Epsilon >= 0,
         initModelNoTrainI(NumClasses, IncrementalVar, Epsilon).
 
 foreign(initModelNoTrain, c, initModelNoTrainI( +integer, 
@@ -146,6 +148,7 @@ foreign(probabilities, c, probabilitiesI(-pointer(float_array), -integer, -integ
 %%              Train the Naive Bayes classifier on the given dataset. The data must be the same dimensionality as the existing model parameters.
 %%
 trainMatrix(DataList, DataRows, LabelsList, NumClasses, IncrementalVar) :-
+        NumClasses >= 0,
         convert_list_to_float_array(DataList, DataRows, array(Xsize, Xrownum, X)),
         convert_list_to_float_array(LabelsList, array(Ysize, Y)),
         trainMatrixI(X, Xsize, Xrownum, Y, Ysize, NumClasses, IncrementalVar).
diff --git a/src/methods/naive_bayes_classifier/naive_bayes_classifier_test.pl b/src/methods/naive_bayes_classifier/naive_bayes_classifier_test.pl
index 351e70f..ca08ac2 100644
--- a/src/methods/naive_bayes_classifier/naive_bayes_classifier_test.pl
+++ b/src/methods/naive_bayes_classifier/naive_bayes_classifier_test.pl
@@ -6,38 +6,258 @@
 :- use_module(naive_bayes_classifier).
 :- use_module('../../helper_files/helper.pl').
 
-reset_Model :-
-        initModel(1,0,50,0.0001).
+reset_Model_NoTrain :-
+        initModelNoTrain(2, 0, 0.000001).
+
+reset_Model_WithTrain :-
+        initModelWithTrain([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,1], 2, 0, 0.000001).
 
 %%
-%% TESTING predicate predicate/10
+%% TESTING predicate initModelNoTrain/3
 %%
-:- begin_tests(predicate).      
+:- begin_tests(initModelNoTrain).      
 
 %% Failure Tests
                                             
-test(testDescription, [error(domain_error('expectation' , culprit), _)]) :-
-        reset_Model_No_Train(perceptron),
-        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, _).
+test(nbc_InitModelNoTrain_Negative_NumClasses, fail) :-
+        initModelNoTrain(-2, 0, 0.000001).
 
-test(testDescription2, [error(_,system_error('The values of the Label have to start at 0 and be >= 0 and < the given numClass!'))]) :-
-        reset_Model_No_Train(perceptron),
-        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, _).
+test(nbc_InitModelNoTrain_Negative_Epsilon, fail) :-
+        initModelNoTrain(2, 0, -0.0001).
         
 
 %% Successful Tests
 
-test(testDescription3, [true(Error =:= 1)]) :-
-        reset_Model_No_Train(perceptron),
-        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).
+test(nbc_InitModelNoTrain_Normal_Use) :-
+        initModelNoTrain(2, 0, 0.000001).
+
+:- end_tests(initModelNoTrain).
+
+
+
+%%
+%% TESTING predicate initModelWithTrain/6
+%%
+:- begin_tests(initModelWithTrain).      
+
+%% Failure Tests
+                                            
+test(nbc_InitModelWithTrain_Negative_NumClasses, fail) :-
+        initModelWithTrain([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,1], -2, 0, 0.000001).
+
+test(nbc_InitModelWithTrain_Negative_Epsilon, fail) :-
+        initModelWithTrain([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,1], 2, 0, -0.000001).
 
-test(testDescription4, [true(Error =:= 0.9797958971132711)]) :-
-        reset_Model_No_Train(perceptron),
+test(nbc_InitModelWithTrain_Too_Short_Label, [error(_,system_error('Error'))]) :-
+        initModelWithTrain([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], 2, 0, 0.000001).
+
+test(nbc_InitModelWithTrain_Too_Long_Label, [error(_,system_error('Error'))]) :-
+        initModelWithTrain([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,1,0,1], 2, 0, 0.000001).
+
+test(nbc_InitModelWithTrain_Too_Many_Label_Classes, [error(_,system_error('Error'))]) :-
+        initModelWithTrain([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,2,3], 2, 0, 0.000001).
+        
+
+%% Successful Tests
+
+test(nbc_InitModelWithTrain_Normal_Use) :-
+        initModelWithTrain([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,1], 2, 0, 0.000001).
+
+test(nbc_InitModelWithTrain_CSV_Input) :-
         open('src/data_csv/iris2.csv', read, File),
         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).
+        initModelWithTrain(Data, 4, [0,1,0,1,1,0,1,1,1,0], 2, 1, 0.0042).
+
+:- end_tests(initModelWithTrain).
+
+
+
+%%
+%% TESTING predicate classifyMatrix/10
+%%
+:- begin_tests(classifyMatrix).      
+
+%% Failure Tests
+
+test(nbc_ClassifyMatrix_Before_Train, [error(_,system_error('Error'))]) :-
+        reset_Model_NoTrain,
+        initModelWithTrain([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, _, _, _).
+                         
+test(nbc_ClassifyMatrix_Diffrent_Dims_To_Train, [error(_,system_error('Error'))]) :-
+        reset_Model_WithTrain,
+        initModelWithTrain([5.1,3.5,1.4,4.9,3.0,1.4,4.7,3.2,1.3,4.6,3.1,1.5], 4, _, _, _).
+        
+
+%% Successful Tests
+
+test(nbc_ClassifyMatrix_Normal_Use) :-
+        reset_Model_WithTrain,
+        initModelWithTrain([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, PredictionList, _, ProbabilitiesList),
+        print('\nPredictions: '),
+        print(PredictionList),
+        print('\nProbabilities: '),
+        print(ProbabilitiesList).
+
+test(nbc_ClassifyMatrix_CSV_Input) :-
+        reset_Model_WithTrain,
+        open('src/data_csv/iris2.csv', read, File),
+        take_csv_row(File, skipFirstRow,10, Data),
+        initModelWithTrain(Data, 4, PredictionList, _, ProbabilitiesList),
+        print('\nPredictions: '),
+        print(PredictionList),
+        print('\nProbabilities: '),
+        print(ProbabilitiesList).
+
+:- end_tests(classifyMatrix).
+
+
+
+%%
+%% TESTING predicate means/10
+%%
+:- begin_tests(means).      
+
+%% Failure Tests
+test(nbc_Means_Before_Train, [error(_,system_error('Error'))]) :-
+        reset_Model_NoTrain,
+        means(MeansList, _),
+        print('\nMeans: '),
+        print(MeansList).
+
+
+%% Successful Tests
+
+test(nbc_Means_Normal_Use) :-
+        reset_Model_WithTrain,
+        means(MeansList, _),
+        print('\nMeans: '),
+        print(MeansList).
+
+:- end_tests(means).
+
+
+
+%%
+%% TESTING predicate probabilities/10
+%%
+:- begin_tests(probabilities).      
+
+%% Failure Tests
+test(nbc_Probabilities_Before_Train, [error(_,system_error('Error'))]) :-
+        reset_Model_NoTrain,
+        probabilities(ProbabilitiesList, _),
+        print('\nProbabilities: '),
+        print(ProbabilitiesList).
+
+
+%% Successful Tests
+
+test(nbc_Probabilities_Normal_Use) :-
+        reset_Model_WithTrain,
+        probabilities(ProbabilitiesList, _),
+        print('\nProbabilities: '),
+        print(ProbabilitiesList).
+
+:- end_tests(probabilities).
+
+
+
+%%
+%% TESTING predicate trainMatrix/5
+%%
+:- begin_tests(trainMatrix).      
+
+%% Failure Tests
+                                            
+test(nbc_TrainMatrix_Negative_NumClasses, fail) :-
+        reset_Model_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,1,0,1], -2, 0).
+
+test(nbc_TrainMatrix_Too_Short_Label, [error(_,system_error('Error'))]) :-
+        reset_Model_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,1], 2, 0).
+
+test(nbc_TrainMatrix_Too_Long_Label, [error(_,system_error('Error'))]) :-
+        reset_Model_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,1,0,1,0,1], 2, 0).
+
+test(nbc_TrainMatrix_Too_Many_Label_Classes, [error(_,system_error('Error'))]) :-
+        reset_Model_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,1,2,3], 2, 0).
+        
+
+%% Successful Tests
+
+test(nbc_TrainMatrix_Normal_Use) :-
+        reset_Model_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,1,0,1], 2, 0).
+
+test(nbc_TrainMatrix_After_InitTrain) :-
+        reset_Model_WithTrain,
+        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], 4, [0,1,0], 2, 0).
+
+test(nbc_TrainMatrix_CSV_Input) :-
+        reset_Model_NoTrain,
+        open('src/data_csv/iris2.csv', read, File),
+        take_csv_row(File, skipFirstRow,10, Data),
+        train(Data, 4, [0,1,0,1,1,0,1,1,1,0], 2, 0).
+
+:- end_tests(trainMatrix).
+
+
+
+%%
+%% TESTING predicate trainPoint/5
+%%
+:- begin_tests(trainPoint).      
+
+%% Failure Tests
+
+test(nbc_TrainPoint_Bad_Label, [error(_,system_error('Error'))]) :-
+        reset_Model_NoTrain,
+        train([5.1,3.5,1.4], -5).
+
+test(nbc_TrainPoint_Too_Long_Point, [error(_,system_error('Error'))]) :-
+        reset_Model_WithTrain,
+        train([5.1,3.5,1.4,3.5], 0).
+        
+
+%% Successful Tests
+
+test(nbc_TrainPoint_Normal_Use) :-
+        reset_Model_NoTrain,
+        train([5.1,3.5,1.4], 0).
+
+test(nbc_TrainPoint_After_InitTrain) :-
+        reset_Model_WithTrain,
+        train([5.1,3.5,1.4], 1).
+
+:- end_tests(trainPoint).
+
+
+
+%%
+%% TESTING predicate variances/10
+%%
+:- begin_tests(variances).      
+
+%% Failure Tests
+test(nbc_Variances_Before_Train, [error(_,system_error('Error'))]) :-
+        reset_Model_NoTrain,
+        variances(VariancesList, _),
+        print('\nVariances: '),
+        print(VariancesList).
+
+
+%% Successful Tests
+
+test(nbc_Variances_Normal_Use) :-
+        reset_Model_WithTrain,
+        variances(VariancesList, _),
+        print('\nVariances: '),
+        print(VariancesList).
 
-:- end_tests(predicate).
+:- end_tests(variances).
 
 run_naive_bayes_classifier_tests :-
         run_tests.
-- 
GitLab