[Avida-SVN] r1405 - in development: source/actions source/cpu source/main source/tools support/scripts

barrick at myxo.css.msu.edu barrick at myxo.css.msu.edu
Thu Mar 15 19:58:31 PDT 2007


Author: barrick
Date: 2007-03-15 22:58:31 -0400 (Thu, 15 Mar 2007)
New Revision: 1405

Modified:
   development/source/actions/PrintActions.cc
   development/source/cpu/cHardwareCPU.cc
   development/source/cpu/cHardwareCPU.h
   development/source/cpu/cTestCPU.cc
   development/source/main/cAvidaConfig.h
   development/source/main/cEnvironment.cc
   development/source/main/cEnvironment.h
   development/source/main/cOrganism.cc
   development/source/main/cPhenotype.cc
   development/source/main/cPhenotype.h
   development/source/main/cPopulation.cc
   development/source/main/cReactionProcess.h
   development/source/main/cReactionResult.cc
   development/source/main/cReactionResult.h
   development/source/main/cStats.cc
   development/source/main/cStats.h
   development/source/tools/tHashTable.h
   development/support/scripts/trace_movie.pl
Log:
Main changes:
(1) Created put-reset and get-2 command flavors that correctly randomize environmental inputs and clear organism inputs so the organism is forced to get new inputs before completing tasks. Also added an "effective task count" so that instructions can reset the max_count reaction limits.
(2) Added a "reaction reward" file, so I can watch plasticity during a run. Currently it only handles 'add' type rewards.
(3) Removed some compound instructions that I haven't found useful at all.



Modified: development/source/actions/PrintActions.cc
===================================================================
--- development/source/actions/PrintActions.cc	2007-03-15 21:55:49 UTC (rev 1404)
+++ development/source/actions/PrintActions.cc	2007-03-16 02:58:31 UTC (rev 1405)
@@ -60,26 +60,27 @@
   void Process(cAvidaContext& ctx) { m_world->GetStats().METHOD(m_filename); }            /* 12 */ \
 }                                                                                         /* 13 */ \
 
-STATS_OUT_FILE(PrintAverageData,       average.dat         );
-STATS_OUT_FILE(PrintErrorData,         error.dat           );
-STATS_OUT_FILE(PrintVarianceData,      variance.dat        );
-STATS_OUT_FILE(PrintDominantData,      dominant.dat        );
-STATS_OUT_FILE(PrintStatsData,         stats.dat           );
-STATS_OUT_FILE(PrintCountData,         count.dat           );
-STATS_OUT_FILE(PrintTotalsData,        totals.dat          );
-STATS_OUT_FILE(PrintTasksData,         tasks.dat           );
-STATS_OUT_FILE(PrintTasksExeData,      tasks_exe.dat       );
-STATS_OUT_FILE(PrintTasksQualData,     tasks_quality.dat   );
-STATS_OUT_FILE(PrintResourceData,      resource.dat        );
-STATS_OUT_FILE(PrintTimeData,          time.dat            );
-STATS_OUT_FILE(PrintMutationRateData,  mutation_rates.dat  );
-STATS_OUT_FILE(PrintDivideMutData,     divide_mut.dat      );
-STATS_OUT_FILE(PrintDominantParaData,  parasite.dat        );
-STATS_OUT_FILE(PrintInstructionData,   instruction.dat     );
-STATS_OUT_FILE(PrintGenotypeMap,       genotype_map.m      );
-STATS_OUT_FILE(PrintMarketData,        market.dat          );
-STATS_OUT_FILE(PrintSenseData,         sense.dat           );
-STATS_OUT_FILE(PrintSenseExeData,      sense_exe.dat       );
+STATS_OUT_FILE(PrintAverageData,            average.dat         );
+STATS_OUT_FILE(PrintErrorData,              error.dat           );
+STATS_OUT_FILE(PrintVarianceData,           variance.dat        );
+STATS_OUT_FILE(PrintDominantData,           dominant.dat        );
+STATS_OUT_FILE(PrintStatsData,              stats.dat           );
+STATS_OUT_FILE(PrintCountData,              count.dat           );
+STATS_OUT_FILE(PrintTotalsData,             totals.dat          );
+STATS_OUT_FILE(PrintTasksData,              tasks.dat           );
+STATS_OUT_FILE(PrintTasksExeData,           tasks_exe.dat       );
+STATS_OUT_FILE(PrintTasksQualData,          tasks_quality.dat   );
+STATS_OUT_FILE(PrintResourceData,           resource.dat        );
+STATS_OUT_FILE(PrintReactionRewardData,     reaction_reward.dat );
+STATS_OUT_FILE(PrintTimeData,               time.dat            );
+STATS_OUT_FILE(PrintMutationRateData,       mutation_rates.dat  );
+STATS_OUT_FILE(PrintDivideMutData,          divide_mut.dat      );
+STATS_OUT_FILE(PrintDominantParaData,       parasite.dat        );
+STATS_OUT_FILE(PrintInstructionData,        instruction.dat     );
+STATS_OUT_FILE(PrintGenotypeMap,            genotype_map.m      );
+STATS_OUT_FILE(PrintMarketData,             market.dat          );
+STATS_OUT_FILE(PrintSenseData,              sense.dat           );
+STATS_OUT_FILE(PrintSenseExeData,           sense_exe.dat       );
 
 
 #define POP_OUT_FILE(METHOD, DEFAULT)                                                     /*  1 */ \
@@ -1494,6 +1495,7 @@
   action_lib->Register<cActionPrintTasksExeData>("PrintTasksExeData");
   action_lib->Register<cActionPrintTasksQualData>("PrintTasksQualData");
   action_lib->Register<cActionPrintResourceData>("PrintResourceData");
+  action_lib->Register<cActionPrintReactionRewardData>("PrintReactionRewardData");
   action_lib->Register<cActionPrintTimeData>("PrintTimeData");
   action_lib->Register<cActionPrintMutationRateData>("PrintMutationRateData");
   action_lib->Register<cActionPrintDivideMutData>("PrintDivideMutData");

Modified: development/source/cpu/cHardwareCPU.cc
===================================================================
--- development/source/cpu/cHardwareCPU.cc	2007-03-15 21:55:49 UTC (rev 1404)
+++ development/source/cpu/cHardwareCPU.cc	2007-03-16 02:58:31 UTC (rev 1405)
@@ -184,13 +184,11 @@
     tInstLibEntry<tMethod>("mem-size", &cHardwareCPU::Inst_MemSize),
     
     tInstLibEntry<tMethod>("get", &cHardwareCPU::Inst_TaskGet),
+    tInstLibEntry<tMethod>("get-2", &cHardwareCPU::Inst_TaskGet2),
     tInstLibEntry<tMethod>("stk-get", &cHardwareCPU::Inst_TaskStackGet),
     tInstLibEntry<tMethod>("stk-load", &cHardwareCPU::Inst_TaskStackLoad),
     tInstLibEntry<tMethod>("put", &cHardwareCPU::Inst_TaskPut),
-    tInstLibEntry<tMethod>("put-clear", &cHardwareCPU::Inst_TaskPutClearInput), 
     tInstLibEntry<tMethod>("put-reset", &cHardwareCPU::Inst_TaskPutResetInputs),
-    tInstLibEntry<tMethod>("put-bcost2", &cHardwareCPU::Inst_TaskPutBonusCost2),
-    tInstLibEntry<tMethod>("put-mcost2", &cHardwareCPU::Inst_TaskPutMeritCost2),
     tInstLibEntry<tMethod>("IO", &cHardwareCPU::Inst_TaskIO, nInstFlag::DEFAULT, "Output ?BX?, and input new number back into ?BX?"),
     tInstLibEntry<tMethod>("IO-Feedback", &cHardwareCPU::Inst_TaskIO_Feedback, 0, "Output ?BX?, and input new number back into ?BX?,  and push 1,0,  or -1 onto stack1 if merit increased, stayed the same, or decreased"),
     tInstLibEntry<tMethod>("match-strings", &cHardwareCPU::Inst_MatchStrings),
@@ -314,9 +312,7 @@
     tInstLibEntry<tMethod>("repro-Y", &cHardwareCPU::Inst_Repro),
     tInstLibEntry<tMethod>("repro-Z", &cHardwareCPU::Inst_Repro),
 
-    tInstLibEntry<tMethod>("IO-repro", &cHardwareCPU::Inst_IORepro),
     tInstLibEntry<tMethod>("put-repro", &cHardwareCPU::Inst_TaskPutRepro),
-    tInstLibEntry<tMethod>("putc-repro", &cHardwareCPU::Inst_TaskPutClearInputRepro),
     tInstLibEntry<tMethod>("metabolize", &cHardwareCPU::Inst_TaskPutResetInputsRepro),        
 
     tInstLibEntry<tMethod>("spawn-deme", &cHardwareCPU::Inst_SpawnDeme),
@@ -2439,8 +2435,7 @@
   child_genome = GetMemory();
   organism->GetPhenotype().SetLinesCopied(GetMemory().GetSize());
 
-  // JEB Hack
-  // Make sure that an organism has accumulated any required bonus
+  // @JEB - Make sure that an organism has accumulated any required bonus
   const int bonus_required = m_world->GetConfig().REQUIRED_BONUS.Get();
   if (organism->GetPhenotype().GetCurBonus() < bonus_required) {
     return false; //  (divide fails)
@@ -2488,28 +2483,15 @@
   return true;
 }
 
-bool cHardwareCPU::Inst_IORepro(cAvidaContext& ctx)
-{
-  // Do normal IO
-  Inst_TaskIO(ctx);
-  
-  // Immediately attempt a repro
-  return Inst_Repro(ctx);
-}
-
 bool cHardwareCPU::Inst_TaskPutRepro(cAvidaContext& ctx)
 {
-  // Do normal IO
-  Inst_TaskPut(ctx);
+  // Do normal IO, but don't zero register
+  //Inst_TaskPut(ctx);
   
-  // Immediately attempt a repro
-  return Inst_Repro(ctx);
-}
-
-bool cHardwareCPU::Inst_TaskPutClearInputRepro(cAvidaContext& ctx)
-{
-  // Do normal IO
-  Inst_TaskPutClearInput(ctx);
+  const int reg_used = FindModifiedRegister(REG_BX);
+  const int value = GetRegister(reg_used);
+ // GetRegister(reg_used) = 0;
+  organism->DoOutput(ctx, value);
   
   // Immediately attempt a repro
   return Inst_Repro(ctx);
@@ -2686,6 +2668,33 @@
   return true;
 }
 
+
+// @JEB - this instruction does more than two "gets" together
+// it also (1) resets the inputs and (2) resets an organisms task counts
+bool cHardwareCPU::Inst_TaskGet2(cAvidaContext& ctx)
+{
+  // Randomize the inputs so they can't save numbers
+  organism->GetOrgInterface().ResetInputs(ctx);   // Now re-randomize the inputs this organism sees
+  organism->ClearInput();                         // Also clear their input buffers, or they can still claim
+                                                  // rewards for numbers no longer in their environment!
+
+  const int reg_used_1 = FindModifiedRegister(REG_BX);
+  const int reg_used_2 = FindNextRegister(reg_used_1);
+  
+  const int value1 = organism->GetNextInput();
+  GetRegister(reg_used_1) = value1;
+  organism->DoInput(value1);
+  
+  const int value2 = organism->GetNextInput();
+  GetRegister(reg_used_2) = value2;
+  organism->DoInput(value2);
+  
+  // Clear the task number
+  organism->GetPhenotype().ClearEffTaskCount();
+  
+  return true;
+}
+
 bool cHardwareCPU::Inst_TaskStackGet(cAvidaContext& ctx)
 {
   const int value = organism->GetNextInput();
@@ -2711,13 +2720,6 @@
   return true;
 }
 
-bool cHardwareCPU::Inst_TaskPutClearInput(cAvidaContext& ctx)
-{
-  bool return_value = Inst_TaskPut(ctx);
-  organism->ClearInput();
-  return return_value;
-}
-
 bool cHardwareCPU::Inst_TaskPutResetInputs(cAvidaContext& ctx)
 {
   bool return_value = Inst_TaskPut(ctx);          // Do a normal put
@@ -2727,38 +2729,6 @@
   return return_value;
 }
 
-bool cHardwareCPU::Inst_TaskPutBonusCost2(cAvidaContext& ctx)
-{
-  const int reg_used = FindModifiedRegister(REG_BX);
-  const int value = GetRegister(reg_used);
-  GetRegister(reg_used) = 0;
-  organism->DoOutput(ctx, value);
-  double new_bonus = organism->GetPhenotype().GetCurBonus();
-  new_bonus *= 0.5;
-//if (new_bonus < 1) new_bonus = 1;
-  organism->GetPhenotype().SetCurBonus(new_bonus);
-  return true;
-}
-
-bool cHardwareCPU::Inst_TaskPutMeritCost2(cAvidaContext& ctx)
-{
-  // Normal put code
-  const int reg_used = FindModifiedRegister(REG_BX);
-  const int value = GetRegister(reg_used);
-  GetRegister(reg_used) = 0;
-  organism->DoOutput(ctx, value);
-  
-  // Immediately half the merit of the current organism, never going below 1
-  double new_merit = organism->GetPhenotype().GetMerit().GetDouble();
-  new_merit /= 2;
-  if (new_merit < 1) new_merit = 1;
-  
-  // Immediately re-initialize the time-slice for this organism.  
-  organism->UpdateMerit(new_merit);
-  
-  return true;
-}
-
 bool cHardwareCPU::Inst_TaskIO(cAvidaContext& ctx)
 {
   const int reg_used = FindModifiedRegister(REG_BX);

Modified: development/source/cpu/cHardwareCPU.h
===================================================================
--- development/source/cpu/cHardwareCPU.h	2007-03-15 21:55:49 UTC (rev 1404)
+++ development/source/cpu/cHardwareCPU.h	2007-03-16 02:58:31 UTC (rev 1405)
@@ -397,9 +397,7 @@
   bool Inst_InjectThread(cAvidaContext& ctx);
   bool Inst_Transposon(cAvidaContext& ctx);
   bool Inst_Repro(cAvidaContext& ctx);
-  bool Inst_IORepro(cAvidaContext& ctx);
   bool Inst_TaskPutRepro(cAvidaContext& ctx);
-  bool Inst_TaskPutClearInputRepro(cAvidaContext& ctx);
   bool Inst_TaskPutResetInputsRepro(cAvidaContext& ctx);
 
   bool Inst_SpawnDeme(cAvidaContext& ctx);
@@ -409,13 +407,11 @@
 
   // I/O and Sensory
   bool Inst_TaskGet(cAvidaContext& ctx);
+  bool Inst_TaskGet2(cAvidaContext& ctx);
   bool Inst_TaskStackGet(cAvidaContext& ctx);
   bool Inst_TaskStackLoad(cAvidaContext& ctx);
   bool Inst_TaskPut(cAvidaContext& ctx);
-  bool Inst_TaskPutClearInput(cAvidaContext& ctx);  
   bool Inst_TaskPutResetInputs(cAvidaContext& ctx);
-  bool Inst_TaskPutBonusCost2(cAvidaContext& ctx);  
-  bool Inst_TaskPutMeritCost2(cAvidaContext& ctx); 
   bool Inst_TaskIO(cAvidaContext& ctx);
   bool Inst_TaskIO_Feedback(cAvidaContext& ctx);
   bool Inst_MatchStrings(cAvidaContext& ctx);

Modified: development/source/cpu/cTestCPU.cc
===================================================================
--- development/source/cpu/cTestCPU.cc	2007-03-15 21:55:49 UTC (rev 1404)
+++ development/source/cpu/cTestCPU.cc	2007-03-16 02:58:31 UTC (rev 1405)
@@ -246,6 +246,23 @@
      
      organism.GetHardware().SingleProcess(ctx);
   }
+  
+  
+  // Output final resource information @JEB
+  if ( (m_res_method >= RES_UPDATED_DEPLETABLE) && (tracerStream != NULL) ) 
+  {
+    const cResourceLib& resource_lib = m_world->GetEnvironment().GetResourceLib();
+    assert(resource_lib.GetSize() >= 0);
+    *tracerStream << "Resources:";
+    // Print out resources
+    for(int i=0; i<resource_lib.GetSize(); i++) 
+    {     
+       *tracerStream << " " << m_resource_count.Get(i);
+    }
+    *tracerStream << endl;
+   }
+
+  
   organism.GetHardware().SetTrace(NULL);
 
   // Print out some final info in trace...

Modified: development/source/main/cAvidaConfig.h
===================================================================
--- development/source/main/cAvidaConfig.h	2007-03-15 21:55:49 UTC (rev 1404)
+++ development/source/main/cAvidaConfig.h	2007-03-16 02:58:31 UTC (rev 1405)
@@ -210,6 +210,7 @@
   CONFIG_ADD_GROUP(REPRODUCTION_GROUP, "Birth and Death");
   CONFIG_ADD_VAR(BIRTH_METHOD, int, 0, "Which organism should be replaced on birth?\n0 = Random organism in neighborhood\n1 = Oldest in neighborhood\n2 = Largest Age/Merit in neighborhood\n3 = None (use only empty cells in neighborhood)\n4 = Random from population (Mass Action)\n5 = Oldest in entire population\n6 = Random within deme\n7 = Organism faced by parent\n8 = Next grid cell (id+1)\n9= Largest energy used in entire population\n10= Largest energy used in neighborhood");
   CONFIG_ADD_VAR(PREFER_EMPTY, int, 1, "Give empty cells preference in offsping placement?");
+  CONFIG_ADD_VAR(ALLOW_PARENT, int, 1, "Allow births to replace the parent organism?");
   CONFIG_ADD_VAR(DEATH_METHOD, int, 2, "0 = Never die of old age.\n1 = Die when inst executed = AGE_LIMIT (+deviation)\n2 = Die when inst executed = length*AGE_LIMIT (+dev)");
   CONFIG_ADD_VAR(AGE_LIMIT, int, 20, "Modifies DEATH_METHOD");
   CONFIG_ADD_VAR(AGE_DEVIATION, int, 0, "Creates a distribution around AGE_LIMIT");

Modified: development/source/main/cEnvironment.cc
===================================================================
--- development/source/main/cEnvironment.cc	2007-03-15 21:55:49 UTC (rev 1404)
+++ development/source/main/cEnvironment.cc	2007-03-16 02:58:31 UTC (rev 1405)
@@ -211,10 +211,6 @@
         return false;
       new_process->SetDetectionError(var_value.AsDouble());
     }
-    else if (var_name == "clearsinput") {
-      if (!AssertInputInt(var_value, "clearsinput", var_type)) return false;
-      new_process->SetClearsInput( (bool)var_value.AsInt() );
-    }
     else if (var_name == "string") {
       new_process->SetMatchString(var_value);
 	}
@@ -833,21 +829,14 @@
     // If this task wasn't performed, move on to the next one.
     if (task_quality == 0.0) continue;
     
-    
     // Mark this task as performed...
     result.MarkTask(task_id, task_quality);
 
     // And lets process it!
-    DoProcesses(ctx, cur_reaction->GetProcesses(), resource_count, task_quality, task_cnt, result);
+    DoProcesses(ctx, cur_reaction->GetProcesses(), resource_count, task_quality, task_cnt, i, result);
     
     // Mark this reaction as occuring...
     result.MarkReaction(cur_reaction->GetID());
-    
-    // If the a process has marked to clear the input queue...
-    if (result.GetClearInput())
-    {
-      break; //no other tasks should be allowed to complete
-    }
   }  
   
   return result.GetActive();
@@ -916,7 +905,7 @@
 
 void cEnvironment::DoProcesses(cAvidaContext& ctx, const tList<cReactionProcess>& process_list,
                                const tArray<double>& resource_count, const double task_quality,
-                               const int task_count, cReactionResult& result) const
+                               const int task_count, const int reaction_id, cReactionResult& result) const
 {
   const int num_process = process_list.GetSize();
   
@@ -961,7 +950,7 @@
     
     switch (cur_process->GetType()) {
       case nReaction::PROCTYPE_ADD:
-        result.AddBonus(bonus);
+        result.AddBonus(bonus, reaction_id);
         break;
       case nReaction::PROCTYPE_MULT:
         result.MultBonus(bonus);
@@ -970,7 +959,7 @@
         result.MultBonus( pow(2.0, bonus) );
         break;
       case nReaction::PROCTYPE_LIN:
-        result.AddBonus( bonus * task_count);
+        result.AddBonus( bonus * task_count, reaction_id);
         break;
       default:
         assert(false);  // Should not get here!
@@ -1004,15 +993,8 @@
       result.AddInst(inst_id);
     }
     
-    result.Lethal(cur_process->GetLethal());
-    
-    // If the reaction clears the input queue...
-    if (cur_process->GetClearsInput())
-    {
-      result.SetClearInput(true);
-      //break; //should other processes depending on that task be allowed to complete?
+    result.Lethal(cur_process->GetLethal());    
     }
-  }
 }
 
 double cEnvironment::GetReactionValue(int& reaction_id)

Modified: development/source/main/cEnvironment.h
===================================================================
--- development/source/main/cEnvironment.h	2007-03-15 21:55:49 UTC (rev 1404)
+++ development/source/main/cEnvironment.h	2007-03-16 02:58:31 UTC (rev 1405)
@@ -104,7 +104,7 @@
 
   bool TestRequisites(const tList<cReactionRequisite>& req_list, int task_count, const tArray<int>& reaction_count, const bool on_divide = false) const;
   void DoProcesses(cAvidaContext& ctx, const tList<cReactionProcess>& process_list, const tArray<double>& resource_count,
-                   const double task_quality, const int task_count, cReactionResult& result) const;
+                   const double task_quality, const int task_count, const int reaction_id, cReactionResult& result) const;
 
   cEnvironment(); // @not_implemented
   cEnvironment(const cEnvironment&); // @not_implemented

Modified: development/source/main/cOrganism.cc
===================================================================
--- development/source/main/cOrganism.cc	2007-03-15 21:55:49 UTC (rev 1404)
+++ development/source/main/cOrganism.cc	2007-03-16 02:58:31 UTC (rev 1405)
@@ -206,7 +206,7 @@
   if (!m_world->GetConfig().SAVE_RECEIVED.Get()) received_messages_point = NULL;
   
   cTaskContext taskctx(m_interface, m_input_buf, m_output_buf, other_input_list, other_output_list, net_valid, 0, on_divide, received_messages_point);
-  m_phenotype.TestOutput(ctx, taskctx, resource_count, res_change, insts_triggered, &  clear_input);
+  m_phenotype.TestOutput(ctx, taskctx, resource_count, res_change, insts_triggered);
   m_interface->UpdateResources(res_change);
 
   for (int i = 0; i < insts_triggered.GetSize(); i++) {
@@ -371,16 +371,14 @@
     bool clear_input;
 
     cTaskContext taskctx(m_interface, m_input_buf, m_output_buf, other_input_list, other_output_list, false, completed);
-    m_phenotype.TestOutput(ctx, taskctx, resource_count, res_change, insts_triggered, &clear_input);
+    m_phenotype.TestOutput(ctx, taskctx, resource_count, res_change, insts_triggered);
     m_interface->UpdateResources(res_change);
     
     for (int i = 0; i < insts_triggered.GetSize(); i++) {
       const int cur_inst = insts_triggered[i];
       m_hardware->ProcessBonusInst(ctx, cInstruction(cur_inst) );
     }
-    
-    if (clear_input) m_input_buf.Clear();
-  }
+}
   
   return true;
 }

Modified: development/source/main/cPhenotype.cc
===================================================================
--- development/source/main/cPhenotype.cc	2007-03-15 21:55:49 UTC (rev 1404)
+++ development/source/main/cPhenotype.cc	2007-03-16 02:58:31 UTC (rev 1405)
@@ -42,12 +42,15 @@
   : m_world(world)
   , initialized(false)
   , cur_task_count(m_world->GetEnvironment().GetNumTasks())
-  , cur_task_quality(m_world->GetEnvironment().GetNumTasks())
+  , eff_task_count(m_world->GetEnvironment().GetNumTasks())
+  , cur_task_quality(m_world->GetEnvironment().GetNumTasks())  
   , cur_reaction_count(m_world->GetEnvironment().GetReactionLib().GetSize())
+  , cur_reaction_add_reward(m_world->GetEnvironment().GetReactionLib().GetSize())
   , cur_inst_count(world->GetHardwareManager().GetInstSet().GetSize())
   , cur_sense_count(m_world->GetStats().GetSenseSize())
   , sensed_resources(m_world->GetEnvironment().GetResourceLib().GetSize())
   , last_task_count(m_world->GetEnvironment().GetNumTasks())
+  , last_reaction_add_reward(m_world->GetEnvironment().GetReactionLib().GetSize())  
   , last_task_quality(m_world->GetEnvironment().GetNumTasks())
   , last_reaction_count(m_world->GetEnvironment().GetReactionLib().GetSize())
   , last_inst_count(world->GetHardwareManager().GetInstSet().GetSize())
@@ -124,26 +127,28 @@
   cur_num_errors  = 0;
   cur_num_donates  = 0;
   cur_task_count.SetAll(0);
+  eff_task_count.SetAll(0);
   cur_task_quality.SetAll(0);
   cur_reaction_count.SetAll(0);
+  cur_reaction_add_reward.SetAll(0);
   cur_inst_count.SetAll(0);
   cur_sense_count.SetAll(0);  
   for (int j = 0; j < sensed_resources.GetSize(); j++)
 	      sensed_resources[j] =  parent_phenotype.sensed_resources[j];
 
   // Copy last values from parent
-  last_merit_base     = parent_phenotype.last_merit_base;
-  last_bonus          = parent_phenotype.last_bonus;
-  last_num_errors     = parent_phenotype.last_num_errors;
-  last_num_donates    = parent_phenotype.last_num_donates;
-  last_task_count     = parent_phenotype.last_task_count;
-  last_task_quality   = parent_phenotype.last_task_quality;
-  last_reaction_count = parent_phenotype.last_reaction_count;
-  last_inst_count     = parent_phenotype.last_inst_count;
-  last_sense_count    = parent_phenotype.last_sense_count;
-  last_fitness        = last_merit_base * last_bonus / gestation_time;
+  last_merit_base           = parent_phenotype.last_merit_base;
+  last_bonus                = parent_phenotype.last_bonus;
+  last_num_errors           = parent_phenotype.last_num_errors;
+  last_num_donates          = parent_phenotype.last_num_donates;
+  last_task_count           = parent_phenotype.last_task_count;
+  last_task_quality         = parent_phenotype.last_task_quality;
+  last_reaction_count       = parent_phenotype.last_reaction_count;
+  last_reaction_add_reward  = parent_phenotype.last_reaction_add_reward;
+  last_inst_count           = parent_phenotype.last_inst_count;
+  last_sense_count          = parent_phenotype.last_sense_count;
+  last_fitness              = last_merit_base * last_bonus / gestation_time;
 
-
   // Setup other miscellaneous values...
   num_divides     = 0;
   generation      = parent_phenotype.generation;
@@ -211,8 +216,10 @@
   cur_num_errors  = 0;
   cur_num_donates  = 0;
   cur_task_count.SetAll(0);
+  eff_task_count.SetAll(0);
   cur_task_quality.SetAll(0);
   cur_reaction_count.SetAll(0);
+  cur_reaction_add_reward.SetAll(0);
   cur_inst_count.SetAll(0);
   sensed_resources.SetAll(0);
   cur_sense_count.SetAll(0);
@@ -225,6 +232,7 @@
   last_task_count.SetAll(0);
   last_task_quality.SetAll(0);
   last_reaction_count.SetAll(0);
+  last_reaction_add_reward.SetAll(0);
   last_sense_count.SetAll(0);
 
   // Setup other miscellaneous values...
@@ -297,23 +305,26 @@
   fitness         = merit.GetDouble() / gestation_time;
 
   // Lock in cur values as last values.
-  last_merit_base     = cur_merit_base;
-  last_bonus          = cur_bonus;
-  last_num_errors     = cur_num_errors;
-  last_num_donates    = cur_num_donates;
-  last_task_count     = cur_task_count;
-  last_task_quality   = cur_task_quality;
-  last_reaction_count = cur_reaction_count;
-  last_inst_count     = cur_inst_count;
-  last_sense_count    = cur_sense_count;
+  last_merit_base           = cur_merit_base;
+  last_bonus                = cur_bonus;
+  last_num_errors           = cur_num_errors;
+  last_num_donates          = cur_num_donates;
+  last_task_count           = cur_task_count;
+  last_task_quality         = cur_task_quality;
+  last_reaction_count       = cur_reaction_count;
+  last_reaction_add_reward  = cur_reaction_add_reward;
+  last_inst_count           = cur_inst_count;
+  last_sense_count          = cur_sense_count;
 
   // Reset cur values.
   cur_bonus       = m_world->GetConfig().DEFAULT_BONUS.Get();
   cur_num_errors  = 0;
   cur_num_donates  = 0;
   cur_task_count.SetAll(0);
+  eff_task_count.SetAll(0);
   cur_task_quality.SetAll(0);
   cur_reaction_count.SetAll(0);
+  cur_reaction_add_reward.SetAll(0);
   cur_inst_count.SetAll(0);
   cur_sense_count.SetAll(0);
 
@@ -393,23 +404,26 @@
   (void) div_type; 				// Unchanged
 
   // Lock in cur values as last values.
-  last_merit_base     = cur_merit_base;
-  last_bonus          = cur_bonus;
-  last_num_errors     = cur_num_errors;
-  last_num_donates    = cur_num_donates;
-  last_task_count     = cur_task_count;
-  last_task_quality   = cur_task_quality;
-  last_reaction_count = cur_reaction_count;
-  last_inst_count     = cur_inst_count;
-  last_sense_count    = cur_sense_count;  
+  last_merit_base           = cur_merit_base;
+  last_bonus                = cur_bonus;
+  last_num_errors           = cur_num_errors;
+  last_num_donates          = cur_num_donates;
+  last_task_count           = cur_task_count;
+  last_task_quality         = cur_task_quality;
+  last_reaction_count       = cur_reaction_count;
+  last_reaction_add_reward  = cur_reaction_add_reward;
+  last_inst_count           = cur_inst_count;
+  last_sense_count          = cur_sense_count;  
 
   // Reset cur values.
   cur_bonus       = m_world->GetConfig().DEFAULT_BONUS.Get();
   cur_num_errors  = 0;
   cur_num_donates  = 0;
   cur_task_count.SetAll(0);
+  eff_task_count.SetAll(0);
   cur_task_quality.SetAll(0);
   cur_reaction_count.SetAll(0);
+  cur_reaction_add_reward.SetAll(0);
   cur_inst_count.SetAll(0);
   cur_sense_count.SetAll(0); 
   sensed_resources.SetAll(-1.0);
@@ -482,7 +496,9 @@
   cur_num_errors  = 0;
   cur_num_donates  = 0;
   cur_task_count.SetAll(0);
+  eff_task_count.SetAll(0);
   cur_reaction_count.SetAll(0);
+  cur_reaction_add_reward.SetAll(0);
   cur_inst_count.SetAll(0);
   cur_sense_count.SetAll(0);  
   for (int j = 0; j < sensed_resources.GetSize(); j++)
@@ -490,15 +506,16 @@
 
 
   // Copy last values from parent
-  last_merit_base     = clone_phenotype.last_merit_base;
-  last_bonus          = clone_phenotype.last_bonus;
-  last_num_errors     = clone_phenotype.last_num_errors;
-  last_num_donates    = clone_phenotype.last_num_donates;
-  last_task_count     = clone_phenotype.last_task_count;
-  last_reaction_count = clone_phenotype.last_reaction_count;
-  last_inst_count     = clone_phenotype.last_inst_count;
-  last_sense_count    = clone_phenotype.last_sense_count;  
-  last_fitness        = last_merit_base * last_bonus / gestation_time;
+  last_merit_base          = clone_phenotype.last_merit_base;
+  last_bonus               = clone_phenotype.last_bonus;
+  last_num_errors          = clone_phenotype.last_num_errors;
+  last_num_donates         = clone_phenotype.last_num_donates;
+  last_task_count          = clone_phenotype.last_task_count;
+  last_reaction_count      = clone_phenotype.last_reaction_count;
+  last_reaction_add_reward = clone_phenotype.last_reaction_add_reward;
+  last_inst_count          = clone_phenotype.last_inst_count;
+  last_sense_count         = clone_phenotype.last_sense_count;  
+  last_fitness             = last_merit_base * last_bonus / gestation_time;
 
   // Setup other miscellaneous values...
   num_divides     = 0;
@@ -552,12 +569,9 @@
 
 bool cPhenotype::TestOutput(cAvidaContext& ctx, cTaskContext& taskctx,
 			    const tArray<double>& res_in, tArray<double>& res_change,
-			    tArray<int>& insts_triggered, bool* clear_input)
+			    tArray<int>& insts_triggered)
 {
   assert(initialized == true);
-  assert(clear_input!= NULL);
-  *clear_input = false; // set default in case we bail in the middle
-  
   taskctx.SetTaskStates(&m_task_states);
 
   const cEnvironment& env = m_world->GetEnvironment();
@@ -568,7 +582,7 @@
   cReactionResult result(num_resources, num_tasks, num_reactions);
 			
   // Run everything through the environment.
-  bool found = env.TestOutput(ctx, result, taskctx, cur_task_count, cur_reaction_count, res_in);
+  bool found = env.TestOutput(ctx, result, taskctx, eff_task_count, cur_reaction_count, res_in);
 
   // If nothing was found, stop here.
   if (found == false) {
@@ -579,11 +593,16 @@
   // Update the phenotype with the results...
   // Start with updating task and reaction counters
   for (int i = 0; i < num_tasks; i++) {
-    if (result.TaskDone(i) == true) cur_task_count[i]++;
+    if (result.TaskDone(i) == true) 
+    {
+      cur_task_count[i]++;
+      eff_task_count[i]++;
+    }
     if (result.TaskQuality(i) > 0) cur_task_quality[i]+= result.TaskQuality(i);
   }
   for (int i = 0; i < num_reactions; i++) {
     if (result.ReactionTriggered(i) == true) cur_reaction_count[i]++;
+    cur_reaction_add_reward[i] += result.GetReactionAddBonus(i);
   }
 
   // Update the merit bonus
@@ -605,8 +624,6 @@
 
   //Kill any cells that did lethal reactions
   to_die = result.GetLethal();
-
-  *clear_input = result.GetClearInput();
   
   return true;
 }

Modified: development/source/main/cPhenotype.h
===================================================================
--- development/source/main/cPhenotype.h	2007-03-15 21:55:49 UTC (rev 1404)
+++ development/source/main/cPhenotype.h	2007-03-16 02:58:31 UTC (rev 1405)
@@ -93,7 +93,7 @@
   int gestation_time;       // CPU cycles to produce offspring (or be produced),
                             // including additional time costs of some instructions.
   int gestation_start;      // Total instructions executed at last divide.
-  double fitness;           // Relative efective replication rate...
+  double fitness;           // Relative effective replication rate...
   double div_type;          // Type of the divide command used
 
   // 2. These are "in progress" variables, updated as the organism operates
@@ -101,10 +101,12 @@
   int cur_num_errors;             // Total instructions executed illeagally.
   int cur_num_donates;            // Number of donations so far
   tArray<int> cur_task_count;     // Total times each task was performed
+  tArray<int> eff_task_count;     // Total times each task was performed (resetable during the life of the organism)
   tArray<double> cur_task_quality;	  // Average (total?) quality with which each task was performed
-  tArray<int> cur_reaction_count; // Total times each reaction was triggered.
+  tArray<int> cur_reaction_count; // Total times each reaction was triggered.  
+  tArray<double> cur_reaction_add_reward; // Bonus change from triggering each reaction.
   tArray<int> cur_inst_count;	    // Intsruction exection counter
-  tArray<int> cur_sense_count;     // Total times resource combinations have been sensed; JEB 10-22-06 
+  tArray<int> cur_sense_count;     // Total times resource combinations have been sensed; @JEB 
   tArray<double> sensed_resources; // Resources of which the organism is explictly aware
   tArray<cCodeLabel> active_transposons; // Transposons that are active
   tHashTable<void*, cTaskState*> m_task_states;
@@ -117,8 +119,9 @@
   tArray<int> last_task_count;
   tArray<double> last_task_quality;
   tArray<int> last_reaction_count;
+  tArray<double> last_reaction_add_reward; 
   tArray<int> last_inst_count;	  // Instruction exection counter
-  tArray<int> last_sense_count;   // Total times resource combinations have been sensed; JEB 10-22-06 
+  tArray<int> last_sense_count;   // Total times resource combinations have been sensed; @JEB 
   double last_fitness;            // Used to determine sterilization.
 
   // 4. Records from this organisms life...
@@ -189,7 +192,7 @@
   bool TestInput(tBuffer<int>& inputs, tBuffer<int>& outputs);
   bool TestOutput(cAvidaContext& ctx, cTaskContext& taskctx,
                   const tArray<double>& res_in, tArray<double>& res_change,
-                  tArray<int>& insts_triggered, bool* clear_input);
+                  tArray<int>& insts_triggered);
 
   // State saving and loading, and printing...
   bool SaveState(std::ofstream& fp);
@@ -221,6 +224,7 @@
   int GetCurNumErrors() const { assert(initialized == true); return cur_num_errors; }
   int GetCurNumDonates() const { assert(initialized == true); return cur_num_donates; }
   const tArray<int>& GetCurTaskCount() const { assert(initialized == true); return cur_task_count; }
+  void ClearEffTaskCount() { assert(initialized == true); eff_task_count.SetAll(0); }
   const tArray<double> & GetCurTaskQuality() const { assert(initialized == true); return cur_task_quality; }
   const tArray<int>& GetCurReactionCount() const { assert(initialized == true); return cur_reaction_count;}
   const tArray<int>& GetCurInstCount() const { assert(initialized == true); return cur_inst_count; }
@@ -236,6 +240,7 @@
   const tArray<int>& GetLastTaskCount() const { assert(initialized == true); return last_task_count; }
   const tArray<double>& GetLastTaskQuality() const { assert(initialized == true); return last_task_quality; }
   const tArray<int>& GetLastReactionCount() const { assert(initialized == true); return last_reaction_count; }
+  const tArray<double>& GetLastReactionAddReward() const { assert(initialized == true); return last_reaction_add_reward; }
   const tArray<int>& GetLastInstCount() const { assert(initialized == true); return last_inst_count; }
   const tArray<int>& GetLastSenseCount() const { assert(initialized == true); return last_sense_count; }
   double GetLastFitness() const { assert(initialized == true); return last_fitness; }

Modified: development/source/main/cPopulation.cc
===================================================================
--- development/source/main/cPopulation.cc	2007-03-15 21:55:49 UTC (rev 1404)
+++ development/source/main/cPopulation.cc	2007-03-16 02:58:31 UTC (rev 1405)
@@ -309,7 +309,7 @@
   // Loop through choosing the later placement of each child in the population.
   bool parent_alive = true;  // Will the parent live through this process?
   for (int i = 0; i < child_array.GetSize(); i++) {
-    target_cells[i] = PositionChild(parent_cell).GetID();
+    target_cells[i] = PositionChild(parent_cell, m_world->GetConfig().ALLOW_PARENT.Get()).GetID();
     
     // If we replaced the parent, make a note of this.
     if (target_cells[i] == parent_cell.GetID()) parent_alive = false;      
@@ -1427,8 +1427,8 @@
   stats.SumExeSize().Clear();
   stats.SumMemSize().Clear();
   
-  
   stats.ZeroTasks();
+  stats.ZeroRewards();
   
 #if INSTRUCTION_COUNT
   stats.ZeroInst();
@@ -1516,6 +1516,11 @@
       } 
     }
     
+    // Record what add bonuses this organism garnered for different reactions    
+    for (int j = 0; j < m_world->GetNumReactions(); j++) {
+      stats.AddLastReactionAddReward(j, phenotype.GetLastReactionAddReward()[j]);    
+    }
+    
     // Test what resource combinations this creature has sensed
     for (int j = 0; j < stats.GetSenseSize(); j++) {
       if (phenotype.GetLastSenseCount()[j] > 0) {

Modified: development/source/main/cReactionProcess.h
===================================================================
--- development/source/main/cReactionProcess.h	2007-03-15 21:55:49 UTC (rev 1404)
+++ development/source/main/cReactionProcess.h	2007-03-16 02:58:31 UTC (rev 1405)
@@ -55,7 +55,6 @@
   bool lethal;		 // Lethality of reaction
   cString match_string;	 // Bit string to match if this is a match string reaction
   int inst_id;           // Instruction to be triggered if reaction successful.
-  bool clears_input;     // Does execution of this task clear the input buffer
 
   // Resource detection
   cResource * detect;    // Resource Measured
@@ -78,7 +77,6 @@
     , conversion(1.0)
     , lethal(0)
     , inst_id(-1)
-    , clears_input(false)
     , detect(NULL)
     , detection_threshold(0.0)
     , detection_error(0.0)
@@ -95,7 +93,6 @@
   cResource* GetProduct() const { return product; }
   double GetConversion() const { return conversion; }
   int GetInstID() const { return inst_id; }
-  bool GetClearsInput() const { return clears_input; }
   bool GetLethal() const { return lethal; }
   cResource* GetDetect() const { return detect; }
   double GetDetectionThreshold() const { return detection_threshold; }
@@ -111,7 +108,6 @@
   void SetProduct(cResource* _in) { product = _in; }
   void SetConversion(double _in) { conversion = _in; }
   void SetInstID(int _in) { inst_id = _in; }
-  void SetClearsInput(bool _in) { clears_input = _in; }  
   void SetLethal(int _in) { lethal = _in; }
   void SetDetect(cResource* _in) { detect = _in; }
   void SetDetectionThreshold(double _in) { detection_threshold = _in; }

Modified: development/source/main/cReactionResult.cc
===================================================================
--- development/source/main/cReactionResult.cc	2007-03-15 21:55:49 UTC (rev 1404)
+++ development/source/main/cReactionResult.cc	2007-03-16 02:58:31 UTC (rev 1405)
@@ -35,12 +35,12 @@
   , tasks_done(num_tasks)
   , tasks_quality(num_tasks)
   , reactions_triggered(num_reactions)
+  , reaction_add_bonus(num_reactions)
   , bonus_add(0.0)
   , bonus_mult(1.0)
   , insts_triggered(0)
   , lethal(false)
   , active_reaction(false)
-  , clear_input(false)
 {
 }
 
@@ -56,6 +56,7 @@
   tasks_done.SetAll(false);
   tasks_quality.SetAll(0.0);
   reactions_triggered.SetAll(false);
+  reaction_add_bonus.SetAll(0.0);
 
   // And finally note that this is indeed already active.
   active_reaction = true;
@@ -103,10 +104,11 @@
 }
 
 
-void cReactionResult::AddBonus(double value)
+void cReactionResult::AddBonus(double value, int id)
 {
   ActivateReaction();
   bonus_add += value;
+  reaction_add_bonus[id] += value;
 }
 
 

Modified: development/source/main/cReactionResult.h
===================================================================
--- development/source/main/cReactionResult.h	2007-03-15 21:55:49 UTC (rev 1404)
+++ development/source/main/cReactionResult.h	2007-03-16 02:58:31 UTC (rev 1405)
@@ -38,14 +38,13 @@
   tArray<bool> tasks_done;
   tArray<double> tasks_quality;
   tArray<bool> reactions_triggered;
+  tArray<double> reaction_add_bonus; 
   double bonus_add;
   double bonus_mult;
   tArray<int> insts_triggered;
   bool lethal;
   bool active_reaction;
-  bool clear_input;
 
-
   inline void ActivateReaction();
   
   cReactionResult(); // @not_implemented
@@ -65,21 +64,20 @@
   void MarkTask(int id, const double quality=1);
 
   void MarkReaction(int id);
-  void AddBonus(double value);
+  void AddBonus(double value, int id);
   void MultBonus(double value);
+  
   void AddInst(int id);
   
-  void SetClearInput(bool _in) { clear_input = _in; }
-
   double GetConsumed(int id);
   double GetProduced(int id);
   double GetDetected(int id);
   bool GetLethal();  
-  bool GetClearInput() { return clear_input; }
   bool ReactionTriggered(int id);
   bool TaskDone(int id);
   double TaskQuality(int id);
   double GetAddBonus() { return bonus_add; }
+  double GetReactionAddBonus(const int i) { return reaction_add_bonus[i]; }
   double GetMultBonus() { return bonus_mult; }
   tArray<int>& GetInstArray() { return insts_triggered; }
 };

Modified: development/source/main/cStats.cc
===================================================================
--- development/source/main/cStats.cc	2007-03-15 21:55:49 UTC (rev 1404)
+++ development/source/main/cStats.cc	2007-03-16 02:58:31 UTC (rev 1405)
@@ -136,6 +136,9 @@
 
   reaction_count.Resize( m_world->GetNumReactions() );
   reaction_count.SetAll(0);
+  
+  reaction_add_reward.Resize( m_world->GetNumReactions() );
+  reaction_add_reward.SetAll(0);
 
   resource_count.Resize( m_world->GetNumResources() );
   resource_count.SetAll(0);
@@ -289,7 +292,12 @@
   }
 }
 
+void cStats::ZeroRewards()
+{
+  reaction_add_reward.SetAll(0);
+}
 
+
 #if INSTRUCTION_COUNT
 void cStats::ZeroInst()
 {
@@ -431,6 +439,8 @@
   sense_last_count.SetAll(0);
   sense_last_exe_count.SetAll(0);
 
+  reaction_add_reward.SetAll(0);
+
   dom_merit = 0;
   dom_gestation = 0.0;
   dom_fitness = 0.0;
@@ -754,6 +764,23 @@
   df.Endl();
 }
 
+void cStats::PrintReactionRewardData(const cString& filename)
+{
+  cDataFile& df = m_world->GetDataFile(filename);
+
+  df.WriteComment("Avida reaction data");
+  df.WriteTimeStamp();
+  df.WriteComment("First column gives the current update, all further columns give the add bonus reward");
+  df.WriteComment("currently living organisms have garnered from each reaction.");
+
+  df.Write(m_update,   "Update");
+  for (int i = 0; i < reaction_count.GetSize(); i++) {
+    df.Write(reaction_add_reward[i], reaction_names[i] );
+  }
+  df.Endl();
+}
+
+
 void cStats::PrintResourceData(const cString& filename)
 {
   cDataFile& df = m_world->GetDataFile(filename);

Modified: development/source/main/cStats.h
===================================================================
--- development/source/main/cStats.h	2007-03-15 21:55:49 UTC (rev 1404)
+++ development/source/main/cStats.h	2007-03-16 02:58:31 UTC (rev 1405)
@@ -218,6 +218,7 @@
   tArray<int> task_exe_count;
 
   tArray<double> reaction_count;
+  tArray<double> reaction_add_reward;
   tArray<double> resource_count;
   tArray<int> resource_geometry;
   tArray< tArray<double> > spatial_res_count;
@@ -456,6 +457,9 @@
     { sense_last_exe_count[res_comb_index]+= count; }
     
   void SetReactions(const tArray<double> &_in) { reaction_count = _in; }
+  void AddLastReactionAddReward(int _id, double _reward) { reaction_add_reward[_id] += _reward; }
+  void ZeroRewards();
+  
   void SetResources(const tArray<double> &_in) { resource_count = _in; }
   void SetResourcesGeometry(const tArray<int> &_in) { resource_geometry = _in;}
   void SetSpatialRes(const tArray< tArray<double> > &_in) { 
@@ -587,6 +591,7 @@
   void PrintTasksExeData(const cString& filename);
   void PrintTasksQualData(const cString& filename);
   void PrintReactionData(const cString& filename);
+  void PrintReactionRewardData(const cString& filename);
   void PrintResourceData(const cString& filename);
   void PrintSpatialResData(const cString& filename, int i);
   void PrintTimeData(const cString& filename);

Modified: development/source/tools/tHashTable.h
===================================================================
--- development/source/tools/tHashTable.h	2007-03-15 21:55:49 UTC (rev 1404)
+++ development/source/tools/tHashTable.h	2007-03-16 02:58:31 UTC (rev 1405)
@@ -292,7 +292,7 @@
     // Determine the bin that we are going to be using.
     const int bin = HashKey(key);
     
-    DATA_TYPE out_data;
+    DATA_TYPE out_data = NULL;
     assert(cell_array[bin] != NULL);
     list_it.Set(cell_array[bin]);
     

Modified: development/support/scripts/trace_movie.pl
===================================================================
--- development/support/scripts/trace_movie.pl	2007-03-15 21:55:49 UTC (rev 1404)
+++ development/support/scripts/trace_movie.pl	2007-03-16 02:58:31 UTC (rev 1405)
@@ -6,11 +6,11 @@
 
 =head1 NAME
 
-trace_movie.perl
+trace_movie.pl
 
 =head1 SYNOPSIS
 
-Usage: trace_movie.perl -i trace_file -o matlab_input_file
+Usage: trace_movie.pl -i org_file -t trace_file -o output_file [-m -f 10000]
 
 Create an image or a folder of images of organism instruction execution.
 
@@ -115,7 +115,7 @@
 		$t->{CX}->{'hex'} = $8;
 		
 		$t->{'aged_time'} = $t->{'time'};
-		if ( $_ =~ m/AgedTime:(\d+)/ )
+		if ( $_ =~ m/EnergyUsed:(\d+)/ )
 		{
 			$t->{'aged_time'} = $1;
 		}
@@ -288,6 +288,7 @@
 	'throwif!=0' => $max_label_size,
 	'catch' => $max_label_size,
 	'sense-m100' => $max_label_size,
+	'sense-unit' => $max_label_size,
 };
 
 our @execution_flare_colors = (




More information about the Avida-cvs mailing list