EmpiricMeasureLevelMaps.cpp 1.97 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
void MonteCarloMap::UpdateSampleCounter(double epsilon) {
    int optimalM;

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

niklas.baumgarten's avatar
niklas.baumgarten committed
12
    for (auto &[level, mc] : _levelMap) {
niklas.baumgarten's avatar
niklas.baumgarten committed
13
        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
        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);
niklas.baumgarten's avatar
niklas.baumgarten committed
25
26
27
        _levelMap.insert(LevelMonteCarloPair(newLevel, MonteCarlo(newLevel, 0, false)));
        _levelMap.find(newLevel)->second.vars.Y = varsY;
        _levelMap.find(newLevel)->second.avgs.Cost = avgsCost;
niklas.baumgarten's avatar
niklas.baumgarten committed
28
        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
        _levelMap[level] = mc.ctr;
niklas.baumgarten's avatar
niklas.baumgarten committed
37
38
39
40
}

bool SampleCounterMap::NoSamplesLeft() {
    bool noSamplesLeft = true;
niklas.baumgarten's avatar
niklas.baumgarten committed
41
    for (auto &&[level, entry]: _levelMap)
niklas.baumgarten's avatar
niklas.baumgarten committed
42
43
44
45
46
47
48
49
50
        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
        _levelMap[level] = mc.avgs;
niklas.baumgarten's avatar
niklas.baumgarten committed
52
53
        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
    for (auto &[level, mc]: mcMap)
niklas.baumgarten's avatar
niklas.baumgarten committed
59
        _levelMap[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
    for (auto &[level, mc]: mcMap)
niklas.baumgarten's avatar
niklas.baumgarten committed
64
        _levelMap[level] = mc.kurtosis;
niklas.baumgarten's avatar
niklas.baumgarten committed
65
}