[Avida-SVN] r3138 - in development/source: cpu main

connel42 at myxo.css.msu.edu connel42 at myxo.css.msu.edu
Fri Jan 30 08:01:07 PST 2009


Author: connel42
Date: 2009-01-30 11:01:06 -0500 (Fri, 30 Jan 2009)
New Revision: 3138

Modified:
   development/source/cpu/cHardwareCPU.cc
   development/source/cpu/cHardwareCPU.h
   development/source/main/cDeme.cc
   development/source/main/cDeme.h
   development/source/main/cPhenotype.cc
   development/source/main/cPhenotype.h
   development/source/main/cPopulation.cc
Log:
Updated energy sharing instructions and logging

Modified: development/source/cpu/cHardwareCPU.cc
===================================================================
--- development/source/cpu/cHardwareCPU.cc	2009-01-28 20:33:34 UTC (rev 3137)
+++ development/source/cpu/cHardwareCPU.cc	2009-01-30 16:01:06 UTC (rev 3138)
@@ -228,6 +228,13 @@
     tInstLibEntry<tMethod>("donate-energy", &cHardwareCPU::Inst_DonateEnergy, nInstFlag::STALL),
     tInstLibEntry<tMethod>("update-metabolic-rate", &cHardwareCPU::Inst_UpdateMetabolicRate, nInstFlag::STALL),
     tInstLibEntry<tMethod>("donate-energy-faced", &cHardwareCPU::Inst_DonateEnergyFaced, nInstFlag::STALL),
+    tInstLibEntry<tMethod>("donate-energy-faced1", &cHardwareCPU::Inst_DonateEnergyFaced1, nInstFlag::STALL),
+    tInstLibEntry<tMethod>("donate-energy-faced2", &cHardwareCPU::Inst_DonateEnergyFaced2, nInstFlag::STALL),
+    tInstLibEntry<tMethod>("donate-energy-faced5", &cHardwareCPU::Inst_DonateEnergyFaced5, nInstFlag::STALL),
+    tInstLibEntry<tMethod>("donate-energy-faced10", &cHardwareCPU::Inst_DonateEnergyFaced10, nInstFlag::STALL),
+    tInstLibEntry<tMethod>("donate-energy-faced20", &cHardwareCPU::Inst_DonateEnergyFaced20, nInstFlag::STALL),
+    tInstLibEntry<tMethod>("donate-energy-faced50", &cHardwareCPU::Inst_DonateEnergyFaced50, nInstFlag::STALL),
+    tInstLibEntry<tMethod>("donate-energy-faced100", &cHardwareCPU::Inst_DonateEnergyFaced100, nInstFlag::STALL),    
     tInstLibEntry<tMethod>("rotate-to-most-needy", &cHardwareCPU::Inst_RotateToMostNeedy, nInstFlag::STALL),
     tInstLibEntry<tMethod>("request-energy", &cHardwareCPU::Inst_RequestEnergy, nInstFlag::STALL),
     tInstLibEntry<tMethod>("request-energy-on", &cHardwareCPU::Inst_RequestEnergyFlagOn, nInstFlag::STALL),
@@ -406,6 +413,8 @@
   	tInstLibEntry<tMethod>("if-faced-energy-more", &cHardwareCPU::Inst_IfFacedEnergyMore, nInstFlag::STALL),	    
 	  tInstLibEntry<tMethod>("if-energy-in-buffer", &cHardwareCPU::Inst_IfEnergyInBuffer, nInstFlag::STALL),
 	  tInstLibEntry<tMethod>("if-energy-not-in-buffer", &cHardwareCPU::Inst_IfEnergyNotInBuffer, nInstFlag::STALL),
+    tInstLibEntry<tMethod>("get-energy-level", &cHardwareCPU::Inst_GetEnergyLevel, nInstFlag::STALL),
+    tInstLibEntry<tMethod>("get-faced-energy-level", &cHardwareCPU::Inst_GetFacedEnergyLevel, nInstFlag::STALL),
 	  
     // Sleep and time
     tInstLibEntry<tMethod>("sleep", &cHardwareCPU::Inst_Sleep, nInstFlag::STALL),
@@ -3541,49 +3550,63 @@
 }
 
 
+void cHardwareCPU::DoEnergyDonatePercent(cOrganism* to_org, const double frac_energy_given)
+{  
+  assert(to_org != NULL);
+  assert(frac_energy_given >= 0);
+  assert(frac_energy_given <= 1);
+
+  DoEnergyDonateAmount(to_org, m_organism->GetPhenotype().GetStoredEnergy() * frac_energy_given);
+  
+} //End DoEnergyDonatePercent()
+
+
 // The difference between this version and the previous is that this one allows energy to be placed
 // into the recipient's incoming energy buffer and not be applied immediately.  Also, some of the
 // energy may be lost in transfer
-void cHardwareCPU::DoEnergyDonatePercent(cOrganism* to_org, const double frac_energy_given)
+void cHardwareCPU::DoEnergyDonateAmount(cOrganism* to_org, const double amount)
 {
   double losspct = m_world->GetConfig().ENERGY_SHARING_LOSS.Get();
   
   assert(to_org != NULL);
-  assert(frac_energy_given >= 0);
-  assert(frac_energy_given <= 1);
+  assert(amount >= 0);
   assert(losspct >= 0);
   assert(losspct <= 1);
-    
-  double cur_energy = m_organism->GetPhenotype().GetStoredEnergy();
+  
   const int update_metabolic = m_world->GetConfig().ENERGY_SHARING_UPDATE_METABOLIC.Get();
-  double energy_given = cur_energy * frac_energy_given;
+  double energy_given = min(m_organism->GetPhenotype().GetStoredEnergy(), amount);
   
   //update energy store and merit of donor
   m_organism->GetPhenotype().ReduceEnergy(energy_given);
+  m_organism->GetPhenotype().SetIsEnergyDonor();
   m_organism->GetPhenotype().IncreaseEnergyDonated(energy_given);
-	
+  m_organism->GetPhenotype().IncreaseNumEnergyDonations();
+  
+  m_organism->GetDeme()->IncreaseEnergyDonated(energy_given);
+  
   if(update_metabolic == 1) {
     double senderMerit = cMerit::EnergyToMerit(m_organism->GetPhenotype().GetStoredEnergy()  * m_organism->GetPhenotype().GetEnergyUsageRatio(), m_world);
     m_organism->UpdateMerit(senderMerit);
   }
-	  
+  
   //apply loss in transfer
   energy_given *= (1 - losspct);
   
   //place energy into receiver's incoming energy buffer
   to_org->GetPhenotype().ReceiveDonatedEnergy(energy_given);
+  to_org->GetDeme()->IncreaseEnergyReceived(energy_given);   // Harder for phenotype to get the deme, so it's done here
   
   //if we are using the push energy method, pass the new energy into the receiver's energy store and recalculate merit
   if(m_world->GetConfig().ENERGY_SHARING_METHOD.Get() == 1) {
     to_org->GetPhenotype().ApplyDonatedEnergy();
 	  
 	  if(update_metabolic == 1) {
-        double receiverMerit = cMerit::EnergyToMerit(to_org->GetPhenotype().GetStoredEnergy() * to_org->GetPhenotype().GetEnergyUsageRatio(), m_world);
-        to_org->UpdateMerit(receiverMerit);
+      double receiverMerit = cMerit::EnergyToMerit(to_org->GetPhenotype().GetStoredEnergy() * to_org->GetPhenotype().GetEnergyUsageRatio(), m_world);
+      to_org->UpdateMerit(receiverMerit);
 	  }
   }
   
-} //End DoEnergyDonatePercent()
+} //End DoEnergyDonateAmount()
 
 
 bool cHardwareCPU::Inst_DonateFacing(cAvidaContext& ctx) {
@@ -4087,7 +4110,6 @@
   
   if(m_organism->GetPhenotype().GetEnergyInBufferAmount() > 0) {
     m_organism->GetPhenotype().ApplyDonatedEnergy();
-    m_organism->GetPhenotype().SetHasUsedDonatedEnergy();
 	 
 	  if(m_world->GetConfig().ENERGY_SHARING_UPDATE_METABOLIC.Get() == 1) {
         double receiverMerit = cMerit::EnergyToMerit(m_organism->GetPhenotype().GetStoredEnergy() * m_organism->GetPhenotype().GetEnergyUsageRatio(), m_world);
@@ -4130,8 +4152,6 @@
   }
   
   DoEnergyDonatePercent(energyReceiver, m_organism->GetFracEnergyDonating());
-  m_organism->GetPhenotype().IncDonates();
-  m_organism->GetPhenotype().SetIsEnergyDonor();
   
   return true;
   
@@ -4163,8 +4183,6 @@
     if ( (neighbor->GetPhenotype().HasOpenEnergyRequest()) || (m_world->GetConfig().ENERGY_SHARING_METHOD.Get() == 1) )
     {
       DoEnergyDonatePercent(neighbor, m_organism->GetFracEnergyDonating());
-      m_organism->GetPhenotype().IncDonates();
-      m_organism->GetPhenotype().SetIsEnergyDonor();
     }
   }  
   
@@ -4173,6 +4191,160 @@
 } //End Inst_DonateEnergyFaced()
 
 
+bool cHardwareCPU::Inst_DonateEnergyFaced1(cAvidaContext& ctx)
+{
+  if(m_organism->GetCellID() < 0) {
+    return false;
+  }	
+  
+  cOrganism * neighbor = m_organism->GetNeighbor();
+  
+  if ( (neighbor != NULL) && (!neighbor->IsDead()) ) {
+    
+    // If the neighbor has requested energy or if we're allowing push sharing, share energy
+    if ( (neighbor->GetPhenotype().HasOpenEnergyRequest()) || (m_world->GetConfig().ENERGY_SHARING_METHOD.Get() == 1) )
+    {
+      DoEnergyDonateAmount(neighbor, 1);
+    }
+  }  
+  
+  return true;
+  
+} //End Inst_DonateEnergyFaced1()
+
+
+bool cHardwareCPU::Inst_DonateEnergyFaced2(cAvidaContext& ctx)
+{
+  if(m_organism->GetCellID() < 0) {
+    return false;
+  }	
+  
+  cOrganism * neighbor = m_organism->GetNeighbor();
+  
+  if ( (neighbor != NULL) && (!neighbor->IsDead()) ) {
+    
+    // If the neighbor has requested energy or if we're allowing push sharing, share energy
+    if ( (neighbor->GetPhenotype().HasOpenEnergyRequest()) || (m_world->GetConfig().ENERGY_SHARING_METHOD.Get() == 1) )
+    {
+      DoEnergyDonateAmount(neighbor, 2);
+    }
+  }  
+  
+  return true;
+  
+} //End Inst_DonateEnergyFaced2()
+
+
+bool cHardwareCPU::Inst_DonateEnergyFaced5(cAvidaContext& ctx)
+{
+  if(m_organism->GetCellID() < 0) {
+    return false;
+  }	
+  
+  cOrganism * neighbor = m_organism->GetNeighbor();
+  
+  if ( (neighbor != NULL) && (!neighbor->IsDead()) ) {
+    
+    // If the neighbor has requested energy or if we're allowing push sharing, share energy
+    if ( (neighbor->GetPhenotype().HasOpenEnergyRequest()) || (m_world->GetConfig().ENERGY_SHARING_METHOD.Get() == 1) )
+    {
+      DoEnergyDonateAmount(neighbor, 5);
+    }
+  }  
+  
+  return true;
+  
+} //End Inst_DonateEnergyFaced5()
+
+
+bool cHardwareCPU::Inst_DonateEnergyFaced10(cAvidaContext& ctx)
+{
+  if(m_organism->GetCellID() < 0) {
+    return false;
+  }	
+  
+  cOrganism * neighbor = m_organism->GetNeighbor();
+  
+  if ( (neighbor != NULL) && (!neighbor->IsDead()) ) {
+    
+    // If the neighbor has requested energy or if we're allowing push sharing, share energy
+    if ( (neighbor->GetPhenotype().HasOpenEnergyRequest()) || (m_world->GetConfig().ENERGY_SHARING_METHOD.Get() == 1) )
+    {
+      DoEnergyDonateAmount(neighbor, 10);
+    }
+  }  
+  
+  return true;
+  
+} //End Inst_DonateEnergyFaced10()
+
+
+bool cHardwareCPU::Inst_DonateEnergyFaced20(cAvidaContext& ctx)
+{
+  if(m_organism->GetCellID() < 0) {
+    return false;
+  }	
+  
+  cOrganism * neighbor = m_organism->GetNeighbor();
+  
+  if ( (neighbor != NULL) && (!neighbor->IsDead()) ) {
+    
+    // If the neighbor has requested energy or if we're allowing push sharing, share energy
+    if ( (neighbor->GetPhenotype().HasOpenEnergyRequest()) || (m_world->GetConfig().ENERGY_SHARING_METHOD.Get() == 1) )
+    {
+      DoEnergyDonateAmount(neighbor, 20);
+    }
+  }  
+  
+  return true;
+  
+} //End Inst_DonateEnergyFaced20()
+
+
+bool cHardwareCPU::Inst_DonateEnergyFaced50(cAvidaContext& ctx)
+{
+  if(m_organism->GetCellID() < 0) {
+    return false;
+  }	
+  
+  cOrganism * neighbor = m_organism->GetNeighbor();
+  
+  if ( (neighbor != NULL) && (!neighbor->IsDead()) ) {
+    
+    // If the neighbor has requested energy or if we're allowing push sharing, share energy
+    if ( (neighbor->GetPhenotype().HasOpenEnergyRequest()) || (m_world->GetConfig().ENERGY_SHARING_METHOD.Get() == 1) )
+    {
+      DoEnergyDonateAmount(neighbor, 50);
+    }
+  }  
+  
+  return true;
+  
+} //End Inst_DonateEnergyFaced50()
+
+
+bool cHardwareCPU::Inst_DonateEnergyFaced100(cAvidaContext& ctx)
+{
+  if(m_organism->GetCellID() < 0) {
+    return false;
+  }	
+  
+  cOrganism * neighbor = m_organism->GetNeighbor();
+  
+  if ( (neighbor != NULL) && (!neighbor->IsDead()) ) {
+    
+    // If the neighbor has requested energy or if we're allowing push sharing, share energy
+    if ( (neighbor->GetPhenotype().HasOpenEnergyRequest()) || (m_world->GetConfig().ENERGY_SHARING_METHOD.Get() == 1) )
+    {
+      DoEnergyDonateAmount(neighbor, 100);
+    }
+  }  
+  
+  return true;
+  
+} //End Inst_DonateEnergyFaced100()
+
+
 // Rotate to face the most energy needy neighbor
 bool cHardwareCPU::Inst_RotateToMostNeedy(cAvidaContext& ctx)
 {
@@ -4227,6 +4399,7 @@
   
   m_organism->BroadcastMessage(ctx, msg);
   m_organism->GetPhenotype().SetIsEnergyRequestor();
+  m_organism->GetPhenotype().IncreaseNumEnergyRequests();
   
   return true;
   
@@ -4241,7 +4414,9 @@
   }	
   
   m_organism->GetPhenotype().SetIsEnergyRequestor();
+  m_organism->GetPhenotype().IncreaseNumEnergyRequests();
   m_organism->GetPhenotype().SetHasOpenEnergyRequest();
+  
   return true;
 } //End Inst_RequestEnergyFlagOn()
 
@@ -5432,6 +5607,40 @@
 } //End Inst_IfEnergyNotInBuffer()
 
 
+bool cHardwareCPU::Inst_GetEnergyLevel(cAvidaContext& ctx) {
+  
+  if(m_organism->GetCellID() < 0) {
+    return false;
+  }	
+  
+  const int reg = FindModifiedRegister(REG_BX);
+  GetRegister(reg) = (int) floor(m_organism->GetPhenotype().GetStoredEnergy());
+  
+  return true;
+	
+} //End Inst_GetEnergyLevel()
+
+
+bool cHardwareCPU::Inst_GetFacedEnergyLevel(cAvidaContext& ctx) {
+  
+  if(m_organism->GetCellID() < 0) {
+    return false;
+  }	
+  
+  cOrganism * neighbor = m_organism->GetNeighbor();
+  
+  if( (neighbor == NULL) || (neighbor->IsDead()) ) {
+    return false;  
+  }
+    
+  const int reg = FindModifiedRegister(REG_BX);
+  GetRegister(reg) = (int) floor(neighbor->GetPhenotype().GetStoredEnergy());
+  
+  return true;
+	
+} //End Inst_GetFacedEnergyLevel()
+
+
 bool cHardwareCPU::Inst_Sleep(cAvidaContext& ctx) {
   cPopulation& pop = m_world->GetPopulation();
   int cellID = m_organism->GetCellID();

Modified: development/source/cpu/cHardwareCPU.h
===================================================================
--- development/source/cpu/cHardwareCPU.h	2009-01-28 20:33:34 UTC (rev 3137)
+++ development/source/cpu/cHardwareCPU.h	2009-01-30 16:01:06 UTC (rev 3138)
@@ -480,6 +480,7 @@
   void DoDonate(cOrganism * to_org);
   void DoEnergyDonate(cOrganism* to_org);
   void DoEnergyDonatePercent(cOrganism* to_org, const double frac_energy_given);
+  void DoEnergyDonateAmount(cOrganism* to_org, const double amount);
   bool Inst_DonateRandom(cAvidaContext& ctx);
   bool Inst_DonateKin(cAvidaContext& ctx);
   bool Inst_DonateEditDist(cAvidaContext& ctx);
@@ -493,6 +494,13 @@
   bool Inst_DonateEnergy(cAvidaContext& ctx);
   bool Inst_UpdateMetabolicRate(cAvidaContext& ctx);
   bool Inst_DonateEnergyFaced(cAvidaContext& ctx);
+  bool Inst_DonateEnergyFaced1(cAvidaContext& ctx);
+  bool Inst_DonateEnergyFaced2(cAvidaContext& ctx);
+  bool Inst_DonateEnergyFaced5(cAvidaContext& ctx);
+  bool Inst_DonateEnergyFaced10(cAvidaContext& ctx);
+  bool Inst_DonateEnergyFaced20(cAvidaContext& ctx);
+  bool Inst_DonateEnergyFaced50(cAvidaContext& ctx);
+  bool Inst_DonateEnergyFaced100(cAvidaContext& ctx);
   bool Inst_RotateToMostNeedy(cAvidaContext& ctx);
   bool Inst_RequestEnergy(cAvidaContext& ctx);
   bool Inst_RequestEnergyFlagOn(cAvidaContext& ctx);
@@ -620,6 +628,8 @@
   bool Inst_IfFacedEnergyLess(cAvidaContext& ctx);
   bool Inst_IfEnergyInBuffer(cAvidaContext& ctx);
   bool Inst_IfEnergyNotInBuffer(cAvidaContext& ctx);
+  bool Inst_GetEnergyLevel(cAvidaContext& ctx);
+  bool Inst_GetFacedEnergyLevel(cAvidaContext& ctx);
 	
   bool Inst_Sleep(cAvidaContext& ctx);
   bool Inst_GetUpdate(cAvidaContext& ctx);

Modified: development/source/main/cDeme.cc
===================================================================
--- development/source/main/cDeme.cc	2009-01-28 20:33:34 UTC (rev 3137)
+++ development/source/main/cDeme.cc	2009-01-30 16:01:06 UTC (rev 3138)
@@ -76,6 +76,10 @@
   last_org_reaction_count.ResizeClear(num_reactions);
   last_org_reaction_count.SetAll(0);
   
+  total_energy_donated = 0.0;
+  total_energy_received = 0.0;
+  total_energy_applied = 0.0;
+  
   // If width is negative, set it to the full number of cells.
   width = in_width;
   if (width < 1) width = cell_ids.GetSize();
@@ -258,6 +262,10 @@
   consecutiveSuccessfulEventPeriods = 0;
   
 	replicateDeme = false;
+  
+  total_energy_donated = 0.0;
+  total_energy_received = 0.0;
+  total_energy_applied = 0.0;
 	
   cur_task_exe_count.SetAll(0);
   cur_reaction_count.SetAll(0);

Modified: development/source/main/cDeme.h
===================================================================
--- development/source/main/cDeme.h	2009-01-28 20:33:34 UTC (rev 3137)
+++ development/source/main/cDeme.h	2009-01-30 16:01:06 UTC (rev 3138)
@@ -88,6 +88,10 @@
   int sleeping_count; //!< Number of organisms currently sleeping
   cDoubleSum energyUsage;
   
+  double total_energy_donated;
+  double total_energy_received;
+  double total_energy_applied;
+  
   tArray<int> cur_task_exe_count;
   tArray<int> cur_reaction_count;
   tArray<int> last_task_exe_count;
@@ -335,6 +339,14 @@
 	void ClearMigrationOut() { migrations_out = 0; }
 	void ClearMigrationIn() { migrations_in = 0; }
 	void ClearSuicides() { suicides = 0; }
+  
+  // --- Energy Sharing --- //
+  double GetEnergyDonated() const { return total_energy_donated; }
+  double GetEnergyReceived() const { return total_energy_received; }
+  double GetEnergyApplied() const { return total_energy_applied; }
+  void IncreaseEnergyDonated(double amount) { assert(amount >=0); total_energy_donated += amount; }
+  void IncreaseEnergyReceived(double amount) { assert(amount >=0); total_energy_received += amount; }
+  void IncreaseEnergyApplied(double amount) { assert(amount >=0); total_energy_applied += amount; }
 
 	
   void GetSurroundingCellIds(tVector<int> &cells, const int absolute_cell_id, const int radius);

Modified: development/source/main/cPhenotype.cc
===================================================================
--- development/source/main/cPhenotype.cc	2009-01-28 20:33:34 UTC (rev 3137)
+++ development/source/main/cPhenotype.cc	2009-01-30 16:01:06 UTC (rev 3138)
@@ -1390,7 +1390,11 @@
     SetEnergy(energy_store + energy_received_buffer);
   }
   
+  IncreaseNumEnergyApplications();
+  SetHasUsedDonatedEnergy();
+  
   energy_received_buffer = 0.0;
+  
 } //End AppplyDonatedEnergy()
 
 
@@ -1398,7 +1402,8 @@
   assert(donation >= 0.0);  
   energy_received_buffer += donation;
   IncreaseEnergyReceived(donation);
-  is_energy_receiver = true;
+  SetIsEnergyReceiver();
+  IncreaseNumEnergyReceptions();
 } //End ReceiveDonatedEnergy()
 
 

Modified: development/source/main/cPhenotype.h
===================================================================
--- development/source/main/cPhenotype.h	2009-01-28 20:33:34 UTC (rev 3137)
+++ development/source/main/cPhenotype.h	2009-01-30 16:01:06 UTC (rev 3138)
@@ -114,6 +114,10 @@
   double total_energy_donated;                // Tota amount of energy that has been donated
   double total_energy_received;               // Total amount of energy received through donations
   double total_energy_applied;                // Total amount of received energy applied to energy store
+  int num_energy_requests;                    // Number of times organism has requested energy
+  int num_energy_donations;                   // Number of times energy has been donated
+  int num_energy_receptions;                    // Number of times organism has received energy donations
+  int num_energy_applications;                // Number of times organism has applied donated energy to its energy store
   int cur_num_errors;                         // Total instructions executed illeagally.
   int cur_num_donates;                        // Number of donations so far
   tArray<int> cur_task_count;                 // Total times each task was performed
@@ -462,9 +466,16 @@
   void IncreaseEnergyDonated(double amount) { assert(amount >=0); total_energy_donated += amount; }
   void IncreaseEnergyReceived(double amount) { assert(amount >=0); total_energy_received += amount; }
   void IncreaseEnergyApplied(double amount) { assert(amount >=0); total_energy_applied += amount; }
+  void IncreaseNumEnergyRequests() { num_energy_requests++; }
+  void IncreaseNumEnergyDonations() { num_energy_donations++; }
+  void IncreaseNumEnergyApplications() { num_energy_applications++; }
+  void IncreaseNumEnergyReceptions() { num_energy_receptions++; }
   double GetAmountEnergyDonated() { return total_energy_donated; }
   double GetAmountEnergyReceived() { return total_energy_received; }
   double GetAmountEnergyApplied() { return total_energy_applied; }
+  int GetNumEnergyDonations() { return num_energy_donations; }
+  int GetNumEnergyReceptions() { return num_energy_receptions; }
+  int GetNumEnergyApplications() { return num_energy_applications; }
   
   void SetCurRBinsAvail(const tArray<double>& in_avail) { cur_rbins_avail = in_avail; }
   void SetCurRbinsTotal(const tArray<double>& in_total) { cur_rbins_total = in_total; }

Modified: development/source/main/cPopulation.cc
===================================================================
--- development/source/main/cPopulation.cc	2009-01-28 20:33:34 UTC (rev 3137)
+++ development/source/main/cPopulation.cc	2009-01-30 16:01:06 UTC (rev 3138)
@@ -2642,6 +2642,9 @@
   double num_requestors = 0;
   double num_donors = 0;
   double num_receivers = 0;
+  double num_donations = 0;
+  double num_receptions = 0;
+  double num_applications;
   double amount_donated = 0.0;
   double amount_received = 0.0;
   double amount_applied = 0.0;  
@@ -2656,14 +2659,21 @@
       if(phenotype.IsEnergyRequestor()) num_requestors++;
       if(phenotype.IsEnergyDonor()) num_donors++;
       if(phenotype.IsEnergyReceiver()) num_receivers++;
+      num_donations += phenotype.GetNumEnergyDonations();
+      num_receptions += phenotype.GetNumEnergyReceptions();
+      num_applications += phenotype.GetNumEnergyApplications();
       amount_donated += phenotype.GetAmountEnergyDonated();
       amount_received += phenotype.GetAmountEnergyReceived();
       amount_applied += phenotype.GetAmountEnergyApplied();
     }
   }
+  
   df_donor.Write(num_requestors/num_demes, "Average number of organisms that have requested energy");
   df_donor.Write(num_donors/num_demes, "Average number of organisms that have donated energy");
   df_donor.Write(num_receivers/num_demes, "Average number of organisms that have received energy");
+  df_donor.Write(num_donations/num_demes, "Average number of donations per deme");
+  df_donor.Write(num_receptions/num_demes, "Average number of receipts per deme");
+  df_donor.Write(num_applications/num_demes, "Average number of applications per deme");
   df_donor.Write(amount_donated/num_demes, "Average total amount of energy donated per deme");
   df_donor.Write(amount_received/num_demes, "Average total amount of energy received per deme");
   df_donor.Write(amount_applied/num_demes, "Average total amount of donated energy applied per deme");




More information about the Avida-cvs mailing list