[Avida-SVN] r2514 - in branches/jobScheduling/source: actions cpu main

beckma24 at myxo.css.msu.edu beckma24 at myxo.css.msu.edu
Wed Apr 2 21:56:50 PDT 2008


Author: beckma24
Date: 2008-04-03 00:56:49 -0400 (Thu, 03 Apr 2008)
New Revision: 2514

Modified:
   branches/jobScheduling/source/actions/EnvironmentActions.cc
   branches/jobScheduling/source/actions/PrintActions.cc
   branches/jobScheduling/source/cpu/cHardwareBase.h
   branches/jobScheduling/source/cpu/cHardwareCPU.cc
   branches/jobScheduling/source/cpu/cHardwareCPU.h
   branches/jobScheduling/source/cpu/cTestCPUInterface.h
   branches/jobScheduling/source/main/cDeme.cc
   branches/jobScheduling/source/main/cDeme.h
   branches/jobScheduling/source/main/cDemeCellEvent.cc
   branches/jobScheduling/source/main/cDemeCellEvent.h
   branches/jobScheduling/source/main/cOrgInterface.h
   branches/jobScheduling/source/main/cOrganism.cc
   branches/jobScheduling/source/main/cOrganism.h
   branches/jobScheduling/source/main/cPopulationInterface.cc
   branches/jobScheduling/source/main/cPopulationInterface.h
   branches/jobScheduling/source/main/cStats.cc
   branches/jobScheduling/source/main/cStats.h
Log:
Added alarm bit cons instruction and lots of data logging code so that I can see population size and event killing relative to event inflow rate.  Plus some more...I think...maybe not...

Modified: branches/jobScheduling/source/actions/EnvironmentActions.cc
===================================================================
--- branches/jobScheduling/source/actions/EnvironmentActions.cc	2008-04-01 20:58:47 UTC (rev 2513)
+++ branches/jobScheduling/source/actions/EnvironmentActions.cc	2008-04-03 04:56:49 UTC (rev 2514)
@@ -770,9 +770,63 @@
   }
 };
 
+class cActionDelayedDemeEventsPerSlots : public cAction
+{
+private:
+  int m_x1, m_y1, m_x2, m_y2; // bounding box of event in deme
+  int m_delay; // deme age when event occurs
+  int m_duration; // length of event; subverted when deme is reset
+  int m_total_slots; // total number of slots
+  int m_total_events_per_slot_max; // maximum number of unique event to create per slot; they may overlab
+  int m_total_events_per_slot_min; // minimum number of unique event to create per slot; they may overlab
+  int m_tolal_event_flow_levels; // total number of evenly spaced event flow levels; not all flow levels will be represented in a single deme
+  bool m_static_position;
+  
+public:
+  cActionDelayedDemeEventsPerSlots(cWorld* world, const cString& args) : 
+    cAction(world, args)
+  , m_x1(-1)
+  , m_y1(-1)
+  , m_x2(-1)
+  , m_y2(-1)
+  , m_delay(-1)
+  , m_duration(-1)
+  , m_total_slots(1)
+  , m_total_events_per_slot_max(1)
+  , m_total_events_per_slot_min(1)
+  , m_tolal_event_flow_levels(1)
+  , m_static_position(true)
+  {
+    cString largs(args);
+    if (largs.GetSize()) m_x1 = largs.PopWord().AsInt();
+    if (largs.GetSize()) m_y1 = largs.PopWord().AsInt();
+    if (largs.GetSize()) m_x2 = largs.PopWord().AsInt();
+    if (largs.GetSize()) m_y2 = largs.PopWord().AsInt();
+    if (largs.GetSize()) m_delay = largs.PopWord().AsInt();
+    if (largs.GetSize()) m_duration = largs.PopWord().AsInt();
+    if (largs.GetSize()) m_static_position = static_cast<bool>(largs.PopWord().AsInt());
+    if (largs.GetSize()) m_total_slots = largs.PopWord().AsInt();
+    if (largs.GetSize()) m_total_events_per_slot_max = largs.PopWord().AsInt();
+    if (largs.GetSize()) m_total_events_per_slot_min = largs.PopWord().AsInt();
+    if (largs.GetSize()) m_tolal_event_flow_levels = largs.PopWord().AsInt();
+  }
+  
+  static const cString GetDescription() { return "Arguments: <int x1> <int y1> <int x2> <int y2> <int delay> <int duraion> <bool static_position> <int total_slots_per_deme> <int total_events_per_slot_max> <int total_events_per_slot_min> <int tolal_event_flow_levels>"; }
+  
+  void Process(cAvidaContext& ctx)
+  {
+    cPopulation& pop = m_world->GetPopulation();
+    int numDemes = pop.GetNumDemes();
+    for(int i = 0; i < numDemes; i++) {
+      pop.GetDeme(i).SetCellEventSlots(m_x1, m_y1, m_x2, m_y2, m_delay, m_duration, m_static_position, m_total_slots, m_total_events_per_slot_max, m_total_events_per_slot_min, m_tolal_event_flow_levels);
+    }
+  }
+};
+
 void RegisterEnvironmentActions(cActionLibrary* action_lib)
 {
   action_lib->Register<cActionDelayedDemeEvent>("DelayedDemeEvent");
+  action_lib->Register<cActionDelayedDemeEventsPerSlots>("DelayedDemeEventsPerSlots");
   action_lib->Register<cActionInjectResource>("InjectResource");
   action_lib->Register<cActionInjectScaledResource>("InjectScaledResource");
   action_lib->Register<cActionOutflowScaledResource>("OutflowScaledResource");

Modified: branches/jobScheduling/source/actions/PrintActions.cc
===================================================================
--- branches/jobScheduling/source/actions/PrintActions.cc	2008-04-01 20:58:47 UTC (rev 2513)
+++ branches/jobScheduling/source/actions/PrintActions.cc	2008-04-03 04:56:49 UTC (rev 2514)
@@ -99,6 +99,7 @@
 STATS_OUT_FILE(PrintGermlineData,           germline.dat        );
 // @WRE: Added output event for collected visit counts
 STATS_OUT_FILE(PrintCellVisitsData,         visits.dat			);
+STATS_OUT_FILE(PrintFlowRateTuples,         flow_rate_tuples.dat);
 
 
 #define POP_OUT_FILE(METHOD, DEFAULT)                                                     /*  1 */ \
@@ -2638,6 +2639,7 @@
   // Stats Out Files
   action_lib->Register<cActionPrintAverageData>("PrintAverageData");
   action_lib->Register<cActionPrintDemeAverageData>("PrintDemeAverageData");
+  action_lib->Register<cActionPrintFlowRateTuples>("PrintFlowRateTuples");
   action_lib->Register<cActionPrintErrorData>("PrintErrorData");
   action_lib->Register<cActionPrintVarianceData>("PrintVarianceData");
   action_lib->Register<cActionPrintDominantData>("PrintDominantData");

Modified: branches/jobScheduling/source/cpu/cHardwareBase.h
===================================================================
--- branches/jobScheduling/source/cpu/cHardwareBase.h	2008-04-01 20:58:47 UTC (rev 2513)
+++ branches/jobScheduling/source/cpu/cHardwareBase.h	2008-04-03 04:56:49 UTC (rev 2514)
@@ -191,7 +191,7 @@
   virtual void InheritState(cHardwareBase& in_hardware){ ; }
   
   //alarm
-  virtual bool Jump_To_Alarm_Label() { return false; }
+  virtual bool Jump_To_Alarm_Label(int jump_label) { return false; }
   
 protected:
   // --------  No-Operation Instruction --------

Modified: branches/jobScheduling/source/cpu/cHardwareCPU.cc
===================================================================
--- branches/jobScheduling/source/cpu/cHardwareCPU.cc	2008-04-01 20:58:47 UTC (rev 2513)
+++ branches/jobScheduling/source/cpu/cHardwareCPU.cc	2008-04-03 04:56:49 UTC (rev 2514)
@@ -395,7 +395,9 @@
         
     // Alarms
     tInstLibEntry<tMethod>("send-alarm-msg", &cHardwareCPU::Inst_Alarm_MSG, nInstFlag::STALL),
-    tInstLibEntry<tMethod>("alarm-label", &cHardwareCPU::Inst_Alarm_Label),
+    tInstLibEntry<tMethod>("send-alarm-msg-bit-cons24", &cHardwareCPU::Inst_Alarm_MSG_Bit_Cons24, nInstFlag::STALL),
+    tInstLibEntry<tMethod>("alarm-label-high", &cHardwareCPU::Inst_Alarm_Label),
+    tInstLibEntry<tMethod>("alarm-label-low", &cHardwareCPU::Inst_Alarm_Label),
 
 
     // Placebo instructions
@@ -4788,16 +4790,34 @@
 }
 
 bool cHardwareCPU::Inst_Alarm_MSG(cAvidaContext& ctx) {
-  return organism->BcastAlarmMSG(ctx);
+  return organism->BcastAlarmMSG(ctx, 1); // jump to Alarm-label-high
 }
 
+bool cHardwareCPU::Inst_Alarm_MSG_Bit_Cons24(cAvidaContext& ctx) {
+  const int reg_used = FindModifiedRegister(REG_BX);
+  const int op1 = FindModifiedNextRegister(reg_used);
+  GetRegister(reg_used) = (BitCount(GetRegister(op1) & MASK24) >= CONSENSUS24) ? 1 : 0;
+
+  return organism->BcastAlarmMSG(ctx, GetRegister(reg_used));// jump to Alarm-label-high OR Alarm-label-low
+}
+
 bool cHardwareCPU::Inst_Alarm_Label(cAvidaContext& ctx) {
   return true;
 }
 
-bool cHardwareCPU::Jump_To_Alarm_Label() {
-  static cInstruction label_inst = GetInstSet().GetInst(cStringUtil::Stringf("alarm-label"));
+bool cHardwareCPU::Jump_To_Alarm_Label(int jump_label) {
+  cString channel;
   
+  if(jump_label == 1) {
+    channel = "high";
+  } else if(jump_label == 0) {
+    channel = "low";
+  } else {
+    assert(false);
+  }
+  
+  cInstruction label_inst = GetInstSet().GetInst(cStringUtil::Stringf("alarm-label-")+channel);
+  
   cHeadCPU search_head(IP());
   int start_pos = search_head.GetPosition();
   search_head++;

Modified: branches/jobScheduling/source/cpu/cHardwareCPU.h
===================================================================
--- branches/jobScheduling/source/cpu/cHardwareCPU.h	2008-04-01 20:58:47 UTC (rev 2513)
+++ branches/jobScheduling/source/cpu/cHardwareCPU.h	2008-04-03 04:56:49 UTC (rev 2514)
@@ -598,8 +598,9 @@
   
   //// Alarm ////
   bool Inst_Alarm_MSG(cAvidaContext& ctx);
+  bool Inst_Alarm_MSG_Bit_Cons24(cAvidaContext& ctx);
   bool Inst_Alarm_Label(cAvidaContext& ctx);
-  bool Jump_To_Alarm_Label();
+  bool Jump_To_Alarm_Label(int jump_label);
 
   
   //// Placebo ////

Modified: branches/jobScheduling/source/cpu/cTestCPUInterface.h
===================================================================
--- branches/jobScheduling/source/cpu/cTestCPUInterface.h	2008-04-01 20:58:47 UTC (rev 2513)
+++ branches/jobScheduling/source/cpu/cTestCPUInterface.h	2008-04-03 04:56:49 UTC (rev 2514)
@@ -81,7 +81,7 @@
   int GetFacing() { return 0; }
   bool SendMessage(cOrgMessage& msg) { return false; }
   
-  bool BcastAlarm() { return false; }
+  bool BcastAlarm(int jump_label) { return false; }
 };
 
 

Modified: branches/jobScheduling/source/main/cDeme.cc
===================================================================
--- branches/jobScheduling/source/main/cDeme.cc	2008-04-01 20:58:47 UTC (rev 2513)
+++ branches/jobScheduling/source/main/cDeme.cc	2008-04-03 04:56:49 UTC (rev 2514)
@@ -29,6 +29,7 @@
 #include "cPopulation.h"
 #include "cPopulationCell.h"
 #include "cResource.h"
+#include "cStats.h"
 #include "cWorld.h"
 
 void cDeme::Setup(int id, const tArray<int> & in_cells, int in_width, cWorld* world)
@@ -98,6 +99,17 @@
       event.DeactivateEvent();  //event over
     }
   }
+  
+  for(vector<pair<int, int> >::iterator iter = event_slot_end_points.begin(); iter < event_slot_end_points.end(); iter++) {
+    cerr<<(*iter).first << " " << _age << endl;
+    if(_age == (*iter).first) {
+      // at end point
+      (m_world->GetStats().FlowRateTuple())[(*iter).second].first.Add(GetSize());
+      (m_world->GetStats().FlowRateTuple())[(*iter).second].second.Add(GetEventsKilled());
+
+      break;
+    }
+  }
   ++_age;
 }
 
@@ -257,6 +269,39 @@
   }
 }
 
+void cDeme::SetCellEventSlots(int x1, int y1, int x2, int y2, int delay, int duration, 
+                              bool static_position, int m_total_slots, int m_total_events_per_slot_max, 
+                              int m_total_events_per_slot_min, int m_tolal_event_flow_levels) {
+  assert(cell_events.GetSize() == 0); // not designed to be used with other cell events
+  assert(m_world->GetConfig().DEMES_MAX_AGE.Get() >= m_total_slots);
+  
+  int flow_level_increment = (m_total_events_per_slot_max - m_total_events_per_slot_min) / (m_tolal_event_flow_levels-1);
+  int slot_length = m_world->GetConfig().DEMES_MAX_AGE.Get() / m_total_slots;
+
+  // setup stats tuples
+
+  for(int i = 0; i < m_total_slots; i++) {
+    int slot_flow_level = flow_level_increment * m_world->GetRandom().GetInt(m_tolal_event_flow_levels) + m_total_events_per_slot_min; // number of event during this slot
+    int slot_delay = i * slot_length;
+    cell_events.Resize(cell_events.GetSize() + slot_flow_level);
+    int cell_events_size = cell_events.GetSize();
+    event_slot_end_points.push_back(make_pair(slot_delay+slot_length, slot_flow_level)); // last slot is never reached it is == to MAX_AGE
+
+    for(int k = 0; k < slot_flow_level; k++) {
+      cDemeCellEvent demeEvent = cDemeCellEvent(x1, y1, x2, y2, delay, duration, width, GetHeight(), static_position, m_world);
+      demeEvent.ConfineToTimeSlot(slot_delay, slot_delay+slot_length);
+      cell_events[cell_events_size-k-1] = demeEvent;
+    }
+  }
+  
+  // setup stats.flow_rate_tuples
+  cStats& stats = m_world->GetStats();
+  for(int i = m_total_events_per_slot_min; i <= m_total_events_per_slot_max; i+=flow_level_increment) {
+    (stats.FlowRateTuple())[i].first.Clear();
+    (stats.FlowRateTuple())[i].second.Clear();
+  }
+}
+
 void cDeme::KillCellEvent(const int eventID) {
   for(int i = 0; i < cell_events.GetSize(); i++) {
     cDemeCellEvent& event = cell_events[i];

Modified: branches/jobScheduling/source/main/cDeme.h
===================================================================
--- branches/jobScheduling/source/main/cDeme.h	2008-04-01 20:58:47 UTC (rev 2513)
+++ branches/jobScheduling/source/main/cDeme.h	2008-04-03 04:56:49 UTC (rev 2514)
@@ -24,6 +24,8 @@
 #ifndef cDeme_h
 #define cDeme_h
 
+#include <vector>
+
 #include "cDemeCellEvent.h"
 #include "cGermline.h"
 #include "cMerit.h"
@@ -70,6 +72,7 @@
   tArray<int> energy_res_ids; //!< IDs of energy resources
   
   tArray<cDemeCellEvent> cell_events;
+  std::vector<std::pair<int, int> > event_slot_end_points; // (slot end point, slot flow rate)
   
   int         m_germline_genotype_id; // Genotype id of germline (if in use)
   tArray<int> m_founder_genotype_ids; // List of genotype ids used to found deme.
@@ -154,6 +157,10 @@
   int GetRelativeCellID(int absolute_cell_id) { return absolute_cell_id % GetSize(); } //!< assumes all demes are the same size
 
   void SetCellEvent(int x1, int y1, int x2, int y2, int delay, int duration, bool static_position, int total_events);
+  void SetCellEventSlots(int x1, int y1, int x2, int y2, int delay, int duration, 
+                         bool static_position, int m_total_slots, int m_total_events_per_slot_max, 
+                         int m_total_events_per_slot_min, int m_tolal_event_flow_levels);
+
   void KillCellEvent(const int eventID);
   
   double CalculateTotalEnergy();

Modified: branches/jobScheduling/source/main/cDemeCellEvent.cc
===================================================================
--- branches/jobScheduling/source/main/cDemeCellEvent.cc	2008-04-01 20:58:47 UTC (rev 2513)
+++ branches/jobScheduling/source/main/cDemeCellEvent.cc	2008-04-03 04:56:49 UTC (rev 2514)
@@ -65,3 +65,11 @@
 void cDemeCellEvent::DeactivateEvent() {
   m_active = false;
 }
+
+// should be called before organisms in deme are running
+void cDemeCellEvent::ConfineToTimeSlot(int min_delay, int max_delay) {
+  assert(!m_active);
+  assert(max_delay > min_delay);
+  
+  m_delay = (m_delay % (max_delay - min_delay)) + min_delay;
+}
\ No newline at end of file

Modified: branches/jobScheduling/source/main/cDemeCellEvent.h
===================================================================
--- branches/jobScheduling/source/main/cDemeCellEvent.h	2008-04-01 20:58:47 UTC (rev 2513)
+++ branches/jobScheduling/source/main/cDemeCellEvent.h	2008-04-03 04:56:49 UTC (rev 2514)
@@ -23,5 +23,7 @@
 
   void ActivateEvent();
   void DeactivateEvent();
+  
+  void ConfineToTimeSlot(int min_delay, int max_delay);
 };
 #endif

Modified: branches/jobScheduling/source/main/cOrgInterface.h
===================================================================
--- branches/jobScheduling/source/main/cOrgInterface.h	2008-04-01 20:58:47 UTC (rev 2513)
+++ branches/jobScheduling/source/main/cOrgInterface.h	2008-04-03 04:56:49 UTC (rev 2514)
@@ -90,7 +90,7 @@
   virtual bool TestOnDivide() = 0;
   virtual bool SendMessage(cOrgMessage& msg) = 0;
 
-  virtual bool BcastAlarm() = 0;
+  virtual bool BcastAlarm(int jump_jabel) = 0;
   
 };
 

Modified: branches/jobScheduling/source/main/cOrganism.cc
===================================================================
--- branches/jobScheduling/source/main/cOrganism.cc	2008-04-01 20:58:47 UTC (rev 2513)
+++ branches/jobScheduling/source/main/cOrganism.cc	2008-04-03 04:56:49 UTC (rev 2514)
@@ -668,11 +668,11 @@
 }
 
 
-bool cOrganism::BcastAlarmMSG(cAvidaContext& ctx) {
+bool cOrganism::BcastAlarmMSG(cAvidaContext& ctx, int jump_label) {
   assert(m_interface);
   
   // If we're able to succesfully send an alarm...
-  if(m_interface->BcastAlarm()) {
+  if(m_interface->BcastAlarm(jump_label)) {
     // check to see if we've performed any tasks...
     DoOutput(ctx);
     return true;
@@ -680,7 +680,7 @@
   return false;
 }
 
-void cOrganism::moveIPtoAlarmLabel() {
+void cOrganism::moveIPtoAlarmLabel(int jump_label) {
   // move IP to alarm_label
-  m_hardware->Jump_To_Alarm_Label();
+  m_hardware->Jump_To_Alarm_Label(jump_label);
 }

Modified: branches/jobScheduling/source/main/cOrganism.h
===================================================================
--- branches/jobScheduling/source/main/cOrganism.h	2008-04-01 20:58:47 UTC (rev 2513)
+++ branches/jobScheduling/source/main/cOrganism.h	2008-04-03 04:56:49 UTC (rev 2514)
@@ -355,8 +355,8 @@
   
   /***** context switch********/
 public: 
-  bool BcastAlarmMSG(cAvidaContext& ctx);
-  void moveIPtoAlarmLabel();
+  bool BcastAlarmMSG(cAvidaContext& ctx, int jump_label);
+  void moveIPtoAlarmLabel(int jump_label);
   
 };
 

Modified: branches/jobScheduling/source/main/cPopulationInterface.cc
===================================================================
--- branches/jobScheduling/source/main/cPopulationInterface.cc	2008-04-01 20:58:47 UTC (rev 2513)
+++ branches/jobScheduling/source/main/cPopulationInterface.cc	2008-04-03 04:56:49 UTC (rev 2514)
@@ -266,7 +266,7 @@
 }
 
 
-bool cPopulationInterface::BcastAlarm() {
+bool cPopulationInterface::BcastAlarm(int jump_label) {
   cPopulationCell& cell = m_world->GetPopulation().GetCell(m_cell_id);
   assert(cell.IsOccupied()); // This organism; sanity.
   
@@ -279,7 +279,7 @@
       continue;
     cOrganism* recvr = rcell->GetOrganism();
     assert(recvr != NULL);
-    recvr->moveIPtoAlarmLabel();
+    recvr->moveIPtoAlarmLabel(jump_label);
   }
   return true;
 }

Modified: branches/jobScheduling/source/main/cPopulationInterface.h
===================================================================
--- branches/jobScheduling/source/main/cPopulationInterface.h	2008-04-01 20:58:47 UTC (rev 2513)
+++ branches/jobScheduling/source/main/cPopulationInterface.h	2008-04-03 04:56:49 UTC (rev 2514)
@@ -92,7 +92,7 @@
   bool TestOnDivide();
   //! Send a message to the faced organism.
   bool SendMessage(cOrgMessage& msg);
-  bool BcastAlarm();
+  bool BcastAlarm(int jump_label);
 };
 
 

Modified: branches/jobScheduling/source/main/cStats.cc
===================================================================
--- branches/jobScheduling/source/main/cStats.cc	2008-04-01 20:58:47 UTC (rev 2513)
+++ branches/jobScheduling/source/main/cStats.cc	2008-04-03 04:56:49 UTC (rev 2514)
@@ -44,6 +44,7 @@
 
 #include <cfloat>
 #include <cmath>
+#include <sstream>
 
 
 cStats::cStats(cWorld* world)
@@ -589,6 +590,35 @@
   df.Endl();
 }
 
+void cStats::PrintFlowRateTuples(const cString& filename) {
+  cDataFile& df = m_world->GetDataFile(filename);
+
+  df.WriteComment("Flow Rate Tuples");
+  df.WriteTimeStamp();
+
+  df.Write(m_update,                                        "Update");
+  // write each tuple
+  for(map<int, pair<cIntSum, cIntSum> >::iterator iter = flow_rate_tuple.begin(); iter != flow_rate_tuple.end(); iter++) {
+    ostringstream oss;
+    oss << "flow rate " << (*iter).first;
+    string flow_rate_str(oss.str());
+    string flow_rate_pop_size_str(flow_rate_str+" deme pop size");
+    string flow_rate_events_killed_str(flow_rate_str+" events killed");
+    
+    df.Write((*iter).first, flow_rate_str.c_str());
+    df.Write((*iter).second.first.Average(), flow_rate_pop_size_str.c_str());
+    df.Write((*iter).second.second.Average(), flow_rate_events_killed_str.c_str());
+    
+  }
+  df.Endl();
+
+  // reset all tuples
+  for(map<int, pair<cIntSum, cIntSum> >::iterator iter = flow_rate_tuple.begin(); iter != flow_rate_tuple.end(); iter++) {
+    (*iter).second.first.Clear();
+    (*iter).second.second.Clear();
+  }
+}
+
 void cStats::PrintErrorData(const cString& filename)
 {
   cDataFile& df = m_world->GetDataFile(filename);

Modified: branches/jobScheduling/source/main/cStats.h
===================================================================
--- branches/jobScheduling/source/main/cStats.h	2008-04-01 20:58:47 UTC (rev 2513)
+++ branches/jobScheduling/source/main/cStats.h	2008-04-03 04:56:49 UTC (rev 2514)
@@ -275,6 +275,9 @@
   cDoubleSum sum_deme_normalized_time_used;
   cDoubleSum sum_deme_merit;
   cIntSum sum_deme_events_killed;
+  
+  //(event flow rate, (deme pop size, events killed))
+  std::map<int, std::pair<cIntSum, cIntSum> > flow_rate_tuple;
 
   // Speculative Execution Stats
   int m_spec_total;
@@ -420,6 +423,8 @@
   cDoubleSum& SumDemeNormalizedTimeUsed()   { return sum_deme_normalized_time_used; }
   cDoubleSum& SumDemeMerit()   { return sum_deme_merit; }
   cIntSum& SumDemeEventsKilled()          { return sum_deme_events_killed; }
+  
+  std::map<int, std::pair<cIntSum, cIntSum> >&  FlowRateTuple() { return flow_rate_tuple; }
 
 #if INSTRUCTION_COUNT
   void ZeroInst();
@@ -461,6 +466,7 @@
   const cDoubleSum& SumDemeNormalizedTimeUsed() const  { return sum_deme_normalized_time_used; }
   const cDoubleSum& SumDemeMerit()  const  { return sum_deme_merit; }
   const cIntSum& SumDemeEventsKilled() const          { return sum_deme_events_killed; }
+  const std::map<int, std::pair<cIntSum, cIntSum> >&  FlowRateTuple() const { return flow_rate_tuple; }
 
 
   void IncResamplings() { ++num_resamplings; }  // @AWC 06/29/06
@@ -654,6 +660,7 @@
   // Public calls to output data files (for events)
   void PrintAverageData(const cString& filename);
   void PrintDemeAverageData(const cString& filename);
+  void PrintFlowRateTuples(const cString& filename);
   void PrintErrorData(const cString& filename);
   void PrintVarianceData(const cString& filename);
   void PrintDominantData(const cString& filename);




More information about the Avida-cvs mailing list