[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