From 310c4c918e4045614b8d22dce7d0f5e7d344ed2d Mon Sep 17 00:00:00 2001
From: Michal Kravcenko <michal.kravcenko@vsb.cz>
Date: Wed, 20 Feb 2019 14:03:25 +0100
Subject: [PATCH] ADD: added a new function to retrieve the last calculated
 activation value of the neuron

---
 src/Neuron/Neuron.cpp         |  4 ++++
 src/Neuron/Neuron.h           | 12 ++++++++++++
 src/Neuron/NeuronBinary.cpp   |  6 ++++--
 src/Neuron/NeuronConstant.cpp |  3 ++-
 src/Neuron/NeuronLinear.cpp   |  3 ++-
 src/Neuron/NeuronLogistic.cpp | 10 +++++++---
 6 files changed, 31 insertions(+), 7 deletions(-)

diff --git a/src/Neuron/Neuron.cpp b/src/Neuron/Neuron.cpp
index 014d1e99..3f8b77f4 100644
--- a/src/Neuron/Neuron.cpp
+++ b/src/Neuron/Neuron.cpp
@@ -8,4 +8,8 @@ namespace lib4neuro {
 
     }
 
+    double Neuron::get_last_activation_value() {
+        return this->activation_val;
+    }
+
 }
diff --git a/src/Neuron/Neuron.h b/src/Neuron/Neuron.h
index 1fed3ec4..88747a63 100644
--- a/src/Neuron/Neuron.h
+++ b/src/Neuron/Neuron.h
@@ -30,6 +30,12 @@ namespace lib4neuro {
       */
     class Neuron {
 
+    protected:
+        /**
+         * holds the last value of the activation function, used by this->activate
+         */
+        double activation_val;
+
     public:
 
         /**
@@ -50,6 +56,12 @@ namespace lib4neuro {
          */
         LIB4NEURO_API virtual double activate(double x, double b) = 0;
 
+        /**
+         * returns the last value of the actual activation function output for this neuron
+         * @return
+         */
+        LIB4NEURO_API virtual double get_last_activation_value( );
+
     }; /* end of Neuron class */
 
 
diff --git a/src/Neuron/NeuronBinary.cpp b/src/Neuron/NeuronBinary.cpp
index 2b90fa3a..9e7bbb80 100644
--- a/src/Neuron/NeuronBinary.cpp
+++ b/src/Neuron/NeuronBinary.cpp
@@ -15,10 +15,12 @@ namespace lib4neuro {
     double NeuronBinary::activate(double x, double b) {
 
         if (x >= b) {
-            return 1.0;
+            this->activation_val = 1.0;
         } else {
-            return 0.0;
+            this->activation_val = 0.0;
         }
+
+        return this->activation_val;
     }
 
 }
\ No newline at end of file
diff --git a/src/Neuron/NeuronConstant.cpp b/src/Neuron/NeuronConstant.cpp
index f660e49d..9210b95c 100644
--- a/src/Neuron/NeuronConstant.cpp
+++ b/src/Neuron/NeuronConstant.cpp
@@ -21,7 +21,8 @@ namespace lib4neuro {
     }
 
     double NeuronConstant::activate(double x, double b) {
-        return this->p;
+        this->activation_val = this->p;
+        return this->activation_val;
     }
 
     double NeuronConstant::activation_function_eval_derivative_bias(double x, double b) {
diff --git a/src/Neuron/NeuronLinear.cpp b/src/Neuron/NeuronLinear.cpp
index b412eef0..0cd3aa8d 100644
--- a/src/Neuron/NeuronLinear.cpp
+++ b/src/Neuron/NeuronLinear.cpp
@@ -15,7 +15,8 @@ namespace lib4neuro {
     NeuronLinear::NeuronLinear() {}
 
     double NeuronLinear::activate(double x, double b) {
-        return x + b;
+        this->activation_val = x + b;
+        return this->activation_val;
     }
 
     double NeuronLinear::activation_function_eval_derivative_bias(double x, double b) {
diff --git a/src/Neuron/NeuronLogistic.cpp b/src/Neuron/NeuronLogistic.cpp
index 2b221320..dd1469d7 100644
--- a/src/Neuron/NeuronLogistic.cpp
+++ b/src/Neuron/NeuronLogistic.cpp
@@ -23,7 +23,8 @@ namespace lib4neuro {
         double eb = std::pow(E, b);
         double denom = (eb + ex);
 
-        return (eb * ex * (eb - ex)) / (denom * denom * denom);
+        this->activation_val = (eb * ex * (eb - ex)) / (denom * denom * denom);
+        return this->activation_val;
     }
 
     double NeuronLogistic_d2::activation_function_eval_derivative_bias(double x, double b) {
@@ -58,7 +59,8 @@ namespace lib4neuro {
         double d = (eb / ex);
         double denom = (d + 1);
 
-        return d / (denom * denom);
+        this->activation_val = d / (denom * denom);
+        return this->activation_val;
     }
 
     double NeuronLogistic_d1::activation_function_eval_derivative_bias(double x, double b) {
@@ -91,7 +93,9 @@ namespace lib4neuro {
         //(1 + e^(-x + b))^(-1)
 
         double ex = std::pow(E, b - x);
-        return 1.0 / (1.0 + ex);
+
+        this->activation_val = 1.0 / (1.0 + ex);
+        return this->activation_val;
     }
 
     double NeuronLogistic::activation_function_eval_derivative_bias(double x, double b) {
-- 
GitLab