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

connel42 at myxo.css.msu.edu connel42 at myxo.css.msu.edu
Thu Nov 20 12:24:09 PST 2008


Author: connel42
Date: 2008-11-20 15:24:09 -0500 (Thu, 20 Nov 2008)
New Revision: 2956

Modified:
   development/source/cpu/cHardwareCPU.cc
   development/source/cpu/cHardwareCPU.h
   development/source/main/cAvidaConfig.h
   development/source/main/cPhenotype.cc
   development/source/main/cPhenotype.h
Log:
Added neighbor-based energy sharing

Modified: development/source/cpu/cHardwareCPU.cc
===================================================================
--- development/source/cpu/cHardwareCPU.cc	2008-11-20 17:52:32 UTC (rev 2955)
+++ development/source/cpu/cHardwareCPU.cc	2008-11-20 20:24:09 UTC (rev 2956)
@@ -225,8 +225,11 @@
     tInstLibEntry<tMethod>("donate-facing", &cHardwareCPU::Inst_DonateFacing),
     tInstLibEntry<tMethod>("receive-donated-energy", &cHardwareCPU::Inst_ReceiveDonatedEnergy, nInstFlag::STALL),
     tInstLibEntry<tMethod>("donate-energy", &cHardwareCPU::Inst_DonateEnergy, nInstFlag::STALL),
+    tInstLibEntry<tMethod>("donate-energy-faced", &cHardwareCPU::Inst_DonateEnergyFaced, 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),
+    tInstLibEntry<tMethod>("request-energy-off", &cHardwareCPU::Inst_RequestEnergyFlagOff, nInstFlag::STALL),
     tInstLibEntry<tMethod>("IObuf-add1", &cHardwareCPU::Inst_IOBufAdd1, nInstFlag::STALL),
     tInstLibEntry<tMethod>("IObuf-add0", &cHardwareCPU::Inst_IOBufAdd0, nInstFlag::STALL),
 
@@ -375,9 +378,14 @@
     // Energy level detection
 	  tInstLibEntry<tMethod>("if-energy-low", &cHardwareCPU::Inst_IfEnergyLow, nInstFlag::STALL),
 	  tInstLibEntry<tMethod>("if-energy-not-low", &cHardwareCPU::Inst_IfEnergyNotLow, nInstFlag::STALL),
+	  tInstLibEntry<tMethod>("if-faced-energy-low", &cHardwareCPU::Inst_IfFacedEnergyLow, nInstFlag::STALL),
+	  tInstLibEntry<tMethod>("if-faced-energy-not-low", &cHardwareCPU::Inst_IfFacedEnergyNotLow, nInstFlag::STALL),
   	tInstLibEntry<tMethod>("if-energy-high", &cHardwareCPU::Inst_IfEnergyHigh, nInstFlag::STALL),
   	tInstLibEntry<tMethod>("if-energy-not-high", &cHardwareCPU::Inst_IfEnergyNotHigh, nInstFlag::STALL),
-  	tInstLibEntry<tMethod>("if-energy-med", &cHardwareCPU::Inst_IfEnergyMed, nInstFlag::STALL),	  
+  	tInstLibEntry<tMethod>("if-faced-energy-high", &cHardwareCPU::Inst_IfFacedEnergyHigh, nInstFlag::STALL),
+  	tInstLibEntry<tMethod>("if-faced-energy-not-high", &cHardwareCPU::Inst_IfFacedEnergyNotHigh, nInstFlag::STALL),
+  	tInstLibEntry<tMethod>("if-energy-med", &cHardwareCPU::Inst_IfEnergyMed, nInstFlag::STALL),	 
+  	tInstLibEntry<tMethod>("if-faced-energy-med", &cHardwareCPU::Inst_IfFacedEnergyMed, 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),
 	  
@@ -4112,14 +4120,82 @@
   
   DoEnergyDonatePercent(receiver, m_world->GetConfig().ENERGY_SHARING_PCT.Get());
   organism->GetPhenotype().IncDonates();
-  GetOrganism()->GetOrgInterface().GetDeme()->IncEnergyDonationsMade();
-  GetOrganism()->GetPhenotype().SetIsEnergyDonor();
+  organism->GetOrgInterface().GetDeme()->IncEnergyDonationsMade();
+  organism->GetPhenotype().SetIsEnergyDonor();
   
   return true;
   
 } //End Inst_DonateEnergy()
 
 
+//Donate a fraction of organism's energy to faced organism.
+bool cHardwareCPU::Inst_DonateEnergyFaced(cAvidaContext& ctx)
+{
+  if(organism->GetCellID() < 0) {
+    return false;
+  }	
+
+  cOrganism * neighbor = 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_PCT.Get() == 1) )
+    {
+      DoEnergyDonatePercent(neighbor, m_world->GetConfig().ENERGY_SHARING_PCT.Get());
+      organism->GetPhenotype().IncDonates();
+      organism->GetOrgInterface().GetDeme()->IncEnergyDonationsMade();
+      organism->GetPhenotype().SetIsEnergyDonor();
+    }
+  }  
+  
+  return true;
+  
+} //End Inst_DonateEnergyFaced()
+
+
+// Rotate to face the most energy needy neighbor
+bool cHardwareCPU::Inst_RotateToMostNeedy(cAvidaContext& ctx)
+{
+  if(organism->GetCellID() < 0) {
+    return false;
+  }	
+  
+  cPopulation& pop = m_world->GetPopulation();
+  cPopulationCell& mycell = pop.GetCell(organism->GetCellID());
+  
+  double min_energy = m_world->GetConfig().ENERGY_CAP.Get();
+  int num_rotations = 0;
+  cOrganism *neighbor;
+  double neighbor_energy;
+
+  // Look at the energy levels of neighbors
+  for(int i = 0; i < mycell.ConnectionList().GetSize(); i++) {
+    mycell.ConnectionList().CircNext();
+    neighbor = organism->GetNeighbor();
+        
+    // If this neighbor is alive and has a request for energy or we're allowing pushing of energy, look at it
+    if ( (neighbor != NULL) && (!neighbor->IsDead()) &&
+         ((neighbor->GetPhenotype().HasOpenEnergyRequest()) || (m_world->GetConfig().ENERGY_SHARING_METHOD.Get() == 1)) ) {
+      neighbor_energy = neighbor->GetPhenotype().GetStoredEnergy();
+      
+      if( (neighbor_energy > 0) && (neighbor_energy < min_energy) ) {
+        num_rotations = i;
+      }
+    }
+    
+  }
+    
+  //Rotate to face the most needy neighbor
+  for(int i = 0; i < num_rotations; i++) {
+    mycell.ConnectionList().CircNext();
+  }
+  
+  return true;
+  
+} //End Inst_RotateToMostNeedy()
+
+
 //Broadcast a request for energy
 bool cHardwareCPU::Inst_RequestEnergy(cAvidaContext& ctx)
 {
@@ -4133,14 +4209,40 @@
   // Could set the data field of the message to be the multiplier
   
   organism->BroadcastMessage(ctx, msg);
-  GetOrganism()->GetOrgInterface().GetDeme()->IncEnergyRequestsMade();
-  GetOrganism()->GetPhenotype().SetIsEnergyRequestor();
+  organism->GetOrgInterface().GetDeme()->IncEnergyRequestsMade();
+  organism->GetPhenotype().SetIsEnergyRequestor();
   
   return true;
   
 } //End Inst_RequestEnergy()
 
 
+//Set the request energy flag
+bool cHardwareCPU::Inst_RequestEnergyFlagOn(cAvidaContext& ctx)
+{
+  if(organism->GetCellID() < 0) {
+    return false;
+  }	
+  
+  organism->GetOrgInterface().GetDeme()->IncEnergyRequestsMade();
+  organism->GetPhenotype().SetIsEnergyRequestor();
+  organism->GetPhenotype().SetHasOpenEnergyRequest();
+  return true;
+} //End Inst_RequestEnergyFlagOn()
+
+
+//Set the request energy flag to off
+bool cHardwareCPU::Inst_RequestEnergyFlagOff(cAvidaContext& ctx)
+{
+  if(organism->GetCellID() < 0) {
+    return false;
+  }	
+  
+  organism->GetPhenotype().ClearHasOpenEnergyRequest();
+  return true;
+} //End Inst_RequestEnergyFlagOff()
+
+
 bool cHardwareCPU::Inst_SearchF(cAvidaContext& ctx)
 {
   ReadLabel();
@@ -4941,6 +5043,50 @@
 } //End Inst_IfEnergyNotLow()
 
 
+/* Execute the next instruction if the faced organism's energy level is low */
+bool cHardwareCPU::Inst_IfFacedEnergyLow(cAvidaContext& ctx) {
+  
+  if(organism->GetCellID() < 0) {
+    return false;
+  }	
+	
+  // Get faced neighbor
+  cOrganism * neighbor = organism->GetNeighbor();
+  
+  if ( (neighbor != NULL) && (!neighbor->IsDead()) ){
+    // Note: these instructions should probably also make sure the returned energy level is not -1.
+    if(neighbor->GetPhenotype().GetDiscreteEnergyLevel() != cPhenotype::ENERGY_LEVEL_LOW) {
+      IP().Advance();
+    }    
+  }  
+	
+  return true;
+	
+} //End Inst_IfFacedEnergyLow()
+
+
+/* Execute the next instruction if the faced organism's energy level is low */
+bool cHardwareCPU::Inst_IfFacedEnergyNotLow(cAvidaContext& ctx) {
+  
+  if(organism->GetCellID() < 0) {
+    return false;
+  }	
+	
+  // Get faced neighbor
+  cOrganism * neighbor = organism->GetNeighbor();
+  
+  if ( (neighbor != NULL) && (!neighbor->IsDead()) ) {
+    // Note: these instructions should probably also make sure the returned energy level is not -1.
+    if(neighbor->GetPhenotype().GetDiscreteEnergyLevel() == cPhenotype::ENERGY_LEVEL_LOW) {
+      IP().Advance();
+    }    
+  }  
+	
+  return true;
+	
+} //End Inst_IfFacedEnergyNotLow()
+
+
 /* Execute the next instruction if the organism's energy level is high */
 bool cHardwareCPU::Inst_IfEnergyHigh(cAvidaContext& ctx) {
 	
@@ -4973,6 +5119,50 @@
 } //End Inst_IfEnergyNotHigh()
 
 
+/* Execute the next instruction if the faced organism's energy level is high */
+bool cHardwareCPU::Inst_IfFacedEnergyHigh(cAvidaContext& ctx) {
+  
+  if(organism->GetCellID() < 0) {
+    return false;
+  }	
+	
+  // Get faced neighbor
+  cOrganism * neighbor = organism->GetNeighbor();
+  
+  if ( (neighbor != NULL) && (!neighbor->IsDead()) ) {
+    // Note: these instructions should probably also make sure the returned energy level is not -1.
+    if(neighbor->GetPhenotype().GetDiscreteEnergyLevel() != cPhenotype::ENERGY_LEVEL_HIGH) {
+      IP().Advance();
+    }    
+  }  
+	
+  return true;
+	
+} //End Inst_IfFacedEnergyHigh()
+
+
+/* Execute the next instruction if the faced organism's energy level is not high */
+bool cHardwareCPU::Inst_IfFacedEnergyNotHigh(cAvidaContext& ctx) {
+  
+  if(organism->GetCellID() < 0) {
+    return false;
+  }	
+	
+  // Get faced neighbor
+  cOrganism * neighbor = organism->GetNeighbor();
+  
+  if ( (neighbor != NULL) && (!neighbor->IsDead()) ) {
+    // Note: these instructions should probably also make sure the returned energy level is not -1.
+    if(neighbor->GetPhenotype().GetDiscreteEnergyLevel() == cPhenotype::ENERGY_LEVEL_HIGH) {
+      IP().Advance();
+    }    
+  }  
+	
+  return true;
+	
+} //End Inst_IfFacedEnergyNotHigh()
+
+
 /* Execute the next instruction if the organism's energy level is medium */
 bool cHardwareCPU::Inst_IfEnergyMed(cAvidaContext& ctx) {
 
@@ -4989,6 +5179,28 @@
 } //End Inst_IfEnergyMed()
 
 
+/* Execute the next instruction if the faced organism's energy level is medium */
+bool cHardwareCPU::Inst_IfFacedEnergyMed(cAvidaContext& ctx) {
+  
+  if(organism->GetCellID() < 0) {
+    return false;
+  }	
+	
+  // Get faced neighbor
+  cOrganism * neighbor = organism->GetNeighbor();
+  
+  if ( (neighbor != NULL) && (!neighbor->IsDead()) ) {
+    // Note: these instructions should probably also make sure the returned energy level is not -1.
+    if(neighbor->GetPhenotype().GetDiscreteEnergyLevel() != cPhenotype::ENERGY_LEVEL_MEDIUM) {
+      IP().Advance();
+    }    
+  }  
+	
+  return true;
+	
+} //End Inst_IfFacedEnergyMed()
+
+
 /* Execute the next instruction if the organism has received energy */
 bool cHardwareCPU::Inst_IfEnergyInBuffer(cAvidaContext& ctx) {
   

Modified: development/source/cpu/cHardwareCPU.h
===================================================================
--- development/source/cpu/cHardwareCPU.h	2008-11-20 17:52:32 UTC (rev 2955)
+++ development/source/cpu/cHardwareCPU.h	2008-11-20 20:24:09 UTC (rev 2956)
@@ -485,9 +485,12 @@
   bool Inst_DonateFacing(cAvidaContext& ctx);
   bool Inst_ReceiveDonatedEnergy(cAvidaContext& ctx);
   bool Inst_DonateEnergy(cAvidaContext& ctx);
+  bool Inst_DonateEnergyFaced(cAvidaContext& ctx);
+  bool Inst_RotateToMostNeedy(cAvidaContext& ctx);
   bool Inst_RequestEnergy(cAvidaContext& ctx);
+  bool Inst_RequestEnergyFlagOn(cAvidaContext& ctx);
+  bool Inst_RequestEnergyFlagOff(cAvidaContext& ctx);
 
-
   bool Inst_SearchF(cAvidaContext& ctx);
   bool Inst_SearchB(cAvidaContext& ctx);
   bool Inst_MemSize(cAvidaContext& ctx);
@@ -590,9 +593,14 @@
 
   bool Inst_IfEnergyLow(cAvidaContext& ctx);
   bool Inst_IfEnergyNotLow(cAvidaContext& ctx);
+  bool Inst_IfFacedEnergyLow(cAvidaContext& ctx);
+  bool Inst_IfFacedEnergyNotLow(cAvidaContext& ctx);
   bool Inst_IfEnergyHigh(cAvidaContext& ctx);
   bool Inst_IfEnergyNotHigh(cAvidaContext& ctx);
+  bool Inst_IfFacedEnergyHigh(cAvidaContext& ctx);
+  bool Inst_IfFacedEnergyNotHigh(cAvidaContext& ctx);
   bool Inst_IfEnergyMed(cAvidaContext& ctx);
+  bool Inst_IfFacedEnergyMed(cAvidaContext& ctx);
   bool Inst_IfEnergyInBuffer(cAvidaContext& ctx);
   bool Inst_IfEnergyNotInBuffer(cAvidaContext& ctx);
 	

Modified: development/source/main/cAvidaConfig.h
===================================================================
--- development/source/main/cAvidaConfig.h	2008-11-20 17:52:32 UTC (rev 2955)
+++ development/source/main/cAvidaConfig.h	2008-11-20 20:24:09 UTC (rev 2956)
@@ -509,7 +509,7 @@
   CONFIG_ADD_VAR(ENERGY_THRESH_HIGH, double, .75, "Threshold percent above which energy level is considered high.  Requires ENERGY_CAP.");
   
   CONFIG_ADD_GROUP(ENERGY_SHARING_GROUP, "Energy Sharing Settings");
-  CONFIG_ADD_VAR(ENERGY_SHARING_METHOD, int, 0, "Method for sharing energy.  0=receiver must actively receive, 1=energy pushed on receiver");
+  CONFIG_ADD_VAR(ENERGY_SHARING_METHOD, int, 0, "Method for sharing energy.  0=receiver must actively receive/request, 1=energy pushed on receiver");
   CONFIG_ADD_VAR(ENERGY_SHARING_PCT, double, 0.0, "Percent of energy to share");
   CONFIG_ADD_VAR(ENERGY_SHARING_LOSS, double, 0.0, "Percent of shared energy lost in transfer");
   

Modified: development/source/main/cPhenotype.cc
===================================================================
--- development/source/main/cPhenotype.cc	2008-11-20 17:52:32 UTC (rev 2955)
+++ development/source/main/cPhenotype.cc	2008-11-20 20:24:09 UTC (rev 2956)
@@ -227,6 +227,7 @@
   is_energy_donor         = in_phen.is_energy_donor;
   is_energy_receiver      = in_phen.is_energy_receiver;
   has_used_donated_energy = in_phen.has_used_donated_energy;
+  has_open_energy_request = in_phen.has_open_energy_request;
   total_energy_donated    = in_phen.total_energy_donated;
   total_energy_received   = in_phen.total_energy_received;
   total_energy_applied    = in_phen.total_energy_applied;
@@ -424,6 +425,7 @@
   is_energy_donor = false;
   is_energy_receiver = false;
   has_used_donated_energy = false;
+  has_open_energy_request = false;
   total_energy_donated = 0.0;
   total_energy_received = 0.0; 
   total_energy_applied = 0.0;
@@ -579,6 +581,7 @@
   is_energy_donor = false;
   is_energy_receiver = false;
   has_used_donated_energy = false;
+  has_open_energy_request = false;
   total_energy_donated = 0.0;
   total_energy_received = 0.0;
   total_energy_applied = 0.0;
@@ -1039,6 +1042,7 @@
   is_energy_donor = false;
   is_energy_receiver = false;
   has_used_donated_energy = false;
+  has_open_energy_request = false;
 
   // Setup child info...
   copy_true          = false;

Modified: development/source/main/cPhenotype.h
===================================================================
--- development/source/main/cPhenotype.h	2008-11-20 17:52:32 UTC (rev 2955)
+++ development/source/main/cPhenotype.h	2008-11-20 20:24:09 UTC (rev 2956)
@@ -196,6 +196,7 @@
   bool is_energy_donor; // Has this organism donated energy?
   bool is_energy_receiver;  // Has this organism received an energy donation?
   bool has_used_donated_energy; // Has the organism actively used an energy donation?
+  bool has_open_energy_request; // Does the organism have an energy request that hasn't been answered?
   int num_thresh_gb_donations;  // Num times this organism threshgb_donated (thresh green beard)? 
   int num_thresh_gb_donations_last; // Num times this org's parent thresh_donated? 
   int num_quanta_thresh_gb_donations;  // Num times this organism threshgb_donated (thresh green beard)? 
@@ -394,6 +395,7 @@
   bool IsEnergyDonor() const { assert(initialized == true); return is_energy_donor; }
   bool IsEnergyReceiver() const { assert(initialized == true); return is_energy_receiver; }
   bool HasUsedEnergyDonation() const { assert(initialized == true); return has_used_donated_energy; }
+  bool HasOpenEnergyRequest() const { assert(initialized == true); return has_open_energy_request; }
   bool IsReceiver() const { assert(initialized == true); return is_receiver; }
   bool IsReceiverLast() const { assert(initialized == true); return is_receiver_last; }
   bool IsReceiverRand() const { assert(initialized == true); return is_receiver_rand; }
@@ -481,6 +483,8 @@
   void SetIsEnergyDonor() { is_energy_donor = true; }
   void SetIsEnergyReceiver() { is_energy_receiver = true; }
   void SetHasUsedDonatedEnergy() {has_used_donated_energy = true; }
+  void SetHasOpenEnergyRequest() { has_open_energy_request = true; }
+  void ClearHasOpenEnergyRequest() { has_open_energy_request = false; }
   
   void SetCurBonus(double _bonus) { cur_bonus = _bonus; }
   void SetCurBonusInstCount(int _num_bonus_inst) {bonus_instruction_count = _num_bonus_inst;}




More information about the Avida-cvs mailing list