From 3deb007be703a326d0eaf5546d14c0d74574d14f Mon Sep 17 00:00:00 2001 From: Matthew Andres Moreno Date: Fri, 24 Nov 2023 13:05:05 -0500 Subject: [PATCH] Make birth count repl respect partitions --- .../source/actions/PopulationActions.cc | 33 +++++++++++++++---- 1 file changed, 27 insertions(+), 6 deletions(-) diff --git a/avida-core/source/actions/PopulationActions.cc b/avida-core/source/actions/PopulationActions.cc index 65192307d..57f981dab 100644 --- a/avida-core/source/actions/PopulationActions.cc +++ b/avida-core/source/actions/PopulationActions.cc @@ -5389,12 +5389,31 @@ class cActionReplicateDemesHighestBirthCount : public cAction static const cString GetDescription() { return "Arguments: [double replprob=0.01] [int replmax = intmax]"; } - void Process(cAvidaContext& ctx) + void Process(cAvidaContext &ctx) + { + const int part_size = m_world->GetConfig().DEMES_PARTITION_INTERVAL.Get(); + const int num_demes = m_world->GetPopulation().GetNumDemes(); + if (part_size) + { + for (int i = 0; i < num_demes; i += part_size) + { + const int begin = i; + const int end = std::min(i + part_size, num_demes); + ProcessPartition(begin, end, ctx); + } + } + else + { + ProcessPartition(0, num_demes, ctx); + } + } + + void ProcessPartition(const int begin, const int end, cAvidaContext &ctx) { cPopulation& pop = m_world->GetPopulation(); - const int num_demes = pop.GetNumDemes(); + const int num_demes = end - begin; std::vector deme_indices(num_demes); - std::iota(std::begin(deme_indices), std::end(deme_indices), 0); + std::iota(std::begin(deme_indices), std::end(deme_indices), begin); const int binomial_draw = ctx.GetRandom().GetRandBinomial( num_demes, @@ -5421,17 +5440,19 @@ class cActionReplicateDemesHighestBirthCount : public cAction struct Comp { std::vector &births; - Comp(std::vector &births) : births(births) {} + const int begin; + Comp(std::vector &births, const int begin) + : births(births), begin(begin) {} bool operator()(const int d1, const int d2) { - return births[d1] > births[d2]; + return births[d1 - begin] > births[d2 - begin]; } }; std::partial_sort( std::begin(deme_indices), std::next(std::begin(deme_indices), repl_quota), std::end(deme_indices), - Comp(birth_counts) + Comp(birth_counts, begin) ); struct DoRepl {