From 1cb6520aca4eb6e23377af42c44bbcab62f2b80f Mon Sep 17 00:00:00 2001 From: Jakhes <dean.schmitz@schmitzbauer.de> Date: Wed, 2 Nov 2022 23:44:02 +0100 Subject: [PATCH] Adding linear_SVM tests --- src/methods/linear_SVM/linear_SVM.pl | 23 +- src/methods/linear_SVM/linear_SVM_test.pl | 283 ++++++++++++++++++++-- 2 files changed, 274 insertions(+), 32 deletions(-) diff --git a/src/methods/linear_SVM/linear_SVM.pl b/src/methods/linear_SVM/linear_SVM.pl index 864abf1..9965310 100644 --- a/src/methods/linear_SVM/linear_SVM.pl +++ b/src/methods/linear_SVM/linear_SVM.pl @@ -37,6 +37,9 @@ %% Initializes the linear_svm model with the given data and trains it. %% initModelWithTrain(DataList, DataRows, LabelsList, NumClasses, Lambda, Delta, FitIntercept, Optimizer) :- + NumClasses >= 0, + Lambda >= 0.0, + Delta >= 0.0, convert_list_to_float_array(DataList, DataRows, array(Xsize, Xrownum, X)), convert_list_to_float_array(LabelsList, array(Ysize, Y)), initModelWithTrainI(X, Xsize, Xrownum, Y, Ysize, NumClasses, Lambda, Delta, FitIntercept, Optimizer). @@ -60,6 +63,9 @@ foreign(initModelWithTrain, c, initModelWithTrainI( +pointer(float_array), + %% Initializes the linear_svm model with the given data but doesnt train it. %% initModelNoTrain(NumClasses, Lambda, Delta, FitIntercept) :- + NumClasses >= 0, + Lambda >= 0.0, + Delta >= 0.0, initModelNoTrainI(NumClasses, Lambda, Delta, FitIntercept). foreign(initModelNoTrain, c, initModelNoTrainI( +integer, +float32, +float32, @@ -100,8 +106,8 @@ classifyPoint(DataList, Prediction) :- convert_list_to_float_array(DataList, array(Xsize, X)), classifyPointI(X, Xsize, Prediction). -foreign(classifyPoint, c, classifyPointI(+pointer(float_array), +integer, - [-integer])). +foreign(classifyPoint, c, classifyPointI( +pointer(float_array), +integer, + [-integer])). %% --Input-- @@ -120,7 +126,7 @@ computeAccuracy(DataList, DataRows, LabelsList, Accuracy) :- convert_list_to_float_array(LabelsList, array(Ysize, Y)), computeAccuracyI(X, Xsize, Xrownum, Y, Ysize, Accuracy). -foreign(computeAccuracy, c, computeAccuracyI( +pointer(float_array), +integer, +integer, +foreign(computeAccuracy, c, computeAccuracyI( +pointer(float_array), +integer, +integer, +pointer(float_array), +integer, [-float32])). @@ -138,15 +144,16 @@ foreign(computeAccuracy, c, computeAccuracyI( +pointer(float_array), +integer %% Train the Linear_svm model with the given training data. %% train(DataList, DataRows, LabelsList, NumClasses, Optimizer, ObjValue) :- + NumClasses >= 0, convert_list_to_float_array(DataList, DataRows, array(Xsize, Xrownum, X)), convert_list_to_float_array(LabelsList, array(Ysize, Y)), trainI(X, Xsize, Xrownum, Y, Ysize, NumClasses, Optimizer, ObjValue). -foreign(train, c, trainI(+pointer(float_array), +integer, +integer, - +pointer(float_array), +integer, - +integer, - +string, - [-float32])). +foreign(train, c, trainI( +pointer(float_array), +integer, +integer, + +pointer(float_array), +integer, + +integer, + +string, + [-float32])). %% Defines the functions that get connected from main.cpp diff --git a/src/methods/linear_SVM/linear_SVM_test.pl b/src/methods/linear_SVM/linear_SVM_test.pl index 2535dc8..9ddaa73 100644 --- a/src/methods/linear_SVM/linear_SVM_test.pl +++ b/src/methods/linear_SVM/linear_SVM_test.pl @@ -6,50 +6,285 @@ :- use_module(linear_SVM). :- use_module('../../helper_files/helper.pl'). -reset_Model :- +reset_Model_NoTrain :- initModelNoTrain(2, 0.0001, 1.0, 0). +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.0001, 1.0, 0, lbfgs). + :- begin_tests(lists). -%% 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, 1.4, 3.0, 2.1, 0.1],4, array(Xsize, Xrownum, X)), - convert_list_to_float_array([1,1,0,0], array(Ysize, Y)), - train(X,Xsize, Xrownum,Y, Ysize, 2, lbfgs, Result), - print(Result). -:- end_tests(lists). +%% +%% TESTING predicate initModelWithTrain/8 +%% +:- begin_tests(initModelWithTrain). + +%% Failure Tests + +test(linear_SVM_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.0001, 1.0, 0, lbfgs). + +test(linear_SVM_InitModelWithTrain_Negative_Lambda, 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.0001, 1.0, 0, lbfgs). + +test(linear_SVM_InitModelWithTrain_Negative_Delta, 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.0001, -1.0, 0, lbfgs). + +test(linear_SVM_InitModelWithTrain_Wrong_Optimizer_Input, [error(domain_error('The given Optimizer is unkown!' , wrongInput), _)]) :- + 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.0001, 1.0, 0, wrongInput). + +test(linear_SVM_InitModelWithTrain_Too_Few_Labels, [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.0001, 1.0, 0, lbfgs). + +test(linear_SVM_InitModelWithTrain_Too_Many_Labels, [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.0001, 1.0, 0, lbfgs). + +test(linear_SVM_InitModelWithTrain_Too_Many_LabelClasses, [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.0001, 1.0, 0, lbfgs). + + +%% Successful Tests + +test(linear_SVM_InitModelWithTrain_Normal_Use_LBFGS) :- + 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.0001, 1.0, 0, lbfgs). + +test(linear_SVM_InitModelWithTrain_Normal_Use_PSGD) :- + 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.0001, 1.0, 0, psgd). + +test(linear_SVM_InitModelWithTrain_CSV_Inpupt_LBFGS) :- + open('src/data_csv/iris2.csv', read, File), + take_csv_row(File, skipFirstRow,10, Data), + initModelWithTrain(Data, 4, [0,1,0,1,1,0,1,1,1,0], 2, 0.000021, 2.0, 1, lbfgs). + +:- end_tests(initModelWithTrain). + + + +%% +%% TESTING predicate initModelNoTrain/4 +%% +:- begin_tests(initModelNoTrain). + +%% Failure Tests + +test(linear_SVM_InitModelNoTrain_Negative_NumClasses, fail) :- + initModelNoTrain(-2, 0.0001, 1.0, 0). + +test(linear_SVM_InitModelNoTrain_Negative_Lambda, fail) :- + initModelNoTrain(2, -0.0001, 1.0, 0). + +test(linear_SVM_InitModelNoTrain_Negative_Delta, fail) :- + initModelNoTrain(2, 0.0001, -1.0, 0). + + +%% Successful Tests + +test(linear_SVM_InitModelNoTrain_Normal_Use) :- + initModelNoTrain(2, 0.0001, 1.0, 0). + +test(linear_SVM_InitModelNoTrain_Alternative) :- + initModelNoTrain(2, 0.042, 0.5, 1). + +:- end_tests(initModelNoTrain). + + %% -%% TESTING predicate predicate/10 +%% TESTING predicate classify/5 %% -:- begin_tests(predicate). +:- begin_tests(classify). %% 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(linear_SVM_Classify_Before_Train, [error(_,system_error('Error'))]) :- + reset_Model_NoTrain, + classify([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(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(linear_SVM_Classify_Diffrent_Dims_Than_Train, [error(_,system_error('Error'))]) :- + reset_Model_WithTrain, + classify([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(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(linear_SVM_Classify_Normal_Use_LBFGS) :- + 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.0001, 1.0, 0, lbfgs), + classify([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, LabelsList, ScoresList, _), + print('\nLabels: '), + print(LabelsList), + print('\nScores: '), + print(ScoresList). + +test(linear_SVM_Classify_Normal_Use_PSGD) :- + 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.0001, 1.0, 0, psgd), + classify([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, LabelsList, ScoresList, _), + print('\nLabels: '), + print(LabelsList), + print('\nScores: '), + print(ScoresList). + +test(linear_SVM_Classify_CSV_Input) :- + 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, [0,1,0], 2, 0.0001, 2.0, 1, lbfgs), + open('src/data_csv/iris2.csv', read, File), + take_csv_row(File, skipFirstRow,10, Data), + classify(Data, 4, LabelsList, ScoresList, _), + print('\nLabels: '), + print(LabelsList), + print('\nScores: '), + print(ScoresList). + +:- end_tests(classify). + + + +%% +%% TESTING predicate classifyPoint/2 +%% +:- begin_tests(classifyPoint). + +%% Failure Tests + +test(linear_SVM_ClassifyPoint_Before_Train, [error(_,system_error('Error'))]) :- + reset_Model_NoTrain, + classifyPoint([5.1,3.5,1.4], _). + +test(linear_SVM_ClassifyPoint_Diffrent_Dims_Than_Train, [error(_,system_error('Error'))]) :- + reset_Model_WithTrain, + classifyPoint([5.1,3.5,1.4,4.9], _). + + +%% Successful Tests + +test(linear_SVM_ClassifyPoint_Normal_Use_LBFGS) :- + 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.0001, 1.0, 0, lbfgs), + classifyPoint([5.1,3.5,1.4], Label), + print('\nLabel: '), + print(Label). + +test(linear_SVM_ClassifyPoint_Normal_Use_PSGD) :- + 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.0001, 1.0, 0, psgd), + classifyPoint([5.1,3.5,1.4], Label), + print('\nLabel: '), + print(Label). + +test(linear_SVM_ClassifyPoint_CSV_Input) :- + 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, [0,1,0], 2, 0.0001, 2.0, 1, lbfgs), + open('src/data_csv/iris2.csv', read, File), + take_csv_row(File, skipFirstRow,1, Data), + classifyPoint(Data, Label), + print('\nLabel: '), + print(Label). + +:- end_tests(classifyPoint). + + + +%% +%% TESTING predicate computeAccuracy/4 +%% +:- begin_tests(computeAccuracy). + +%% Failure Tests + +test(linear_SVM_ComputeAccuracy_Before_Train, [error(_,system_error('Error'))]) :- + reset_Model_NoTrain, + computeAccuracy([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], _). + +test(linear_SVM_ComputeAccuracy_Too_Few_Labels, [error(_,system_error('Error'))]) :- + reset_Model_WithTrain, + computeAccuracy([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], _). + +test(linear_SVM_ComputeAccuracy_Too_Many_Labels, [error(_,system_error('Error'))]) :- + reset_Model_WithTrain, + computeAccuracy([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], _). + +test(linear_SVM_ComputeAccuracy_Too_Many_LabelClasses, [error(_,system_error('Error'))]) :- + reset_Model_WithTrain, + computeAccuracy([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], _). + +test(linear_SVM_ComputeAccuracy_Wrong_Data_Dims, [error(_,system_error('Error'))]) :- + reset_Model_WithTrain, + computeAccuracy([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], _). + + +%% Successful Tests + +test(linear_SVM_ComputeAccuracy_Normal_Use_LBFGS) :- + 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.0001, 1.0, 0, lbfgs), + computeAccuracy([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], Accuracy), + print('\nAccuracy: '), + print(Accuracy). + +test(linear_SVM_ComputeAccuracy_Normal_Use_PSGD) :- + 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.0001, 1.0, 0, psgd), + computeAccuracy([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], Accuracy), + print('\nAccuracy: '), + print(Accuracy). + +test(linear_SVM_ComputeAccuracy_CSV_Input) :- + 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, [0,1,0], 2, 0.0001, 2.0, 1, lbfgs), + open('src/data_csv/iris2.csv', read, File), + take_csv_row(File, skipFirstRow,1, Data), + computeAccuracy(Data, 4, [0,1,0,1,1,0,1,1,1,0], Accuracy), + print('\nAccuracy: '), + print(Accuracy). + +:- end_tests(computeAccuracy). + + + +%% +%% TESTING predicate train/6 +%% +:- begin_tests(train). + +%% Failure Tests + +test(linear_SVM_Train_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, lbfgs, _). + +test(linear_SVM_Train_Wrong_Optimizer_Input, [error(domain_error('The given Optimizer is unkown!' , wrongInput), _)]) :- + 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, wrongInput, _). + +test(linear_SVM_Train_Too_Few_Labels, [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, lbfgs, _). + +test(linear_SVM_Train_Too_Many_Labels, [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, lbfgs, _). + +test(linear_SVM_Train_Too_Many_LabelClasses, [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, lbfgs, _). + + +%% Successful Tests + +test(linear_SVM_Train_Normal_Use_LBFGS) :- + 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, lbfgs, ObjectiveValue), + print('\nObjectiveValue: '), + print(ObjectiveValue). + +test(linear_SVM_Train_Normal_Use_PSGD) :- + 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, psgd, ObjectiveValue), + print('\nObjectiveValue: '), + print(ObjectiveValue). -test(testDescription4, [true(Error =:= 0.9797958971132711)]) :- - reset_Model_No_Train(perceptron), +test(linear_SVM_Train_CSV_Inpupt_LBFGS) :- + 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, perceptron, 50, 0.0001, Error). + train(Data, 4, [0,1,0,1,1,0,1,1,1,0], 2, lbfgs, ObjectiveValue), + print('\nObjectiveValue: '), + print(ObjectiveValue). -:- end_tests(predicate). +:- end_tests(train). run_linear_SVM_tests :- run_tests. -- GitLab