From 64c863b99f1e5f6c2ea2611d9d057fdac0a98351 Mon Sep 17 00:00:00 2001
From: KyleKlenk <kyle.c.klenk@gmail.com>
Date: Fri, 8 Jul 2022 16:22:33 -0600
Subject: [PATCH] added timing info to summa_actor, removed unencessary print
 statements

---
 build/includes/global/timing_info.hpp         |  6 ++-
 build/includes/summa_actor/summa_actor.hpp    | 10 +++--
 build/source/actors/hru_actor/hru_actor.cpp   | 44 ++-----------------
 .../source/actors/summa_actor/summa_actor.cpp | 24 +++++-----
 4 files changed, 25 insertions(+), 59 deletions(-)

diff --git a/build/includes/global/timing_info.hpp b/build/includes/global/timing_info.hpp
index 145ee06..e246a6c 100644
--- a/build/includes/global/timing_info.hpp
+++ b/build/includes/global/timing_info.hpp
@@ -4,7 +4,11 @@
 #include <vector>
 
 using chrono_time = std::chrono::time_point<std::chrono::system_clock>;
-
+/**
+ * Class to manage timing information. This allows the user to add an arbitrary amount of timing variables.
+ * The timing variables are accessed through their named string and will keep a running duration of the amount 
+ * of time spent through multiple calls to updateStartPoint and updateEndPoint
+ */
 class TimingInfo {
     private:
         std::vector<std::optional<chrono_time>> start;
diff --git a/build/includes/summa_actor/summa_actor.hpp b/build/includes/summa_actor/summa_actor.hpp
index a2e9410..ef05577 100644
--- a/build/includes/summa_actor/summa_actor.hpp
+++ b/build/includes/summa_actor/summa_actor.hpp
@@ -2,14 +2,17 @@
 
 #include "caf/all.hpp"
 #include "caf/io/all.hpp"
+#include "timing_info.hpp"
 
 #include <chrono>
 #include <string>
+#include <vector>
 
 namespace caf {
 
 
-struct summa_actor_timing_info {
+struct job_timing_info {
+    std:
     std::chrono::time_point<std::chrono::system_clock> start;
     std::chrono::time_point<std::chrono::system_clock> end;
     double summa_actor_duration;
@@ -18,9 +21,8 @@ struct summa_actor_timing_info {
 
 struct summa_actor_state {
     // Timing Information For Summa-Actor
-    std::chrono::time_point<std::chrono::system_clock> start;
-    std::chrono::time_point<std::chrono::system_clock> end;
-    double duration;
+    TimingInfo summa_actor_timing;
+
     // Program Parameters
     int startGRU;           // starting GRU for the simulation
     int numGRU;             // number of GRUs to compute
diff --git a/build/source/actors/hru_actor/hru_actor.cpp b/build/source/actors/hru_actor/hru_actor.cpp
index 6a2ed14..90b60db 100644
--- a/build/source/actors/hru_actor/hru_actor.cpp
+++ b/build/source/actors/hru_actor/hru_actor.cpp
@@ -90,7 +90,7 @@ behavior hru_actor(stateful_actor<hru_state>* self, int refGRU, int indxGRU,
                 self->state.hru_timing.updateEndPoint("total_duration");
 
                 // Tell our parent we are done, convert all timings to seconds
-                aout(self) << "\n________________PRINTING HRU TIMING INFO RESULTS________________\n";
+                aout(self) << "\n________________HRU TIMING INFO RESULTS________________\n";
                 aout(self) << "Total Duration = " << self->state.hru_timing.getDuration("total_duration").value_or(-1.0) << " Seconds\n";
                 aout(self) << "Init Duration = " << self->state.hru_timing.getDuration("init_duration").value_or(-1.0) << " Seconds\n";
                 aout(self) << "Forcing Duration = " << self->state.hru_timing.getDuration("forcing_duration").value_or(-1.0) << " Seconds\n";
@@ -145,16 +145,13 @@ behavior hru_actor(stateful_actor<hru_state>* self, int refGRU, int indxGRU,
             self->state.dt_init_factor = dt_init_factor;
         },
     };
-    /*********************************************************************************************************
-     *********************************** END ACTOR MESSAGE HANDLERS ******************************************
-     *********************************************************************************************************/
 }
 
+
+
 void Initialize_HRU(stateful_actor<hru_state>* self) {
     self->state.hru_timing.updateStartPoint("init_duration");
     
-    // aout(self) << "Initalizing HRU" << std::endl;
-    // aout(self) << "Entering Initalize \n"; 
     summaActors_initialize(&self->state.indxGRU,
             &self->state.num_steps, 
             self->state.handle_forcStat, 
@@ -209,7 +206,6 @@ void Initialize_HRU(stateful_actor<hru_state>* self) {
         self->quit();
         return;
     }
-    // aout(self) << "Restart" << std::endl;
             
     Restart(&self->state.indxGRU, 
             &self->state.indxHRU, 
@@ -294,9 +290,6 @@ int Run_HRU(stateful_actor<hru_state>* self) {
     }
     self->state.hru_timing.updateEndPoint("run_physics_duration");
 
-    /**********************************************************************
-    ** WRITE_OUTPUT  
-    **********************************************************************/
     self->state.hru_timing.updateStartPoint("write_output_duration");
     WriteOutput(&self->state.indxHRU,
             &self->state.indxGRU,
@@ -349,13 +342,6 @@ bool check_HRU(stateful_actor<hru_state>* self, int err) {
     } else if (self->state.timestep > self->state.num_steps) {
         // check if simulation is finished
         self->state.outputStep -= 1; // prevents segfault
-
-        if (debug)
-            aout(self) << "Sending Final Write" << 
-                "forcingStep = " << self->state.forcingStep << "\n" << 
-                "stepsInCurrentFFile = " << self->state.stepsInCurrentFFile << "\n" <<
-                "timeStep = " << self->state.timestep << "\n" << 
-                "outputStep = " << self->state.outputStep << "\n";
         
         self->send(self->state.file_access_actor, write_output_v, 
             self->state.indxGRU, self->state.indxHRU, self->state.outputStep, self);
@@ -369,14 +355,6 @@ bool check_HRU(stateful_actor<hru_state>* self, int err) {
         // Special case where we need both reading and writing
         self->state.outputStep -= 1; // prevents segfault
 
-        if (debug)
-            aout(self) << "Need to read forcing and write to outputstruc\n" << 
-                "forcingStep = " << self->state.forcingStep << "\n" << 
-                "stepsInCurrentFFile = " << self->state.stepsInCurrentFFile << "\n" <<
-                "timeStep = " << self->state.timestep << "\n" << 
-                "outputStep = " << self->state.outputStep << "\n";
-        
-
         self->send(self->state.file_access_actor, read_and_write_v, self->state.indxGRU, 
             self->state.indxHRU, self->state.outputStep, self->state.iFile + 1, self);
         self->state.outputStep = 1;
@@ -386,14 +364,6 @@ bool check_HRU(stateful_actor<hru_state>* self, int err) {
     } else if (self->state.outputStep > self->state.outputStrucSize) {
         // check if we need to clear the output struc
         self->state.outputStep -= 1;
-
-        if (debug)
-            aout(self) << "Sending Write \n" << 
-                "forcingStep = " << self->state.forcingStep << "\n" << 
-                "stepsInCurrentFFile = " << self->state.stepsInCurrentFFile << "\n" <<
-                "timeStep = " << self->state.timestep << "\n" << 
-                "outputStep = " << self->state.outputStep << "\n";
-        
         
         self->send(self->state.file_access_actor, write_output_v, 
             self->state.indxGRU, self->state.indxHRU, self->state.outputStep, self);
@@ -403,14 +373,6 @@ bool check_HRU(stateful_actor<hru_state>* self, int err) {
 
     } else if (self->state.forcingStep > self->state.stepsInCurrentFFile) {
         // we need more forcing data
-
-        if (debug)
-            aout(self) << "Asking for more forcing data\n" << 
-                "forcingStep = " << self->state.forcingStep << "\n" << 
-                "stepsInCurrentFFile = " << self->state.stepsInCurrentFFile << "\n" <<
-                "timeStep = " << self->state.timestep << "\n" << 
-                "outputStep = " << self->state.outputStep << "\n";
-        
         self->send(self->state.file_access_actor, access_forcing_v, self->state.iFile + 1, self);
 
         return false;
diff --git a/build/source/actors/summa_actor/summa_actor.cpp b/build/source/actors/summa_actor/summa_actor.cpp
index 4aaa11e..10049d7 100644
--- a/build/source/actors/summa_actor/summa_actor.cpp
+++ b/build/source/actors/summa_actor/summa_actor.cpp
@@ -15,7 +15,10 @@ using json = nlohmann::json;
 namespace caf {
 
 behavior summa_actor(stateful_actor<summa_actor_state>* self, int startGRU, int numGRU, std::string configPath, actor parent) {
- 	self->state.start = std::chrono::high_resolution_clock::now();
+ 	// Set Timing Variables
+	self->state.summa_actor_timing = TimingInfo();
+	self->state.summa_actor_timing.addTimePoint("total_duration");
+	self->state.summa_actor_timing.updateStartPoint("total_duration");
 	// Set Variables
 	self->state.startGRU = startGRU;
 	self->state.numGRU = numGRU;
@@ -35,24 +38,19 @@ behavior summa_actor(stateful_actor<summa_actor_state>* self, int startGRU, int
 	spawnJob(self);
 
 	return {
-		[=](done_job, int numFailed, int job_duration, int read_duration, int write_duration) {
+		[=](done_job, int numFailed, double job_duration, double read_duration, double write_duration) {
 			self->state.numFailed += numFailed;
 			aout(self) << "Job Done\n"; 
 			if (self->state.numGRU <= 0) {
-
-				self->state.end = std::chrono::high_resolution_clock::now();
-            	self->state.duration = calculateTime(self->state.start, self->state.end);
-				
-            	self->state.duration = self->state.duration / 1000; // Convert to milliseconds
-
+				self->state.summa_actor_timing.updateEndPoint("total_duration");
 				
-				aout(self) << "Total Program Duration:\n";
-            	aout(self) << "     " << self->state.duration / 1000  << " Seconds\n";
-            	aout(self) << "     " << (self->state.duration / 1000) / 60  << " Minutes\n";
-            	aout(self) << "     " << ((self->state.duration / 1000) / 60) / 60 << " Hours\n";
+				aout(self) << "\n________________SUMMA_ACTOR TIMING INFO________________\n";
+				aout(self) << "Total Duration = " << self->state.summa_actor_timing.getDuration("total_duration").value_or(-1.0) << " Seconds\n";
+				aout(self) << "Total Duration = " << self->state.summa_actor_timing.getDuration("total_duration").value_or(-1.0) / 60 << " Minutes\n";
+				aout(self) << "Total Duration = " << (self->state.summa_actor_timing.getDuration("total_duration").value_or(-1.0) / 60) / 60 << " Hours\n\n";
 				aout(self) << "Program Finished \n";
 
-				self->send(self->state.parent, done_batch_v, self->state.duration);		
+				self->send(self->state.parent, done_batch_v, self->state.summa_actor_timing.getDuration("total duration").value_or(-1.0));		
 
 			} else {
 				// spawn a new job
-- 
GitLab