Program Listing for File EfficientWorld.h

Return to documentation for file (source/efficient_mode/EfficientWorld.h)

#ifndef EFFWORLD_H
#define EFFWORLD_H

#include "../default_mode/SymWorld.h"
#include "../default_mode/DataNodes.h"

class EfficientWorld : public SymWorld {
private:
  emp::Ptr<emp::DataMonitor<double>> data_node_efficiency;
public:
  using SymWorld::SymWorld;

  ~EfficientWorld(){
      if (data_node_efficiency) data_node_efficiency.Delete();
  }


  void Setup();
  void SetupHosts(long unsigned int* POP_SIZE);
  void SetupSymbionts(long unsigned int* total_syms);


  void CreateDataFiles(){
    std::string file_ending = "_SEED"+std::to_string(my_config->SEED())+".data";
    SymWorld::CreateDataFiles();
    SetupEfficiencyFile(my_config->FILE_PATH()+"Efficiency"+my_config->FILE_NAME()+file_ending).SetTimingRepeat(my_config->DATA_INT());
  }

  emp::DataFile & SetupEfficiencyFile(const std::string & filename) {
    auto & file = SetupFile(filename);
    auto & node = GetEfficiencyDataNode();
    file.AddVar(update, "update", "Update");
    file.AddMean(node, "mean_efficiency", "Average efficiency", true);
    file.PrintHeaderKeys();

    return file;
  }

  emp::DataMonitor<double>& GetEfficiencyDataNode() {
    if (!data_node_efficiency) {
      data_node_efficiency.New();
      OnUpdate([this](size_t){
        data_node_efficiency->Reset();
        for (size_t i = 0; i< pop.size(); i++) {
          if (IsOccupied(i)) {
            emp::vector<emp::Ptr<Organism>>& syms = pop[i]->GetSymbionts();
            size_t sym_size = syms.size();
            for(size_t j=0; j< sym_size; j++){
              data_node_efficiency->AddDatum(syms[j]->GetEfficiency());
            }//close for
          }//close if
          if(sym_pop[i]) {
            data_node_efficiency->AddDatum(sym_pop[i]->GetEfficiency());
          }//close if
      }//close for
      });
    }
    return *data_node_efficiency;
  }

}; //end of EfficientWorld class
#endif