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
00142