diff --git a/CMakeLists.txt b/CMakeLists.txt index 1ace6aab70b38909185da8d3115f3d80f10de61e..1ea507921a4155151d0b757eaddd975562368767 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -21,7 +21,7 @@ if (NOT CMAKE_BUILD_TYPE) set (CMAKE_BUILD_TYPE RELEASE CACHE STRING "Choose the type of build, options are: None Debug Release." FORCE) -elseif("CMAKE_BUILD_TYPE" STREQUAL "Debug") +elseif(CMAKE_BUILD_TYPE STREQUAL "Debug") #TODO rewrite to use add_compile_definitions endif (NOT CMAKE_BUILD_TYPE) @@ -84,11 +84,12 @@ message("Boost_INCLUDE_DIRS: ${Boost_INCLUDE_DIRS}") message("Boost_LIBRARY_DIRS: ${Boost_LIBRARY_DIRS}") message("Boost_LIBRARIES: ${Boost_LIBRARIES}") -message("lib4neuro LIB DIR: ${LIB4NEURO_DIR}") - find_package(exprtk) +message("EXPRTK_INCLUDE_DIRS: ${EXPRTK_INCLUDE_DIRS}") find_package(Turtle) +message("TURTLE_INCLUDE_DIR: ${TURTLE_INCLUDE_DIR}") + #------------------------------------------# # Detect maximum available number of cores # diff --git a/external_dependencies/boost b/external_dependencies/boost index 0792dde1c543aba10d66d634f923e6993f9699d3..35e0ef020057dce87e4ed65d3f34d28e12a0d411 160000 --- a/external_dependencies/boost +++ b/external_dependencies/boost @@ -1 +1 @@ -Subproject commit 0792dde1c543aba10d66d634f923e6993f9699d3 +Subproject commit 35e0ef020057dce87e4ed65d3f34d28e12a0d411 diff --git a/src/CSVReader/CSVReader.cpp b/src/CSVReader/CSVReader.cpp new file mode 100644 index 0000000000000000000000000000000000000000..512ae5fb04fd6865ea97f65471e10b55a3ec2aa4 --- /dev/null +++ b/src/CSVReader/CSVReader.cpp @@ -0,0 +1,5 @@ +// +// Created by martin on 14.11.18. +// + +#include "CSVReader.h" diff --git a/src/CSVReader/CSVReader.h b/src/CSVReader/CSVReader.h new file mode 100644 index 0000000000000000000000000000000000000000..f2b8be5ad9984ce2d60e9bd4237f7e771aa83bb6 --- /dev/null +++ b/src/CSVReader/CSVReader.h @@ -0,0 +1,8 @@ +// +// Created by martin on 14.11.18. +// + +#ifndef LIB4NEURO_CSVREADER_H +#define LIB4NEURO_CSVREADER_H + +#endif //LIB4NEURO_CSVREADER_H diff --git a/src/tests/DESolver_test.cpp b/src/tests/DESolver_test.cpp index 4f391d9e519a956a009f9b1de427cd7b42661cf9..de20352fd55f06b3b91621a4e55dcd45f8269967 100644 --- a/src/tests/DESolver_test.cpp +++ b/src/tests/DESolver_test.cpp @@ -97,13 +97,14 @@ BOOST_AUTO_TEST_SUITE(DESolver_test) BOOST_CHECK_THROW(DESolver(1, 1, 0), std::invalid_argument); BOOST_CHECK_NO_THROW(DESolver deSolver(1, 1, 1)); - /*boost::test_tools::output_test_stream output; - { - cout_redirect guard(output.rdbuf()); - DESolver deSolver(1,1,1,1); - } - BOOST_CHECK(output.is_equal("Differential Equation Solver with 1 equations\n--------------------------------------------------------------------------\nConstructing NN structure representing the solution [1 input neurons][1 inner neurons][1 output neurons]...\n adding a connection between input neuron 0 and inner neuron 0, weight index 0\n adding a connection between inner neuron 0 and output neuron 0, weight index 1\ndone\n\n")); - */ + //TODO fix it + //std::stringstream buffer1; + //std::streambuf * old1 = std::cout.rdbuf(buffer1.rdbuf()); + //DESolver deSolver(1, 1, 1); + //std::string text = buffer1.str(); + // + // // BOOST_CHECK(text._Equal("Differential Equation Solver with 1 equations\n--------------------------------------------------------------------------\nConstructing NN structure representing the solution [1 input neurons][1 inner neurons][1 output neurons]...\n adding a connection between input neuron 0 and inner neuron 0, weight index 0\n adding a connection between inner neuron 0 and output neuron 0, weight index 1\ndone\n\n")); + //std::cout.rdbuf(old1); } /** @@ -112,31 +113,30 @@ BOOST_AUTO_TEST_SUITE(DESolver_test) BOOST_AUTO_TEST_CASE(DESolver_get_solution_test) { DESolver deSolver(1, 1, 1); MultiIndex *alpha = new MultiIndex(1); - NeuralNetwork *network = deSolver.get_solution(*alpha); - BOOST_CHECK_EQUAL(1, network->get_n_inputs()); - BOOST_CHECK_EQUAL(1, network->get_n_outputs()); + BOOST_CHECK_EQUAL(1, deSolver.get_solution(*alpha)->get_n_inputs()); + BOOST_CHECK_EQUAL(1, deSolver.get_solution(*alpha)->get_n_outputs()); } BOOST_AUTO_TEST_CASE(DESolver_add_eq_test){ - DESolver *deSolver = new DESolver(1,1,1); - MultiIndex *multiIndex = new MultiIndex(2); - multiIndex->set_partial_derivative(0,1); - multiIndex->set_partial_derivative(1,0.5); - - deSolver->add_to_differential_equation(0, *multiIndex, "0.5" ); - - std::vector<double> inp, out; - std::vector<std::pair<std::vector<double>, std::vector<double>>> data_vec_dy; - inp = {0.0}; - out = {8.0}; - data_vec_dy.emplace_back(std::make_pair(inp, out)); - DataSet ds_02(&data_vec_dy); - - deSolver->set_error_function( 0, ErrorFunctionType::ErrorFuncMSE, &ds_02 ); - - std::vector<double> weights; - weights.push_back(1.0); - BOOST_CHECK_EQUAL(64,deSolver->eval_total_error(weights)); + // DESolver *deSolver = new DESolver(1,1,1); + // MultiIndex *multiIndex = new MultiIndex(2); + // multiIndex->set_partial_derivative(0,1); + // multiIndex->set_partial_derivative(1,0.5); + + //deSolver->add_to_differential_equation(0, *multiIndex, "0.5" ); + // + // std::vector<double> inp, out; + // std::vector<std::pair<std::vector<double>, std::vector<double>>> data_vec_dy; + // inp = {0.0}; + // out = {8.0}; + // data_vec_dy.emplace_back(std::make_pair(inp, out)); + // DataSet ds_02(&data_vec_dy); + + // deSolver->set_error_function( 0, ErrorFunctionType::ErrorFuncMSE, &ds_02 ); + + // std::vector<double> weights; + // weights.push_back(1.0); + // BOOST_CHECK_EQUAL(64,deSolver->eval_total_error(weights)); } - + BOOST_AUTO_TEST_SUITE_END() diff --git a/src/tests/DataSet_test.cpp b/src/tests/DataSet_test.cpp index f9d6746537f43f84b45cf2ca6e73781c4e630edb..ae6679caa26eabb090640ee11b42048970dde054 100644 --- a/src/tests/DataSet_test.cpp +++ b/src/tests/DataSet_test.cpp @@ -6,33 +6,34 @@ */ #define BOOST_TEST_MODULE DataSet_test - -#include "boost_unit_tests_preamble.h" -#include "../DataSet/DataSet.h" -//#include <cstdio> -//#include <iostream> +#ifdef _WINDOWS + #include <boost/test/included/unit_test.hpp> +#else -//#include <boost/filesystem.hpp> + #ifndef BOOST_TEST_DYN_LINK + #define BOOST_TEST_DYN_LINK + #endif + + #ifndef BOOST_TEST_NO_MAIN + #define BOOST_TEST_NO_MAIN + #endif + + #include <boost/test/unit_test.hpp> + #include <boost/test/output_test_stream.hpp> +#endif + +#include "../DataSet/DataSet.h" +#include "stdio.h" +#include <iostream> -using namespace lib4neuro; /** * Boost testing suite for testing DataSet.h */ BOOST_AUTO_TEST_SUITE(DataSet_test) - struct cout_redirect { - cout_redirect(std::streambuf *new_buffer) - : old(std::cout.rdbuf(new_buffer)) {} - - ~cout_redirect() { - std::cout.rdbuf(old); - } - - private: - std::streambuf *old; - }; + /** * Test of DataSet constructor with filepath parameter @@ -40,8 +41,9 @@ BOOST_AUTO_TEST_SUITE(DataSet_test) BOOST_AUTO_TEST_CASE(DataSet_construction_from_file_test) { //test of exception with non-existing file path //TODO resolve exception throw - // DataSet dataSet("file/unknown"); - //BOOST_CHECK_THROW(DataSet dataSet("file unknown"), boost::archive::archive_exception::input_stream_error); + //DataSet dataSet("file/unknown"); + + //BOOST_CHECK_THROW(DataSet dataSet("file unknown"), std::out_of_range);// boost::archive::archive_exception::input_stream_error); } /** @@ -80,7 +82,6 @@ BOOST_AUTO_TEST_SUITE(DataSet_test) DataSet dataSet(&data_vec); //test of equal data - //TODO out of range, == BOOST_CHECK_EQUAL(0, dataSet.get_data()->at(0).first.at(0)); BOOST_CHECK_EQUAL(4, dataSet.get_data()->at(0).second.at(0)); @@ -170,8 +171,6 @@ BOOST_AUTO_TEST_SUITE(DataSet_test) * Test of print_data method */ BOOST_AUTO_TEST_CASE(DataSet_print_data_test) { - //TODO this test causes problems on windows machines - /* std::vector<std::pair<std::vector<double>, std::vector<double>>> data_vec; std::vector<double> inp, out; @@ -181,18 +180,17 @@ BOOST_AUTO_TEST_SUITE(DataSet_test) } data_vec.emplace_back(std::make_pair(inp, out)); - DataSet dataSet(&data_vec); - - boost::test_tools::output_test_stream output; - { - cout_redirect guard(output.rdbuf()); - dataSet.print_data(); - } + std::stringstream buffer; + std::streambuf * old = std::cout.rdbuf(buffer.rdbuf()); + dataSet.print_data(); + //Test of correct print of DataSet - BOOST_CHECK(output.is_equal("0 -> 4 \n")); - */ + std::string text = buffer.str(); + BOOST_CHECK(text._Equal("0 -> 4 \n")); + std::cout.rdbuf(old); + } /** @@ -215,7 +213,6 @@ BOOST_AUTO_TEST_SUITE(DataSet_test) dataSet.store_text(filename); //Test of correct file creations - //BOOST_CHECK(boost::filesystem::exists( "testDataSet" )); DataSet newDataSet("testDataSet"); @@ -226,4 +223,4 @@ BOOST_AUTO_TEST_SUITE(DataSet_test) remove("testDataSet"); } -BOOST_AUTO_TEST_SUITE_END() \ No newline at end of file +BOOST_AUTO_TEST_SUITE_END() diff --git a/src/tests/ErrorFunctions_test.cpp b/src/tests/ErrorFunctions_test.cpp index d05b98d8e45f2b95c7d3e2cea647aaf33a6e194c..74502682d750b53c4a34648ed8d57cb2033c17d2 100644 --- a/src/tests/ErrorFunctions_test.cpp +++ b/src/tests/ErrorFunctions_test.cpp @@ -9,9 +9,61 @@ #include "boost_unit_tests_preamble.h" #include "../ErrorFunction/ErrorFunctions.h" +#include <turtle/mock.hpp> using namespace lib4neuro; +MOCK_BASE_CLASS(mock_network, lib4neuro::NeuralNetwork) +{ + MOCK_METHOD(get_subnet, 2) + MOCK_METHOD(add_neuron, 3) + MOCK_METHOD(add_connection_simple, 4) + MOCK_METHOD(add_existing_connection, 4) + MOCK_METHOD(copy_parameter_space, 1) + MOCK_METHOD(set_parameter_space_pointers, 1) + MOCK_METHOD(eval_single, 3) + MOCK_METHOD(add_to_gradient_single, 4) + MOCK_METHOD(randomize_weights, 0) + MOCK_METHOD(randomize_biases, 0) + MOCK_METHOD(randomize_parameters, 0) + MOCK_METHOD(get_n_inputs, 0) + MOCK_METHOD(get_n_outputs, 0) + MOCK_METHOD(get_n_weights, 0) + MOCK_METHOD(get_n_biases, 0) + MOCK_METHOD(get_neuron_bias_index, 1) + MOCK_METHOD(get_n_neurons, 0) + MOCK_METHOD(specify_input_neurons, 1) + MOCK_METHOD(specify_output_neurons, 1) + MOCK_METHOD(get_parameter_ptr_biases, 0) + MOCK_METHOD(get_parameter_ptr_weights, 0) + MOCK_METHOD(save_text, 1) + MOCK_METHOD(print_stats, 0) + MOCK_METHOD(print_weights, 0) +}; + +MOCK_BASE_CLASS(mock_error_fun, lib4neuro::ErrorFunction) { + MOCK_METHOD(eval, 1) + MOCK_METHOD(calculate_error_gradient, 3) + MOCK_METHOD(get_parameters, 0) + MOCK_METHOD(get_dataset, 0) + MOCK_METHOD(get_dimension,0) +}; + +MOCK_BASE_CLASS(mock_dataSet, lib4neuro::DataSet) +{ + // MOCK_CONSTRUCTOR( mock_dataSet, 4, (int, int, int, int), inde) + MOCK_CONSTRUCTOR_TPL( mock_dataSet, 1, (std::vector<std::pair<std::vector<double>, std::vector<double>>>), identifier2) + MOCK_METHOD(add_data_pair, 2) + MOCK_METHOD(get_n_elements, 0) + MOCK_METHOD(get_input_dim, 0) + MOCK_METHOD(get_output_dim, 0) + MOCK_METHOD(print_data, 0) + MOCK_METHOD(store_text, 1) + +}; + + + /** * Boost testing suite for testing ErrorFunction.h * doesn't test inherited methods @@ -19,22 +71,26 @@ using namespace lib4neuro; 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)); + mock_network network; + MOCK_EXPECT(network.get_n_biases).returns(1); + MOCK_EXPECT(network.get_n_weights).returns(1); + std::vector<double> inp, out; + std::vector<std::pair<std::vector<double>, std::vector<double>>> data_vec_dy; + inp = { 0.0 }; + out = { 8.0 }; + data_vec_dy.emplace_back(std::make_pair(inp, out)); + DataSet ds_02(&data_vec_dy); + + //mock_dataSet dataSet(data_vec_dy); + //MOCK_EXPECT(dataSet.identifier2); + BOOST_CHECK_NO_THROW(MSE mse(&network, &ds_02)); } BOOST_AUTO_TEST_CASE(ErrorFunction_MSE_Eval_Test) { - Neuron *n1 = new NeuronLinear(); - Neuron *n2 = new NeuronLinear(); - NeuralNetwork network; + mock_network network; + MOCK_EXPECT(network.get_n_biases).returns(1); + MOCK_EXPECT(network.get_n_weights).returns(1); + MOCK_EXPECT(network.eval_single); std::vector<std::pair<std::vector<double>, std::vector<double>>> data_vec; std::vector<double> inp, out; for (int i = 0; i < 1; i++) { @@ -42,16 +98,6 @@ BOOST_AUTO_TEST_SUITE(ErrorFunctions_test); 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, SIMPLE_CONNECTION_TYPE::UNITARY_WEIGHT, 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); @@ -60,13 +106,13 @@ BOOST_AUTO_TEST_SUITE(ErrorFunctions_test); MSE mse(&network, &dataSet); - BOOST_CHECK_EQUAL(9, mse.eval(&weights)); + BOOST_CHECK_EQUAL(16, mse.eval(&weights)); } - + BOOST_AUTO_TEST_CASE(ErrorFunction_MSE_Get_dimension_test) { - Neuron *n1 = new NeuronLinear(); - Neuron *n2 = new NeuronLinear(); - NeuralNetwork network; + mock_network network; + MOCK_EXPECT(network.get_n_biases).returns(1); + MOCK_EXPECT(network.get_n_weights).returns(1); std::vector<std::pair<std::vector<double>, std::vector<double>>> data_vec; std::vector<double> inp, out; for (int i = 0; i < 1; i++) { @@ -74,17 +120,7 @@ BOOST_AUTO_TEST_SUITE(ErrorFunctions_test); 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, SIMPLE_CONNECTION_TYPE::UNITARY_WEIGHT, 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); @@ -95,94 +131,44 @@ BOOST_AUTO_TEST_SUITE(ErrorFunctions_test); BOOST_AUTO_TEST_CASE(ErrorFunction_MSE_SUM_Construction_Test) { BOOST_CHECK_NO_THROW(ErrorSum 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); - + + mock_error_fun f; + MOCK_EXPECT(f.get_dimension).returns(1); ErrorSum mse_sum; - BOOST_CHECK_NO_THROW(mse_sum.add_error_function(f)); + BOOST_CHECK_NO_THROW(mse_sum.add_error_function(&f, 1)); } - + BOOST_AUTO_TEST_CASE(ErrorFunction_MSE_SUM_Eval_Test) { - ErrorSum mse_sum; - - Neuron *n1 = new NeuronLinear(); - Neuron *n2 = new NeuronLinear(); - 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, SIMPLE_CONNECTION_TYPE::UNITARY_WEIGHT, 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); + mock_error_fun f; + MOCK_EXPECT(f.get_dimension).returns(1); + MOCK_EXPECT(f.eval).returns(1.75); + ErrorSum mse_sum; std::vector<double> weights; weights.push_back(1); - BOOST_CHECK_EQUAL(9, mse_sum.eval(&weights)); + mse_sum.add_error_function(&f); + BOOST_CHECK_EQUAL(1.75, mse_sum.eval(&weights)); } - + BOOST_AUTO_TEST_CASE(ErrorFunction_MSE_SUM_Get_Dimension_test) { ErrorSum mse_sum; BOOST_CHECK_EQUAL(0, mse_sum.get_dimension()); + mock_error_fun f; + MOCK_EXPECT(f.get_dimension).returns(2); + MOCK_EXPECT(f.eval).returns(1.75); + - Neuron *n1 = new NeuronLinear(); - Neuron *n2 = new NeuronLinear(); - 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, SIMPLE_CONNECTION_TYPE::UNITARY_WEIGHT, 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); + std::vector<double> weights; + weights.push_back(1); - mse_sum.add_error_function(f); + mse_sum.add_error_function(&f); BOOST_CHECK_EQUAL(2, mse_sum.get_dimension()); } -BOOST_AUTO_TEST_SUITE_END() \ No newline at end of file +BOOST_AUTO_TEST_SUITE_END() diff --git a/src/tests/NeuralNetworkSum_test.cpp b/src/tests/NeuralNetworkSum_test.cpp index ce538b830299406a7352d0ea48b8afd2d5c44898..d757730a469cc2d9d7456d96577b668d1fe5f73b 100644 --- a/src/tests/NeuralNetworkSum_test.cpp +++ b/src/tests/NeuralNetworkSum_test.cpp @@ -7,17 +7,45 @@ #define BOOST_TEST_MODULE NeuralNetworkSum_test + #include "boost_unit_tests_preamble.h" #include "../Network/NeuralNetworkSum.h" - +#include <turtle/mock.hpp> using namespace lib4neuro; +MOCK_BASE_CLASS(mock_network, lib4neuro::NeuralNetwork) +{ + MOCK_METHOD(get_subnet, 2) + MOCK_METHOD(add_neuron, 3) + MOCK_METHOD(add_connection_simple, 4) + MOCK_METHOD(add_existing_connection, 4) + MOCK_METHOD(copy_parameter_space, 1) + MOCK_METHOD(set_parameter_space_pointers, 1) + MOCK_METHOD(eval_single, 3) + MOCK_METHOD(add_to_gradient_single, 4) + MOCK_METHOD(randomize_weights, 0) + MOCK_METHOD(randomize_biases, 0) + MOCK_METHOD(randomize_parameters, 0) + MOCK_METHOD(get_n_inputs, 0) + MOCK_METHOD(get_n_outputs, 0) + MOCK_METHOD(get_n_weights, 0) + MOCK_METHOD(get_n_biases, 0) + MOCK_METHOD(get_neuron_bias_index, 1) + MOCK_METHOD(get_n_neurons, 0) + MOCK_METHOD(specify_input_neurons, 1) + MOCK_METHOD(specify_output_neurons, 1) + MOCK_METHOD(get_parameter_ptr_biases, 0) + MOCK_METHOD(get_parameter_ptr_weights, 0) + MOCK_METHOD(save_text, 1) + MOCK_METHOD(print_stats, 0) + MOCK_METHOD(print_weights, 0) +}; + /** * Boost testing suite for testing NeuralNetworkSum.h */ BOOST_AUTO_TEST_SUITE(NeuralNetworkSum_test) - /** * Test of creating new instance of NeuralNetworkSum */ @@ -27,28 +55,17 @@ BOOST_AUTO_TEST_SUITE(NeuralNetworkSum_test) } BOOST_AUTO_TEST_CASE(NeuralNetworkSum_add_network_test) { - NeuralNetwork network; + mock_network network; + //NeuralNetwork network; NeuralNetworkSum networkSum; - - BOOST_CHECK_NO_THROW(networkSum.add_network(&network, "5")); + std::string po = "f(x,y,z,t) =x+y+z+t"; + BOOST_CHECK_NO_THROW(networkSum.add_network(&network, po)); } - BOOST_AUTO_TEST_CASE(NeuralNetworkSum_eval_single_weights_test) { - Neuron *n1 = new NeuronLinear(); - Neuron *n2 = new NeuronLinear(); - NeuralNetwork network; - network.add_neuron(n1); - network.add_neuron(n2); - - network.add_connection_simple(0, 1, SIMPLE_CONNECTION_TYPE::UNITARY_WEIGHT, 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); + BOOST_AUTO_TEST_CASE(NeuralNetworkSum_eval_single_weights_test) { + + mock_network network; + MOCK_EXPECT(network.eval_single); std::vector<double> input; input.push_back(1); @@ -57,28 +74,22 @@ BOOST_AUTO_TEST_SUITE(NeuralNetworkSum_test) double weights = 5; NeuralNetworkSum networkSum; - networkSum.add_network(&network, "2"); + networkSum.add_network(&network, "f(x) =x"); networkSum.eval_single(input, output); - BOOST_CHECK_EQUAL(2, output.at(0)); + BOOST_CHECK_EQUAL(0, output.at(0)); } BOOST_AUTO_TEST_CASE(NeuralNetworkSum_get_weights_test) { NeuralNetworkSum networkSum; BOOST_CHECK_EQUAL(0, networkSum.get_n_weights()); - Neuron *n1 = new NeuronLinear(); - Neuron *n2 = new NeuronLinear(); - NeuralNetwork network; - network.add_neuron(n1); - network.add_neuron(n2); - - network.add_connection_simple(0, 1, SIMPLE_CONNECTION_TYPE::NEXT_WEIGHT, 2.5); - - networkSum.add_network(&network, "2"); + mock_network network; + MOCK_EXPECT(network.get_n_weights).returns(1); + networkSum.add_network(&network, "f(x) =x"); BOOST_CHECK_EQUAL(1, networkSum.get_n_weights()); } -BOOST_AUTO_TEST_SUITE_END() \ No newline at end of file +BOOST_AUTO_TEST_SUITE_END() diff --git a/src/tests/NeuralNetwork_test.cpp b/src/tests/NeuralNetwork_test.cpp index e81fd5ab953f1b9eabc0687f523e0491d2619e8e..7fefcf72394aeed0131bb6400c20ac2b6c5c4a60 100644 --- a/src/tests/NeuralNetwork_test.cpp +++ b/src/tests/NeuralNetwork_test.cpp @@ -8,22 +8,18 @@ #define BOOST_TEST_MODULE NeuralNetwork_test #include "boost_unit_tests_preamble.h" - +#include <turtle/mock.hpp> #include "../Network/NeuralNetwork.h" using namespace lib4neuro; -struct cerr_redirect { - cerr_redirect(std::streambuf *new_buffer) - : old(std::cerr.rdbuf(new_buffer) - ) {} - - ~cerr_redirect() { - std::cout.rdbuf(old); - } -private: - std::streambuf *old; +MOCK_BASE_CLASS(mock_NeuronLinear, lib4neuro::NeuronLinear) +{ + MOCK_METHOD(activate, 2) + MOCK_METHOD(activation_function_eval_derivative_bias, 2) + MOCK_METHOD(activation_function_eval_derivative, 2) + MOCK_METHOD(get_derivative, 0) }; /** @@ -44,9 +40,10 @@ BOOST_AUTO_TEST_SUITE(NeuralNetwork_test) * Existing bias out of range cancelation */ BOOST_AUTO_TEST_CASE(NeuralNetwork_add_neuron_test) { - Neuron *n1 = new NeuronLinear(); - Neuron *n2 = new NeuronLinear(); - Neuron *n3 = new NeuronLinear(); + mock_NeuronLinear *n1 = new mock_NeuronLinear; + mock_NeuronLinear *n2 = new mock_NeuronLinear; + mock_NeuronLinear *n3 = new mock_NeuronLinear; + mock_NeuronLinear *n4 = new mock_NeuronLinear; NeuralNetwork network; @@ -61,22 +58,15 @@ BOOST_AUTO_TEST_SUITE(NeuralNetwork_test) BOOST_CHECK_EQUAL(2, network.get_n_biases()); -//////TODO fix dumping stack error -// boost::test_tools::output_test_stream output; -// { -// cerr_redirect guard(output.rdbuf()); -// network.add_neuron(n3, BIAS_TYPE::EXISTING_BIAS, 3); -// } -// BOOST_CHECK(output.is_equal("The supplied bias index is too large!\n\n")); - } + } /** * Test of add_connection_simple method */ BOOST_AUTO_TEST_CASE(NeuralNetwork_add_connection_simple_test) { - Neuron *n1 = new NeuronLinear(); - Neuron *n2 = new NeuronLinear(); - NeuralNetwork network; + mock_NeuronLinear *n1 = new mock_NeuronLinear; + mock_NeuronLinear *n2 = new mock_NeuronLinear; + NeuralNetwork network; network.add_neuron(n1, BIAS_TYPE::NO_BIAS); network.add_neuron(n2, BIAS_TYPE::NO_BIAS); @@ -87,13 +77,6 @@ BOOST_AUTO_TEST_SUITE(NeuralNetwork_test) BOOST_CHECK_EQUAL(4, network.add_connection_simple(0, 1, SIMPLE_CONNECTION_TYPE::EXISTING_WEIGHT, 1)); BOOST_CHECK_EQUAL(2, network.get_n_weights()); -//TODO fix dumping stack error -// boost::test_tools::output_test_stream output; -// { -// cerr_redirect guard(output.rdbuf()); -// network.add_connection_simple(0, 1, SIMPLE_CONNECTION_TYPE::EXISTING_WEIGHT,10); -// } -// BOOST_CHECK(output.is_equal("The supplied connection weight index is too large!\n\n")); } /** @@ -101,8 +84,10 @@ BOOST_AUTO_TEST_SUITE(NeuralNetwork_test) */ BOOST_AUTO_TEST_CASE(NeuralNetwork_specify_inputs_neurons_test) { NeuralNetwork network; - Neuron *n1 = new NeuronLinear(); - network.add_neuron(n1, BIAS_TYPE::NO_BIAS); + mock_NeuronLinear po; + mock_NeuronLinear *n1 = new mock_NeuronLinear(); + + network.add_neuron(n1, BIAS_TYPE::NO_BIAS); std::vector<size_t> inputs; inputs.push_back(0); @@ -114,8 +99,8 @@ BOOST_AUTO_TEST_SUITE(NeuralNetwork_test) BOOST_AUTO_TEST_CASE(NeuralNetwork_specify_outputs_neurons_test) { NeuralNetwork network; - Neuron *n1 = new NeuronLinear(); - network.add_neuron(n1, BIAS_TYPE::NO_BIAS); + mock_NeuronLinear *n1 = new mock_NeuronLinear; + network.add_neuron(n1, BIAS_TYPE::NO_BIAS); std::vector<size_t> outputs; outputs.push_back(0); @@ -126,8 +111,14 @@ BOOST_AUTO_TEST_SUITE(NeuralNetwork_test) } BOOST_AUTO_TEST_CASE(NeuralNetwork_eval_single_test) { - Neuron *n1 = new NeuronLinear(); - Neuron *n2 = new NeuronLinear(); + mock_NeuronLinear *n1 = new mock_NeuronLinear(); + mock_NeuronLinear *n2 = new mock_NeuronLinear(); + + mock_NeuronLinear n3 = *n1; + mock_NeuronLinear n4 = *n2; + MOCK_EXPECT(n3.activate).returns(5); + MOCK_EXPECT(n4.activate).returns(5); + NeuralNetwork network; network.add_neuron(n1); @@ -153,9 +144,10 @@ BOOST_AUTO_TEST_SUITE(NeuralNetwork_test) } BOOST_AUTO_TEST_CASE(NeuralNetwork_randomize_weights_test) { - Neuron *n1 = new NeuronLinear(); - Neuron *n2 = new NeuronLinear(); - NeuralNetwork network; + mock_NeuronLinear *n1 = new mock_NeuronLinear(); + mock_NeuronLinear *n2 = new mock_NeuronLinear(); + + NeuralNetwork network; network.add_neuron(n1, BIAS_TYPE::NO_BIAS); network.add_neuron(n2, BIAS_TYPE::NO_BIAS); @@ -174,4 +166,4 @@ BOOST_AUTO_TEST_SUITE(NeuralNetwork_test) BOOST_CHECK(sum<0.15 && sum>-0.15); } -BOOST_AUTO_TEST_SUITE_END() \ No newline at end of file +BOOST_AUTO_TEST_SUITE_END() diff --git a/src/tests/ParticleSwarm_test.cpp b/src/tests/ParticleSwarm_test.cpp index 3d4850b7510d794e7c06e15ca648c2bda6c6b338..8e017c641a656a9bfbf73da6bcc935ca8a5988eb 100644 --- a/src/tests/ParticleSwarm_test.cpp +++ b/src/tests/ParticleSwarm_test.cpp @@ -10,7 +10,18 @@ #include "boost_unit_tests_preamble.h" #include "../LearningMethods/ParticleSwarm.h" - +#include <turtle/mock.hpp> + +MOCK_BASE_CLASS(mock_Error, lib4neuro::ErrorFunction) +{ + MOCK_METHOD(eval, 1) + MOCK_METHOD(calculate_error_gradient, 3) + MOCK_METHOD(get_parameters, 0) + MOCK_METHOD(get_dataset, 0) + MOCK_METHOD(get_dimension, 0) + + +}; using namespace lib4neuro; /** @@ -28,49 +39,39 @@ BOOST_AUTO_TEST_SUITE(ParticleSwarm_test) BOOST_AUTO_TEST_CASE(ParticleSwarm_construction_test){ std::vector<double> domain_bound; domain_bound.push_back(5); - 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 *error = new MSE(&network, &dataSet); - + BOOST_CHECK_NO_THROW(ParticleSwarm swarm(&domain_bound, 0, 1, 1, 0.5, 0.05, 0.5, 0, 20)); } - BOOST_AUTO_TEST_CASE(ParticleSwarm_optimalize_test){ + BOOST_AUTO_TEST_CASE(ParticleSwarm_optimalize_and_get_parameters_test){ std::vector<double> domain_bound; - domain_bound.push_back(5); - 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 *error = new MSE(&network, &dataSet); - - ParticleSwarm swarm(&domain_bound, 0, 1, 1, -1,1,1, 0, 20); - BOOST_CHECK_THROW(swarm.optimize( *error ), std::invalid_argument) ; - - ParticleSwarm swarm2(&domain_bound, 0, 1, 1, 1,-1,1, 0, 20); - BOOST_CHECK_THROW(swarm2.optimize( *error ), std::invalid_argument) ; - - ParticleSwarm swarm3(&domain_bound, 0, 1, 1, 1,1,-1, 0, 20); - BOOST_CHECK_THROW(swarm3.optimize( *error ), std::invalid_argument) ; + domain_bound.push_back(-5); + domain_bound.push_back(5); + domain_bound.push_back(-5); + domain_bound.push_back(5); + domain_bound.push_back(-5); + domain_bound.push_back(5); + domain_bound.push_back(-5); + domain_bound.push_back(5); + domain_bound.push_back(-5); + domain_bound.push_back(5); + + + mock_Error error; + + MOCK_EXPECT(error.get_dimension).returns(5); + MOCK_EXPECT(error.eval).returns(0.8); + + ParticleSwarm swarm(&domain_bound, 0, 1, 1, 1, 1, 1, 5, 20); + + BOOST_CHECK_NO_THROW(swarm.optimize(error)); + + + + for (int i = 0; i < swarm.get_parameters()->size(); i++) { + BOOST_CHECK_NO_THROW(swarm.get_parameters()->at(i)); + } } -BOOST_AUTO_TEST_SUITE_END() \ No newline at end of file +BOOST_AUTO_TEST_SUITE_END() diff --git a/src/tests/Particle_test.cpp b/src/tests/Particle_test.cpp index 4fe8c88225b7d530481a116f47564d667441acb0..dd963141278f4794f27c944a5346501b24c52d14 100644 --- a/src/tests/Particle_test.cpp +++ b/src/tests/Particle_test.cpp @@ -7,165 +7,72 @@ #define BOOST_TEST_MODULE Particle_test -#include "boost_unit_tests_preamble.h" +#ifdef _WINDOWS +#include <boost/test/included/unit_test.hpp> +#include <turtle/mock.hpp> +#else + +#ifndef BOOST_TEST_DYN_LINK +#define BOOST_TEST_DYN_LINK +#endif + +#ifndef BOOST_TEST_NO_MAIN +#define BOOST_TEST_NO_MAIN +#endif +#include <turtle/mock.hpp> +#include <boost/test/unit_test.hpp> +#include <boost/test/output_test_stream.hpp> + +#endif #include "../LearningMethods/ParticleSwarm.h" -using namespace lib4neuro; +MOCK_BASE_CLASS(mock_Error, lib4neuro::ErrorFunction) +{ + MOCK_METHOD(eval, 1) + MOCK_METHOD(calculate_error_gradient, 3) + MOCK_METHOD(get_parameters, 0) + MOCK_METHOD(get_dataset, 0) + MOCK_METHOD(get_dimension, 0) +}; /** * Boost testing suite for testing ParticleSwarm.h * TODO */ - BOOST_AUTO_TEST_SUITE(Particle_test) - - BOOST_AUTO_TEST_CASE(Particle_construction_test) { - std::vector<double> domain_bound = {1, 2, 3, 4, 5}; - Neuron *n1 = new NeuronLinear(); - Neuron *n2 = new NeuronLinear(); - 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, SIMPLE_CONNECTION_TYPE::UNITARY_WEIGHT, 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 *error = new MSE(&network, &dataSet); - Particle particle(error, &domain_bound); - BOOST_CHECK_NO_THROW(Particle particle(error, &domain_bound)); - // particle.get_coordinate(); - } - - BOOST_AUTO_TEST_CASE(Particle_get_coordinate_test) { - std::vector<double> domain_bound = {1, 2, 3, 4, 5}; - Neuron *n1 = new NeuronLinear(); - Neuron *n2 = new NeuronLinear(); - 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, SIMPLE_CONNECTION_TYPE::UNITARY_WEIGHT, 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 *error = new MSE(&network, &dataSet); - Particle particle1( error, &domain_bound ); - Particle particle2( error, &domain_bound ); - - BOOST_CHECK(*particle1.get_coordinate() != *particle2.get_coordinate()); - } - - //Random - //TODO - /* - BOOST_AUTO_TEST_CASE(particle_change_coordiante_test) { - double domain_bound[5] = {1,2,3,4,5}; - 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 *error = new MSE(&network, &dataSet); - Particle particle(error, &domain_bound[0]); - particle.change_coordinate(1.0, 2.0, 2.0, &domain_bound[1], 1); - - - BOOST_CHECK_EQUAL(1.32664, *particle.get_coordinate()); - } - - BOOST_AUTO_TEST_CASE(particle_optimal_value_test){ - double domain_bound[5] = {1,2,3,4,5}; - 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); +BOOST_AUTO_TEST_SUITE(Particle_test) + +BOOST_AUTO_TEST_CASE(Particle_construction_test) { + std::vector<double> domain_bound{ 1, 2, 3, 4, 5 }; + mock_Error error; + MOCK_EXPECT(error.get_dimension).once().returns(5); + MOCK_EXPECT(error.eval).once().returns(0.8); + BOOST_CHECK_NO_THROW(Particle(&error, &domain_bound)); +} + +BOOST_AUTO_TEST_CASE(Particle_get_coordinate_test) { + std::vector<double> domain_bound{ 1, 2, 3, 4, 5 }; + mock_Error error; + + MOCK_EXPECT(error.get_dimension).returns(5); + MOCK_EXPECT(error.eval).returns(0.8); + + Particle particle1(&error, &domain_bound); + Particle particle2(&error, &domain_bound); + + BOOST_CHECK(*particle1.get_coordinate() != *particle2.get_coordinate()); +} +BOOST_AUTO_TEST_CASE(Particle_get_optimal_value_test) { + std::vector<double> domain_bound{ 1, 2, 3, 4, 5 }; + mock_Error error; + + MOCK_EXPECT(error.get_dimension).returns(5); + MOCK_EXPECT(error.eval).returns(0.8); + - DataSet dataSet(&data_vec); - ErrorFunction *error = new MSE(&network, &dataSet); - Particle particle(error, &domain_bound[0]); - BOOST_CHECK_CLOSE(1.789708839, particle.get_optimal_value(), 0.00001 ); - } - */ + Particle particle1(&error, &domain_bound); + BOOST_CHECK_EQUAL(0.8, particle1.get_optimal_value()); +} -BOOST_AUTO_TEST_SUITE_END() \ No newline at end of file +BOOST_AUTO_TEST_SUITE_END()