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
|
#pragma once
#include <cmath>
#include <functional>
#include <array>
#define FINITE_STATES
// must have N_STATES, states[N_STATES], and state_to_ind defined before
// invoking header
std::array<std::array<std::array<double, N_STATES>, N_STATES>, N_STATES> J_probs;
#ifndef NOFIELD
std::array<std::array<double, N_STATES>, N_STATES> H_probs;
#endif
template <class X_t>
#ifndef NOFIELD
void initialize_probs(std::function <double(X_t, X_t)> J, std::function <double(X_t)> H, double T) {
for (q_t i = 0; i < N_STATES; i++) {
for (q_t j = 0; j < N_STATES; j++) {
H_probs[i][j] = 1.0 - exp(-(H(states[i]) - H(states[j])) / T);
}
}
#else
void initialize_probs(std::function <double(X_t, X_t)> J, double T) {
#endif
for (q_t i = 0; i < N_STATES; i++) {
for (q_t j = 0; j < N_STATES; j++) {
for (q_t k = 0; k < N_STATES; k++) {
J_probs[i][j][k] = 1.0 - exp(-(J(states[i], states[k]) - J(states[j], states[k])) / T);
}
}
}
}
|