diff --git a/src/methods/linear_SVM/linear_SVM.pl b/src/methods/linear_SVM/linear_SVM.pl
index 864abf15bc544ff25a46c097b45be277daf34ab0..996531079d10358bd08c1623dd55d7c3d1d0b2cc 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 2535dc83ec63581d605f973f2132df5e0464f205..9ddaa7301faeb1f4e184db6c66aee5a434badb79 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.