00001 #ifndef __SRMNEURON_H 00002 #define __SRMNEURON_H 00003 00004 #include "Neuron.h" 00005 #include <an/Numeric.h> 00006 #include "../../utils/SpikeDelayLine.h" 00007 00008 #include <queue> 00009 #include <cmath> 00010 00015 namespace Teem 00016 { 00029 class SRMNeuron : public Neuron 00030 { 00031 public: 00032 SRMNeuron(); 00033 virtual ~SRMNeuron() { } 00034 00035 // Neuron overrides 00036 virtual void setParams(const std::string ¶m, double value); 00037 virtual void update(double dt); 00038 virtual void commit(); 00039 00042 void overrideSpike(bool spike) { lastSpike = spike; } 00043 00044 public: 00046 double membrane; 00048 double threshold; 00049 00050 protected: 00052 An::ExpDecay refractory; 00054 bool isSpiking; 00056 double thresNoise; 00058 double refracQuantum; 00059 }; 00060 00070 class DelaySynapse : public Synapse 00071 { 00072 public: 00073 DelaySynapse() { setDelay(2.0); incomingSpikes = 0; } 00074 virtual ~DelaySynapse() { } 00075 00076 virtual void setParams(const std::string ¶m, double value); 00077 virtual void update(double dt = 1.0); 00078 00080 virtual void setDelay(double theDelay) { delayLine.setDelay(theDelay); } 00081 00082 protected: 00084 SpikeDelayLine delayLine; 00086 unsigned incomingSpikes; 00087 }; 00088 00101 class SRMSynapse : public DelaySynapse 00102 { 00103 public: 00104 SRMSynapse(); 00105 virtual ~SRMSynapse() {} 00106 00107 // Synapse overrides 00108 virtual void setParams(const std::string ¶m, double value); 00109 virtual bool getSpike() const {return false;} 00110 virtual double getCurrent() const {return response;} 00111 00112 virtual void update(double dt = 1.0); 00113 00114 // Accessors. 00116 virtual void setTau(double theTau) 00117 { 00118 spikeResponse1.setTau(theTau / std::log(2.0)); 00119 spikeResponse2.setTau(theTau / (2.0 * std::log(2.0))); 00120 } 00121 00122 protected: 00123 00125 An::ExpDecay spikeResponse1; 00127 An::ExpDecay spikeResponse2; 00129 double response; 00130 00131 }; 00132 00145 class SRMPlasticSynapse : public SRMSynapse 00146 { 00147 public: 00148 SRMPlasticSynapse(); 00149 virtual ~SRMPlasticSynapse() {} 00150 00151 virtual void setParams(const std::string ¶m, double value); 00152 00153 virtual void update(double dt = 1.0); 00154 00155 static double learningRate; 00156 static double stdpControl; 00157 00158 protected: 00159 00161 double potFactor; 00163 double deprFactor; 00165 An::ExpDecay potState; 00167 An::ExpDecay deprState; 00169 SpikeDelayLine preDelayLine; 00171 SpikeDelayLine postDelayLine; 00172 00173 00175 void preformLearning(double dt); 00176 }; 00177 } 00178 00179 #endif