[Avida-SVN] r3297 - in development/source: cpu main

jbarrick at myxo.css.msu.edu jbarrick at myxo.css.msu.edu
Sun Jun 7 08:51:08 PDT 2009


Author: jbarrick
Date: 2009-06-07 11:51:08 -0400 (Sun, 07 Jun 2009)
New Revision: 3297

Modified:
   development/source/cpu/cHardwareBase.cc
   development/source/main/cAvidaConfig.h
   development/source/main/cMutationRates.cc
   development/source/main/cMutationRates.h
   development/source/main/cOrganism.h
Log:
Added options for all categories of mutations happening on divide with Poisson mean. Also changed mutation order so slip mutations always happen first.

Modified: development/source/cpu/cHardwareBase.cc
===================================================================
--- development/source/cpu/cHardwareBase.cc	2009-06-06 21:53:52 UTC (rev 3296)
+++ development/source/cpu/cHardwareBase.cc	2009-06-07 15:51:08 UTC (rev 3297)
@@ -209,9 +209,25 @@
   
   m_organism->GetPhenotype().SetDivType(mut_multiplier);
   
+  // @JEB 
+  // All slip mutations should happen first, so that there is a chance
+  // of getting a point mutation within one copy in the same divide.
+ 
   // Divide Slip Mutations - NOT COUNTED.
   if (m_organism->TestDivideSlip(ctx)) doSlipMutation(ctx, offspring_genome);
+ 
+  // Poisson Slip Mutations - NOT COUNTED
+  unsigned int num_poisson_slip = m_organism->NumDividePoissonSlip(ctx);
+  for (unsigned int i = 0; i < num_poisson_slip; i++) { doSlipMutation(ctx, offspring_genome);  }
     
+  // Slip Mutations (per site) - NOT COUNTED
+  if (m_organism->GetDivSlipProb() > 0) {
+    int num_mut = ctx.GetRandom().GetRandBinomial(offspring_genome.GetSize(), 
+                                                  m_organism->GetDivSlipProb() / mut_multiplier);
+    for (int i = 0; i < num_mut; i++) doSlipMutation(ctx, offspring_genome);
+  }
+  
+  
   // Divide Mutations
   if (m_organism->TestDivideMut(ctx) && totalMutations < maxmut) {
     const unsigned int mut_line = ctx.GetRandom().GetUInt(offspring_genome.GetSize());
@@ -220,7 +236,21 @@
     offspring_genome.GetMutationSteps().AddSubstitutionMutation(mut_line, before_mutation, offspring_genome[mut_line].GetSymbol());
     totalMutations++;
   }
+    
   
+  // Poisson Divide Mutations
+  unsigned int num_poisson_mut = m_organism->NumDividePoissonMut(ctx);
+  for (unsigned int i=0; i<num_poisson_mut; i++)
+  {
+    if (totalMutations >= maxmut) break;
+    const unsigned int mut_line = ctx.GetRandom().GetUInt(offspring_genome.GetSize());
+    char before_mutation = offspring_genome[mut_line].GetSymbol();
+    offspring_genome[mut_line] = m_inst_set->GetRandomInst(ctx);
+    offspring_genome.GetMutationSteps().AddSubstitutionMutation(mut_line, before_mutation, offspring_genome[mut_line].GetSymbol());
+    totalMutations++;
+  }
+ 
+  
   // Divide Insertions
   if (m_organism->TestDivideIns(ctx) && offspring_genome.GetSize() < max_genome_size && totalMutations < maxmut) {
     const unsigned int mut_line = ctx.GetRandom().GetUInt(offspring_genome.GetSize() + 1);
@@ -228,7 +258,21 @@
     offspring_genome.GetMutationSteps().AddInsertionMutation(mut_line, offspring_genome[mut_line].GetSymbol());
     totalMutations++;
   }
-  
+
+
+  // Poisson Divide Insertions
+  unsigned int num_poisson_ins = m_organism->NumDividePoissonIns(ctx);
+  for (unsigned int i=0; i<num_poisson_ins; i++)
+  {
+    if (offspring_genome.GetSize() >= max_genome_size) break;
+    if (totalMutations >= maxmut) break;
+    const unsigned int mut_line = ctx.GetRandom().GetUInt(offspring_genome.GetSize() + 1);
+    offspring_genome.Insert(mut_line, m_inst_set->GetRandomInst(ctx));
+    offspring_genome.GetMutationSteps().AddInsertionMutation(mut_line, offspring_genome[mut_line].GetSymbol());
+    totalMutations++;
+  }
+   
+   
   // Divide Deletions
   if (m_organism->TestDivideDel(ctx) && offspring_genome.GetSize() > min_genome_size && totalMutations < maxmut) {
     const unsigned int mut_line = ctx.GetRandom().GetUInt(offspring_genome.GetSize());
@@ -237,15 +281,26 @@
     totalMutations++;
   }
 
+
+  // Poisson Divide Deletions
+  unsigned int num_poisson_del = m_organism->NumDividePoissonDel(ctx);
+  for (unsigned int i=0; i<num_poisson_del; i++)
+  {
+    if (offspring_genome.GetSize() <= min_genome_size) break;
+    if (totalMutations >= maxmut) break;
+    const unsigned int mut_line = ctx.GetRandom().GetUInt(offspring_genome.GetSize());
+    offspring_genome.GetMutationSteps().AddDeletionMutation(mut_line, offspring_genome[mut_line].GetSymbol());
+    offspring_genome.Remove(mut_line);
+    totalMutations++;
+  }
+
+
   // Divide Uniform Mutations
   if (m_organism->TestDivideUniform(ctx) && totalMutations < maxmut) {
     if (doUniformMutation(ctx, offspring_genome)) totalMutations++;
   }
   
   
-  
-  
-  
   // Divide Mutations (per site)
   if (m_organism->GetDivMutProb() > 0 && totalMutations < maxmut) {
     int num_mut = ctx.GetRandom().GetRandBinomial(offspring_genome.GetSize(), 
@@ -262,7 +317,6 @@
     }
   }
 
-  
   // Insert Mutations (per site)
   if (m_organism->GetDivInsProb() > 0 && totalMutations < maxmut) {
     int num_mut = ctx.GetRandom().GetRandBinomial(offspring_genome.GetSize(), m_organism->GetDivInsProb());
@@ -324,18 +378,6 @@
     }
   }
   
-  
-  // Slip Mutations (per site) - NOT COUNTED
-  if (m_organism->GetDivSlipProb() > 0) {
-    int num_mut = ctx.GetRandom().GetRandBinomial(offspring_genome.GetSize(), 
-                                                  m_organism->GetDivSlipProb() / mut_multiplier);
-    for (int i = 0; i < num_mut; i++) doSlipMutation(ctx, offspring_genome);
-  }
-  
-  
-  
-  
-  
   // Mutations in the parent's genome
   if (m_organism->GetParentMutProb() > 0 && totalMutations < maxmut) {
     for (int i = 0; i < GetMemory().GetSize(); i++) {

Modified: development/source/main/cAvidaConfig.h
===================================================================
--- development/source/main/cAvidaConfig.h	2009-06-06 21:53:52 UTC (rev 3296)
+++ development/source/main/cAvidaConfig.h	2009-06-07 15:51:08 UTC (rev 3297)
@@ -395,12 +395,18 @@
   CONFIG_ADD_VAR(DIV_UNIFORM_PROB, double, 0.0, "Uniform mutation probability (per site, applied on divide)\n- Randomly applies any of the three classes of mutations (ins, del, point).");
   CONFIG_ADD_VAR(DIV_SLIP_PROB, double, 0.0, "Slip rate (per site, applied on divide)");
   
-  CONFIG_ADD_VAR(DIVIDE_MUT_PROB, double, 0.0, "Mutation rate (per divide)");
-  CONFIG_ADD_VAR(DIVIDE_INS_PROB, double, 0.05, "Insertion rate (per divide)");
-  CONFIG_ADD_VAR(DIVIDE_DEL_PROB, double, 0.05, "Deletion rate (per divide)");
-  CONFIG_ADD_VAR(DIVIDE_UNIFORM_PROB, double, 0.0, "Uniform mutation probability (per divide)\n- Randomly applies any of the three classes of mutations (ins, del, point).");
+  CONFIG_ADD_VAR(DIVIDE_MUT_PROB, double, 0.0, "Mutation rate (max one, per divide)");
+  CONFIG_ADD_VAR(DIVIDE_INS_PROB, double, 0.05, "Insertion rate (max one, per divide)");
+  CONFIG_ADD_VAR(DIVIDE_DEL_PROB, double, 0.05, "Deletion rate (max one, per divide)");
   CONFIG_ADD_VAR(DIVIDE_SLIP_PROB, double, 0.0, "Slip rate (per divide) - creates large deletions/duplications");
   
+  CONFIG_ADD_VAR(DIVIDE_POISSON_MUT_MEAN, double, 0.0, "Mutation rate (Poisson distributed, per divide)");
+  CONFIG_ADD_VAR(DIVIDE_POISSON_INS_MEAN, double, 0.0, "Insertion rate (Poisson distributed, per divide)");
+  CONFIG_ADD_VAR(DIVIDE_POISSON_DEL_MEAN, double, 0.0, "Deletion rate (Poisson distributed, per divide)");
+  CONFIG_ADD_VAR(DIVIDE_POISSON_SLIP_MEAN, double, 0.0, "Slip rate (Poisson distributed, per divide)");
+
+  CONFIG_ADD_VAR(DIVIDE_UNIFORM_PROB, double, 0.0, "Uniform mutation probability (per divide)\n- Randomly applies any of the three classes of mutations (ins, del, point).");
+  
   CONFIG_ADD_VAR(INJECT_INS_PROB, double, 0.0, "Insertion rate (per site, applied on inject)");
   CONFIG_ADD_VAR(INJECT_DEL_PROB, double, 0.0, "Deletion rate (per site, applied on inject)");
   CONFIG_ADD_VAR(INJECT_MUT_PROB, double, 0.0, "Mutation rate (per site, applied on inject)");

Modified: development/source/main/cMutationRates.cc
===================================================================
--- development/source/main/cMutationRates.cc	2009-06-06 21:53:52 UTC (rev 3296)
+++ development/source/main/cMutationRates.cc	2009-06-07 15:51:08 UTC (rev 3297)
@@ -46,6 +46,12 @@
   divide.divide_mut_prob = world->GetConfig().DIVIDE_MUT_PROB.Get();
   divide.divide_ins_prob = world->GetConfig().DIVIDE_INS_PROB.Get();
   divide.divide_del_prob = world->GetConfig().DIVIDE_DEL_PROB.Get();
+  
+  divide.divide_poisson_mut_mean = world->GetConfig().DIVIDE_POISSON_MUT_MEAN.Get();
+  divide.divide_poisson_ins_mean = world->GetConfig().DIVIDE_POISSON_INS_MEAN.Get();
+  divide.divide_poisson_del_mean = world->GetConfig().DIVIDE_POISSON_DEL_MEAN.Get();
+  divide.divide_poisson_slip_mean = world->GetConfig().DIVIDE_POISSON_SLIP_MEAN.Get();
+
   divide.divide_uniform_prob = world->GetConfig().DIVIDE_UNIFORM_PROB.Get();
   divide.divide_slip_prob = world->GetConfig().DIVIDE_SLIP_PROB.Get();
   
@@ -76,6 +82,12 @@
   divide.divide_mut_prob = 0.0;
   divide.divide_ins_prob = 0.0;
   divide.divide_del_prob = 0.0;
+  
+  divide.divide_poisson_mut_mean = 0.0;
+  divide.divide_poisson_ins_mean = 0.0;
+  divide.divide_poisson_del_mean = 0.0; 
+  divide.divide_poisson_slip_mean = 0.0; 
+
   divide.divide_uniform_prob = 0.0;
   divide.divide_slip_prob = 0.0;
   
@@ -106,6 +118,12 @@
   divide.divide_mut_prob = in_muts.divide.divide_mut_prob;
   divide.divide_ins_prob = in_muts.divide.divide_ins_prob;
   divide.divide_del_prob = in_muts.divide.divide_del_prob;
+  
+  divide.divide_poisson_mut_mean = in_muts.divide.divide_poisson_mut_mean;
+  divide.divide_poisson_ins_mean = in_muts.divide.divide_poisson_ins_mean;
+  divide.divide_poisson_del_mean = in_muts.divide.divide_poisson_del_mean;
+  divide.divide_poisson_slip_mean = in_muts.divide.divide_poisson_slip_mean;
+
   divide.divide_uniform_prob = in_muts.divide.divide_uniform_prob;
   divide.divide_slip_prob = in_muts.divide.divide_slip_prob;
   

Modified: development/source/main/cMutationRates.h
===================================================================
--- development/source/main/cMutationRates.h	2009-06-06 21:53:52 UTC (rev 3296)
+++ development/source/main/cMutationRates.h	2009-06-07 15:51:08 UTC (rev 3297)
@@ -60,6 +60,10 @@
     double divide_mut_prob;     // Max one per divide
     double divide_ins_prob;     // Max one per divide
     double divide_del_prob;     // Max one per divide
+    double divide_poisson_mut_mean;     // Allows multiple with constant genomic rate
+    double divide_poisson_ins_mean;     // Allows multiple with constant genomic rate
+    double divide_poisson_del_mean;     // Allows multiple with constant genomic rate
+    double divide_poisson_slip_mean;     // Allows multiple with constant genomic rate
     double divide_slip_prob;     // Max one per divide
     double divide_uniform_prob;
     double parent_mut_prob;
@@ -105,6 +109,16 @@
   bool TestDivideMut(cAvidaContext& ctx) const { return ctx.GetRandom().P(divide.divide_mut_prob); }
   bool TestDivideIns(cAvidaContext& ctx) const { return ctx.GetRandom().P(divide.divide_ins_prob); }
   bool TestDivideDel(cAvidaContext& ctx) const { return ctx.GetRandom().P(divide.divide_del_prob); }
+  
+  unsigned int NumDividePoissonMut(cAvidaContext& ctx) const 
+    { return (divide.divide_poisson_mut_mean == 0.0) ? 0 : ctx.GetRandom().GetRandPoisson(divide.divide_poisson_mut_mean); }
+  unsigned int NumDividePoissonIns(cAvidaContext& ctx) const 
+    { return (divide.divide_poisson_ins_mean == 0.0) ? 0 : ctx.GetRandom().GetRandPoisson(divide.divide_poisson_ins_mean); }
+  unsigned int NumDividePoissonDel(cAvidaContext& ctx) const 
+    { return (divide.divide_poisson_del_mean == 0.0) ? 0 : ctx.GetRandom().GetRandPoisson(divide.divide_poisson_del_mean); }
+ unsigned int NumDividePoissonSlip(cAvidaContext& ctx) const 
+    { return (divide.divide_poisson_slip_mean == 0.0) ? 0 : ctx.GetRandom().GetRandPoisson(divide.divide_poisson_slip_mean); }
+
   bool TestDivideSlip(cAvidaContext& ctx) const { return ctx.GetRandom().P(divide.divide_slip_prob); }
   bool TestDivideUniform(cAvidaContext& ctx) const
   {

Modified: development/source/main/cOrganism.h
===================================================================
--- development/source/main/cOrganism.h	2009-06-06 21:53:52 UTC (rev 3296)
+++ development/source/main/cOrganism.h	2009-06-07 15:51:08 UTC (rev 3297)
@@ -333,6 +333,12 @@
   bool TestDivideMut(cAvidaContext& ctx) const { return m_mut_rates.TestDivideMut(ctx); }
   bool TestDivideIns(cAvidaContext& ctx) const { return m_mut_rates.TestDivideIns(ctx); }
   bool TestDivideDel(cAvidaContext& ctx) const { return m_mut_rates.TestDivideDel(ctx); }
+  
+  unsigned int NumDividePoissonMut(cAvidaContext& ctx) const { return m_mut_rates.NumDividePoissonMut(ctx); }
+  unsigned int NumDividePoissonIns(cAvidaContext& ctx) const { return m_mut_rates.NumDividePoissonIns(ctx); }
+  unsigned int NumDividePoissonDel(cAvidaContext& ctx) const { return m_mut_rates.NumDividePoissonDel(ctx); }
+  unsigned int NumDividePoissonSlip(cAvidaContext& ctx) const { return m_mut_rates.NumDividePoissonSlip(ctx); }
+
   bool TestDivideUniform(cAvidaContext& ctx) const { return m_mut_rates.TestDivideUniform(ctx); }
   bool TestDivideSlip(cAvidaContext& ctx) const { return m_mut_rates.TestDivideSlip(ctx); } 
   




More information about the Avida-cvs mailing list