EmpiricMeasureLevelMaps.cpp 1.94 KB
Newer Older
niklas.baumgarten's avatar
niklas.baumgarten committed
1
2
3
#include "EmpiricMeasureLevelMaps.hpp"
#include "Exponents.hpp"

4

niklas.baumgarten's avatar
niklas.baumgarten committed
5
6
7
8
9
void MonteCarloMap::UpdateSampleCounter(double epsilon) {
    int optimalM;

    double factor = 0.0;
    for (auto &[level, mc] : *this)
niklas.baumgarten's avatar
niklas.baumgarten committed
10
        factor += sqrt(mc.vars.Y * mc.avgs.Cost);
niklas.baumgarten's avatar
niklas.baumgarten committed
11
12
13

    for (auto &[level, mc] : *this) {
        optimalM = (int) (ceil(2 * pow(epsilon, -2) * factor *
niklas.baumgarten's avatar
niklas.baumgarten committed
14
            sqrt(mc.vars.Y / mc.avgs.Cost)));
niklas.baumgarten's avatar
niklas.baumgarten committed
15
        if (optimalM == 1) optimalM++;  // Hack
niklas.baumgarten's avatar
niklas.baumgarten committed
16
        mc.ctr.UpdateSampleCounter(optimalM - mc.ctr.M);
niklas.baumgarten's avatar
niklas.baumgarten committed
17
18
19
    }
}

niklas.baumgarten's avatar
niklas.baumgarten committed
20
void MonteCarloMap::AppendLevel(double epsilon, Exponents exponents, Level newLevel) {
niklas.baumgarten's avatar
niklas.baumgarten committed
21
    if (newLevel <= maxLevel) {
niklas.baumgarten's avatar
niklas.baumgarten committed
22
23
24
25
26
27
28
        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);
        this->insert(LevelMonteCarloPair(newLevel, MonteCarlo(newLevel, 0, false)));
        this->find(newLevel)->second.vars.Y = varsY;
        this->find(newLevel)->second.avgs.Cost = avgsCost;
        this->UpdateSampleCounter(epsilon);
niklas.baumgarten's avatar
niklas.baumgarten committed
29
30
31
32
33
34
35
    } else {
        Exit ("Maximum level has been reached.")
    }
}

void SampleCounterMap::Update(const MonteCarloMap &mcMap) {
    for (auto &[level, mc]: mcMap)
niklas.baumgarten's avatar
niklas.baumgarten committed
36
        (*this)[level] = mc.ctr;
niklas.baumgarten's avatar
niklas.baumgarten committed
37
38
39
40
41
42
43
44
45
46
47
48
49
50
}

bool SampleCounterMap::NoSamplesLeft() {
    bool noSamplesLeft = true;
    for (auto &&[level, entry]: *this)
        if (entry.dM > 0) {
            noSamplesLeft = false;
            break;
        }
    return noSamplesLeft;
}

void AveragesMap::Update(const MonteCarloMap &mcMap) {
    for (auto &&[level, mc]: mcMap) {
niklas.baumgarten's avatar
niklas.baumgarten committed
51
52
53
        (*this)[level] = mc.avgs;
        Q += mc.avgs.Y;
        Cost += mc.avgs.Cost; // Todo at the right place?
niklas.baumgarten's avatar
niklas.baumgarten committed
54
55
56
57
    }
}

void VariancesMap::Update(const MonteCarloMap &mcMap) {
niklas.baumgarten's avatar
niklas.baumgarten committed
58
59
    for (auto &[level, mc]: mcMap)
        (*this)[level] = mc.vars;
niklas.baumgarten's avatar
niklas.baumgarten committed
60
61
62
}

void KurtosisMap::Update(const MonteCarloMap &mcMap) {
niklas.baumgarten's avatar
niklas.baumgarten committed
63
64
    for (auto &[level, mc]: mcMap)
        (*this)[level] = mc.kurtosis;
niklas.baumgarten's avatar
niklas.baumgarten committed
65
}