Skip to content
Snippets Groups Projects
NeuralNetwork.h 6.61 KiB
Newer Older
Michal Kravcenko's avatar
Michal Kravcenko committed
 * This file contains the header for the NeuralNetwork class representing a function in the form of a directed graph,
 * in which the vertices are called Neurons (with activation functions) and the edges Connections (with transfer functions)
 *
 * @author Michal Kravčenko
 * @date 13.6.18 -
 */

Michal Kravcenko's avatar
Michal Kravcenko committed
//TODO preprocess the feed-forward and backward passes for more efficient parallelism
#ifndef INC_4NEURO_NEURALNETWORK_H
#define INC_4NEURO_NEURALNETWORK_H

Michal Kravcenko's avatar
Michal Kravcenko committed
#include <algorithm>
#include <utility>
Michal Kravcenko's avatar
Michal Kravcenko committed
#include "../NetConnection/ConnectionFunctionGeneral.h"
#include "../NetConnection/ConnectionFunctionIdentity.h"
enum BIAS_TYPE{NEXT_BIAS, NO_BIAS, EXISTING_BIAS};

enum SIMPLE_CONNECTION_TYPE{NEXT_WEIGHT, UNITARY_WEIGHT, EXISTING_WEIGHT};
/**
 *
 */
class NeuralNetwork {
private:
    /**
     *
     */
    NET_TYPE network_type = GENERAL;

Michal Kravcenko's avatar
Michal Kravcenko committed
    /**
     *
     */
    std::vector<Neuron*> *neurons = nullptr;

    /**
     *
     */
    std::vector<size_t>* input_neuron_indices = nullptr;

    /**
     *
     */
    std::vector<size_t>* output_neuron_indices = nullptr;

    /**
     *
     */
    std::vector<double>* connection_weights = nullptr;

    /**
     *
     */
    std::vector<double>* neuron_biases = nullptr;

Michal Kravcenko's avatar
Michal Kravcenko committed
    /**
     *
     */
    std::vector<double>* neuron_potentials = nullptr;

    /**
     *
     */
    std::vector<ConnectionFunctionGeneral*> * connection_list = nullptr;

    /**
     *
     */
    std::vector<std::vector<std::pair<size_t, size_t>>*> * inward_adjacency = nullptr;

    /**
     *
     */
    std::vector<std::vector<std::pair<size_t, size_t>>*> * outward_adjacency = nullptr;

    /**
     *
     */
    std::vector<std::vector<size_t>*> *neuron_layers_feedforward = nullptr;

    /**
     *
     */
    std::vector<std::vector<size_t>*> *neuron_layers_feedbackward = nullptr;

Michal Kravcenko's avatar
Michal Kravcenko committed
     *
     */
    bool layers_analyzed = false;
Michal Kravcenko's avatar
Michal Kravcenko committed
    /**
     *
     */
    bool delete_weights = true;
Michal Kravcenko's avatar
Michal Kravcenko committed
    /**
     *
     */
    bool delete_biases = true;
Michal Kravcenko's avatar
Michal Kravcenko committed
    /**
     * Adds a new connection to the local list of connections
     * @param con Connection object to be added
     * @return Returns the index of the added connection among all the connections
     */
    size_t add_new_connection_to_list(ConnectionFunctionGeneral* con);
Michal Kravcenko's avatar
Michal Kravcenko committed
    /**
     * Adds a new entry (oriented edge s -> t) to the adjacency list of this network
     * @param s Index of the source neuron
     * @param t Index of the target neuron
     * @param con_idx Index of the connection representing the edge
     */
    void add_outward_connection(size_t s, size_t t, size_t con_idx);
Michal Kravcenko's avatar
Michal Kravcenko committed
    /**
     * Adds a new entry (oriented edge s <- t) to the adjacency list of this network
     * @param s Index of the source neuron
     * @param t Index of the target neuron
     * @param con_idx Index of the connection representing the edge
     */
    void add_inward_connection(size_t s, size_t t, size_t con_idx);
Michal Kravcenko's avatar
Michal Kravcenko committed
    /**
     * Performs one feedforward pass and feedbackward pass during which determines the layers of this neural network
     * for simpler use during evaluation and learning
     */
    void analyze_layer_structure( );
Michal Kravcenko's avatar
Michal Kravcenko committed
    virtual ~NeuralNetwork();
    /**
     * If possible, returns a neural net with 'input_neuron_indices' neurons as inputs and 'output_neuron_indices' as
     * outputs, otherwise returns nullptr. The returned object shares adjustable weights with this network. All
     * neurons are coppied (new instances), edges also. Uses a breadth-first search as the underlying algorithm.
     * @param input_neuron_indices
     * @param output_neuron_indices
     * @return
     */
    NeuralNetwork* get_subnet(std::vector<size_t> &input_neuron_indices, std::vector<size_t> &output_neuron_indices);

Michal Kravcenko's avatar
Michal Kravcenko committed
    /**
     * Replaces the values in @{this->connection_weights} and @{this->neuron_biases} by the provided values
     * @param parameters
     */
    virtual void copy_parameter_space(std::vector<double> *parameters);

    /**
     * Copies the pointers @{this->connection_weights} and @{this->neuron_biases} from the parental network, sets
     * flags to not delete the vectors in this object
     * @param parent_network
     */
    virtual void set_parameter_space_pointers( NeuralNetwork &parent_network );

Michal Kravcenko's avatar
Michal Kravcenko committed
     * @param input
     * @param output
     * @param custom_weights_and_biases
Michal Kravcenko's avatar
Michal Kravcenko committed
    virtual void eval_single(std::vector<double> &input, std::vector<double> &output, std::vector<double> *custom_weights_and_biases = nullptr);
Michal Kravcenko's avatar
Michal Kravcenko committed
     * Adds a new neuron to the list of neurons. Also assigns a valid bias value to its activation function
    size_t add_neuron(Neuron* n, BIAS_TYPE bt = NEXT_BIAS, size_t bias_idx = 0);

    /**
     *
     * @param n1_idx
     * @param n2_idx
     * @return
     */
    size_t add_connection_simple(size_t n1_idx, size_t n2_idx, SIMPLE_CONNECTION_TYPE sct = NEXT_WEIGHT, size_t weight_idx = 0 );
Michal Kravcenko's avatar
Michal Kravcenko committed
     * Take the existing connection with index 'connection_idx' in 'parent_network' and adds it to the structure of this
     * object
     * @param n1_idx
     * @param n2_idx
Michal Kravcenko's avatar
Michal Kravcenko committed
     * @param connection_idx
     * @param parent_network
Michal Kravcenko's avatar
Michal Kravcenko committed
    void add_existing_connection(size_t n1_idx, size_t n2_idx, size_t connection_idx, NeuralNetwork &parent_network );
Michal Kravcenko's avatar
Michal Kravcenko committed
    void randomize_weights();
Michal Kravcenko's avatar
Michal Kravcenko committed
    void randomize_biases();
Michal Kravcenko's avatar
Michal Kravcenko committed
    virtual size_t get_n_inputs();
Michal Kravcenko's avatar
Michal Kravcenko committed
     * @return
Michal Kravcenko's avatar
Michal Kravcenko committed
    virtual size_t get_n_outputs();
Michal Kravcenko's avatar
Michal Kravcenko committed
    virtual size_t get_n_weights();
Michal Kravcenko's avatar
Michal Kravcenko committed
    virtual size_t get_n_biases();
    virtual int get_neuron_bias_index( size_t neuron_idx );
Michal Kravcenko's avatar
Michal Kravcenko committed
    virtual size_t get_n_neurons();
    /**
     *
     * @param input_neurons_indices
     */
    void specify_input_neurons(std::vector<size_t> &input_neurons_indices);

    /**
     *
     * @param output_neurons_indices
     */
    void specify_output_neurons(std::vector<size_t> &output_neurons_indices);

    /**
     *
     */
    void print_weights();

    /**
     *
     */
    void print_stats();
Michal Kravcenko's avatar
Michal Kravcenko committed

    /**
     *
     * @return
     */
    std::vector<double>* get_parameter_ptr_weights();

    /**
     *
     * @return
     */
    std::vector<double>* get_parameter_ptr_biases();