From 3005ed13f0fde6d61ab8a229c1490f9389cd75b5 Mon Sep 17 00:00:00 2001 From: mike Date: Sat, 16 Jul 2011 18:53:45 +0000 Subject: Everything is in place except for columns, networks, and a cute language for describing the networks. ...and tests, don't forget about tests. git-svn-id: http://svn.xagasoft.com/misc/libneural/trunk@470 d8baa203-390c-0410-a584-dba4c0749223 --- default.bld | 9 +++++++ neural | 1 + src/column.cpp | 0 src/column.h | 0 src/container.cpp | 5 ++++ src/container.h | 46 +++++++++++++++++++++++++++++++ src/network.cpp | 0 src/network.h | 0 src/neuron.cpp | 5 ++++ src/neuron.h | 71 ++++++++++++++++++++++++++++++++++++++++++++++++ src/node.cpp | 5 ++++ src/node.h | 29 ++++++++++++++++++++ src/row.cpp | 5 ++++ src/row.h | 81 +++++++++++++++++++++++++++++++++++++++++++++++++++++++ src/slope.cpp | 1 + src/slope.h | 22 +++++++++++++++ src/slopestd.cpp | 5 ++++ src/slopestd.h | 55 +++++++++++++++++++++++++++++++++++++ 18 files changed, 340 insertions(+) create mode 100644 default.bld create mode 120000 neural create mode 100644 src/column.cpp create mode 100644 src/column.h create mode 100644 src/container.cpp create mode 100644 src/container.h create mode 100644 src/network.cpp create mode 100644 src/network.h create mode 100644 src/neuron.cpp create mode 100644 src/neuron.h create mode 100644 src/node.cpp create mode 100644 src/node.h create mode 100644 src/row.cpp create mode 100644 src/row.h create mode 100644 src/slope.cpp create mode 100644 src/slope.h create mode 100644 src/slopestd.cpp create mode 100644 src/slopestd.h diff --git a/default.bld b/default.bld new file mode 100644 index 0000000..be99b23 --- /dev/null +++ b/default.bld @@ -0,0 +1,9 @@ +target "libneural.a" +{ + rule "lib"; + input files("src/*.cpp"); + + CXXFLAGS += "-I."; + LDCONFIG += "-lbu++"; +} + diff --git a/neural b/neural new file mode 120000 index 0000000..e831038 --- /dev/null +++ b/neural @@ -0,0 +1 @@ +src \ No newline at end of file diff --git a/src/column.cpp b/src/column.cpp new file mode 100644 index 0000000..e69de29 diff --git a/src/column.h b/src/column.h new file mode 100644 index 0000000..e69de29 diff --git a/src/container.cpp b/src/container.cpp new file mode 100644 index 0000000..00e7cad --- /dev/null +++ b/src/container.cpp @@ -0,0 +1,5 @@ +#include "neural/container.h" + +template class Neural::Container; +template class Neural::Container; +template class Neural::Container; diff --git a/src/container.h b/src/container.h new file mode 100644 index 0000000..d9eeffd --- /dev/null +++ b/src/container.h @@ -0,0 +1,46 @@ +#ifndef NEURAL_CONTAINER_H +#define NEURAL_CONTAINER_H + +#include "neural/node.h" +#include + +namespace Neural +{ + template + class Container : public Node + { + public: + typedef Bu::List *> NodeList; + + Container() + { + } + + virtual ~Container() + { + for( typename NodeList::iterator i = lNodes.begin(); i; i++ ) + delete *i; + } + + virtual void addNode( Node *pNode ) + { + lNodes.append( pNode ); + } + + virtual const NodeList &getNodeList() const + { + return lNodes; + } + + protected: + virtual NodeList &getNodeList() + { + return lNodes; + } + + private: + NodeList lNodes; + }; +}; + +#endif diff --git a/src/network.cpp b/src/network.cpp new file mode 100644 index 0000000..e69de29 diff --git a/src/network.h b/src/network.h new file mode 100644 index 0000000..e69de29 diff --git a/src/neuron.cpp b/src/neuron.cpp new file mode 100644 index 0000000..a951b45 --- /dev/null +++ b/src/neuron.cpp @@ -0,0 +1,5 @@ +#include "neural/neuron.h" + +template class Neural::Neuron; +template class Neural::Neuron; +template class Neural::Neuron; diff --git a/src/neuron.h b/src/neuron.h new file mode 100644 index 0000000..dc30471 --- /dev/null +++ b/src/neuron.h @@ -0,0 +1,71 @@ +#ifndef NEURAL_NEURON_H +#define NEURAL_NEURON_H + +#include "neural/node.h" +#include "neural/slope.h" + +namespace Neural +{ + template + class Neuron : public Node + { + public: + Neuron() : + iInputs( 0 ), + aWeights( 0 ), + sBias( 0.0 ), + pSlope( 0 ) + { + } + + virtual ~Neuron() + { + delete[] aWeights; + delete pSlope; + } + + virtual void finalize( int iNumInputs ) + { + iInputs = iNumInputs; + aWeights = new sigtype[iInputs]; + } + + virtual void process( sigtype *aInput, sigtype *aOutput ) + { + sigtype sOutput = sBias; + for( int j = 0; j < iInputs; j++ ) + { + sOutput += aWeights[j] * aInput[j]; + } + *aOutput = (*pSlope)( sOutput ); + } + + virtual int getNumInputs() const + { + return iInputs; + } + + virtual int getNumOutputs() const + { + return 1; + } + + virtual int getNumWeights() const + { + return iInputs; + } + + virtual int getNumBiases() const + { + return 1; + } + + private: + int iInputs; + sigtype *aWeights; + sigtype sBias; + Slope *pSlope; + }; +}; + +#endif diff --git a/src/node.cpp b/src/node.cpp new file mode 100644 index 0000000..1a02875 --- /dev/null +++ b/src/node.cpp @@ -0,0 +1,5 @@ +#include "neural/node.h" + +template class Neural::Node; +template class Neural::Node; +template class Neural::Node; diff --git a/src/node.h b/src/node.h new file mode 100644 index 0000000..fe2b720 --- /dev/null +++ b/src/node.h @@ -0,0 +1,29 @@ +#ifndef NEURAL_NODE_H +#define NEURAL_NODE_H + +namespace Neural +{ + template + class Node + { + public: + Node() + { + } + + virtual ~Node() + { + } + + virtual void finalize( int iNumInputs )=0; + virtual void process( sigtype *aInput, sigtype *aOutput )=0; + + virtual int getNumInputs() const=0; + virtual int getNumOutputs() const=0; + virtual int getNumWeights() const=0; + virtual int getNumBiases() const=0; + }; +}; + +#endif + diff --git a/src/row.cpp b/src/row.cpp new file mode 100644 index 0000000..ea050d2 --- /dev/null +++ b/src/row.cpp @@ -0,0 +1,5 @@ +#include "neural/row.h" + +template class Neural::Row; +template class Neural::Row; +template class Neural::Row; diff --git a/src/row.h b/src/row.h new file mode 100644 index 0000000..0ec5dde --- /dev/null +++ b/src/row.h @@ -0,0 +1,81 @@ +#ifndef NEURAL_ROW_H +#define NEURAL_ROW_H + +#include "neural/container.h" + +namespace Neural +{ + template + class Row : public Container + { + public: + //typedef Bu::List *> NodeList; + Row() : + iInputs( 0 ), + iOutputs( 0 ), + iWeights( 0 ), + iBiases( 0 ) + { + } + + virtual ~Row() + { + } + + virtual void finalize( int iNumInputs ) + { + iInputs = iNumInputs; + iOutputs = 0; + iWeights = 0; + iBiases = 0; + + for( typename Container::NodeList::iterator i = + Container::getNodeList().begin(); i; i++ ) + { + (*i)->finalize( iInputs ); + iOutputs += (*i)->getNumOutputs(); + iWeights += (*i)->getNumWeights(); + iBiases += (*i)->getNumBiases(); + } + } + + virtual void process( sigtype *aInput, sigtype *aOutput ) + { + int iOutputOffset = 0; + for( typename Container::NodeList::iterator i = + Container::getNodeList().begin(); i; i++ ) + { + (*i)->process( aInput, aOutput+iOutputOffset ); + iOutputOffset += (*i)->getNumOutputs(); + } + } + + virtual int getNumInputs() const + { + return iInputs; + } + + virtual int getNumOutputs() const + { + return iOutputs; + } + + virtual int getNumWeights() const + { + return iWeights; + } + + virtual int getNumBiases() const + { + return iBiases; + } + + private: + int iInputs; + int iOutputs; + int iWeights; + int iBiases; + }; +}; + +#endif diff --git a/src/slope.cpp b/src/slope.cpp new file mode 100644 index 0000000..5b380af --- /dev/null +++ b/src/slope.cpp @@ -0,0 +1 @@ +#include "neural/slope.h" diff --git a/src/slope.h b/src/slope.h new file mode 100644 index 0000000..acdbb41 --- /dev/null +++ b/src/slope.h @@ -0,0 +1,22 @@ +#ifndef NEURAL_SLOPE_H +#define NEURAL_SLOPE_H + +namespace Neural +{ + template + class Slope + { + public: + Slope() + { + } + + virtual ~Slope() + { + } + + virtual sigtype operator()( sigtype sInput )=0; + }; +}; + +#endif diff --git a/src/slopestd.cpp b/src/slopestd.cpp new file mode 100644 index 0000000..16b2be4 --- /dev/null +++ b/src/slopestd.cpp @@ -0,0 +1,5 @@ +#include "neural/slopestd.h" + +template class Neural::SlopeStd; +template class Neural::SlopeStd; +template class Neural::SlopeStd; diff --git a/src/slopestd.h b/src/slopestd.h new file mode 100644 index 0000000..40ceef2 --- /dev/null +++ b/src/slopestd.h @@ -0,0 +1,55 @@ +#ifndef NEURAL_SLOPE_STD_H +#define NEURAL_SLOPE_STD_H + +#include + +#include "neural/slope.h" + +namespace Neural +{ + template + sigtype tpltanh( sigtype sInput ); + + template<> + float tpltanh( float sInput ) + { + return tanhf( sInput ); + } + + template<> + double tpltanh( double sInput ) + { + return tanh( sInput ); + } + + template<> + long double tpltanh( long double sInput ) + { + return tanhl( sInput ); + } + + template + class SlopeStd : public Slope + { + public: + SlopeStd( sigtype sSlope=1.0 ) : + sSlope( sSlope ) + { + } + + virtual ~SlopeStd() + { + } + + virtual sigtype operator()( sigtype sInput ) + { + return (tpltanh(2.0*sSlope*sInput) + 1.0)/2.0; + } + + private: + sigtype sSlope; + }; +}; + +#endif + -- cgit v1.2.3