Newer
Older

Michal Kravcenko
committed
/**
* DESCRIPTION OF THE CLASS
*
* @author Martin Beseda
* @author Martin Mrovec
* @author Michal Kravčenko
* @date 2017 - 2018
*/
#ifndef NEURON_H_
#define NEURON_H_
#include <boost/serialization/base_object.hpp>

Michal Kravcenko
committed
#include <vector>
#include "../NetConnection/Connection.h"
class Connection;

Michal Kravcenko
committed
/**
* Abstract class representing a general neuron
*/
class Neuron{
friend class boost::serialization::access;
/**
* Inner potential of the neuron (input of the activation function)
*/
double potential = 0.0;
/**
* State of the neuron (output of the activation function)
*/
double state = 0.0;
/**
* array of the activation function parameters
*/
double *activation_function_parameters = nullptr;
/**
* Number of parameters of the activation function
*/

Michal Kravcenko
committed
/**
* Keeps track of the number of saturated INCOMING connections
*/

Michal Kravcenko
committed
/**
* Keeps track of the number of saturated OUTGOING connections
*/

Michal Kravcenko
committed
/**
* Index of this neuron among the neurons in the neural network
*/
size_t neural_net_index;

Michal Kravcenko
committed
/**
* A pointer to a vector containing pointers to incoming connections
*/
std::vector<Connection*> *edges_in = nullptr;
/**
* A pointer to a vector containing pointers to outgoing connections
*/
std::vector<Connection*> *edges_out = nullptr;
template<class Archive>
void serialize(Archive & ar, const unsigned int version){
//TODO separate implementation to Neuron.cpp!
ar & this->potential;
ar & this->state;
for(unsigned short int i = 0; i < this->n_activation_function_parameters; i++) {
ar & this->activation_function_parameters[i];
}
};
/**
* Instantiates a copy of this object and returns a pointer to it
* @return
*/
virtual Neuron* get_copy( ) = 0;
/**
* Destructor of the Neuron object
* this level deallocates the array 'activation_function_parameters'

Michal Kravcenko
committed
* also deallocates the OUTGOING connections
*/
virtual ~Neuron();
/**
* Performs the activation function and stores the result into the 'state' property
*/
virtual void activate( ) = 0;

Michal Kravcenko
committed
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
/**
* Sets the number of saturated INPUT connections to the prescribed value
* @param[in] value The number of saturated INCOMING connections
*/
virtual void set_saturation_in(int value) final;
/**
* Increases the saturation counter of the INCOMING connections by the specified amount
* @param value Amount to be added to the counter
*/
virtual void adjust_saturation_in(int value) final;
/**
* Returns true if the neuron is saturated via the INCOMING connections
* @return true/false
*/
virtual bool is_saturated_in() final;
/**
* Returns true if the neuron is saturated via the OUTGOING connections
* @return true/false
*/
virtual bool is_saturated_out() final;
/**
* Sets the number of saturated OUTPUT connections to the prescribed value
* @param[in] value The number of saturated OUTGOING connections
*/
virtual void set_saturation_out(int value) final;
/**
* Increases the saturation counter of the OUTGOING connections by the specified amount
* @param value Amount to be added to the counter
*/
virtual void adjust_saturation_out(int value) final;
/**
* Adds the input signal value to the current potential
* @param[in] input_signal Input value
*/
virtual void adjust_potential(double input_signal);
/**
* Getter to the 'potential' property
* @return Value of the neuron's potential (real number)
*/
virtual double get_potential();
/**
* Setter to the 'potential' property
* @param[in] value Value of the neuron's potential (real number)
*/
virtual void set_potential(double value);
/**
* Getter to the 'state' property
* @return Value of the current neuron's state
*/
virtual double get_state();
/**
* Setter to the 'state' component
* @param[in] value Value of the current neuron's state
*/
virtual void set_state(double value);
/**
* Returns the number of parameters the activation function relies on
* @return Number of the parameters
*/
virtual int activation_function_get_n_parameters();
/**
* Adjusts the parameter with index 'param_idx' of the activation function
* by the value prescribed by 'value'
* @param[in] param_idx Index of the parameter to be adjusted
* @param[in] value Value of the adjustment
*/
virtual void activation_function_adjust_parameter(int param_idx, double value);
/**
* Sets the parameter with index 'param_idx' of the activation function
* to the value prescribed by 'value'
* @param[in] param_idx
* @param[in] value
*/
virtual void activation_function_set_parameter(int param_idx, double value);
/**
* Gets the parameter with index 'param_idx' of the activation function
* @param[in] param_idx
*/
virtual double activation_function_get_parameter(int param_idx);

Michal Kravcenko
committed
/**
* Adds a new incoming connection with this neuron as its end-point
* @param[in] con Incoming connection
*/
virtual void add_connection_in(Connection *con) final;
/**
* Adds a new outgoing connection with this neuron as its source-point
* @param[in] con Outgoing connection
*/
virtual void add_connection_out(Connection *con) final;
/**
* Returns the pointer to the incoming connection vector
* @return
*/
virtual std::vector<Connection*>* get_connections_in( ) final;
/**
* Returns the pointer to the outgoing connection vector
* @return
*/
virtual std::vector<Connection*>* get_connections_out( ) final;
/**
*
* @return
*/
size_t get_idx();
/**
*
* @param value
*/
void set_idx(size_t value);
}; /* end of Neuron class */
Martin Beseda
committed
/**

Michal Kravcenko
committed
* Class serving as an interface providing 'activation_function_eval_partial_derivative',
* 'activation_function_eval_derivative', 'get_partial_derivative' and
* 'get_derivative' methods.
Martin Beseda
committed
*/
class IDifferentiable {
/**
* Calculates the partial derivative of the activation function
* with respect to the parameter and the current potential
* @param[in] param_idx Index of the parameter to calculate derivative of
* @return Partial derivative of the activation function according to the
* 'param_idx'-th parameter
*/

Michal Kravcenko
committed
virtual double activation_function_eval_partial_derivative(int param_idx) = 0;
Martin Beseda
committed
/**
* Calculates the derivative with respect to the argument, ie the 'potential'
* @return f'(x), where 'f(x)' is the activation function and 'x' = 'potential'
*/

Michal Kravcenko
committed
virtual double activation_function_eval_derivative( ) = 0;
/**
* Returns a Neuron pointer object with activation function being the partial derivative of
* the activation function of this Neuron object with respect to the argument, i.e. 'potential'
* @return
*/
virtual Neuron* get_derivative( );

Michal Kravcenko
committed
Martin Beseda
committed
}; /* end of IDifferentiable class */
#endif /* NEURON_H_ */