From d4b7687534e6d1a0eeb94bc03c4145264c533ef0 Mon Sep 17 00:00:00 2001
From: bcumming <bcumming@cscs.ch>
Date: Thu, 16 Jun 2016 09:07:42 +0200
Subject: [PATCH] work on spike source <remove>

---
 src/spike_source.hpp | 20 ++++++++++++--------
 1 file changed, 12 insertions(+), 8 deletions(-)

diff --git a/src/spike_source.hpp b/src/spike_source.hpp
index 8a5199bf..73c54995 100644
--- a/src/spike_source.hpp
+++ b/src/spike_source.hpp
@@ -11,7 +11,7 @@ namespace mc {
 class spike_source {
     public:
 
-    virtual std::vector<float> test(float t) = 0;
+    virtual util::optional<float> test(float t) = 0;
 };
 
 // spike detector for a lowered cell
@@ -36,15 +36,15 @@ class spike_detector : public spike_source
         is_spiking_ = previous_v_ >= thresh ? true : false;
     }
 
-    std::vector<float> test(float t) override {
-        std::vector<float> spike_times;
+    util::optional<float> test(float t) override {
+        util::optional<float> result = util::nothing;
         auto v = cell_->voltage(location_);
         if (!is_spiking_) {
             if (v>=threshold_) {
                 // the threshold has been passed, so estimate the time using
                 // linear interpolation
                 auto pos = (threshold_ - previous_v_)/(v - previous_v_);
-                spike_times.push_back(previous_t_ + pos*(t - previous_t_));
+                result = previous_t_ + pos*(t - previous_t_);
 
                 is_spiking_ = true;
             }
@@ -58,7 +58,7 @@ class spike_detector : public spike_source
         previous_v_ = v;
         previous_t_ = t;
 
-        return spike_times;
+        return result;
     }
 
     bool is_spiking() const {
@@ -88,21 +88,25 @@ class poisson_generator : public spike_source
     public:
 
     poisson_generator(float r)
-    :   firing_rate_(r)
+    :   dist_(0.0f, 1.0f),
+        firing_rate_(r)
     {}
 
     util::optional<float> test(float t) {
         // generate a uniformly distrubuted random number x \in [0,1]
         // if  (x > r*dt)  we have a spike in the interval
         std::vector<float> spike_times;
-        if(rand() > firing_rate_*(t-previous_t_)) {
+        if(dist_(generator_) > firing_rate_*(t-previous_t_)) {
             return t;
         }
-        return util::optional<float>::nothing;
+        return util::nothing;
     }
 
     private:
 
+    std::mt19937 generator_; // for now default initialized
+    std::uniform_real_distribution<float> dist_;
+
     // firing rate in spikes/ms
     float firing_rate_;
     float previous_t_;
-- 
GitLab