[Avida-SVN] r1867 - development/source/analyze

brysonda at myxo.css.msu.edu brysonda at myxo.css.msu.edu
Mon Jul 30 06:59:01 PDT 2007


Author: brysonda
Date: 2007-07-30 09:59:01 -0400 (Mon, 30 Jul 2007)
New Revision: 1867

Modified:
   development/source/analyze/cMutationalNeighborhood.cc
   development/source/analyze/cMutationalNeighborhood.h
Log:
MutationalNeighborhood: properly track pending fitness source.

Modified: development/source/analyze/cMutationalNeighborhood.cc
===================================================================
--- development/source/analyze/cMutationalNeighborhood.cc	2007-07-30 13:23:07 UTC (rev 1866)
+++ development/source/analyze/cMutationalNeighborhood.cc	2007-07-30 13:59:01 UTC (rev 1867)
@@ -163,7 +163,7 @@
   
   m_fitness_point.ResizeClear(m_base_genome.GetSize(), m_inst_set.GetSize());
   m_fitness_insert.ResizeClear(m_base_genome.GetSize() + 1, m_inst_set.GetSize());
-  m_fitness_delete.ResizeClear(m_base_genome.GetSize());
+  m_fitness_delete.ResizeClear(m_base_genome.GetSize(), 0);
   
   m_cur_site = 0;
   m_completed = 0;
@@ -232,7 +232,7 @@
   
   cCPUMemory mod_genome(m_base_genome);
   mod_genome.Remove(cur_site);
-  m_fitness_delete[cur_site] = ProcessOneStepGenome(ctx, testcpu, test_info, mod_genome, odata, cur_site);
+  m_fitness_delete[cur_site][0] = ProcessOneStepGenome(ctx, testcpu, test_info, mod_genome, odata, cur_site);
   ProcessTwoStepDelete(ctx, testcpu, test_info, cur_site, mod_genome);
   ProcessDeletePointCombo(ctx, testcpu, test_info, cur_site, mod_genome);
 }
@@ -301,6 +301,7 @@
 {
   const int inst_size = m_inst_set.GetSize();
   sTwoStep& tdata = m_twostep_point[cur_site];
+  sPendFit cur(m_fitness_point, cur_site, mod_genome[cur_site].GetOp());
 
   // Loop through remaining lines of genome, testing trying all combinations.
   for (int line_num = cur_site + 1; line_num < m_base_genome.GetSize(); line_num++) {
@@ -311,7 +312,7 @@
       if (cur_inst == inst_num) continue;
       
       mod_genome[line_num].SetOp(inst_num);
-      ProcessTwoStepGenome(ctx, testcpu, test_info, mod_genome, tdata, line_num, cur_site);
+      ProcessTwoStepGenome(ctx, testcpu, test_info, mod_genome, tdata, sPendFit(m_fitness_point, line_num, inst_num), cur);
     }
     
     mod_genome[line_num].SetOp(cur_inst);
@@ -325,6 +326,7 @@
   const int inst_size = m_inst_set.GetSize();
   const int mod_size = mod_genome.GetSize();
   sTwoStep& tdata = m_twostep_insert[cur_site];
+  sPendFit cur(m_fitness_insert, cur_site, mod_genome[cur_site].GetOp());
   
   // Loop through all instructions...
   for (int line_num = cur_site + 1; line_num <= mod_size; line_num++) {
@@ -332,7 +334,7 @@
     
     for (int inst_num = 0; inst_num < inst_size; inst_num++) {
       mod_genome[cur_site].SetOp(inst_num);
-      ProcessTwoStepGenome(ctx, testcpu, test_info, mod_genome, tdata, line_num, cur_site);
+      ProcessTwoStepGenome(ctx, testcpu, test_info, mod_genome, tdata, sPendFit(m_fitness_insert, line_num - 1, inst_num), cur);
     }
     mod_genome.Remove(line_num);
   }
@@ -344,12 +346,13 @@
 {
   const int mod_size = mod_genome.GetSize();
   sTwoStep& tdata = m_twostep_delete[cur_site];
+  sPendFit cur(m_fitness_delete, cur_site, 0); // Delete 'inst' is always 0
   
   // Loop through all instructions...
   for (int line_num = cur_site; line_num < mod_size; line_num++) {
     int cur_inst = mod_genome[line_num].GetOp();
     mod_genome.Remove(line_num);
-    ProcessTwoStepGenome(ctx, testcpu, test_info, mod_genome, tdata, line_num + 1, cur_site);
+    ProcessTwoStepGenome(ctx, testcpu, test_info, mod_genome, tdata, sPendFit(m_fitness_delete, line_num + 1, 0), cur);
     mod_genome.Insert(line_num, cInstruction(cur_inst));
   }
 }
@@ -360,10 +363,12 @@
 {
   const int inst_size = m_inst_set.GetSize();
   sTwoStep& tdata = m_insert_point[cur_site];
+  sPendFit cur(m_fitness_insert, cur_site, mod_genome[cur_site].GetOp());
   
   // Loop through all lines of genome, testing trying all combinations.
   for (int line_num = 0; line_num < mod_genome.GetSize(); line_num++) {
     if (line_num == cur_site) continue; // Skip the site of the insertion
+    int actual = (line_num < cur_site) ? line_num : (line_num - 1); // if at or past insertion site, adjust pending target site
     
     int cur_inst = mod_genome[line_num].GetOp();
     
@@ -372,7 +377,7 @@
       if (cur_inst == inst_num) continue;
       
       mod_genome[line_num].SetOp(inst_num);
-      ProcessTwoStepGenome(ctx, testcpu, test_info, mod_genome, tdata, line_num, cur_site);
+      ProcessTwoStepGenome(ctx, testcpu, test_info, mod_genome, tdata, sPendFit(m_fitness_point, actual, inst_num), cur);
     }
     
     mod_genome[line_num].SetOp(cur_inst);
@@ -384,14 +389,16 @@
                                                        int cur_site, cCPUMemory& mod_genome)
 {
   sTwoStep& tdata = m_insert_delete[cur_site];
-  
+  sPendFit cur(m_fitness_insert, cur_site, mod_genome[cur_site].GetOp());
+
   // Loop through all lines of genome, testing trying all combinations.
   for (int line_num = 0; line_num < mod_genome.GetSize(); line_num++) {
     if (line_num == cur_site) continue; // Skip the site of the insertion
-
+    int actual = (line_num < cur_site) ? line_num : (line_num - 1); // if at or past insertion site, adjust pending target site
+    
     int cur_inst = mod_genome[line_num].GetOp();
     mod_genome.Remove(line_num);
-    ProcessTwoStepGenome(ctx, testcpu, test_info, mod_genome, tdata, line_num, cur_site);
+    ProcessTwoStepGenome(ctx, testcpu, test_info, mod_genome, tdata, sPendFit(m_fitness_delete, actual, 0), cur);
     mod_genome.Insert(line_num, cInstruction(cur_inst));
   }
 }
@@ -402,17 +409,19 @@
 {
   const int inst_size = m_inst_set.GetSize();
   sTwoStep& tdata = m_delete_point[cur_site];
+  sPendFit cur(m_fitness_delete, cur_site, 0); // Delete 'inst' is always 0
   
   // Loop through all lines of genome, testing trying all combinations.
   for (int line_num = 0; line_num < mod_genome.GetSize(); line_num++) {
     int cur_inst = mod_genome[line_num].GetOp();
+    int actual = (line_num < cur_site) ? line_num : (line_num + 1); // if at or past deletion site, adjust pending target site
     
     // Loop through all instructions...
     for (int inst_num = 0; inst_num < inst_size; inst_num++) {
       if (cur_inst == inst_num) continue;
       
       mod_genome[line_num].SetOp(inst_num);
-      ProcessTwoStepGenome(ctx, testcpu, test_info, mod_genome, tdata, line_num, cur_site);
+      ProcessTwoStepGenome(ctx, testcpu, test_info, mod_genome, tdata, sPendFit(m_fitness_point, actual, inst_num), cur);
     }
     
     mod_genome[line_num].SetOp(cur_inst);
@@ -421,7 +430,8 @@
 
 
 double cMutationalNeighborhood::ProcessTwoStepGenome(cAvidaContext& ctx, cTestCPU* testcpu, cCPUTestInfo& test_info,
-                                                     const cGenome& mod_genome, sTwoStep& tdata, int cur_site, int oth_site)
+                                                     const cGenome& mod_genome, sTwoStep& tdata,
+                                                     const sPendFit& cur, const sPendFit& oth)
 {
   // Run the modified genome through the Test CPU
   testcpu->TestGenome(ctx, test_info, mod_genome);
@@ -448,7 +458,7 @@
     }
   }
   
-  if (test_fitness >= m_neut_min) tdata.site_count[cur_site]++;
+  if (test_fitness >= m_neut_min) tdata.site_count[cur.site]++;
   
   if (test_fitness != 0.0) { // Only count tasks if the organism is alive
     const tArray<int>& cur_tasks = test_info.GetColonyOrganism()->GetPhenotype().GetLastTaskCount();    
@@ -471,8 +481,8 @@
       tdata.task_size_target += test_fitness;
       
       // Push both instructions as possible first mutations, for post determination of first step fitness effect
-      tdata.pending.Push(new sPendingTarget(oth_site, mod_genome[oth_site].GetOp()));
-      tdata.pending.Push(new sPendingTarget(cur_site, mod_genome[cur_site].GetOp()));
+      tdata.pending.Push(new sPendFit(oth));
+      tdata.pending.Push(new sPendFit(cur));
     }
   }
   
@@ -684,7 +694,7 @@
 
 void cMutationalNeighborhood::AggregateTwoStep(tArray<sTwoStep>& steps, sTwoStepAggregate tsa)
 {
-  sPendingTarget* pend = NULL;
+  sPendFit* pend = NULL;
 
   for (int i = 0; i < steps.GetSize(); i++) {
     sTwoStep& tdata = steps[i];
@@ -717,7 +727,7 @@
     tsa.task_size_knockout += tdata.task_size_knockout;
     
     while ((pend = tdata.pending.Pop())) {
-      double fitness = m_fitness_point[pend->site][pend->inst];
+      double fitness = pend->GetFitness();
       
       if (fitness == 0.0) {
         tsa.task_target_dead++;

Modified: development/source/analyze/cMutationalNeighborhood.h
===================================================================
--- development/source/analyze/cMutationalNeighborhood.h	2007-07-30 13:23:07 UTC (rev 1866)
+++ development/source/analyze/cMutationalNeighborhood.h	2007-07-30 13:59:01 UTC (rev 1867)
@@ -135,15 +135,20 @@
   // fitness values that may not have been calculated yet.  A pending list must be maintained for each site, as a
   // list in the main class would be subject to a race condition should two separate threads try to write to it
   // simultaneously.
-  struct sPendingTarget
+  struct sPendFit
   {
+    tMatrix<double>& fmat;
     int site;
     int inst;
-    sPendingTarget(int in_site, int in_inst) : site(in_site), inst(in_inst) { ; }
+    
+    sPendFit(tMatrix<double>& in_fmat, int in_site, int in_inst) : fmat(in_fmat), site(in_site), inst(in_inst) { ; }
+    sPendFit(const sPendFit& in_pf) : fmat(in_pf.fmat), site(in_pf.site), inst(in_pf.site) { ; }
+    
+    inline double GetFitness() { return fmat[site][inst]; }
   };
   struct sTwoStep : public sStep
   {
-    tList<sPendingTarget> pending;
+    tList<sPendFit> pending;
     
     sTwoStep() : sStep() { ; }
   };  
@@ -160,7 +165,7 @@
   // -----------------------------------------------------------------------------------------------------------------------
   tMatrix<double> m_fitness_point;
   tMatrix<double> m_fitness_insert;
-  tArray<double> m_fitness_delete;
+  tMatrix<double> m_fitness_delete;
   
 
 
@@ -273,7 +278,7 @@
   void ProcessInsertDeleteCombo(cAvidaContext& ctx, cTestCPU* testcpu, cCPUTestInfo& test_info, int cur_site, cCPUMemory& mod_genome);
   void ProcessDeletePointCombo(cAvidaContext& ctx, cTestCPU* testcpu, cCPUTestInfo& test_info, int cur_site, cGenome& mod_genome);
   double ProcessTwoStepGenome(cAvidaContext& ctx, cTestCPU* testcpu, cCPUTestInfo& test_info, const cGenome& mod_genome,
-                              sTwoStep& tdata, int cur_site, int oth_site);
+                              sTwoStep& tdata, const sPendFit& cur, const sPendFit& oth);
   void AggregateTwoStep(tArray<sTwoStep>& steps, sTwoStepAggregate osa);
   
   void ProcessComplete(cAvidaContext& ctx);




More information about the Avida-cvs mailing list