[Avida-SVN] r3084 - development/source/main
brysonda at myxo.css.msu.edu
brysonda at myxo.css.msu.edu
Tue Dec 30 14:05:44 PST 2008
Author: brysonda
Date: 2008-12-30 17:05:44 -0500 (Tue, 30 Dec 2008)
New Revision: 3084
Modified:
development/source/main/cPopulation.cc
Log:
Attempt to revert some deme code that was squashed by r3053.
Modified: development/source/main/cPopulation.cc
===================================================================
--- development/source/main/cPopulation.cc 2008-12-30 21:45:17 UTC (rev 3083)
+++ development/source/main/cPopulation.cc 2008-12-30 22:05:44 UTC (rev 3084)
@@ -1407,7 +1407,9 @@
// used to pass energy to offspring demes (set to zero if energy model is not enabled)
double source_deme_energy(0.0), deme_energy_decay(0.0), parent_deme_energy(0.0), offspring_deme_energy(0.0);
if(m_world->GetConfig().ENERGY_ENABLED.Get()) {
- source_deme_energy = source_deme.CalculateTotalEnergy() + source_deme.GetTotalEnergyTestament();
+ double energyRemainingInSourceDeme = source_deme.CalculateTotalEnergy();
+ source_deme.SetEnergyRemainingInDemeAtReplication(energyRemainingInSourceDeme);
+ source_deme_energy = energyRemainingInSourceDeme + source_deme.GetTotalEnergyTestament();
m_world->GetStats().SumEnergyTestamentAcceptedByDeme().Add(source_deme.GetTotalEnergyTestament());
deme_energy_decay = 1.0 - m_world->GetConfig().FRAC_ENERGY_DECAY_AT_DEME_BIRTH.Get();
parent_deme_energy = source_deme_energy * deme_energy_decay * (1.0 - m_world->GetConfig().FRAC_PARENT_ENERGY_GIVEN_TO_DEME_AT_BIRTH.Get());
@@ -1439,7 +1441,7 @@
// Reset both demes, in case they have any cleanup work to do.
// Must reset target first for stats to be correctly updated!
- if(m_world->GetConfig().ENERGY_ENABLED.Get()) {
+ if(m_world->GetConfig().ENERGY_ENABLED.Get() == 1) {
// Transfer energy from source to target if we're using the energy model.
if (target_successfully_seeded) target_deme.DivideReset(source_deme, target_deme_resource_reset, offspring_deme_energy);
source_deme.DivideReset(source_deme, source_deme_resource_reset, parent_deme_energy);
@@ -1543,38 +1545,43 @@
// split energy from parent deme evenly among orgs in child deme
- if(m_world->GetConfig().ENERGY_ENABLED.Get() == 1 && m_world->GetConfig().ENERGY_PASSED_ON_DEME_REPLICATION_METHOD.Get() == 0) {
+ if (m_world->GetConfig().ENERGY_ENABLED.Get() == 1 && m_world->GetConfig().ENERGY_PASSED_ON_DEME_REPLICATION_METHOD.Get() == 0) {
assert(source_deme.GetOrgCount() > 0 && target_deme.GetOrgCount() > 0);
- if(offspring_deme_energy < 0.0)
- offspring_deme_energy = 0.0;
- if(parent_deme_energy < 0.0)
- parent_deme_energy = 0.0;
-
- // split deme energy evenly between organisms in source deme
- for (int i=0; i < source_deme.GetSize(); i++) {
- int cellid = source_deme.GetCellID(i);
- cPopulationCell& cell = m_world->GetPopulation().GetCell(cellid);
- if(cell.IsOccupied()) {
- cOrganism* organism = cell.GetOrganism();
- cPhenotype& phenotype = organism->GetPhenotype();
- phenotype.SetEnergy(phenotype.GetStoredEnergy() + parent_deme_energy/static_cast<double>(source_deme.GetOrgCount()));
- phenotype.SetMerit(cMerit(cMerit::EnergyToMerit(phenotype.GetStoredEnergy() * phenotype.GetEnergyUsageRatio(), m_world)));
- }
- }
-
- // split deme energy evenly between organisms in target deme
- for (int i=0; i < target_deme.GetSize(); i++) {
- int cellid = target_deme.GetCellID(i);
- cPopulationCell& cell = m_world->GetPopulation().GetCell(cellid);
- if(cell.IsOccupied()) {
- cOrganism* organism = cell.GetOrganism();
- cPhenotype& phenotype = organism->GetPhenotype();
- phenotype.SetEnergy(phenotype.GetStoredEnergy() + offspring_deme_energy/static_cast<double>(target_deme.GetOrgCount()));
- phenotype.SetMerit(cMerit(cMerit::EnergyToMerit(phenotype.GetStoredEnergy() * phenotype.GetEnergyUsageRatio(), m_world)));
- }
- }
- }
-
+ if (offspring_deme_energy > 0.0) {
+ // split deme energy evenly between organisms in target deme
+ double totalEnergyInjectedIntoOrganisms(0.0);
+ for (int i=0; i < target_deme.GetSize(); i++) {
+ int cellid = target_deme.GetCellID(i);
+ cPopulationCell& cell = m_world->GetPopulation().GetCell(cellid);
+ if(cell.IsOccupied()) {
+ cOrganism* organism = cell.GetOrganism();
+ cPhenotype& phenotype = organism->GetPhenotype();
+ phenotype.SetEnergy(phenotype.GetStoredEnergy() + offspring_deme_energy/static_cast<double>(target_deme.GetOrgCount()));
+ phenotype.SetMerit(cMerit(cMerit::EnergyToMerit(phenotype.GetStoredEnergy() * phenotype.GetEnergyUsageRatio(), m_world)));
+ totalEnergyInjectedIntoOrganisms += phenotype.GetStoredEnergy();
+ }
+ }
+ target_deme.SetEnergyInjectedIntoOrganisms(totalEnergyInjectedIntoOrganisms);
+ }
+ if (parent_deme_energy > 0.0) {
+ // split deme energy evenly between organisms in source deme
+ double totalEnergyInjectedIntoOrganisms(0.0);
+ for (int i=0; i < source_deme.GetSize(); i++) {
+ int cellid = source_deme.GetCellID(i);
+ cPopulationCell& cell = m_world->GetPopulation().GetCell(cellid);
+ if(cell.IsOccupied()) {
+ cOrganism* organism = cell.GetOrganism();
+ cPhenotype& phenotype = organism->GetPhenotype();
+ phenotype.SetEnergy(phenotype.GetStoredEnergy() + parent_deme_energy/static_cast<double>(source_deme.GetOrgCount()));
+ phenotype.SetMerit(cMerit(cMerit::EnergyToMerit(phenotype.GetStoredEnergy() * phenotype.GetEnergyUsageRatio(), m_world)));
+ totalEnergyInjectedIntoOrganisms += phenotype.GetStoredEnergy();
+ }
+ }
+ source_deme.SetEnergyInjectedIntoOrganisms(totalEnergyInjectedIntoOrganisms);
+ }
+ }
+
+
// The source's merit must be transferred to the target, and then the source has
// to rotate its heritable merit to its current merit.
@@ -3587,7 +3594,11 @@
}
}
- if (cur_org->GetPhenotype().GetToDelete() == true) delete cur_org;
+ double merit = cur_org->GetPhenotype().GetMerit().GetDouble();
+ if (cur_org->GetPhenotype().GetToDelete() == true) {
+ delete cur_org;
+ cur_org = NULL;
+ }
m_world->GetStats().IncExecuted();
resource_count.Update(step_size);
@@ -3598,7 +3609,7 @@
for(int i = 0; i < GetNumDemes(); i++) GetDeme(i).Update(step_size);
cDeme & deme = GetDeme(GetCell(cell_id).GetDemeID());
- deme.IncTimeUsed(cur_org->GetPhenotype().GetMerit().GetDouble());
+ deme.IncTimeUsed(merit);
CheckImplicitDemeRepro(deme);
}
More information about the Avida-cvs
mailing list