diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt index 5ae1c4cbb13f5104cb316f48e59376c0ee3efcfc..cac502895d6a41418cdbf31ba5982923313b0ebc 100644 --- a/src/CMakeLists.txt +++ b/src/CMakeLists.txt @@ -75,6 +75,9 @@ target_link_libraries(connection_weight_identity_test boost_unit_test 4neuro) add_executable(dataset_test tests/DataSet_test.cpp) target_link_libraries(dataset_test boost_unit_test 4neuro) +add_executable(errorfunction_test tests/ErrorFunctions_test.cpp) +target_link_libraries(errorfunction_test boost_unit_test 4neuro) + add_executable(particle_swarm_test tests/ParticleSwarm_test.cpp) target_link_libraries(particle_swarm_test boost_unit_test 4neuro) diff --git a/src/tests/ErrorFunctions_test.cpp b/src/tests/ErrorFunctions_test.cpp new file mode 100644 index 0000000000000000000000000000000000000000..16af741d9eb6be2bd0cac816c2ff1140776a7a83 --- /dev/null +++ b/src/tests/ErrorFunctions_test.cpp @@ -0,0 +1,184 @@ +/** + * DESCRIPTION OF THE CLASS + * + * @author David Vojtek + * @date 2018 + */ + +#define BOOST_TEST_NO_MAIN + +#include <boost/test/unit_test.hpp> +#include "../ErrorFunction/ErrorFunctions.h" +#include "../Neuron/NeuronLinear.h" + +/** + * Boost testing suite for testing ErrorFunction.h + * doesn't test inherited methods + */ +BOOST_AUTO_TEST_SUITE(ErrorFunctions_test) + + BOOST_AUTO_TEST_CASE(ErrorFunction_MSE_Construction_Test) { + NeuralNetwork network; + std::vector<std::pair<std::vector<double>, std::vector<double>>> data_vec; + std::vector<double> inp, out; + for (int i = 0; i < 3; i++) { + inp.push_back(i); + out.push_back(i + 4); + } + data_vec.emplace_back(std::make_pair(inp, out)); + DataSet dataSet(&data_vec); + BOOST_CHECK_NO_THROW(MSE mse(&network, &dataSet)); + } + + BOOST_AUTO_TEST_CASE(ErrorFunction_MSE_Eval_Test) { + Neuron *n1 = new NeuronLinear(1, 1); + Neuron *n2 = new NeuronLinear(2, 2); + NeuralNetwork network; + std::vector<std::pair<std::vector<double>, std::vector<double>>> data_vec; + std::vector<double> inp, out; + for (int i = 0; i < 1; i++) { + inp.push_back(i); + out.push_back(i + 4); + } + data_vec.emplace_back(std::make_pair(inp, out)); + network.add_neuron(n1); + network.add_neuron(n2); + network.add_connection_simple(0, 1, 0, 2.5); + network.randomize_weights(); + std::vector<size_t> net_input_neurons_indices(1); + std::vector<size_t> net_output_neurons_indices(1); + net_input_neurons_indices[0] = 0; + net_output_neurons_indices[0] = 1; + network.specify_input_neurons(net_input_neurons_indices); + network.specify_output_neurons(net_output_neurons_indices); + + DataSet dataSet(&data_vec); + + double weights[1] = {0}; + + MSE mse(&network, &dataSet); + + BOOST_CHECK_EQUAL(4, mse.eval(&weights[0])); + } + + BOOST_AUTO_TEST_CASE(ErrorFunction_MSE_Get_dimension_test) { + Neuron *n1 = new NeuronLinear(1, 1); + Neuron *n2 = new NeuronLinear(2, 2); + NeuralNetwork network; + std::vector<std::pair<std::vector<double>, std::vector<double>>> data_vec; + std::vector<double> inp, out; + for (int i = 0; i < 1; i++) { + inp.push_back(i); + out.push_back(i + 4); + } + data_vec.emplace_back(std::make_pair(inp, out)); + network.add_neuron(n1); + network.add_neuron(n2); + network.add_connection_simple(0, 1, 0, 2.5); + network.randomize_weights(); + std::vector<size_t> net_input_neurons_indices(1); + std::vector<size_t> net_output_neurons_indices(1); + net_input_neurons_indices[0] = 0; + net_output_neurons_indices[0] = 1; + network.specify_input_neurons(net_input_neurons_indices); + network.specify_output_neurons(net_output_neurons_indices); + + DataSet dataSet(&data_vec); + + MSE mse(&network, &dataSet); + + BOOST_CHECK_EQUAL(1, mse.get_dimension()); + } + + BOOST_AUTO_TEST_CASE(ErrorFunction_MSE_SUM_Construction_Test) { + BOOST_CHECK_NO_THROW(MSE_SUM mse_sum); + } + + BOOST_AUTO_TEST_CASE(ErrorFunction_MSE_SUM_Add_Error_Function_Test) { + NeuralNetwork network; + std::vector<std::pair<std::vector<double>, std::vector<double>>> data_vec; + std::vector<double> inp, out; + for (int i = 0; i < 3; i++) { + inp.push_back(i); + out.push_back(i + 4); + } + data_vec.emplace_back(std::make_pair(inp, out)); + DataSet dataSet(&data_vec); + + ErrorFunction *f = new MSE(&network, &dataSet); + + MSE_SUM mse_sum; + BOOST_CHECK_NO_THROW(mse_sum.add_error_function(f)); + } + + BOOST_AUTO_TEST_CASE(ErrorFunction_MSE_SUM_Eval_Test) { + MSE_SUM mse_sum; + double weights[1] = {0}; + + Neuron *n1 = new NeuronLinear(1, 1); + Neuron *n2 = new NeuronLinear(2, 2); + NeuralNetwork network; + std::vector<std::pair<std::vector<double>, std::vector<double>>> data_vec; + std::vector<double> inp, out; + for (int i = 0; i < 1; i++) { + inp.push_back(i); + out.push_back(i + 4); + } + data_vec.emplace_back(std::make_pair(inp, out)); + network.add_neuron(n1); + network.add_neuron(n2); + network.add_connection_simple(0, 1, 0, 2.5); + network.randomize_weights(); + std::vector<size_t> net_input_neurons_indices(1); + std::vector<size_t> net_output_neurons_indices(1); + net_input_neurons_indices[0] = 0; + net_output_neurons_indices[0] = 1; + network.specify_input_neurons(net_input_neurons_indices); + network.specify_output_neurons(net_output_neurons_indices); + + DataSet dataSet(&data_vec); + + ErrorFunction *f = new MSE(&network, &dataSet); + + mse_sum.add_error_function(f); + + BOOST_CHECK_EQUAL(4, mse_sum.eval(&weights[0])); + } + + BOOST_AUTO_TEST_CASE(ErrorFunction_MSE_SUM_Get_Dimension_test) { + MSE_SUM mse_sum; + BOOST_CHECK_EQUAL(0, mse_sum.get_dimension()); + + Neuron *n1 = new NeuronLinear(1, 1); + Neuron *n2 = new NeuronLinear(2, 2); + NeuralNetwork network; + std::vector<std::pair<std::vector<double>, std::vector<double>>> data_vec; + std::vector<double> inp, out; + for (int i = 0; i < 1; i++) { + inp.push_back(i); + out.push_back(i + 4); + } + data_vec.emplace_back(std::make_pair(inp, out)); + network.add_neuron(n1); + network.add_neuron(n2); + network.add_connection_simple(0, 1, 0, 2.5); + network.randomize_weights(); + std::vector<size_t> net_input_neurons_indices(1); + std::vector<size_t> net_output_neurons_indices(1); + net_input_neurons_indices[0] = 0; + net_output_neurons_indices[0] = 1; + network.specify_input_neurons(net_input_neurons_indices); + network.specify_output_neurons(net_output_neurons_indices); + + DataSet dataSet(&data_vec); + + ErrorFunction *f = new MSE(&network, &dataSet); + + mse_sum.add_error_function(f); + + BOOST_CHECK_EQUAL(1, mse_sum.get_dimension()); + + } + + +BOOST_AUTO_TEST_SUITE_END() \ No newline at end of file diff --git a/src/tests/NeuralNetwork_test.cpp b/src/tests/NeuralNetwork_test.cpp index a5b4350f097d23dd5273c5a842dd30f0e571c317..7f5f672f086803c394c484ba10d3d7ae610c5296 100644 --- a/src/tests/NeuralNetwork_test.cpp +++ b/src/tests/NeuralNetwork_test.cpp @@ -82,4 +82,135 @@ BOOST_AUTO_TEST_SUITE(NeuralNetwork_test) BOOST_CHECK_THROW(network.add_connection_general(0, 2, &f, para, w_array, 5), std::out_of_range); } + BOOST_AUTO_TEST_CASE(NeuralNetwork_get_subnet_test) { + Neuron *n1 = new NeuronLinear(1, 1); + Neuron *n2 = new NeuronLinear(2, 2); + Neuron *n3 = new NeuronLinear(3, 3); + Neuron *n4 = new NeuronLinear(4, 4); + + NeuralNetwork network; + network.add_neuron(n1); + network.add_neuron(n2); + network.add_neuron(n3); + network.add_neuron(n4); + + network.add_connection_simple(0, 1, 0, 2.5); + network.add_connection_simple(0, 3, 0, 2.5); + network.add_connection_simple(2, 1, 0, 2.5); + network.add_connection_simple(2, 3, 0, 2.5); + + std::vector<size_t> input_neuron_indices(1); + input_neuron_indices.push_back(0); + + std::vector<size_t> output_neuron_indices(1); + output_neuron_indices.push_back(1); + + NeuralNetwork *network2 = network.get_subnet(input_neuron_indices, output_neuron_indices); + + BOOST_CHECK_EQUAL(2, network2->add_neuron(n1)); + } + + BOOST_AUTO_TEST_CASE(NeuralNetwork_specify_input_neurons_test) { + Neuron *n1 = new NeuronLinear(1, 1); + Neuron *n2 = new NeuronLinear(2, 2); + NeuralNetwork network; + network.add_neuron(n1); + network.add_neuron(n2); + + network.add_connection_simple(0, 1, 0, 2.5); + + BOOST_CHECK_EQUAL(0, network.get_n_inputs()); + std::vector<size_t> input_neuron_indices(1); + input_neuron_indices[0] = (size_t) 0; + + network.specify_input_neurons(input_neuron_indices); + + BOOST_CHECK_EQUAL(1, network.get_n_inputs()); + } + + BOOST_AUTO_TEST_CASE(NeuralNetwork_specify_output_neurons_test) { + Neuron *n1 = new NeuronLinear(1, 1); + Neuron *n2 = new NeuronLinear(2, 2); + NeuralNetwork network; + network.add_neuron(n1); + network.add_neuron(n2); + + network.add_connection_simple(0, 1, 0, 2.5); + + BOOST_CHECK_EQUAL(0, network.get_n_outputs()); + std::vector<size_t> output_neuron_indices(1); + output_neuron_indices[0] = (size_t) 1; + + network.specify_output_neurons(output_neuron_indices); + + BOOST_CHECK_EQUAL(1, network.get_n_outputs()); + } + + BOOST_AUTO_TEST_CASE(NeuralNetwork_get_weights_test) { + Neuron *n1 = new NeuronLinear(1, 1); + Neuron *n2 = new NeuronLinear(2, 2); + NeuralNetwork network; + network.add_neuron(n1); + network.add_neuron(n2); + + network.add_connection_simple(0, 1, 0, 2.5); + + BOOST_CHECK_EQUAL(1, network.get_n_weights()); + } + + BOOST_AUTO_TEST_CASE(NeuralNetwork_eval_single_test) { + Neuron *n1 = new NeuronLinear(1, 1); + Neuron *n2 = new NeuronLinear(2, 2); + NeuralNetwork network; + network.add_neuron(n1); + network.add_neuron(n2); + + network.add_connection_simple(0, 1, -1, 2.5); + + std::vector<size_t> output_neuron_indices(1); + output_neuron_indices[0] = (size_t) 1; + network.specify_output_neurons(output_neuron_indices); + + std::vector<size_t> input_neuron_indices(1); + input_neuron_indices[0] = (size_t) 0; + network.specify_input_neurons(input_neuron_indices); + + std::vector<double> input; + input.push_back(1); + std::vector<double> output; + output.push_back(1); + + network.eval_single(input, output); + BOOST_CHECK_EQUAL(12, output.at(0)); + } + + + BOOST_AUTO_TEST_CASE(NeuralNetwork_eval_single_weights_test) { + Neuron *n1 = new NeuronLinear(1, 1); + Neuron *n2 = new NeuronLinear(2, 2); + NeuralNetwork network; + network.add_neuron(n1); + network.add_neuron(n2); + + network.add_connection_simple(0, 1, -1, 2.5); + + std::vector<size_t> output_neuron_indices(1); + output_neuron_indices[0] = (size_t) 1; + network.specify_output_neurons(output_neuron_indices); + + std::vector<size_t> input_neuron_indices(1); + input_neuron_indices[0] = (size_t) 0; + network.specify_input_neurons(input_neuron_indices); + + std::vector<double> input; + input.push_back(1); + std::vector<double> output; + output.push_back(1); + + double weights = 5; + network.get_n_weights(); + network.eval_single(input, output, &weights); + BOOST_CHECK_EQUAL(22, output.at(0)); + } + BOOST_AUTO_TEST_SUITE_END() \ No newline at end of file