#ifndef NEURAL_COLUMN_H #define NEURAL_COLUMN_H #include "neural/container.h" namespace Neural { template class Column : public Container { public: Column() { } virtual ~Column() { } virtual void finalize( int iNumInputs ) { iInputs = iNumInputs; iWeights = 0; iBiases = 0; int iNextInputs = iInputs; for( typename Container::NodeList::iterator i = Container::getNodeList().begin(); i; i++ ) { (*i)->finalize( iNextInputs ); iNextInputs = (*i)->getNumOutputs(); if( (i+1) ) { lBuffer.append( new sigtype[iNextInputs] ); } iWeights += (*i)->getNumWeights(); iBiases += (*i)->getNumBiases(); } } virtual void process( sigtype *aInput, sigtype *aOutput ) { typename BufferList::iterator iBuf = lBuffer.begin(); sigtype *pBuffer = aInput; sigtype *pNextBuffer = *iBuf; for( typename Container::NodeList::iterator i = Container::getNodeList().begin(); i; i++ ) { (*i)->process( pBuffer, pNextBuffer ); pBuffer = pNextBuffer; if( iBuf ) iBuf++; if( iBuf ) pNextBuffer = *iBuf; else pNextBuffer = aOutput; } } virtual int getNumInputs() const { return iInputs; } virtual int getNumOutputs() const { return Container::getNodeList().last()->getNumOutputs(); } virtual int getNumWeights() const { return iWeights; } virtual int getNumBiases() const { return iBiases; } private: int iInputs; int iWeights; int iBiases; typedef Bu::List BufferList; BufferList lBuffer; }; }; #endif