Program Listing for File GDRelease.cpp#
↰ Return to documentation for file (src\GDRelease.cpp
)
#include <vector>
#include <algorithm>
#include "GDRelease.h"
#include "Patch.h"
#include "random.h"
void GDRelease::release_gene_drive(int day, std::vector<Patch*> &sites)
{
if (is_release_time(day)) {
auto rel_sites = select_driver_sites(day, sites);
put_driver_sites(rel_sites);
}
}
bool GDRelease::is_release_time(int day)
{
return (std::find(release_times.begin(), release_times.end(), day) == release_times.end()) ? false : true;
}
void GDRelease::put_driver_sites(std::vector<Patch*>& rel_sites)
{
for (const auto& rel_pat : rel_sites) {
rel_pat->add_driver_M(num_driver_M);
}
}
RandomGDRelease::RandomGDRelease(ReleaseParams* params): GDRelease(params->num_driver_M, params->release_times)
{
num_driver_sites = params->num_driver_sites;
}
std::vector<Patch*> RandomGDRelease::select_driver_sites(int day, const std::vector<Patch*> &sites)
{
int num_rel_sites = std::min(int(sites.size()), num_driver_sites);
std::vector<Patch*> rel_patches; // patches in which to release the gene drive
while (rel_patches.size() < num_rel_sites) {
int rel_pat = random_discrete(0, sites.size() - 1);
// only pick unique sites within the central area to release the gene drive
auto is_unique = (rel_patches.end() == std::find(rel_patches.begin(), rel_patches.end(), sites[rel_pat]));
if (is_unique) {
rel_patches.push_back(sites[rel_pat]);
}
}
return rel_patches;
}
SchedGDRelease::SchedGDRelease(ReleaseParams* params, std::vector<int> rel_sites, std::vector<Patch*> &sites): GDRelease(params->num_driver_M, params->release_times)
{
for (const auto& s : rel_sites) { // convert indices relative to sites vector into patch pointers
release_sites.push_back(sites.at(s));
}
}
std::vector<Patch*> SchedGDRelease::select_driver_sites(int day, const std::vector<Patch*> &sites)
{
return release_sites;
}