#include "EmpiricMeasureLevelMaps.hpp" #include "Exponents.hpp" void MonteCarloMap::UpdateSampleCounter(double epsilon) { int optimalM; double factor = 0.0; for (auto &[level, mc] : _levelMap) factor += sqrt(mc.vars.Y * mc.avgs.Cost); for (auto &[level, mc] : _levelMap) { optimalM = (int) (ceil(2 * pow(epsilon, -2) * factor * sqrt(mc.vars.Y / mc.avgs.Cost))); if (optimalM == 1) optimalM++; // Hack mc.aggregate.UpdateSampleCounter(optimalM - mc.aggregate.M); mc.ctr.UpdateSampleCounter(optimalM - mc.ctr.M); } } void MonteCarloMap::AppendLevel(double epsilon, Exponents exponents, int newLevel) { if (newLevel <= maxLevel) { auto oldLevel = this->rbegin(); double varsY = oldLevel->second.vars.Y / pow(2.0, exponents.beta); double avgsCost = oldLevel->second.avgs.Cost * pow(2.0, exponents.gamma); _levelMap.insert(LevelMonteCarloPair(newLevel, MonteCarlo(newLevel, 0, false))); _levelMap.find(newLevel)->second.vars.Y = varsY; _levelMap.find(newLevel)->second.avgs.Cost = avgsCost; this->UpdateSampleCounter(epsilon); } else { Exit ("Maximum level has been reached.") } } void SampleCounterMap::Update(const MonteCarloMap &mcMap) { for (auto &[level, mc]: mcMap) _levelMap[level] = SampleCounter(mc.aggregate); } bool SampleCounterMap::NoSamplesLeft() { bool noSamplesLeft = true; for (auto &&[level, entry]: _levelMap) if (entry.dM > 0) { noSamplesLeft = false; break; } return noSamplesLeft; } void AveragesMap::Update(const MonteCarloMap &mcMap) { for (auto &&[level, mc]: mcMap) { _levelMap[level] = mc.avgs; Q += mc.avgs.Y; Cost += mc.avgs.Cost; // Todo at the right place? } } void VariancesMap::Update(const MonteCarloMap &mcMap) { for (auto &[level, mc]: mcMap) _levelMap[level] = mc.vars; } void KurtosisMap::Update(const MonteCarloMap &mcMap) { for (auto &[level, mc]: mcMap) _levelMap[level] = mc.kurtosis; }