void add_new_mutation( const std::size_t idx, const mcont_t & mutations, gamete_type & new_gamete ) { assert(idx<mutations.size()); if(mutations[idx].neutral) { assert(std::find(new_gamete.mutations.begin(), new_gamete.mutations.end(),idx)==new_gamete.mutations.end()); new_gamete.mutations.emplace(std::upper_bound(new_gamete.mutations.begin(), new_gamete.mutations.end(),mutations[idx].pos, [&mutations](const double & __value,const std::size_t __mut) noexcept { assert(__mut<mutations.size()); return __value < mutations[__mut].pos;}), idx ); assert(gamete_is_sorted_n(new_gamete,mutations)); } else { assert(std::find(new_gamete.smutations.begin(), new_gamete.smutations.end(),idx)==new_gamete.smutations.end()); new_gamete.smutations.emplace(std::upper_bound(new_gamete.smutations.begin(), new_gamete.smutations.end(),mutations[idx].pos, [&mutations](const double & __value,const std::size_t __mut) noexcept { assert(__mut<mutations.size()); return __value < mutations[__mut].pos;}), idx ); assert(gamete_is_sorted_s(new_gamete,mutations)); } }
void add_N_mutations_recycle( queue_type & recycling_bin, const mutation_model & mmodel, const unsigned & n, mlist_type & mutations, gamete_type & g) { assert(gamete_is_sorted_n(g,mutations)); assert(gamete_is_sorted_s(g,mutations)); for( unsigned i = 0 ; i < n ; ++i ) { add_new_mutation(mmodel_dispatcher(mmodel,g,mutations,recycling_bin),mutations,g); } }
void recombine_gametes( const double_vec_type & pos, const std::size_t ibeg, const std::size_t jbeg, gcont_t & gametes, const mcont_t & mutations, typename gcont_t::value_type::mutation_container & neutral, typename gcont_t::value_type::mutation_container & selected) { assert( std::is_sorted(pos.cbegin(),pos.cend()) ); auto itr = gametes[ibeg].mutations.cbegin(); auto jtr = gametes[jbeg].mutations.cbegin(); auto itr_s = gametes[ibeg].smutations.cbegin(); auto jtr_s = gametes[jbeg].smutations.cbegin(); auto itr_e = gametes[ibeg].mutations.cend(); auto itr_s_e = gametes[ibeg].smutations.cend(); auto jtr_e = gametes[jbeg].mutations.cend(); auto jtr_s_e = gametes[jbeg].smutations.cend(); auto pend = (pos.size()%2==0) ? pos.cend() : pos.cend()-1; auto i = pos.cbegin(); const double * p = pos.data(); for( ; i < pend ; i+=2,p+=2 ) { itr = fwdpp_internal::rec_gam_updater(itr,itr_e,mutations, neutral,*p); itr_s = fwdpp_internal::rec_gam_updater(itr_s,itr_s_e,mutations, selected,*p); jtr = fwdpp_internal::rec_update_itr(jtr,jtr_e,mutations,*p); jtr_s = fwdpp_internal::rec_update_itr(jtr_s,jtr_s_e,mutations,*p); jtr = fwdpp_internal::rec_gam_updater(jtr,jtr_e,mutations, neutral,*(p+1)); jtr_s = fwdpp_internal::rec_gam_updater(jtr_s,jtr_s_e,mutations, selected,*(p+1)); itr = fwdpp_internal::rec_update_itr(itr,itr_e,mutations,*(p+1)); itr_s = fwdpp_internal::rec_update_itr(itr_s,itr_s_e,mutations,*(p+1)); } assert(std::distance(i,pos.cend())<=1); for( ; i<pos.cend();++i) { itr = fwdpp_internal::rec_gam_updater(itr,itr_e,mutations, neutral,*p); itr_s = fwdpp_internal::rec_gam_updater(itr_s,itr_s_e,mutations, selected,*p); } assert(gamete_is_sorted_n(gametes[ibeg],mutations)); assert(gamete_is_sorted_s(gametes[ibeg],mutations)); }