Skip to content
Snippets Groups Projects
NeuralNetwork_test.cpp 7.24 KiB
Newer Older
  • Learn to ignore specific revisions
  • David Vojtek's avatar
    David Vojtek committed
    /**
     * DESCRIPTION OF THE CLASS
     *
     * @author David Vojtek
     * @date 2018
     */
    
    #define BOOST_TEST_NO_MAIN
    
    #include <boost/test/unit_test.hpp>
    #include "../Network/NeuralNetwork.h"
    #include "../Neuron/NeuronLinear.h"
    
    David Vojtek's avatar
    David Vojtek committed
    /**
     * Boost testing suite for testing NeuralNetwork.h
     */
    BOOST_AUTO_TEST_SUITE(NeuralNetwork_test)
    
    
        /**
         * Test of creating new instance of NeuralNetwork
         */
        BOOST_AUTO_TEST_CASE(NeuralNetwork_constuction_test) {
            //Test of none exception raise when creating new instance of NeuralNewtwork
    
    David Vojtek's avatar
    David Vojtek committed
            BOOST_CHECK_NO_THROW(NeuralNetwork network);
        }
    
    
        /**
         * Test of add_neuron method
         */
        BOOST_AUTO_TEST_CASE(NeuralNetwork_add_neuron_test) {
            Neuron *n1 = new NeuronLinear(1, 1);
            Neuron *n2 = new NeuronLinear(2, 2);
    
    David Vojtek's avatar
    David Vojtek committed
            NeuralNetwork network;
    
    
            //Tests of correct neuron indexs when add_neuron
            BOOST_CHECK_EQUAL(0, network.add_neuron(n1));
            BOOST_CHECK_EQUAL(1, network.add_neuron(n2));
    
        /**
         * Test of add_connection_simple method
         */
        BOOST_AUTO_TEST_CASE(NeuralNetwork_add_connection_simple_test) {
            Neuron *n1 = new NeuronLinear(1, 1);
            Neuron *n2 = new NeuronLinear(2, 2);
    
    David Vojtek's avatar
    David Vojtek committed
            NeuralNetwork network;
            network.add_neuron(n1);
            network.add_neuron(n2);
    
    
            network.add_connection_simple(0, 1, 0, 2.5);
            //Tests of correct connection number with affected neurons
    
    David Vojtek's avatar
    David Vojtek committed
            BOOST_CHECK_EQUAL(1, n1->get_connections_out()->size());
            BOOST_CHECK_EQUAL(1, n2->get_connections_in()->size());
    
            //Tests of raising out_of_range exception when calling add_connection_simple with not valid parameters
            BOOST_CHECK_THROW(network.add_connection_simple(2, 0, 0, 0), std::out_of_range);
            BOOST_CHECK_THROW(network.add_connection_simple(0, 2, 0, 0), std::out_of_range);
    
        /**
         * Test of add_connection_general method
         */
        BOOST_AUTO_TEST_CASE(NeuralNetwork_add_connection_general_test) {
    
    David Vojtek's avatar
    David Vojtek committed
            NeuralNetwork network;
    
            Neuron *n1 = new NeuronLinear(1, 1);
            Neuron *n2 = new NeuronLinear(2, 2);
    
    David Vojtek's avatar
    David Vojtek committed
            network.add_neuron(n1);
            network.add_neuron(n2);
    
            std::function<double(double *, int *, int)> f = [](double *weight_array, int *index_array, int n_params) {
    
    David Vojtek's avatar
    David Vojtek committed
                double a = weight_array[0];
                double b = weight_array[1];
                return (a + 1.5 * b);
            };
    
            int para[5] = {0, 1, 2, 3, 4};
            double w_array[5] = {1, 2, 3, 4, 5};
    
    David Vojtek's avatar
    David Vojtek committed
    
    
            network.add_connection_general(0, 1, &f, para, w_array, 5);
            //Tests of correct connection number with affected neurons
    
    David Vojtek's avatar
    David Vojtek committed
            BOOST_CHECK_EQUAL(1, n1->get_connections_out()->size());
            BOOST_CHECK_EQUAL(1, n2->get_connections_in()->size());
    
            //Tests of raising out_of_range exception when calling add_connection_general with not valid parameters
            BOOST_CHECK_THROW(network.add_connection_general(2, 1, &f, para, w_array, 5), std::out_of_range);
            BOOST_CHECK_THROW(network.add_connection_general(0, 2, &f, para, w_array, 5), std::out_of_range);
    
    David Vojtek's avatar
    David Vojtek committed
        }
    
        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));
        }
    
    
    David Vojtek's avatar
    David Vojtek committed
    BOOST_AUTO_TEST_SUITE_END()