Program Listing for File EfficientDataNodes.test.cc

Return to documentation for file (source/test/efficient_mode_test/EfficientDataNodes.test.cc)

#include "../../efficient_mode/EfficientHost.h"
#include "../../efficient_mode/EfficientSymbiont.h"
#include "../../efficient_mode/EfficientWorld.h"

TEST_CASE("GetEfficiencyDataNode", "[efficient]"){
  GIVEN("a world"){
    emp::Random random(17);
    SymConfigBase config;
    int int_val = 0;
    double points = 10;
    EfficientWorld world(random, &config);
    world.Resize(4);

    config.FREE_LIVING_SYMS(1);
    config.SYM_INFECTION_CHANCE(0);
    config.SYM_LIMIT(3);

    emp::DataMonitor<double>& sym_efficiency_node = world.GetEfficiencyDataNode();
    REQUIRE(std::isnan(sym_efficiency_node.GetMean()));

    WHEN("efficient symbionts are added to the world"){
      size_t num_syms = 6;
      double free_sym_efficiencies[3] = {0, 0.31, 0.45};
      double hosted_sym_efficiencies[3] = {0.71, 0.77, 1.0};

      double expected_av = 0.54;

      emp::Ptr<Host> host = emp::NewPtr<EfficientHost>(&random, &world, &config, int_val);
      world.AddOrgAt(host, 0);

      for(size_t i = 0; i < (num_syms/2); i++){
        world.AddOrgAt(emp::NewPtr<EfficientSymbiont>(&random, &world, &config, int_val, points, free_sym_efficiencies[i]), emp::WorldPosition(0, i));
        host->AddSymbiont(emp::NewPtr<EfficientSymbiont>(&random, &world, &config, int_val, points, hosted_sym_efficiencies[i]));
      }

      world.Update();
      THEN("their efficiency is tracked by a data node"){
        REQUIRE(sym_efficiency_node.GetMean() < (expected_av + 0.0001));
        REQUIRE(sym_efficiency_node.GetMean() > (expected_av - 0.0001));
      }
    }
  }
}