From 7e8dce7224214cbb82e9191917de9f234fe38cb7 Mon Sep 17 00:00:00 2001 From: Justin Worthe Date: Sat, 1 Aug 2015 14:35:58 +0200 Subject: Implemented structure of network --- include/brain/bias_node.h | 10 ++++++++++ include/brain/neural_link.h | 3 ++- include/brain/neural_network.h | 4 ++-- include/brain/neural_node.h | 11 ++++++++++- include/brain/neuron.h | 5 ++++- include/brain/sensor.h | 11 +++++++---- src/brain/bias_node.cpp | 6 ++++++ src/brain/neural_link.cpp | 11 +++++++++++ src/brain/neural_network.cpp | 4 ++-- src/brain/neural_node.cpp | 6 ++++++ src/brain/neuron.cpp | 24 ++++++++++++++++++++++++ src/brain/sensor.cpp | 5 +++++ watch.sh | 4 ++-- 13 files changed, 91 insertions(+), 13 deletions(-) create mode 100644 include/brain/bias_node.h create mode 100644 src/brain/bias_node.cpp create mode 100644 src/brain/neural_link.cpp create mode 100644 src/brain/neural_node.cpp create mode 100644 src/brain/neuron.cpp create mode 100644 src/brain/sensor.cpp diff --git a/include/brain/bias_node.h b/include/brain/bias_node.h new file mode 100644 index 0000000..501a0a0 --- /dev/null +++ b/include/brain/bias_node.h @@ -0,0 +1,10 @@ +#pragma once + +#include "brain/neural_node.h" + +class BiasNode: public NeuralNode +{ +public: + BiasNode(); + virtual double activation() const { return 1; } +}; diff --git a/include/brain/neural_link.h b/include/brain/neural_link.h index 447b26f..42ee2f9 100644 --- a/include/brain/neural_link.h +++ b/include/brain/neural_link.h @@ -7,7 +7,8 @@ class NeuralLink { public: - double weightedActivation(); + NeuralLink(double weight); + double weightedActivation() const; private: std::shared_ptr _input; diff --git a/include/brain/neural_network.h b/include/brain/neural_network.h index 37eb3a1..bb53079 100644 --- a/include/brain/neural_network.h +++ b/include/brain/neural_network.h @@ -15,8 +15,8 @@ public: void setInput(int inputIndex, double activation); int findMaxOutputIndex(); - int numberOfSensors() { return _sensors.size(); } - int numberOfOutputs() { return _outputs.size(); } + int numberOfSensors() const { return _sensors.size(); } + int numberOfOutputs() const { return _outputs.size(); } private: std::vector> _nodes; diff --git a/include/brain/neural_node.h b/include/brain/neural_node.h index abc27b8..3c2a6cb 100644 --- a/include/brain/neural_node.h +++ b/include/brain/neural_node.h @@ -3,5 +3,14 @@ class NeuralNode { public: - virtual double activation() = 0; + NeuralNode(char type, int id); + virtual ~NeuralNode() {}; + + virtual double activation() const = 0; + + char type() const { return _type; } + int id() const { return _id; } +private: + char _type; + int _id; }; diff --git a/include/brain/neuron.h b/include/brain/neuron.h index 27d7202..1607cf0 100644 --- a/include/brain/neuron.h +++ b/include/brain/neuron.h @@ -9,8 +9,11 @@ class Neuron : public NeuralNode { public: - virtual double activation() {} + Neuron(int id); + virtual ~Neuron() {} + virtual double activation() const; private: std::vector> _inputLinks; + double sigmoid(double input) const; }; diff --git a/include/brain/sensor.h b/include/brain/sensor.h index 06b96d0..b33080b 100644 --- a/include/brain/sensor.h +++ b/include/brain/sensor.h @@ -4,10 +4,13 @@ class Sensor: public NeuralNode { -private: - double _activation; - public: + Sensor(int id); + virtual ~Sensor() {} + void setActivation(double activation) { _activation = activation; } - virtual double activation() { return _activation; } + virtual double activation() const { return _activation; } + +private: + double _activation; }; diff --git a/src/brain/bias_node.cpp b/src/brain/bias_node.cpp new file mode 100644 index 0000000..99ae70d --- /dev/null +++ b/src/brain/bias_node.cpp @@ -0,0 +1,6 @@ +#include "brain/bias_node.h" + +BiasNode::BiasNode() + :NeuralNode('b', 0) +{ +} diff --git a/src/brain/neural_link.cpp b/src/brain/neural_link.cpp new file mode 100644 index 0000000..d217236 --- /dev/null +++ b/src/brain/neural_link.cpp @@ -0,0 +1,11 @@ +#include "brain/neural_link.h" + +NeuralLink::NeuralLink(double weight) + :_weight(weight) +{ +} + +double NeuralLink::weightedActivation() const +{ + return _input->activation()*_weight; +} diff --git a/src/brain/neural_network.cpp b/src/brain/neural_network.cpp index 980d5bc..c3e9f33 100644 --- a/src/brain/neural_network.cpp +++ b/src/brain/neural_network.cpp @@ -5,11 +5,11 @@ NeuralNetwork::NeuralNetwork(std::istream &&networkConfigFile, int numberOfSenso { for (int i=0; i()); + _sensors.push_back(std::make_shared(i)); } for (int i=0; i()); + _outputs.push_back(std::make_shared(i)); } } diff --git a/src/brain/neural_node.cpp b/src/brain/neural_node.cpp new file mode 100644 index 0000000..9bdd7c6 --- /dev/null +++ b/src/brain/neural_node.cpp @@ -0,0 +1,6 @@ +#include "brain/neural_node.h" + +NeuralNode::NeuralNode(char type, int id) + :_type(type), _id(id) +{ +} diff --git a/src/brain/neuron.cpp b/src/brain/neuron.cpp new file mode 100644 index 0000000..8c2e47c --- /dev/null +++ b/src/brain/neuron.cpp @@ -0,0 +1,24 @@ +#include "brain/neuron.h" +#include + +Neuron::Neuron(int id) + :NeuralNode('n', id) +{ +} + +double Neuron::sigmoid(double input) const +{ + double slope = 4.924273; + double constant = 2.4621365; + return (1/(1+(std::exp(-(slope*input))))); +} + +double Neuron::activation() const +{ + double activationSum = 0; + for (auto link : _inputLinks) + { + activationSum += link->weightedActivation(); + } + return sigmoid(activationSum); +} diff --git a/src/brain/sensor.cpp b/src/brain/sensor.cpp new file mode 100644 index 0000000..3069659 --- /dev/null +++ b/src/brain/sensor.cpp @@ -0,0 +1,5 @@ +#include "brain/sensor.h" + +Sensor::Sensor(int id) + :NeuralNode('s', id) +{} diff --git a/watch.sh b/watch.sh index a22e34c..101bfa2 100755 --- a/watch.sh +++ b/watch.sh @@ -1,4 +1,4 @@ while true; do - inotifywait -r -e modify,move ./ - ./test.sh + ./test.sh + inotifywait -r -e modify,move ./ done -- cgit v1.2.3