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

brysonda at myxo.css.msu.edu brysonda at myxo.css.msu.edu
Sun Jul 29 18:32:27 PDT 2007


Author: brysonda
Date: 2007-07-29 21:32:27 -0400 (Sun, 29 Jul 2007)
New Revision: 1862

Modified:
   development/source/analyze/cMutationalNeighborhood.cc
   development/source/analyze/cMutationalNeighborhood.h
Log:
MutationalNeighborhood: Reorganize and label the header file.  Implement two-step insert and delete process. No data reporting yet.

Modified: development/source/analyze/cMutationalNeighborhood.cc
===================================================================
--- development/source/analyze/cMutationalNeighborhood.cc	2007-07-30 00:55:46 UTC (rev 1861)
+++ development/source/analyze/cMutationalNeighborhood.cc	2007-07-30 01:32:27 UTC (rev 1862)
@@ -183,7 +183,7 @@
     mod_genome[cur_site].SetOp(inst_num);
     m_fitness_insert[cur_site][inst_num] = ProcessOneStepGenome(ctx, testcpu, test_info, mod_genome, odata, cur_site);
     
-    //ProcessTwoStepPoint(ctx, testcpu, test_info, cur_site, mod_genome);
+    ProcessTwoStepInsert(ctx, testcpu, test_info, cur_site, mod_genome);
   }  
 }
 
@@ -195,7 +195,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);
-  //ProcessTwoStepPoint(ctx, testcpu, test_info, cur_site, mod_genome);
+  ProcessTwoStepDelete(ctx, testcpu, test_info, cur_site, mod_genome);
 }
 
 
@@ -280,6 +280,42 @@
 }
 
 
+void cMutationalNeighborhood::ProcessTwoStepInsert(cAvidaContext& ctx, cTestCPU* testcpu, cCPUTestInfo& test_info,
+                                                   int cur_site, cCPUMemory& mod_genome)
+{
+  const int inst_size = m_inst_set.GetSize();
+  const int mod_size = mod_genome.GetSize();
+  sTwoStep& tdata = m_twostep_insert[cur_site];
+  
+  // Loop through all instructions...
+  for (int line_num = cur_site + 1; line_num <= mod_size; line_num++) {
+    mod_genome.Insert(line_num, cInstruction(0));
+    
+    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);
+    }
+    mod_genome.Remove(line_num);
+  }
+}
+
+
+void cMutationalNeighborhood::ProcessTwoStepDelete(cAvidaContext& ctx, cTestCPU* testcpu, cCPUTestInfo& test_info,
+                                                   int cur_site, cCPUMemory& mod_genome)
+{
+  const int mod_size = mod_genome.GetSize();
+  sTwoStep& tdata = m_twostep_delete[cur_site];
+  
+  // 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, cur_site);
+    mod_genome.Insert(line_num, cInstruction(cur_inst));
+  }
+}
+
+
 double cMutationalNeighborhood::ProcessTwoStepGenome(cAvidaContext& ctx, cTestCPU* testcpu, cCPUTestInfo& test_info,
                                                      const cGenome& mod_genome, sTwoStep& tdata, int cur_site, int oth_site)
 {

Modified: development/source/analyze/cMutationalNeighborhood.h
===================================================================
--- development/source/analyze/cMutationalNeighborhood.h	2007-07-30 00:55:46 UTC (rev 1861)
+++ development/source/analyze/cMutationalNeighborhood.h	2007-07-30 01:32:27 UTC (rev 1862)
@@ -48,6 +48,7 @@
 #endif
 
 class cAvidaContext;
+class cCPUMemory;
 class cCPUTestInfo;
 class cDataFile;
 class cInstSet;
@@ -64,7 +65,7 @@
   cWorld* m_world;
   
   // Internal state information
-  // --------------------------------------------------------------------------
+  // -----------------------------------------------------------------------------------------------------------------------
   cRWLock m_rwlock;
   cMutex m_mutex;
   
@@ -72,6 +73,25 @@
   int m_cur_site;
   int m_completed;
   
+  const cInstSet& m_inst_set;  
+  int m_target;
+  
+  
+  
+  // Base data
+  // -----------------------------------------------------------------------------------------------------------------------
+  cGenome m_base_genome;
+  double m_base_fitness;
+  double m_base_merit;
+  double m_base_gestation;
+  tArray<int> m_base_tasks;
+  double m_neut_min;  // These two variables are a range around the base
+  double m_neut_max;  //   fitness to be counted as neutral mutations.
+  
+  
+
+  // One Step Per-Site Data
+  // -----------------------------------------------------------------------------------------------------------------------
   struct sStep
   {
     int total;
@@ -107,13 +127,20 @@
   tArray<sStep> m_onestep_insert;
   tArray<sStep> m_onestep_delete;
   
+
+  // Two Step Per-Site Data
+  // -----------------------------------------------------------------------------------------------------------------------
+  
+  // Based on sStep, the sTwoStep data structure adds a pending list to calculate fitness effects based single step
+  // 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
   {
     int site;
     int inst;
     sPendingTarget(int in_site, int in_inst) : site(in_site), inst(in_inst) { ; }
   };
-
   struct sTwoStep : public sStep
   {
     tList<sPendingTarget> pending;
@@ -122,27 +149,17 @@
   tArray<sTwoStep> m_twostep_insert;
   tArray<sTwoStep> m_twostep_delete;
 
+
+  // One Step Fitness Data
+  // -----------------------------------------------------------------------------------------------------------------------
   tMatrix<double> m_fitness_point;
   tMatrix<double> m_fitness_insert;
   tArray<double> m_fitness_delete;
-    
-  const cInstSet& m_inst_set;  
-  int m_target;
   
-  
-  // Base data
-  // --------------------------------------------------------------------------
-  cGenome m_base_genome;
-  double m_base_fitness;
-  double m_base_merit;
-  double m_base_gestation;
-  tArray<int> m_base_tasks;
-  double m_neut_min;  // These two variables are a range around the base
-  double m_neut_max;  //   fitness to be counted as neutral mutations.
-  
-  
+
+
   // Aggregated One Step Data
-  // --------------------------------------------------------------------------
+  // -----------------------------------------------------------------------------------------------------------------------
   struct sOneStepAggregate
   {
     int total;
@@ -186,7 +203,7 @@
   
   
   // Aggregated Two Step Data
-  // --------------------------------------------------------------------------
+  // -----------------------------------------------------------------------------------------------------------------------
   struct sTwoStepAggregate
   {
     int total;
@@ -234,6 +251,27 @@
 
   
   
+  cMutationalNeighborhood(); // @not_implemented
+  cMutationalNeighborhood(const cMutationalNeighborhood&); // @not_implemented
+  cMutationalNeighborhood& operator=(const cMutationalNeighborhood&); // @not_implemented
+  
+public:
+  // Public Methods - Instantiate and Process Only.   All results must be read with a cMutationalNeighborhood object.
+  // -----------------------------------------------------------------------------------------------------------------------
+  cMutationalNeighborhood(cWorld* world, const cGenome& genome, const cInstSet& inst_set, int target)
+    : m_world(world), m_initialized(false), m_inst_set(inst_set), m_target(target), m_base_genome(genome)
+  {
+    // Acquire write lock, to prevent any cMutationalNeighborhoodResults instances before computing
+    m_rwlock.WriteLock();
+  }
+  ~cMutationalNeighborhood() { ; }
+  
+  void Process(cAvidaContext& ctx);
+
+
+private:
+  // Internal Calculation Methods
+  // -----------------------------------------------------------------------------------------------------------------------
   void ProcessInitialize(cAvidaContext& ctx);
   
   void ProcessOneStepPoint(cAvidaContext& ctx, cTestCPU* testcpu, cCPUTestInfo& test_info, int cur_site);
@@ -243,35 +281,20 @@
                               sStep& odata, int cur_site);
   
   void ProcessTwoStepPoint(cAvidaContext& ctx, cTestCPU* testcpu, cCPUTestInfo& test_info, int cur_site, cGenome& mod_genome);
-  //  void ProcessTwoStepInsert(cAvidaContext& ctx, cTestCPU* testcpu, cCPUTestInfo& test_info, int cur_site, cGenome& mod_genome);
-//  void ProcessTwoStepDelete(cAvidaContext& ctx, cTestCPU* testcpu, cCPUTestInfo& test_info, int cur_site, cGenome& mod_genome);
-//  void ProcessInDelPointCombo(cAvidaContext& ctx, cTestCPU* testcpu, cCPUTestInfo& test_info, int cur_site, cGenome& mod_genome);
+  void ProcessTwoStepInsert(cAvidaContext& ctx, cTestCPU* testcpu, cCPUTestInfo& test_info, int cur_site, cCPUMemory& mod_genome);
+  void ProcessTwoStepDelete(cAvidaContext& ctx, cTestCPU* testcpu, cCPUTestInfo& test_info, int cur_site, cCPUMemory& mod_genome);
+  //  void ProcessInDelPointCombo(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);
   
-  
   void ProcessComplete(cAvidaContext& ctx);
   
   void AggregateOneStep(tArray<sStep>& steps, sOneStepAggregate osa);
   
-  cMutationalNeighborhood(); // @not_implemented
-  cMutationalNeighborhood(const cMutationalNeighborhood&); // @not_implemented
-  cMutationalNeighborhood& operator=(const cMutationalNeighborhood&); // @not_implemented
   
-public:
-  cMutationalNeighborhood(cWorld* world, const cGenome& genome, const cInstSet& inst_set, int target)
-  : m_world(world), m_initialized(false), m_inst_set(inst_set), m_target(target), m_base_genome(genome)
-  {
-    // Acquire write lock, to prevent any Results instances before computing
-	m_rwlock.WriteLock();
-  }
-  ~cMutationalNeighborhood() { ; }
   
-  void Process(cAvidaContext& ctx);
-
-  
-// These methods can only be accessed via a cMutationalNeighborhoodResults object
-private:
+  // cMutationalNeighborhoodResults Backing Methods
+  // -----------------------------------------------------------------------------------------------------------------------
   void PrintStats(cDataFile& df, int update = -1) const;
   
   inline int GetTargetTask() const { return m_target; }
@@ -509,15 +532,4 @@
 };
 
 
-#ifdef ENABLE_UNIT_TESTS
-namespace nMutationalNeighborhood {
-  /**
-  * Run unit tests
-   *
-   * @param full Run full test suite; if false, just the fast tests.
-   **/
-  void UnitTests(bool full = false);
-}
-#endif  
-
 #endif




More information about the Avida-cvs mailing list