[Avida-cvs] [avida-svn] r701 - development/source/main

ofria@myxo.css.msu.edu ofria at myxo.css.msu.edu
Mon May 22 19:04:55 PDT 2006


Author: ofria
Date: 2006-05-22 22:04:55 -0400 (Mon, 22 May 2006)
New Revision: 701

Modified:
   development/source/main/cBirthChamber.cc
   development/source/main/cBirthChamber.h
Log:
Setup birth chamber to keep track of the update an entry was placed into it. 
If the entry is empty, this update is set to -1.


Modified: development/source/main/cBirthChamber.cc
===================================================================
--- development/source/main/cBirthChamber.cc	2006-05-22 21:30:12 UTC (rev 700)
+++ development/source/main/cBirthChamber.cc	2006-05-23 02:04:55 UTC (rev 701)
@@ -20,6 +20,7 @@
 #include "cOrganism.h"
 #include "cTools.h"
 #include "cWorld.h"
+#include "cStats.h"
 
 cBirthChamber::cBirthChamber(cWorld* world) : m_world(world)
 {
@@ -27,13 +28,6 @@
   const int num_demes = m_world->GetConfig().NUM_DEMES.Get(); 
   local_wait_entry.Resize(num_orgs);
   deme_wait_entry.Resize(num_demes);
-  for (int i = 0; i < num_orgs; i++) {
-    local_wait_entry[i].is_waiting = false;
-  }
-  for (int i = 0; i < num_demes; i++) {
-    deme_wait_entry[i].is_waiting = false;
-  }
-  global_wait_entry.is_waiting = false;
 }
 
 bool cBirthChamber::GetNeighborWaiting(const int & parent_id, int world_x, int world_y)
@@ -41,7 +35,7 @@
   for (int i=-1; i<=1; i++) {
     for (int j=-1; j<=1; j++) { 
       const int neighbor_id = GridNeighbor(parent_id, world_x, world_y, i, j);
-      if (local_wait_entry[neighbor_id].is_waiting == true) {
+      if (local_wait_entry[neighbor_id].update_in >= 0) {
         return true;
       }
     }
@@ -58,7 +52,7 @@
     int i = test_neighbor / 3 - 1; 
     int j = test_neighbor % 3 - 1;
     int test_loc = GridNeighbor(parent_id,world_x, world_y, i, j); 		
-    if (local_wait_entry[test_loc].is_waiting == true) {
+    if (local_wait_entry[test_loc].update_in >= 0) {
       return test_loc;
     }
   }
@@ -174,19 +168,16 @@
   if (size_wait_entry.GetSize() <= child_length) {
     int old_wait_size = size_wait_entry.GetSize();
     size_wait_entry.Resize(child_length + 1);
-    for (int i = old_wait_size; i <= child_length; i++) {
-      size_wait_entry[i].is_waiting = false;
-    }
   }
 
   // Determine if we have an offspring of this length waiting already...
-  if (size_wait_entry[child_length].is_waiting == false) {
+  if (size_wait_entry[child_length].update_in == -1) {
     cGenotype * parent_genotype = parent.GetGenotype();
     parent_genotype->IncDeferAdjust();
     size_wait_entry[child_length].genome = child_genome;
     size_wait_entry[child_length].merit = parent.GetPhenotype().GetMerit();
     size_wait_entry[child_length].parent_genotype = parent_genotype;
-    size_wait_entry[child_length].is_waiting = true;
+    size_wait_entry[child_length].update_in = m_world->GetStats().GetUpdate();
     return NULL; 				
   }
 
@@ -202,19 +193,16 @@
   if (mate_select_wait_entry.GetSize() <= mate_id) {
     int old_wait_size = mate_select_wait_entry.GetSize();
     mate_select_wait_entry.Resize(mate_id + 1);
-    for (int i = old_wait_size; i <= mate_id; i++) {
-      mate_select_wait_entry[i].is_waiting = false;
-    }
   }
 
   // Determine if we have an offspring of this length waiting already...
-  if (mate_select_wait_entry[mate_id].is_waiting == false) {
+  if (mate_select_wait_entry[mate_id].update_in == -1) {
     cGenotype * parent_genotype = parent.GetGenotype();
     parent_genotype->IncDeferAdjust();
     mate_select_wait_entry[mate_id].genome = child_genome;
     mate_select_wait_entry[mate_id].merit = parent.GetPhenotype().GetMerit();
     mate_select_wait_entry[mate_id].parent_genotype = parent_genotype;
-    mate_select_wait_entry[mate_id].is_waiting = true;
+    mate_select_wait_entry[mate_id].update_in = m_world->GetStats().GetUpdate();
     return NULL;
   }
 
@@ -237,7 +225,7 @@
     local_wait_entry[parent_id].genome = child_genome;
     local_wait_entry[parent_id].merit = parent.GetPhenotype().GetMerit();
     local_wait_entry[parent_id].parent_genotype = parent_genotype;
-    local_wait_entry[parent_id].is_waiting = true;
+    local_wait_entry[parent_id].update_in = m_world->GetStats().GetUpdate();
     return NULL; 				
   }
 
@@ -257,13 +245,13 @@
   const int parent_deme = (int) parent_id/(world_y*world_x/num_demes);
 
   // If nothing is waiting, store child locally.
-  if (deme_wait_entry[parent_deme].is_waiting == false) { 
+  if (deme_wait_entry[parent_deme].update_in == -1) { 
     cGenotype * parent_genotype = parent.GetGenotype();
     parent_genotype->IncDeferAdjust();
     deme_wait_entry[parent_deme].genome = child_genome;
     deme_wait_entry[parent_deme].merit = parent.GetPhenotype().GetMerit();
     deme_wait_entry[parent_deme].parent_genotype = parent_genotype;
-    deme_wait_entry[parent_deme].is_waiting = true;
+    deme_wait_entry[parent_deme].update_in = m_world->GetStats().GetUpdate();
     return NULL; 				
   }
 
@@ -275,13 +263,13 @@
 cBirthChamber::cBirthEntry* cBirthChamber::FindSexGlobalWaiting(const cGenome& child_genome, cOrganism& parent)
 {
   // If no other child is waiting, store this one.
-  if (global_wait_entry.is_waiting == false){
+  if (global_wait_entry.update_in == -1){
     cGenotype * parent_genotype = parent.GetGenotype();
     parent_genotype->IncDeferAdjust();
     global_wait_entry.genome = child_genome; 
     global_wait_entry.merit = parent.GetPhenotype().GetMerit();
     global_wait_entry.parent_genotype = parent_genotype;
-    global_wait_entry.is_waiting = true;
+    global_wait_entry.update_in = m_world->GetStats().GetUpdate();
     return NULL;
   }
 
@@ -500,7 +488,7 @@
   }
 
   // We have now found a waiting entry.  Mark it no longer waiting and use it.
-  old_entry->is_waiting = false;
+  old_entry->update_in = -1;
 
   // If we are NOT recombining, handle that here.
   if (parent_phenotype.CrossNum() == 0 || 

Modified: development/source/main/cBirthChamber.h
===================================================================
--- development/source/main/cBirthChamber.h	2006-05-22 21:30:12 UTC (rev 700)
+++ development/source/main/cBirthChamber.h	2006-05-23 02:04:55 UTC (rev 701)
@@ -41,7 +41,9 @@
     cCPUMemory genome;
     cMerit merit;
     cGenotype * parent_genotype;
-    bool is_waiting;
+    int update_in;  // Update entry was created; Set to -1 if entry is empty.
+
+    cBirthEntry() : parent_genotype(NULL), update_in(-1) { ; }
   };
   
   cWorld* m_world;




More information about the Avida-cvs mailing list