#pragma once #include "../Neuron.h" #include #include #include #include #include #include namespace NeuralNetwork { namespace Recurrent { class Network; /** * @author Tomas Cernik (Tom.Cernik@gmail.com) * @brief Class of recurrent neuron. */ class Neuron : public NeuralNetwork::Neuron { public: Neuron(unsigned long _id=0,const float& _bias = 0): NeuralNetwork::Neuron(), basis(new BasisFunction::Linear), activation(new ActivationFunction::Sigmoid(-4.9)), id_(_id),bias(_bias),weights(_id+1),_output(0),_value(0) { } Neuron(const Neuron &r): NeuralNetwork::Neuron(), basis(r.basis->clone()), activation(r.activation->clone()),id_(r.id_), bias(r.bias), weights(r.weights), _output(r._output), _value(r._value) { } virtual ~Neuron() { delete basis; delete activation; }; virtual std::string stringify(const std::string &prefix="") const override; Recurrent::Neuron& operator=(const NeuralNetwork::Recurrent::Neuron&r) { id_=r.id_; bias=r.bias; weights=r.weights; basis=r.basis->clone(); activation=r.activation->clone(); return *this; } virtual long unsigned int id() const override { return id_; }; /** * @brief Gets weight * @param n is neuron */ virtual float getWeight(const NeuralNetwork::Neuron &n) const override { return weights[n.id()]; } /** * @brief Sets weight * @param n is neuron * @param w is new weight for input neuron n */ virtual void setWeight(const NeuralNetwork::Neuron& n ,const float &w) override { if(weights.size()& inputs) { //compute value _value=basis->operator()(weights,inputs)+bias; //compute output _output=activation->operator()(_value); return _output; } protected: BasisFunction::BasisFunction *basis; ActivationFunction::ActivationFunction *activation; unsigned long id_; float bias; std::vector weights; float _output; float _value; }; } }