• Main Page
  • Classes
  • Files
  • File List

PLAdditiveKernelSpikeResponse.h

00001 #ifndef AdditiveKernelSpikeResponseBase_H_
00002 #define AdditiveKernelSpikeResponseBase_H_
00003 
00004 #include "EvSimObject.h"
00005 #include "DirectEventSender.h"
00006 #include "SharedArray.h"
00007 #include "SharedArrayTypes.h"
00008 #include "SpikeResponse.h"
00009 #include "EvSimObjectTypeUtils.h"
00010 
00011 #include <queue>
00012 #include <vector>
00013 
00015 
00025 class PLAdditiveKernelSpikeResponse : public SpikeResponse, public DirectEventSender {
00026 
00027     EV_SIM_OBJECT( PLAdditiveKernelSpikeResponse )
00028 
00029 public:
00031 
00034     PLAdditiveKernelSpikeResponse() : resp_shape_amplitudes(0), resp_shape_timepoints(0) {};
00035 
00037 
00041     PLAdditiveKernelSpikeResponse(const SharedArray<double> &resp_shape_amplitudes,
00042                                   const SharedArray<double> &resp_shape_timepoints)
00043         : resp_shape_amplitudes(resp_shape_amplitudes.get()),
00044           resp_shape_timepoints(resp_shape_timepoints.get())
00045     {}
00046 
00048     virtual ~PLAdditiveKernelSpikeResponse();
00049 
00051 
00055     void setResponseKernel(const SharedArray<double> &resp_shape_amplitudes,
00056                            const SharedArray<double> &resp_shape_timepoints)
00057     {                           
00058         this->resp_shape_amplitudes = resp_shape_amplitudes.get();
00059         this->resp_shape_timepoints = resp_shape_timepoints.get();
00060     }
00061 
00062     virtual unsigned numInputPorts() const
00063     {
00064         return 2;
00065     };
00066 
00067     virtual unsigned numOutputPorts() const
00068     {
00069         return 1;
00070     };
00071 
00072 
00073     virtual PortType getInputPortType(port_id_t p) const
00074     {
00075         if (p < 2)
00076             return eventPortDirect;
00077         return portUndefined;
00078     };
00079 
00080     virtual PortType getOutputPortType(port_id_t p) const
00081     {
00082         if (p == 0)
00083             return eventPortDirect;
00084         return portUndefined;
00085     };
00086 
00087     virtual void reset(SimContext &sim_ctxt);
00088 
00089     virtual double getSlope() {return slope;};
00090 
00091     virtual void postAddedInNetwork(EvSimNetwork &net, EvSimObject::ID self);
00092     
00093     virtual void eventHit(SimContext & sim_info, Time time, port_id_t port);
00094 
00095     virtual void updateState(SimContext &sim_info, Time time, update_id_t upd_id);
00096 
00097 protected:
00098     class ResponseKernel {
00099 
00100     public:
00101         ResponseKernel(const vector<double> * resp_amplitudes, const vector<double> * resp_shape_timepoints);
00102         
00103         ~ResponseKernel();
00104         
00105         void trigger(Time time);
00106         
00107         void update(Time time);
00108         
00109         bool isFinished() const;
00110 
00111         double r;
00112         double slope;
00113         Time next_expected_time;
00114         
00115     protected:
00116         static const unsigned RESPONSE_NOT_ACTIVE = ~(0u);
00117         
00118         void updateResponse(Time time);
00119         
00120         const vector<double> * resp_shape_amplitudes;
00121         const vector<double> * resp_shape_timepoints;
00122         unsigned curr_timepoint;
00123     };
00124 
00125         class CompareResponseKernel {
00126         public:
00127                 bool operator()(ResponseKernel const * left, ResponseKernel const * right) const {
00128                         return left->next_expected_time > right->next_expected_time;
00129                 }
00130         };
00131 
00132     std::priority_queue<ResponseKernel*, std::vector<ResponseKernel*>, CompareResponseKernel > response_queue;
00133     
00134     const vector<double> * resp_shape_amplitudes;
00135     const vector<double> * resp_shape_timepoints;
00136 
00137     Time cur_time;
00138     double slope;
00139 };
00140 
00141 #endif /* AdditiveKernelSpikeResponseBase_H_ */
00142 

Generated on Wed Sep 18 2013 11:25:40 for NEVESIM by  doxygen 1.7.1