[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