Program Listing for File Pgghost.h

Return to documentation for file (source/pgg_mode/Pgghost.h)

#ifndef PGGHOST_H
#define PGGHOST_H

// #include "../../Empirical/include/emp/math/Random.hpp"
// #include "../../Empirical/include/emp/tools/string_utils.hpp"
// #include <set>
// #include <iomanip> // setprecision
// #include <sstream> // stringstream
#include "../default_mode/Host.h"
#include "PggWorld.h"


class PggHost: public Host {
protected:

  double sourcepool = 0;

  emp::Ptr<PggWorld> my_world = NULL;

public:
  PggHost(emp::Ptr<emp::Random> _random, emp::Ptr<PggWorld> _world, emp::Ptr<SymConfigBase> _config,
  double _intval =0.0, emp::vector<emp::Ptr<Organism>> _syms = {},
  emp::vector<emp::Ptr<Organism>> _repro_syms = {},
  std::set<int> _set = std::set<int>(),
  double _points = 0.0) : Host(_random, _world, _config, _intval,_syms, _repro_syms, _set, _points) {my_world = _world;}


  PggHost(const PggHost &) = default;


  PggHost(PggHost &&) = default;


  PggHost() = default;


  double GetPool() {return sourcepool;}


  void SetPool(double _in) {sourcepool= _in;}


  void AddPool(double _in) {sourcepool += _in;}


  void DistribResources(double resources) {
    Host::DistribResources(resources);

    for(size_t i=0; i < syms.size(); i++){
      double hostPool = syms[i]->ProcessPool();
      this->AddPool(hostPool);
    }
    if(syms.size()>0){this->DistribPool();}
  } //end DistribResources


  void DistribPool(){
    //to do: marginal return
    int num_sym = syms.size();
    double bonus = my_config->PGG_SYNERGY();
    double sym_piece = (double) sourcepool / num_sym;
    for(size_t i=0; i < syms.size(); i++){
        syms[i]->AddPoints(sym_piece*bonus);
    }
    this->SetPool(0);
  }

  emp::Ptr<Organism> makeNew(){
    emp::Ptr<PggHost> host_baby = emp::NewPtr<PggHost>(random, my_world, my_config, GetIntVal());
    return host_baby;
  }

};//Host

#endif