summaryrefslogtreecommitdiff
path: root/lib/include/wolff/finite_states.hpp
blob: 426edadc016924804bef9706c131e6f3732faeac (plain)
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);
      }
    }
  }
}