[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