summaryrefslogtreecommitdiff
path: root/lib/include/wolff/models/potts.hpp
blob: a0cb368bff9791823ae903d50c031dbfc94c987b (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
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68

#ifndef WOLFF_MODELS_POTTS_H
#define WOLFF_MODELS_POTTS_H

#include <cmath>

#include "vector.hpp"

namespace wolff {

#include "../types.h"

template <q_t q>
class potts_t {
  public:
    q_t x;

    potts_t() : x(0) {}
    potts_t(q_t x) : x(x) {}

    typedef vector_t<q, int> M_t;
    typedef vector_t<q, double> F_t;

    inline vector_t<q, int> operator*(v_t a) const {
      vector_t<q, int> result;
      result.fill(0);
      result[x] = (int)a;

      return result;
    }

    inline vector_t<q, double> operator*(double a) const {
      vector_t<q, double> result;
      result.fill(0.0);
      result[x] = a;

      return result;
    }

    inline vector_t<q, int> operator-(const potts_t<q> &s) const {
      vector_t<q, int> result;
      result.fill(0);

      result[x]++;
      result[s.x]--;

      return result;
    }

    q_t enumerate() const {
      return x;
    }
};

template<q_t q>
inline typename potts_t<q>::M_t operator*(v_t a, const potts_t<q>& s) {
  return s * a;
}

template<q_t q>
inline typename potts_t<q>::F_t operator*(double a, const potts_t<q>& s) {
  return s * a;
}

}

#endif