[Avida-SVN] r2878 - in branches/movement/source: actions cpu main

grabow38 at myxo.css.msu.edu grabow38 at myxo.css.msu.edu
Fri Oct 24 10:59:38 PDT 2008


Author: grabow38
Date: 2008-10-24 13:59:37 -0400 (Fri, 24 Oct 2008)
New Revision: 2878

Modified:
   branches/movement/source/actions/PopulationActions.cc
   branches/movement/source/cpu/cHardwareCPU.cc
   branches/movement/source/main/cPopulation.cc
   branches/movement/source/main/cPopulation.h
   branches/movement/source/main/cStats.cc
Log:
Adding code to compete demes based on resource consumption.

Modified: branches/movement/source/actions/PopulationActions.cc
===================================================================
--- branches/movement/source/actions/PopulationActions.cc	2008-10-24 15:51:53 UTC (rev 2877)
+++ branches/movement/source/actions/PopulationActions.cc	2008-10-24 17:59:37 UTC (rev 2878)
@@ -1692,6 +1692,35 @@
     }
 };
 
+// @ LMG
+// Compete demes based on how much resource has been consumed within the deme
+class cAbstractCompeteDemes_ConsumeCellResources : public cAbstractCompeteDemes {
+  public:
+    cAbstractCompeteDemes_ConsumeCellResources(cWorld* world, const cString& args) : cAbstractCompeteDemes(world, args) { }
+
+    static const cString GetDescription() { return "No Arguments"; }
+  
+    double Fitness(const cDeme& deme) {    
+	
+	  cResourceCount res = deme.GetDemeResourceCount(); 
+	  double current_res;// Current total resource in deme                                                                                                            
+	  double initial_res;// Initial total resource in deme
+	
+	  for(int i = 0; i < res.GetSize(); i++) {                                                                                                                        
+	    if( (res.GetResourcesGeometry())[i] != nGeometry::GLOBAL) {                                                                                                   
+	      cSpatialResCount sp_res = res.GetSpatialResource(i);                                                                                                       
+		  current_res += sp_res.GetAmount(i);                                                                                                                     
+		  initial_res += res.GetInitialResourceValue(i);   
+	    }                                                                                                                                                  
+      }   
+	  
+	  // Fitness is square of how much resource has been consumed
+	  double fitnessOfDeme = pow( (initial_res - current_res), 2.0);
+	  
+      return fitnessOfDeme;
+    }
+};
+
 /* This Action will check if any demes have met the critera to be replicated
    and do so.  There are several bases this can be checked on:
 
@@ -2390,8 +2419,9 @@
   action_lib->Register<cAbstractCompeteDemes_AttackKillAndEnergyConserve>("CompeteDemes_AttackKillAndEnergyConserve");
   action_lib->Register<cAssignRandomCellData>("AssignRandomCellData");
   action_lib->Register<cActionIteratedConsensus>("IteratedConsensus");
-	action_lib->Register<cActionSynchronization>("Synchronization");
-	action_lib->Register<cActionDesynchronization>("Desynchronization");
+  action_lib->Register<cAbstractCompeteDemes_ConsumeCellResources>("CompeteDemes_ConsumeCellResources"); // @ LMG
+  action_lib->Register<cActionSynchronization>("Synchronization");
+  action_lib->Register<cActionDesynchronization>("Desynchronization");
 	
   action_lib->Register<cActionNewTrial>("NewTrial");
   action_lib->Register<cActionCompeteOrganisms>("CompeteOrganisms");

Modified: branches/movement/source/cpu/cHardwareCPU.cc
===================================================================
--- branches/movement/source/cpu/cHardwareCPU.cc	2008-10-24 15:51:53 UTC (rev 2877)
+++ branches/movement/source/cpu/cHardwareCPU.cc	2008-10-24 17:59:37 UTC (rev 2878)
@@ -778,12 +778,12 @@
 
   // NOTE: Organism may be dead now if instruction executed killed it (such as some divides, "die", or "kazi")
 
-#if INSTRUCTION_COUNT
+//#if INSTRUCTION_COUNT
   // Decrement if the instruction was not executed successfully.
   if (exec_success == false) {
     organism->GetPhenotype().DecCurInstCount(actual_inst.GetOp());
   }
-#endif	
+//#endif	
   
   return exec_success;
 }

Modified: branches/movement/source/main/cPopulation.cc
===================================================================
--- branches/movement/source/main/cPopulation.cc	2008-10-24 15:51:53 UTC (rev 2877)
+++ branches/movement/source/main/cPopulation.cc	2008-10-24 17:59:37 UTC (rev 2878)
@@ -982,24 +982,24 @@
 void cPopulation::CompeteDemes(int competition_type)
 {
   const int num_demes = deme_array.GetSize();
-  
-  double total_fitness = 0; 
-  tArray<double> deme_fitness(num_demes); 
-  
+
+  double total_fitness = 0;
+  tArray<double> deme_fitness(num_demes);
+
   switch(competition_type) {
-    case 0:    // deme fitness = 1; 
+    case 0:    // deme fitness = 1;                                                                                                                                     
       total_fitness = (double) num_demes;
-      deme_fitness.SetAll(1); 
-      break; 
-    case 1:     // deme fitness = number of births
-                // Determine the scale for fitness by totaling births across demes.
+      deme_fitness.SetAll(1);
+      break;
+    case 1:     // deme fitness = number of births                                                                                                                      
+                // Determine the scale for fitness by totaling births across demes.                                                                                     
       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
+      break;
+    case 2:    // deme fitness = average organism fitness at the current update                                                                                         
       for (int deme_id = 0; deme_id < num_demes; deme_id++) {
         cDoubleSum single_deme_fitness;
         const cDeme & cur_deme = deme_array[deme_id];
@@ -1009,12 +1009,12 @@
           cPhenotype & phenotype =
             GetCell(cur_cell).GetOrganism()->GetPhenotype();
           single_deme_fitness.Add(phenotype.GetFitness());
-        } 
+        }
         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 
+      break;
+    case 3:     // deme fitness = average mutation rate at the current update                                                                                           
       for (int deme_id = 0; deme_id < num_demes; deme_id++) {
         cDoubleSum single_deme_div_type;
         const cDeme & cur_deme = deme_array[deme_id];
@@ -1029,10 +1029,10 @@
         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 ...
-    {      
+      break;
+    case 4:     // deme fitness = 2^(-deme fitness rank)                                                                                                                
+                // first find all the deme fitness values ...                                                                                                           
+    {
       for (int deme_id = 0; deme_id < num_demes; deme_id++) {
         cDoubleSum single_deme_fitness;
         const cDeme & cur_deme = deme_array[deme_id];
@@ -1041,30 +1041,30 @@
           if (cell_array[cur_cell].IsOccupied() == false) continue;
           cPhenotype & phenotype = GetCell(cur_cell).GetOrganism()->GetPhenotype();
           single_deme_fitness.Add(phenotype.GetFitness());
-        }  
+        }
         deme_fitness[deme_id] = single_deme_fitness.Ave();
       }
-      // ... then determine the rank of each deme based on its fitness
+      // ... then determine the rank of each deme based on its fitness                                                                                                  
       tArray<double> deme_rank(num_demes);
       deme_rank.SetAll(1);
       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[deme_id] < deme_fitness[test_deme]) {
             deme_rank[deme_id]++;
-          } 
-        } 
-      } 
-      // ... finally, make deme fitness 2^(-deme rank)
-      deme_fitness.SetAll(1);	
+          }
+        }
+      }
+      // ... finally, make deme fitness 2^(-deme rank)                                                                                                                  
+      deme_fitness.SetAll(1);
       for (int deme_id = 0; deme_id < num_demes; deme_id++) {
-        for (int i = 0; i < deme_rank[deme_id]; i++) { 
+        for (int i = 0; i < deme_rank[deme_id]; i++) {
           deme_fitness[deme_id] = deme_fitness[deme_id]/2;
-        } 
-        total_fitness += deme_fitness[deme_id]; 
-      } 
+        }
+        total_fitness += deme_fitness[deme_id];
+      }
     }
-      break; 
-    case 5:    // deme fitness = average organism life fitness at the current update
+      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;
         const cDeme & cur_deme = deme_array[deme_id];
@@ -1077,9 +1077,9 @@
         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 ...
+      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 deme_id = 0; deme_id < num_demes; deme_id++) {
         cDoubleSum single_deme_life_fitness;
@@ -1092,7 +1092,7 @@
         }
         deme_fitness[deme_id] = single_deme_life_fitness.Ave();
       }
-      // ... then determine the rank of each deme based on its fitness
+      // ... then determine the rank of each deme based on its fitness                                                                                                  
       tArray<double> deme_rank(num_demes);
       deme_rank.SetAll(1);
       for (int deme_id = 0; deme_id < num_demes; deme_id++) {
@@ -1102,7 +1102,7 @@
           }
         }
       }
-      // ... finally, make deme fitness 2^(-deme rank)
+      // ... finally, make deme fitness 2^(-deme rank)                                                                                                                  
       deme_fitness.SetAll(1);
       for (int deme_id = 0; deme_id < num_demes; deme_id++) {
         for (int i = 0; i < deme_rank[deme_id]; i++) {
@@ -1111,9 +1111,10 @@
         total_fitness += deme_fitness[deme_id];
       }
     }
-      break;
-  } 
-  
+      break;                                                                                                                                                                       
+
+	}
+	    
   // Pick which demes should be in the next generation.
   tArray<int> new_demes(num_demes);
   for (int i = 0; i < num_demes; i++) {
@@ -1166,6 +1167,7 @@
 		// But, use of InjectClone messes that up, breaking consistency.  So the next
 		// time that someone comes in here looking to refactor, consider fixing this.    
     
+
     // Do the actual copy!
     for (int i = 0; i < from_deme.GetSize(); i++) {
       int from_cell_id = from_deme.GetCellID(i);
@@ -2914,6 +2916,7 @@
   
   cSpatialResCount sp_res = res.GetSpatialResource(i);
   int gridsize = sp_res.GetSize();
+  
   int xsize = m_world->GetConfig().WORLD_X.Get();
   
   for (int j = 0; j < gridsize; j++) {

Modified: branches/movement/source/main/cPopulation.h
===================================================================
--- branches/movement/source/main/cPopulation.h	2008-10-24 15:51:53 UTC (rev 2877)
+++ branches/movement/source/main/cPopulation.h	2008-10-24 17:59:37 UTC (rev 2878)
@@ -321,6 +321,7 @@
   
   // @WRE: Make a method to provide "tumble" capability 08-Aug-2008
    void Tumble(cOrganism* organism);
+
 };
 
 

Modified: branches/movement/source/main/cStats.cc
===================================================================
--- branches/movement/source/main/cStats.cc	2008-10-24 15:51:53 UTC (rev 2877)
+++ branches/movement/source/main/cStats.cc	2008-10-24 17:59:37 UTC (rev 2878)
@@ -1129,7 +1129,7 @@
   }
 #else // INSTRUCTION_COUNT undefined
   m_world->GetDriver().RaiseException("Warning: Instruction Counts not compiled in");
-#endif // ifdef INSTRUCTION_COUNT
+ #endif // ifdef INSTRUCTION_COUNT
 
   df.Endl();
 }




More information about the Avida-cvs mailing list