[Avida-SVN] r1829 - in branches/energy_dev: Avida.xcodeproj source/cpu source/main source/tools

beckma24 at myxo.css.msu.edu beckma24 at myxo.css.msu.edu
Thu Jul 19 13:11:11 PDT 2007


Author: beckma24
Date: 2007-07-19 16:11:11 -0400 (Thu, 19 Jul 2007)
New Revision: 1829

Modified:
   branches/energy_dev/Avida.xcodeproj/project.pbxproj
   branches/energy_dev/source/cpu/cHardwareCPU.cc
   branches/energy_dev/source/main/cBirthChamber.cc
   branches/energy_dev/source/main/cBirthChamber.h
   branches/energy_dev/source/main/cOrganism.cc
   branches/energy_dev/source/main/cPhenotype.cc
   branches/energy_dev/source/main/cPhenotype.h
   branches/energy_dev/source/tools/cMerit.cc
   branches/energy_dev/source/tools/cMerit.h
Log:
Added cMerit::EnergyToMerit, cPhenotype::ExtractParentEnergy

Modified: branches/energy_dev/Avida.xcodeproj/project.pbxproj
===================================================================
--- branches/energy_dev/Avida.xcodeproj/project.pbxproj	2007-07-19 17:37:45 UTC (rev 1828)
+++ branches/energy_dev/Avida.xcodeproj/project.pbxproj	2007-07-19 20:11:11 UTC (rev 1829)
@@ -209,6 +209,23 @@
 		};
 /* End PBXBuildRule section */
 
+/* Begin PBXBuildStyle section */
+		B512934E0C4FCA11004B0E41 /* Development */ = {
+			isa = PBXBuildStyle;
+			buildSettings = {
+				COPY_PHASE_STRIP = NO;
+			};
+			name = Development;
+		};
+		B512934F0C4FCA11004B0E41 /* Deployment */ = {
+			isa = PBXBuildStyle;
+			buildSettings = {
+				COPY_PHASE_STRIP = YES;
+			};
+			name = Deployment;
+		};
+/* End PBXBuildStyle section */
+
 /* Begin PBXContainerItemProxy section */
 		56F555DA0C3B36FC00E2E929 /* PBXContainerItemProxy */ = {
 			isa = PBXContainerItemProxy;
@@ -1761,6 +1778,12 @@
 		DCC30C4D0762532C008F7A48 /* Project object */ = {
 			isa = PBXProject;
 			buildConfigurationList = 702442D70859E0B00059BD9B /* Build configuration list for PBXProject "Avida" */;
+			buildSettings = {
+			};
+			buildStyles = (
+				B512934E0C4FCA11004B0E41 /* Development */,
+				B512934F0C4FCA11004B0E41 /* Deployment */,
+			);
 			hasScannedForEncodings = 0;
 			mainGroup = DCC30C490762532C008F7A48;
 			productRefGroup = DCC3164E07626CF3008F7A48 /* Products */;

Modified: branches/energy_dev/source/cpu/cHardwareCPU.cc
===================================================================
--- branches/energy_dev/source/cpu/cHardwareCPU.cc	2007-07-19 17:37:45 UTC (rev 1828)
+++ branches/energy_dev/source/cpu/cHardwareCPU.cc	2007-07-19 20:11:11 UTC (rev 1829)
@@ -4121,12 +4121,8 @@
   pop.decNumAsleep();
   if(m_world->GetConfig().APPLY_ENERGY_METHOD.Get() == 2) {
     organism->GetPhenotype().RefreshEnergy();
-    double newMerit = organism->GetPhenotype().ApplyToEnergyStore();
-    if(newMerit != -1) {
-      std::cerr.precision(20);
-      std::cerr<<"[cHardwareCPU::Inst_Sleep] newMerit = "<< newMerit <<std::endl;
-      organism->GetOrgInterface().UpdateMerit(newMerit);
-    }
+    organism->GetPhenotype().ApplyToEnergyStore();
+    double newMerit = cMerit::EnergyToMerit(organism->GetPhenotype().GetStoredEnergy(), m_world);
   }
   return true;
 }

Modified: branches/energy_dev/source/main/cBirthChamber.cc
===================================================================
--- branches/energy_dev/source/main/cBirthChamber.cc	2007-07-19 17:37:45 UTC (rev 1828)
+++ branches/energy_dev/source/main/cBirthChamber.cc	2007-07-19 20:11:11 UTC (rev 1829)
@@ -158,44 +158,16 @@
   merit_array.Resize(1);
   
   if(m_world->GetConfig().ENERGY_ENABLED.Get() == 1) {
-    // energy model config variables
-    double energy_given_at_birth = m_world->GetConfig().ENERGY_GIVEN_AT_BIRTH.Get();
-    double frac_parent_energy_given_at_birth = m_world->GetConfig().FRAC_PARENT_ENERGY_GIVEN_AT_BIRTH.Get();
-    double frac_energy_decay_at_birth = m_world->GetConfig().FRAC_ENERGY_DECAY_AT_BIRTH.Get();
-    int inst_2_exc = m_world->GetConfig().NUM_INST_EXC_BEFORE_0_ENERGY.Get();
     double energy_cap = (double) m_world->GetConfig().ENERGY_CAP.Get();
-  
-    // apply energy if APPLY_ENERGY_METHOD is set to "on divide" (0)
-    if(m_world->GetConfig().APPLY_ENERGY_METHOD.Get() == 0) {
-      parent.GetPhenotype().RefreshEnergy();
-      parent.GetPhenotype().ApplyToEnergyStore();
-    }
-    
-    // decay of energy in parent
-    parent.GetPhenotype().ReduceEnergy(parent.GetPhenotype().GetStoredEnergy() * frac_energy_decay_at_birth);
-
     // calculate energy to be given to child
-    double child_energy = min(parent.GetPhenotype().GetStoredEnergy() * frac_parent_energy_given_at_birth + energy_given_at_birth, energy_cap);
+    double child_energy = parent.GetPhenotype().ExtractParentEnergy();
         
-    // adjust energy in parent
-    parent.GetPhenotype().ReduceEnergy(child_energy - energy_given_at_birth);
-
     // set child energy & merit
     child_array[0]->GetPhenotype().SetEnergy(child_energy);
-    merit_array[0] = 100 * child_energy / (inst_2_exc);
-    
-
-    cMerit parentMerit = cMerit(min(100 * (parent.GetPhenotype().GetStoredEnergy() + energy_given_at_birth)/(inst_2_exc), energy_cap));
-    parent.GetPhenotype().SetMerit(parentMerit);
-
-    if(m_world->GetConfig().ENERGY_VERBOSE.Get()) {
-      cerr<<"child merit: "<<merit_array[0]<<endl<<"child energy: "<< child_energy <<endl
-          <<"parent merit: "<<parent.GetPhenotype().GetMerit()<<endl<<"parent energy: "<< parent.GetPhenotype().GetStoredEnergy() <<endl;
-    }
+    merit_array[0] = cMerit::EnergyToMerit(child_array[0]->GetPhenotype().GetStoredEnergy(), m_world);
   } else {
     merit_array[0] = parent.GetPhenotype().GetMerit();
   }
-  
 
   // Setup the genotype for the child
   cGenotype * child_genotype = parent.GetGenotype();
@@ -584,9 +556,16 @@
   // If we made it this far, RECOMBINATION will happen!
   cCPUMemory genome0 = old_entry->genome;
   cCPUMemory genome1 = child_genome;
-  double merit0 = old_entry->merit.GetDouble();
-  double merit1 = parent_phenotype.GetMerit().GetDouble();
+  double meritOrEnergy0;
+  double meritOrEnergy1;
 
+  if(m_world->GetConfig().ENERGY_ENABLED.Get() == 1) {
+    meritOrEnergy0 = old_entry->energy4Offspring;
+    meritOrEnergy1 = parent_phenotype.ExtractParentEnergy();
+  } else {
+    meritOrEnergy0 = old_entry->merit.GetDouble();
+    meritOrEnergy1 = parent_phenotype.GetMerit().GetDouble();
+  }
 
   // Check the modular recombination settings.  There are three variables:
   //  1: How many modules?  (0 = non-modular)
@@ -599,22 +578,22 @@
 
   // If we are NOT modular...
   if (num_modules == 0) {
-    DoBasicRecombination(ctx, genome0, genome1, merit0, merit1);
+    DoBasicRecombination(ctx, genome0, genome1, meritOrEnergy0, meritOrEnergy1);
   }
 
   // If we ARE modular, and continuous...
   else if (continuous_regions == 1) {
-    DoModularContRecombination(ctx, genome0, genome1, merit0, merit1);
+    DoModularContRecombination(ctx, genome0, genome1, meritOrEnergy0, meritOrEnergy1);
   }
 
   // If we are NOT continuous, but NO shuffling...
   else if (shuffle_regions == 0) {
-    DoModularNonContRecombination(ctx, genome0, genome1, merit0, merit1);
+    DoModularNonContRecombination(ctx, genome0, genome1, meritOrEnergy0, meritOrEnergy1);
   }
 
   // If there IS shuffling (NON-continuous required)
   else {
-    DoModularShuffleRecombination(ctx, genome0, genome1, merit0, merit1);
+    DoModularShuffleRecombination(ctx, genome0, genome1, meritOrEnergy0, meritOrEnergy1);
   }
 
   // Should there be a 2-fold cost to sex?
@@ -629,10 +608,17 @@
     child_array[0] = new cOrganism(m_world, ctx, genome0);
     child_array[1] = new cOrganism(m_world, ctx, genome1);
     
+    if(m_world->GetConfig().ENERGY_ENABLED.Get() == 1) {
+      child_array[0]->GetPhenotype().SetEnergy(meritOrEnergy0);
+      child_array[1]->GetPhenotype().SetEnergy(meritOrEnergy1);
+      meritOrEnergy0 = cMerit::EnergyToMerit(meritOrEnergy0, m_world);
+      meritOrEnergy1 = cMerit::EnergyToMerit(meritOrEnergy1, m_world);
+    }
+    
     merit_array.Resize(2);
-    merit_array[0] = merit0;
-    merit_array[1] = merit1;
-
+    merit_array[0] = meritOrEnergy0;
+    merit_array[1] = meritOrEnergy1;
+    
     // Setup the genotypes for both children...
     SetupGenotypeInfo(child_array[0], parent0_genotype, parent1_genotype);
     SetupGenotypeInfo(child_array[1], parent1_genotype, parent0_genotype);
@@ -644,14 +630,22 @@
 
     if (ctx.GetRandom().GetDouble() < 0.5) {
       child_array[0] = new cOrganism(m_world, ctx, genome0);
-      merit_array[0] = merit0;
+      if(m_world->GetConfig().ENERGY_ENABLED.Get() == 1) {
+        child_array[0]->GetPhenotype().SetEnergy(meritOrEnergy0);
+        meritOrEnergy0 = cMerit::EnergyToMerit(meritOrEnergy0, m_world);
+      }
+      merit_array[0] = meritOrEnergy0;
 
       // Setup the genotype for the child...
       SetupGenotypeInfo(child_array[0], parent0_genotype, parent1_genotype);
     } 
     else {
       child_array[0] = new cOrganism(m_world, ctx, genome1);
-      merit_array[0] = merit1;
+      if(m_world->GetConfig().ENERGY_ENABLED.Get() == 1) {
+        child_array[0]->GetPhenotype().SetEnergy(meritOrEnergy1);
+        meritOrEnergy1 = cMerit::EnergyToMerit(meritOrEnergy1, m_world);
+      }
+      merit_array[0] = meritOrEnergy1;
 
       // Setup the genotype for the child...
       SetupGenotypeInfo(child_array[0], parent1_genotype, parent0_genotype);
@@ -665,4 +659,3 @@
 
   return true;
 }
-

Modified: branches/energy_dev/source/main/cBirthChamber.h
===================================================================
--- branches/energy_dev/source/main/cBirthChamber.h	2007-07-19 17:37:45 UTC (rev 1828)
+++ branches/energy_dev/source/main/cBirthChamber.h	2007-07-19 20:11:11 UTC (rev 1829)
@@ -54,6 +54,7 @@
   class cBirthEntry {
   public:
     cCPUMemory genome;
+    double energy4Offspring;
     cMerit merit;
     cGenotype * parent_genotype;
     int update_in;  // Update entry was created; Set to -1 if entry is empty.

Modified: branches/energy_dev/source/main/cOrganism.cc
===================================================================
--- branches/energy_dev/source/main/cOrganism.cc	2007-07-19 17:37:45 UTC (rev 1828)
+++ branches/energy_dev/source/main/cOrganism.cc	2007-07-19 20:11:11 UTC (rev 1829)
@@ -228,7 +228,8 @@
   
   if(m_world->GetConfig().ENERGY_ENABLED.Get() && m_world->GetConfig().APPLY_ENERGY_METHOD.Get() == 1 && task_completed) {
     m_phenotype.RefreshEnergy();
-    double newMerit = m_phenotype.ApplyToEnergyStore();
+    m_phenotype.ApplyToEnergyStore();
+    double newMerit = cMerit::EnergyToMerit(GetPhenotype().GetStoredEnergy(), m_world);
     if(newMerit != -1) {
       m_interface->UpdateMerit(newMerit);
     }

Modified: branches/energy_dev/source/main/cPhenotype.cc
===================================================================
--- branches/energy_dev/source/main/cPhenotype.cc	2007-07-19 17:37:45 UTC (rev 1828)
+++ branches/energy_dev/source/main/cPhenotype.cc	2007-07-19 20:11:11 UTC (rev 1829)
@@ -1184,15 +1184,23 @@
   }
 }
 
+void cPhenotype::ReduceEnergy(const double cost) {
+  SetEnergy(energy_store - cost);
+}
+
+void cPhenotype::SetEnergy(const double value) {
+  energy_store = max(0.0, min(value, (double) m_world->GetConfig().ENERGY_CAP.Get()));
+}
+
 /**
-Credit organism with energy reward, but only update energy store if APPLY_ENERGY_METHOD = "no task completion" (1)
+Credit organism with energy reward, but only update energy store if APPLY_ENERGY_METHOD = "on task completion" (1)
  */
 void cPhenotype::RefreshEnergy() {
   if(cur_energy_bonus > 0) {
     if(m_world->GetConfig().APPLY_ENERGY_METHOD.Get() == 0 || m_world->GetConfig().APPLY_ENERGY_METHOD.Get() == 2) {
       energy_tobe_applied += cur_energy_bonus;
     } else if(m_world->GetConfig().APPLY_ENERGY_METHOD.Get() == 1) {
-      energy_store += cur_energy_bonus;
+      SetEnergy(energy_store + cur_energy_bonus);  //TODO: use SetEnergy
     } else {
       cerr<< "Unknown APPLY_ENERGY_METHOD value " << m_world->GetConfig().APPLY_ENERGY_METHOD.Get();
       exit(-1);
@@ -1201,10 +1209,9 @@
   }
 }
 
-double cPhenotype::ApplyToEnergyStore() {
-  energy_store += energy_tobe_applied;
+void cPhenotype::ApplyToEnergyStore() {
+  SetEnergy(energy_store + energy_tobe_applied);
   energy_tobe_applied = 0.0;
-  return min(100 * energy_store / (m_world->GetConfig().NUM_INST_EXC_BEFORE_0_ENERGY.Get()), (double) m_world->GetConfig().ENERGY_CAP.Get());
 }
 
 void cPhenotype::DecayAllPromoterRegulation()
@@ -1218,6 +1225,41 @@
   }
 }
 
+double cPhenotype::ExtractParentEnergy() {
+  assert(m_world->GetConfig().ENERGY_ENABLED.Get() > 0);
+  // energy model config variables
+  double energy_given_at_birth = m_world->GetConfig().ENERGY_GIVEN_AT_BIRTH.Get();
+  double frac_parent_energy_given_at_birth = m_world->GetConfig().FRAC_PARENT_ENERGY_GIVEN_AT_BIRTH.Get();
+  double frac_energy_decay_at_birth = m_world->GetConfig().FRAC_ENERGY_DECAY_AT_BIRTH.Get();
+  int inst_2_exc = m_world->GetConfig().NUM_INST_EXC_BEFORE_0_ENERGY.Get();
+  double energy_cap = (double) m_world->GetConfig().ENERGY_CAP.Get();
+  
+  // apply energy if APPLY_ENERGY_METHOD is set to "on divide" (0)
+  if(m_world->GetConfig().APPLY_ENERGY_METHOD.Get() == 0) {
+    RefreshEnergy();
+    ApplyToEnergyStore();
+  }
+  
+  // decay of energy in parent
+  ReduceEnergy(GetStoredEnergy() * frac_energy_decay_at_birth);
+  
+  // calculate energy to be given to child
+  double child_energy = min(GetStoredEnergy() * frac_parent_energy_given_at_birth + energy_given_at_birth, energy_cap);
+  
+  // adjust energy in parent
+  ReduceEnergy(child_energy - energy_given_at_birth);
+    
+  //TODO: add energy_given_at_birth to Stored_energy
+  cMerit parentMerit = cMerit(min(cMerit::EnergyToMerit(GetStoredEnergy() + energy_given_at_birth, m_world), energy_cap));
+  SetMerit(parentMerit);
+  
+/*  if(m_world->GetConfig().ENERGY_VERBOSE.Get()) {
+    cerr<<"child merit: "<<merit_array[0]<<endl<<"child energy: "<< child_energy <<endl
+    <<"parent merit: "<<GetMerit()<<endl<<"parent energy: "<< GetStoredEnergy() <<endl;
+  }*/
+  return child_energy;
+}
+
 void cPhenotype::RegulatePromoter(const int i, const bool up )
 {
   // Make sure we were initialized

Modified: branches/energy_dev/source/main/cPhenotype.h
===================================================================
--- branches/energy_dev/source/main/cPhenotype.h	2007-07-19 17:37:45 UTC (rev 1828)
+++ branches/energy_dev/source/main/cPhenotype.h	2007-07-19 20:11:11 UTC (rev 1829)
@@ -379,8 +379,8 @@
 
   ////////////////////  Accessors -- Modifying  ///////////////////
   void SetMerit(const cMerit& in_merit) { merit = in_merit; }
-  void ReduceEnergy(const double cost) { energy_store -= min(cost, (double) m_world->GetConfig().ENERGY_CAP.Get()); }
-  void SetEnergy(const double value) { energy_store = value; } //min(value, (double) m_world->GetConfig().ENERGY_CAP.Get()); }
+  void ReduceEnergy(const double cost);
+  void SetEnergy(const double value);
   void SetGestationTime(int in_time) { gestation_time = in_time; }
   void SetTimeUsed(int in_time) { time_used = in_time; }
   void SetFault(const cString& in_fault) { fault_desc = in_fault; }
@@ -450,7 +450,8 @@
   bool& IsMultiThread() { assert(initialized == true); return is_multi_thread; }
   
   void RefreshEnergy();
-  double ApplyToEnergyStore();
+  void ApplyToEnergyStore();
+  double ExtractParentEnergy();
 };
 
 

Modified: branches/energy_dev/source/tools/cMerit.cc
===================================================================
--- branches/energy_dev/source/tools/cMerit.cc	2007-07-19 17:37:45 UTC (rev 1828)
+++ branches/energy_dev/source/tools/cMerit.cc	2007-07-19 20:11:11 UTC (rev 1829)
@@ -9,6 +9,7 @@
  */
 
 #include "cMerit.h"
+#include "cWorld.h"
 
 using namespace std;
 
@@ -71,8 +72,12 @@
            test_value >= value / (1 + 1 / UINT_MAX)));
 }
 
+double cMerit::EnergyToMerit(const double orgEnergy, cWorld* m_world) {
+  assert(m_world->GetConfig().ENERGY_ENABLED.Get() == 1);
+  int inst_2_exc = m_world->GetConfig().NUM_INST_EXC_BEFORE_0_ENERGY.Get();
+  return 100 * orgEnergy / (inst_2_exc);
+}
 
-
 ostream& operator<<(ostream& os, const cMerit& merit)
 {
   os << merit.GetDouble();

Modified: branches/energy_dev/source/tools/cMerit.h
===================================================================
--- branches/energy_dev/source/tools/cMerit.h	2007-07-19 17:37:45 UTC (rev 1828)
+++ branches/energy_dev/source/tools/cMerit.h	2007-07-19 20:11:11 UTC (rev 1829)
@@ -31,6 +31,8 @@
 #include <climits>
 #include <cassert>
 
+class cWorld;
+
 class cMerit
 {
 protected:
@@ -94,6 +96,8 @@
   double CalcFitness(int gestation_time) const {
     return ( gestation_time != 0 ) ? value / ((double) gestation_time) : 0; }
 
+  static double EnergyToMerit(const double orgEnergy, cWorld* m_world);
+
   std::ostream& BinaryPrint(std::ostream& os = std::cout) const ;
 };
 




More information about the Avida-cvs mailing list