[Avida-SVN] r1334 - in branches/dkdev: Avida.xcodeproj source/main

dknoester at myxo.css.msu.edu dknoester at myxo.css.msu.edu
Mon Feb 19 10:48:40 PST 2007


Author: dknoester
Date: 2007-02-19 13:48:39 -0500 (Mon, 19 Feb 2007)
New Revision: 1334

Added:
   branches/dkdev/source/main/cDeme.cc
   branches/dkdev/source/main/cDeme.h
Modified:
   branches/dkdev/Avida.xcodeproj/project.pbxproj
   branches/dkdev/source/main/CMakeLists.txt
   branches/dkdev/source/main/SConscript
   branches/dkdev/source/main/cPopulation.cc
   branches/dkdev/source/main/cPopulation.h
   branches/dkdev/source/main/cPopulationCell.cc
   branches/dkdev/source/main/cPopulationCell.h
Log:
Merge: r1048:1049 from avida/development; addition of cDeme object.

Modified: branches/dkdev/Avida.xcodeproj/project.pbxproj
===================================================================
--- branches/dkdev/Avida.xcodeproj/project.pbxproj	2007-02-19 18:04:35 UTC (rev 1333)
+++ branches/dkdev/Avida.xcodeproj/project.pbxproj	2007-02-19 18:48:39 UTC (rev 1334)
@@ -245,6 +245,8 @@
 		70F7DE6D09296616009E311D /* cSpeciesControl.cc in Sources */ = {isa = PBXBuildFile; fileRef = 70F7DE6A09296613009E311D /* cSpeciesControl.cc */; };
 		70F7DE7409296794009E311D /* cGenotype_BirthData.cc in Sources */ = {isa = PBXBuildFile; fileRef = 70F7DE700929678E009E311D /* cGenotype_BirthData.cc */; };
 		DCC3166107628531008F7A48 /* avida.cc in Sources */ = {isa = PBXBuildFile; fileRef = DCC3109C0762539E008F7A48 /* avida.cc */; };
+		E03F28DC0B8A2840009966B8 /* cDeme.cc in Sources */ = {isa = PBXBuildFile; fileRef = E03F28DA0B8A2840009966B8 /* cDeme.cc */; };
+		E03F28DD0B8A2840009966B8 /* cDeme.h in CopyFiles */ = {isa = PBXBuildFile; fileRef = E03F28DB0B8A2840009966B8 /* cDeme.h */; };
 		E08178BA0B3DCB9600B474B6 /* cTopology.h in CopyFiles */ = {isa = PBXBuildFile; fileRef = E08178B90B3DCB9600B474B6 /* cTopology.h */; };
 		E626209E0A372C2A00C07685 /* SaveLoadActions.cc in Sources */ = {isa = PBXBuildFile; fileRef = 708051A80A1F65FE00CBB8B6 /* SaveLoadActions.cc */; };
 /* End PBXBuildFile section */
@@ -290,6 +292,7 @@
 				7049F3720A66AD7E00640512 /* default-smt.org in CopyFiles */,
 				7049F3730A66AD7E00640512 /* default-transsmt.org in CopyFiles */,
 				E08178BA0B3DCB9600B474B6 /* cTopology.h in CopyFiles */,
+				E03F28DD0B8A2840009966B8 /* cDeme.h in CopyFiles */,
 			);
 			runOnlyForDeploymentPostprocessing = 0;
 		};
@@ -795,7 +798,9 @@
 		DCC315CF076253A5008F7A48 /* Makefile */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.make; path = Makefile; sourceTree = "<group>"; };
 		DCC315D0076253A5008F7A48 /* task_event_gen.cc */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.cpp.cpp; path = task_event_gen.cc; sourceTree = "<group>"; };
 		DCC315D1076253A5008F7A48 /* task_event_gen.old.cc */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.cpp.cpp; path = task_event_gen.old.cc; sourceTree = "<group>"; };
-		DCC3164D07626CF3008F7A48 /* avida */ = {isa = PBXFileReference; includeInIndex = 0; lastKnownFileType = "compiled.mach-o.executable"; path = avida; sourceTree = BUILT_PRODUCTS_DIR; };
+		DCC3164D07626CF3008F7A48 /* avida */ = {isa = PBXFileReference; explicitFileType = "compiled.mach-o.executable"; includeInIndex = 0; path = avida; sourceTree = BUILT_PRODUCTS_DIR; };
+		E03F28DA0B8A2840009966B8 /* cDeme.cc */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.cpp.cpp; path = cDeme.cc; sourceTree = "<group>"; };
+		E03F28DB0B8A2840009966B8 /* cDeme.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; path = cDeme.h; sourceTree = "<group>"; };
 		E08178B90B3DCB9600B474B6 /* cTopology.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = cTopology.h; sourceTree = "<group>"; };
 /* End PBXFileReference section */
 
@@ -1243,6 +1248,8 @@
 		DCC310040762539D008F7A48 /* main */ = {
 			isa = PBXGroup;
 			children = (
+				E03F28DA0B8A2840009966B8 /* cDeme.cc */,
+				E03F28DB0B8A2840009966B8 /* cDeme.h */,
 				708BF3010AB65DD300A923BF /* cEventList.h */,
 				708BF2FD0AB65DC700A923BF /* cEventList.cc */,
 				703CA36F0A5072B700AB4DB4 /* SConscript */,
@@ -1894,6 +1901,7 @@
 				704ADBF90A6EF3A300666970 /* DriverActions.cc in Sources */,
 				705ABB3C0A8A6B3D00A6A80E /* EnvironmentActions.cc in Sources */,
 				708BF2FE0AB65DC700A923BF /* cEventList.cc in Sources */,
+				E03F28DC0B8A2840009966B8 /* cDeme.cc in Sources */,
 			);
 			runOnlyForDeploymentPostprocessing = 0;
 		};

Modified: branches/dkdev/source/main/CMakeLists.txt
===================================================================
--- branches/dkdev/source/main/CMakeLists.txt	2007-02-19 18:04:35 UTC (rev 1333)
+++ branches/dkdev/source/main/CMakeLists.txt	2007-02-19 18:48:39 UTC (rev 1334)
@@ -4,6 +4,7 @@
   avida.cc
   cAvidaConfig.cc
   cBirthChamber.cc
+  cDeme.cc
   cEnvironment.cc
   cEventList.cc
   cFitnessMatrix.cc

Modified: branches/dkdev/source/main/SConscript
===================================================================
--- branches/dkdev/source/main/SConscript	2007-02-19 18:04:35 UTC (rev 1333)
+++ branches/dkdev/source/main/SConscript	2007-02-19 18:48:39 UTC (rev 1334)
@@ -8,6 +8,7 @@
   'cAvidaConfig.h',
   'cAvidaContext.h',
   'cBirthChamber.h',
+  'cDeme.h',
   'cEnvironment.h',
   'cEventList.h',
   'cFitnessMatrix.h',
@@ -58,6 +59,7 @@
   'avida.cc',
   'cAvidaConfig.cc',
   'cBirthChamber.cc',
+  'cDeme.cc',
   'cEnvironment.cc',
   'cEventList.cc',
   'cFitnessMatrix.cc',

Copied: branches/dkdev/source/main/cDeme.cc (from rev 1049, development/source/main/cDeme.cc)

Copied: branches/dkdev/source/main/cDeme.h (from rev 1049, development/source/main/cDeme.h)

Modified: branches/dkdev/source/main/cPopulation.cc
===================================================================
--- branches/dkdev/source/main/cPopulation.cc	2007-02-19 18:04:35 UTC (rev 1333)
+++ branches/dkdev/source/main/cPopulation.cc	2007-02-19 18:48:39 UTC (rev 1334)
@@ -59,12 +59,13 @@
 , world_x(world->GetConfig().WORLD_X.Get())
 , world_y(world->GetConfig().WORLD_Y.Get())
 , num_organisms(0)
-, num_demes(m_world->GetConfig().NUM_DEMES.Get())
 , sync_events(false)
 {
   const int geometry = world->GetConfig().WORLD_GEOMETRY.Get();
   const int num_cells = world_x * world_y;
   const int birth_method = m_world->GetConfig().BIRTH_METHOD.Get();
+
+  int num_demes = m_world->GetConfig().NUM_DEMES.Get();    
   
   // Error checking for demes vs. non-demes setup.
   if(num_demes > 0) {
@@ -76,14 +77,24 @@
     num_demes = 1; // One population == one deme.
   }
 
-  // Track birth counts...
-  deme_birth_count.Resize(num_demes);
-  deme_birth_count.SetAll(0);
-  
   const int deme_size_x = world_x;
   const int deme_size_y = world_y / num_demes;
-  deme_size = deme_size_x * deme_size_y;
+  const int deme_size = deme_size_x * deme_size_y;
   
+  deme_array.Resize(num_demes);
+  
+  // Setup the deme structures.
+  tArray<int> deme_cells(deme_size);
+  for (int deme_id = 0; deme_id < num_demes; deme_id++) {
+    for (int offset = 0; offset < deme_size; offset++) {
+      int cell_id = deme_id * deme_size + offset;
+      deme_cells[offset] = cell_id;
+      cell_array[cell_id].SetDemeID(deme_id);
+    }
+    deme_array[deme_id].Setup(deme_cells);
+  }
+  
+  
   cell_array.Resize(num_cells);
   resource_count.ResizeSpatialGrids(world_x, world_y);
   market.Resize(MARKET_SIZE);
@@ -539,6 +550,7 @@
 
 void cPopulation::CompeteDemes(int competition_type)
 {
+  const int num_demes = deme_array.GetSize();
   
   double total_fitness = 0; 
   tArray<double> deme_fitness(num_demes); 
@@ -550,116 +562,124 @@
       break; 
     case 1:     // deme fitness = number of births
                 // Determine the scale for fitness by totaling births across demes.
-      for (int cur_deme = 0; cur_deme < num_demes; cur_deme++) {
-        deme_fitness[cur_deme] = (double) deme_birth_count[cur_deme]; 
-        total_fitness += deme_birth_count[cur_deme];
+      for (int deme_id = 0; deme_id < num_demes; deme_id++) {
+	double cur_fitness = (double) deme_array[deme_id].GetBirthCount();
+        deme_fitness[deme_id] = cur_fitness;
+        total_fitness += cur_fitness;
       }
       break; 
     case 2:    // deme fitness = average organism fitness at the current update
-      for (int cur_deme = 0; cur_deme < num_demes; cur_deme++) {
+      for (int deme_id = 0; deme_id < num_demes; deme_id++) {
         cDoubleSum single_deme_fitness;
-        for (int i = 0; i < deme_size; i++) {
-          int cur_cell = cur_deme * deme_size + i;
+	const cDeme & cur_deme = deme_array[deme_id];
+        for (int i = 0; i < cur_deme.GetSize(); i++) {
+          int cur_cell = cur_deme.GetCellID(i);
           if (cell_array[cur_cell].IsOccupied() == false) continue;
-          cPhenotype & phenotype = GetCell(cur_cell).GetOrganism()->GetPhenotype();
+          cPhenotype & phenotype =
+	    GetCell(cur_cell).GetOrganism()->GetPhenotype();
           single_deme_fitness.Add(phenotype.GetFitness());
         } 
-        deme_fitness[cur_deme] = single_deme_fitness.Ave();
-        total_fitness += deme_fitness[cur_deme];
+        deme_fitness[deme_id] = single_deme_fitness.Ave();
+        total_fitness += deme_fitness[deme_id];
       }
       break; 
     case 3: 	// deme fitness = average mutation rate at the current update 
-      for (int cur_deme = 0; cur_deme < num_demes; cur_deme++) {
+      for (int deme_id = 0; deme_id < num_demes; deme_id++) {
         cDoubleSum single_deme_div_type;
-        for (int i = 0; i < deme_size; i++) {
-          int cur_cell = cur_deme * deme_size + i;
+	const cDeme & cur_deme = deme_array[deme_id];
+        for (int i = 0; i < cur_deme.GetSize(); i++) {
+          int cur_cell = cur_deme.GetCellID(i);
           if (cell_array[cur_cell].IsOccupied() == false) continue;
-          cPhenotype & phenotype = GetCell(cur_cell).GetOrganism()->GetPhenotype();
+          cPhenotype & phenotype =
+	    GetCell(cur_cell).GetOrganism()->GetPhenotype();
           assert(phenotype.GetDivType()>0);
           single_deme_div_type.Add(1/phenotype.GetDivType());
         }
-        deme_fitness[cur_deme] = single_deme_div_type.Ave();
-        total_fitness += deme_fitness[cur_deme];
-      } 			 	      	
+        deme_fitness[deme_id] = single_deme_div_type.Ave();
+        total_fitness += deme_fitness[deme_id];
+      }
       break; 
     case 4: 	// deme fitness = 2^(-deme fitness rank) 
               // first find all the deme fitness values ...
     {      
-      for (int cur_deme = 0; cur_deme < num_demes; cur_deme++) {
+      for (int deme_id = 0; deme_id < num_demes; deme_id++) {
         cDoubleSum single_deme_fitness;
-        for (int i = 0; i < deme_size; i++) {
-          int cur_cell = cur_deme * deme_size + i; 
+	const cDeme & cur_deme = deme_array[deme_id];
+        for (int i = 0; i < cur_deme.GetSize(); i++) {
+          int cur_cell = cur_deme.GetCellID(i);
           if (cell_array[cur_cell].IsOccupied() == false) continue;
           cPhenotype & phenotype = GetCell(cur_cell).GetOrganism()->GetPhenotype();
           single_deme_fitness.Add(phenotype.GetFitness());
         }  
-        deme_fitness[cur_deme] = single_deme_fitness.Ave();
+        deme_fitness[deme_id] = single_deme_fitness.Ave();
       }
       // ... then determine the rank of each deme based on its fitness
       tArray<double> deme_rank(num_demes);
       deme_rank.SetAll(1);
-      for (int cur_deme = 0; cur_deme < num_demes; cur_deme++) {
+      for (int deme_id = 0; deme_id < num_demes; deme_id++) {
         for (int test_deme = 0; test_deme < num_demes; test_deme++) {
-          if (deme_fitness[cur_deme] < deme_fitness[test_deme]) {
-            deme_rank[cur_deme]++;
+          if (deme_fitness[deme_id] < deme_fitness[test_deme]) {
+            deme_rank[deme_id]++;
           } 
         } 
       } 
       // ... finally, make deme fitness 2^(-deme rank)
       deme_fitness.SetAll(1);	
-      for (int cur_deme = 0; cur_deme < num_demes; cur_deme++) {
-        for (int i = 0; i < deme_rank[cur_deme]; i++) { 
-          deme_fitness[cur_deme] = deme_fitness[cur_deme]/2;
+      for (int deme_id = 0; deme_id < num_demes; deme_id++) {
+        for (int i = 0; i < deme_rank[deme_id]; i++) { 
+          deme_fitness[deme_id] = deme_fitness[deme_id]/2;
         } 
-        total_fitness += deme_fitness[cur_deme]; 
+        total_fitness += deme_fitness[deme_id]; 
       } 
     }
-      break; 
-    case 5:    // deme fitness = average organism life fitness at the current update
-      for (int cur_deme = 0; cur_deme < num_demes; cur_deme++) {
+    break; 
+  case 5:    // deme fitness = average organism life fitness at the current update
+    for (int deme_id = 0; deme_id < num_demes; deme_id++) {
         cDoubleSum single_deme_life_fitness;
-        for (int i = 0; i < deme_size; i++) {
-          int cur_cell = cur_deme * deme_size + i;
+	const cDeme & cur_deme = deme_array[deme_id];
+        for (int i = 0; i < cur_deme.GetSize(); i++) {
+          int cur_cell = cur_deme.GetCellID(i);
           if (cell_array[cur_cell].IsOccupied() == false) continue;
           cPhenotype & phenotype = GetCell(cur_cell).GetOrganism()->GetPhenotype();
           single_deme_life_fitness.Add(phenotype.GetLifeFitness());
         }
-        deme_fitness[cur_deme] = single_deme_life_fitness.Ave();
-        total_fitness += deme_fitness[cur_deme];
-      }
-      break; 
-    case 6:     // deme fitness = 2^(-deme life fitness rank) (same as 4, but with life fitness)
-                // first find all the deme fitness values ...
+        deme_fitness[deme_id] = single_deme_life_fitness.Ave();
+        total_fitness += deme_fitness[deme_id];
+    }
+    break; 
+  case 6:     // deme fitness = 2^(-deme life fitness rank) (same as 4, but with life fitness)
+    // first find all the deme fitness values ...
     {
-      for (int cur_deme = 0; cur_deme < num_demes; cur_deme++) {
+      for (int deme_id = 0; deme_id < num_demes; deme_id++) {
         cDoubleSum single_deme_life_fitness;
-        for (int i = 0; i < deme_size; i++) {
-          int cur_cell = cur_deme * deme_size + i;
+	const cDeme & cur_deme = deme_array[deme_id];
+        for (int i = 0; i < cur_deme.GetSize(); i++) {
+          int cur_cell = cur_deme.GetCellID(i);
           if (cell_array[cur_cell].IsOccupied() == false) continue;
           cPhenotype & phenotype = GetCell(cur_cell).GetOrganism()->GetPhenotype();
           single_deme_life_fitness.Add(phenotype.GetLifeFitness());
         }
-        deme_fitness[cur_deme] = single_deme_life_fitness.Ave();
+        deme_fitness[deme_id] = single_deme_life_fitness.Ave();
       }
       // ... then determine the rank of each deme based on its fitness
       tArray<double> deme_rank(num_demes);
       deme_rank.SetAll(1);
-      for (int cur_deme = 0; cur_deme < num_demes; cur_deme++) {
+      for (int deme_id = 0; deme_id < num_demes; deme_id++) {
         for (int test_deme = 0; test_deme < num_demes; test_deme++) {
-          if (deme_fitness[cur_deme] < deme_fitness[test_deme]) {
-            deme_rank[cur_deme]++;
+          if (deme_fitness[deme_id] < deme_fitness[test_deme]) {
+            deme_rank[deme_id]++;
           }
         }
       }
       // ... finally, make deme fitness 2^(-deme rank)
       deme_fitness.SetAll(1);
-      for (int cur_deme = 0; cur_deme < num_demes; cur_deme++) {
-        for (int i = 0; i < deme_rank[cur_deme]; i++) {
-          deme_fitness[cur_deme] = deme_fitness[cur_deme]/2;
+      for (int deme_id = 0; deme_id < num_demes; deme_id++) {
+        for (int i = 0; i < deme_rank[deme_id]; i++) {
+          deme_fitness[deme_id] = deme_fitness[deme_id]/2;
         }
-        total_fitness += deme_fitness[cur_deme];
+        total_fitness += deme_fitness[deme_id];
       }
-      break;
+    break;
     }
   } 
   
@@ -690,42 +710,52 @@
   // Copy demes until all deme counts are 1.
   while (true) {
     // Find the next deme to copy...
-    int from_deme, to_deme;
-    for (from_deme = 0; from_deme < num_demes; from_deme++) {
-      if (deme_count[from_deme] > 1) break;
+    int from_deme_id, to_deme_id;
+    for (from_deme_id = 0; from_deme_id < num_demes; from_deme_id++) {
+      if (deme_count[from_deme_id] > 1) break;
     }
-    if (from_deme == num_demes) break; // If we don't find another deme to copy
     
-    for (to_deme = 0; to_deme < num_demes; to_deme++) {
-      if (deme_count[to_deme] == 0) break;
+    // Stop If we didn't find another deme to copy
+    if (from_deme_id == num_demes) break;
+    
+    for (to_deme_id = 0; to_deme_id < num_demes; to_deme_id++) {
+      if (deme_count[to_deme_id] == 0) break;
     }
     
     // We now have both a from and a to deme....
-    deme_count[from_deme]--;
-    deme_count[to_deme]++;
+    deme_count[from_deme_id]--;
+    deme_count[to_deme_id]++;
     
+    cDeme & from_deme = deme_array[from_deme_id];
+    cDeme & to_deme   = deme_array[to_deme_id];
+
     // Do the actual copy!
-    for (int i = 0; i < deme_size; i++) {
-      int from_cell = from_deme * deme_size + i;
-      int to_cell = to_deme * deme_size + i;
-      if (cell_array[from_cell].IsOccupied() == true) {
-        InjectClone( to_cell, *(cell_array[from_cell].GetOrganism()) );
+    for (int i = 0; i < from_deme.GetSize(); i++) {
+      int from_cell_id = from_deme.GetCellID(i);
+      int to_cell_id = to_deme.GetCellID(i);
+      if (cell_array[from_cell_id].IsOccupied() == true) {
+        InjectClone( to_cell_id, *(cell_array[from_cell_id].GetOrganism()) );
       }
     }
-    is_init[to_deme] = true;
+    is_init[to_deme_id] = true;
   }
   
   // Now re-inject all remaining demes into themselves to reset them.
-  for (int cur_deme = 0; cur_deme < num_demes; cur_deme++) {
-    if (is_init[cur_deme] == true) continue;
-    for (int i = 0; i < deme_size; i++) {
-      int cur_cell = cur_deme * deme_size + i;
-      if (cell_array[cur_cell].IsOccupied() == false) continue;
-      InjectClone( cur_cell, *(cell_array[cur_cell].GetOrganism()) );
+  for (int deme_id = 0; deme_id < num_demes; deme_id++) {
+    if (is_init[deme_id] == true) continue;
+    cDeme & cur_deme = deme_array[deme_id];
+
+    for (int i = 0; i < cur_deme.GetSize(); i++) {
+      int cur_cell_id = cur_deme.GetCellID(i);
+      if (cell_array[cur_cell_id].IsOccupied() == false) continue;
+      InjectClone( cur_cell_id, *(cell_array[cur_cell_id].GetOrganism()) );
     }
   }
   
-  deme_birth_count.SetAll(0);
+  // Reset all deme stats to zero.
+  for (int deme_id = 0; deme_id < num_demes; deme_id++) {
+    deme_array[deme_id].Reset();
+  }
 }
 
 
@@ -734,21 +764,26 @@
 void cPopulation::ResetDemes()
 {
   // re-inject all demes into themselves to reset them.
-  for (int cur_deme = 0; cur_deme < num_demes; cur_deme++) {
-    for (int i = 0; i < deme_size; i++) {
-      int cur_cell = cur_deme * deme_size + i;
-      if (cell_array[cur_cell].IsOccupied() == false) continue;
-      InjectClone( cur_cell, *(cell_array[cur_cell].GetOrganism()) );
+  for (int deme_id = 0; deme_id < deme_array.GetSize(); deme_id++) {
+    for (int i = 0; i < deme_array[deme_id].GetSize(); i++) {
+      int cur_cell_id = deme_array[deme_id].GetCellID(i);
+      if (cell_array[cur_cell_id].IsOccupied() == false) continue;
+      InjectClone( cur_cell_id, *(cell_array[cur_cell_id].GetOrganism()) );
     }
   }
 }
 
-// Copy the contents of one deme into another.
+
+// Copy the full contents of one deme into another.
+
 void cPopulation::CopyDeme(int deme1_id, int deme2_id)
 {
-  for (int i = 0; i < deme_size; i++) {
-    int from_cell = deme1_id * deme_size + i;
-    int to_cell = deme2_id * deme_size + i;
+  cDeme & deme1 = deme_array[deme1_id];
+  cDeme & deme2 = deme_array[deme2_id];
+
+  for (int i = 0; i < deme1.GetSize(); i++) {
+    int from_cell = deme1.GetCellID(i);
+    int to_cell = deme2.GetCellID(i);
     if (cell_array[from_cell].IsOccupied() == false) {
       KillOrganism(cell_array[to_cell]);
       continue;
@@ -758,6 +793,29 @@
 }
 
 
+// Copy a single indvidual out of a deme into a new one (which is first purged
+// of existing organisms.)
+
+void cPopulation::SpawnDeme(int deme1_id, int deme2_id)
+{
+  cDeme & deme1 = deme_array[deme1_id];
+  cDeme & deme2 = deme_array[deme2_id];
+
+  // Determine the cell to copy from and to.
+  cRandom & random = m_world->GetRandom();
+  int cell1_id = deme1.GetCellID( random.GetUInt(deme1.GetSize()) );
+  int cell2_id = deme2.GetCellID( random.GetUInt(deme2.GetSize()) );
+
+  // Clear out existing cells in target deme.
+  for (int i = 0; i < deme2.GetSize(); i++) {
+    KillOrganism(cell_array[ deme2.GetCellID(i) ]);
+  }
+
+  // And do the spawning.
+  InjectClone( cell2_id, *(cell_array[cell1_id].GetOrganism()) );    
+}
+
+
 // Print out statistics about individual demes
 
 void cPopulation::PrintDemeStats()
@@ -799,13 +857,14 @@
   const int num_inst = m_world->GetNumInstructions();
   const int num_task = environment.GetTaskLib().GetSize();
   
-  for (int cur_deme = 0; cur_deme < num_demes; cur_deme++) {
+  const int num_demes = deme_array.GetSize();
+  for (int deme_id = 0; deme_id < num_demes; deme_id++) {
     cString filename;
-    filename.Set("deme_instruction-%d.dat", cur_deme);
+    filename.Set("deme_instruction-%d.dat", deme_id);
     cDataFile & df_inst = m_world->GetDataFile(filename); 
     cString comment;
     comment.Set("Number of times each instruction is exectued in deme %d",
-                cur_deme);
+                deme_id);
     df_inst.WriteComment(comment);
     df_inst.WriteTimeStamp();
     df_inst.Write(stats.GetUpdate(), "update");
@@ -819,8 +878,9 @@
     tArray<cIntSum> single_deme_task(num_task);
     tArray<cIntSum> single_deme_inst(num_inst);
     
-    for (int i = 0; i < deme_size; i++) {
-      int cur_cell = cur_deme * deme_size + i;
+    const cDeme & cur_deme = deme_array[deme_id];
+    for (int i = 0; i < cur_deme.GetSize(); i++) {
+      int cur_cell = cur_deme.GetCellID(i);
       if (cell_array[cur_cell].IsOccupied() == false) continue;
       cPhenotype & phenotype = GetCell(cur_cell).GetOrganism()->GetPhenotype();
       single_deme_fitness.Add(phenotype.GetFitness()); 	
@@ -842,7 +902,7 @@
       }
     }
     
-    comment.Set("Deme %d", cur_deme);
+    comment.Set("Deme %d", deme_id);
     df_fit.Write(single_deme_fitness.Ave(), comment);
     df_life_fit.Write(single_deme_life_fitness.Ave(), comment);
     df_merit.Write(single_deme_merit.Ave(), comment);
@@ -851,7 +911,7 @@
     df_receiver.Write(single_deme_receiver.Sum(), comment);
     
     for (int j = 0; j < num_task; j++) {
-      comment.Set("Deme %d, Task %d", cur_deme, j);
+      comment.Set("Deme %d, Task %d", deme_id, j);
       df_task.Write((int) single_deme_task[j].Sum(), comment);
     }
     
@@ -922,14 +982,18 @@
     return *out_cell;
   }
   else if (birth_method == POSITION_CHILD_DEME_RANDOM) {
-    const int parent_id = parent_cell.GetID();
-    const int cur_deme = parent_id / deme_size;
-    int out_pos = m_world->GetRandom().GetUInt(deme_size) + deme_size * cur_deme;
-    while (parent_ok == false && out_pos == parent_cell.GetID()) {
-      out_pos = m_world->GetRandom().GetUInt(deme_size) + deme_size * cur_deme;
+    const int deme_id = parent_cell.GetDemeID();
+    const int deme_size = deme_array[deme_id].GetSize();
+
+    int out_pos = m_world->GetRandom().GetUInt(deme_size);
+    int out_cell_id = deme_array[deme_id].GetCellID(out_pos);
+    while (parent_ok == false && out_cell_id == parent_cell.GetID()) {
+      out_pos = m_world->GetRandom().GetUInt(deme_size);
+      out_cell_id = deme_array[deme_id].GetCellID(out_pos);
     }
-    deme_birth_count[cur_deme]++;
-    return GetCell(out_pos);    
+
+    deme_array[deme_id].IncBirthCount();
+    return GetCell(out_cell_id);    
   }
   
   // Construct a list of equally viable locations to place the child...
@@ -966,10 +1030,9 @@
     }
   }
   
-  if (num_demes > 0) {
-    const int parent_id = parent_cell.GetID();
-    const int cur_deme = parent_id / deme_size;
-    deme_birth_count[cur_deme]++;
+  if (deme_array.GetSize() > 0) {
+    const int deme_id = parent_cell.GetDemeID();
+    deme_array[deme_id].IncBirthCount();
   }
   
   // If there are no possibilities, return parent.

Modified: branches/dkdev/source/main/cPopulation.h
===================================================================
--- branches/dkdev/source/main/cPopulation.h	2007-02-19 18:04:35 UTC (rev 1333)
+++ branches/dkdev/source/main/cPopulation.h	2007-02-19 18:48:39 UTC (rev 1334)
@@ -16,6 +16,9 @@
 #ifndef cBirthChamber_h
 #include "cBirthChamber.h"
 #endif
+#ifndef cDeme_h
+#include "cDeme.h"
+#endif
 #ifndef cOrgInterface_h
 #include "cOrgInterface.h"
 #endif
@@ -72,9 +75,7 @@
   int world_x;                         // Structured population width.
   int world_y;                         // Structured population
   int num_organisms;                   // Cell count with living organisms
-  int num_demes;                       // Number of sub-groups of organisms
-  int deme_size;                       // Number of organims in a deme.
-  tArray<int> deme_birth_count;        // Track number of births in each deme.
+  tArray<cDeme> deme_array;            // Deme structure of the population.
  
   // Outside interactions...
   bool sync_events;   // Do we need to sync up the event list with population?
@@ -130,10 +131,12 @@
   void Kaboom(cPopulationCell& in_cell, int distance=0);
   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);
+
   // Deme-related methods
   void CompeteDemes(int competition_type);
   void ResetDemes();
   void CopyDeme(int deme1_id, int deme2_id);
+  void SpawnDeme(int deme1_id, int deme2_id);
   void PrintDemeStats();
 
   // Process a single organism one instruction...

Modified: branches/dkdev/source/main/cPopulationCell.cc
===================================================================
--- branches/dkdev/source/main/cPopulationCell.cc	2007-02-19 18:04:35 UTC (rev 1333)
+++ branches/dkdev/source/main/cPopulationCell.cc	2007-02-19 18:48:39 UTC (rev 1334)
@@ -31,6 +31,7 @@
   , organism(in_cell.organism)
   , cur_input(in_cell.cur_input)
   , cell_id(in_cell.cell_id)
+  , deme_id(in_cell.deme_id)
   , organism_count(in_cell.organism_count)
 {
   for (int i = 0; i < nHardware::IO_SIZE; i++) input_array[i] = in_cell.input_array[i];
@@ -49,6 +50,7 @@
   for (int i = 0; i < nHardware::IO_SIZE; i++) input_array[i] = in_cell.input_array[i];
   cur_input = in_cell.cur_input;
   cell_id = in_cell.cell_id;
+  deme_id = in_cell.deme_id;
   organism_count = in_cell.organism_count;
   if (mutation_rates == NULL)
     mutation_rates = new cMutationRates(*in_cell.mutation_rates);
@@ -65,6 +67,8 @@
 {
   m_world = world;
   cell_id = in_id;
+  deme_id = -1;
+  
   if (mutation_rates == NULL)
     mutation_rates = new cMutationRates(in_rates);
   else

Modified: branches/dkdev/source/main/cPopulationCell.h
===================================================================
--- branches/dkdev/source/main/cPopulationCell.h	2007-02-19 18:04:35 UTC (rev 1333)
+++ branches/dkdev/source/main/cPopulationCell.h	2007-02-19 18:48:39 UTC (rev 1334)
@@ -40,6 +40,7 @@
   int cur_input;                           // Next input to give organism.
 
   int cell_id;           // Unique id for position of cell in population.
+  int deme_id;           // ID of the deme that this cell is part of.
   int organism_count;    // Total number of orgs to ever inhabit this cell.
 
 
@@ -54,6 +55,7 @@
   void operator=(const cPopulationCell& in_cell);
 
   void Setup(cWorld* world, int in_id, const cMutationRates & in_rates);
+  void SetDemeID(int in_id) { deme_id = in_id; }
   void Rotate(cPopulationCell & new_facing);
 
   cOrganism* GetOrganism() const { return organism; }
@@ -65,6 +67,7 @@
   int GetInputAt(int & input_pointer);
 
   int GetID() const { return cell_id; }
+  int GetDemeID() const { return deme_id; }
   int GetOrganismCount() const { return organism_count; }
 
   bool IsOccupied() const { return organism != NULL; }




More information about the Avida-cvs mailing list