[Avida-SVN] r3371 - branches/goings/source/main
goingssh at myxo.css.msu.edu
goingssh at myxo.css.msu.edu
Wed Aug 19 18:31:58 PDT 2009
Author: goingssh
Date: 2009-08-19 21:31:58 -0400 (Wed, 19 Aug 2009)
New Revision: 3371
Modified:
branches/goings/source/main/cPopulation.cc
branches/goings/source/main/cPopulation.h
Log:
changed so if child org is identical to parent doesn't recalculate all edit distances, since that calculation takes forever...
Modified: branches/goings/source/main/cPopulation.cc
===================================================================
--- branches/goings/source/main/cPopulation.cc 2009-08-20 00:03:29 UTC (rev 3370)
+++ branches/goings/source/main/cPopulation.cc 2009-08-20 01:31:58 UTC (rev 3371)
@@ -431,9 +431,11 @@
// Place all of the offspring...
- for (int i = 0; i < child_array.GetSize(); i++) {
- ActivateOrganism(ctx, child_array[i], GetCell(target_cells[i]));
-
+ for (int i = 0; i < child_array.GetSize(); i++)
+ {
+ int parent_cell = (child_array[i]->GetGenotype() == parent_genotype) ? parent_id : -1;
+ ActivateOrganism(ctx, child_array[i], GetCell(target_cells[i]), parent_cell);
+
//@JEB - we may want to pass along some state information from parent to child
if ( (m_world->GetConfig().EPIGENETIC_METHOD.Get() == EPIGENETIC_METHOD_OFFSPRING)
|| (m_world->GetConfig().EPIGENETIC_METHOD.Get() == EPIGENETIC_METHOD_BOTH) ) {
@@ -491,7 +493,7 @@
return true;
}
-void cPopulation::ActivateOrganism(cAvidaContext& ctx, cOrganism* in_organism, cPopulationCell& target_cell)
+void cPopulation::ActivateOrganism(cAvidaContext& ctx, cOrganism* in_organism, cPopulationCell& target_cell, int par_cell)
{
assert(in_organism != NULL);
assert(in_organism->GetGenome().GetSize() >= 1);
@@ -565,7 +567,7 @@
double niche_val = 1;
if (m_world->GetConfig().NICHE_RADIUS.Get() > 0)
{
- UpdateHDists(target_cell.GetID(), in_genotype);
+ UpdateHDists(target_cell.GetID(), par_cell, in_genotype);
niche_val = GetNicheVal(target_cell.GetID());
}
in_organism->GetPhenotype().SetMeritNicheVal(niche_val);
@@ -931,13 +933,18 @@
// maintain grid of hamming distances between each org in population and each other org
// cell_id is cell we're about to place a new org, gen is its genotype
-void cPopulation::UpdateHDists(int cell_id, cGenotype* gen)
+void cPopulation::UpdateHDists(int cell_id, int par_id, cGenotype* gen)
{
for (int i=0; i<cell_array.GetSize(); i++)
{
int dist = m_world->GetConfig().NICHE_RADIUS.Get();
if (cell_array[i].GetOrganism())
- dist = cGenomeUtil::FindEditDistance(cell_array[i].GetOrganism()->GetGenome(), gen->GetGenome());
+ {
+ if (par_id==-1)
+ dist = cGenomeUtil::FindEditDistance(cell_array[i].GetOrganism()->GetGenome(), gen->GetGenome());
+ else
+ dist = hdists[i][par_id];
+ }
hdists[i][cell_id] = dist;
hdists[cell_id][i] = dist;
}
Modified: branches/goings/source/main/cPopulation.h
===================================================================
--- branches/goings/source/main/cPopulation.h 2009-08-20 00:03:29 UTC (rev 3370)
+++ branches/goings/source/main/cPopulation.h 2009-08-20 01:31:58 UTC (rev 3371)
@@ -147,7 +147,7 @@
void CCladeSetupOrganism(cOrganism* organism);
// Must be called to activate *any* organism in the population.
- void ActivateOrganism(cAvidaContext& ctx, cOrganism* in_organism, cPopulationCell& target_cell);
+ void ActivateOrganism(cAvidaContext& ctx, cOrganism* in_organism, cPopulationCell& target_cell, int parent_cell=-1);
inline void AdjustSchedule(const cPopulationCell& cell, const cMerit& merit);
@@ -183,7 +183,7 @@
void AddSellValue(const int data, const int label, const int sell_price, const int org_id, const int cell_id);
int BuyValue(const int label, const int buy_price, const int cell_id);
void SwapCells(cPopulationCell & cell1, cPopulationCell & cell2);
- void UpdateHDists(int cell_id, cGenotype* gen);
+ void UpdateHDists(int cell_id, int parent_id, cGenotype* gen);
double GetNicheVal(int cell_id);
// Deme-related methods
More information about the Avida-cvs
mailing list