-
Notifications
You must be signed in to change notification settings - Fork 5
/
Copy pathadaptive_takestep.cpp
41 lines (37 loc) · 1.33 KB
/
adaptive_takestep.cpp
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
#include "mcpele/adaptive_takestep.h"
namespace mcpele {
AdaptiveTakeStep::AdaptiveTakeStep(std::shared_ptr<TakeStep> ts,
const size_t interval, const double factor,
const double min_acceptance_ratio, const double max_acceptance_ratio)
: m_ts(ts),
m_interval(interval),
m_total_steps(0),
m_accepted_steps(0),
m_factor(factor),
m_min_acceptance_ratio(min_acceptance_ratio),
m_max_acceptance_ratio(max_acceptance_ratio)
{
if (factor <= 0 || factor >= 1) {
throw std::runtime_error("AdaptiveTakeStep::AdaptiveTakeStep: input factor has illegal value");
}
}
void AdaptiveTakeStep::report(pele::Array<double>&, const double,
pele::Array<double>&, const double, const bool success, MC* mc)
{
++m_total_steps;
if (success) {
++m_accepted_steps;
}
if (mc->get_iterations_count() % m_interval == 0) {
const double acceptance_fraction = static_cast<double>(m_accepted_steps) / static_cast<double>(m_total_steps);
m_accepted_steps = 0;
m_total_steps = 0;
if (acceptance_fraction < get_min_acceptance_ratio()) {
m_ts->increase_acceptance(m_factor);
}
else if (acceptance_fraction > get_max_acceptance_ratio()) {
m_ts->decrease_acceptance(m_factor);
}
}
}
} // namespace mcpele