summaryrefslogtreecommitdiff
path: root/lib
diff options
context:
space:
mode:
authorJaron Kent-Dobias <jaron@kent-dobias.com>2018-10-10 21:45:32 -0400
committerJaron Kent-Dobias <jaron@kent-dobias.com>2018-10-10 21:45:32 -0400
commita43ff1f98e9b9814f858bccb11c174b418458491 (patch)
treeae7e094d914eddb8a1ae9548420ba8c2f329ffae /lib
parent6e264d243f0b29d90e90b605b6cdeab8227129c9 (diff)
downloadc++-a43ff1f98e9b9814f858bccb11c174b418458491.tar.gz
c++-a43ff1f98e9b9814f858bccb11c174b418458491.tar.bz2
c++-a43ff1f98e9b9814f858bccb11c174b418458491.zip
big rearrangement of files to make libraries and example (research) files clearer, and changed to c++ std lib random numbers
Diffstat (limited to 'lib')
-rw-r--r--lib/CMakeLists.txt17
-rw-r--r--lib/angle.h48
-rw-r--r--lib/circle_group.h46
-rw-r--r--lib/colors.h34
-rw-r--r--lib/convex.c102
-rw-r--r--lib/convex.h23
-rw-r--r--lib/correlation.h23
-rw-r--r--lib/dihedral.h48
-rw-r--r--lib/dihedral_inf.h47
-rw-r--r--lib/height.h75
-rw-r--r--lib/include/wolff.hpp (renamed from lib/wolff.h)10
-rw-r--r--lib/include/wolff/cluster.hpp (renamed from lib/cluster.h)12
-rw-r--r--lib/include/wolff/finite_states.hpp (renamed from lib/finite_states.h)0
-rw-r--r--lib/include/wolff/graph.hpp (renamed from lib/graph.h)1
-rw-r--r--lib/include/wolff/state.hpp (renamed from lib/state.h)2
-rw-r--r--lib/include/wolff/types.h (renamed from lib/types.h)0
-rw-r--r--lib/ising.h59
-rw-r--r--lib/measure.h63
-rw-r--r--lib/orthogonal.h200
-rw-r--r--lib/potts.h72
-rw-r--r--lib/rand.c20
-rw-r--r--lib/rand.h16
-rw-r--r--lib/src/graph.cpp (renamed from lib/graph.cpp)2
-rw-r--r--lib/symmetric.h51
-rw-r--r--lib/torus.h64
-rw-r--r--lib/vector.h118
-rw-r--r--lib/z2.h53
27 files changed, 31 insertions, 1175 deletions
diff --git a/lib/CMakeLists.txt b/lib/CMakeLists.txt
new file mode 100644
index 0000000..a31500e
--- /dev/null
+++ b/lib/CMakeLists.txt
@@ -0,0 +1,17 @@
+
+project(libwolff LANGUAGES C CXX)
+
+add_library(wolff SHARED src/graph.cpp)
+
+target_include_directories(wolff PUBLIC $<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}/include>
+ $<INSTALL_INTERFACE:include>)
+
+install(TARGETS wolff EXPORT wolffConfig
+ ARCHIVE DESTINATION ${CMAKE_INSTALL_LIBDIR}
+ LIBRARY DESTINATION ${CMAKE_INSTALL_LIBDIR}
+ RUNTIME DESTINATION ${CMAKE_INSTALL_BINDIR})
+install(DIRECTORY include/ DESTINATION ${CMAKE_INSTALL_INCLUDEDIR})
+
+install(EXPORT wolffConfig DESTINATION share/wolff/cmake)
+
+export(TARGETS wolff FILE wolffConfig.cmake)
diff --git a/lib/angle.h b/lib/angle.h
deleted file mode 100644
index c3f128e..0000000
--- a/lib/angle.h
+++ /dev/null
@@ -1,48 +0,0 @@
-#pragma once
-
-#include "types.h"
-
-#include <cmath>
-#include "vector.h"
-
-class angle_t {
- public:
- double x;
-
- typedef vector_t<2, double> M_t;
- typedef vector_t<2, double> F_t;
-
- angle_t() : x(0) {}
- angle_t(double x) : x(x) {}
-
- inline vector_t<2, double> operator*(v_t a) const {
- vector_t<2, double>M;
- M[0] = a * cos(x);
- M[1] = a * sin(x);
-
- return M;
- }
-
- inline vector_t<2, double> operator*(double a) const {
- vector_t<2, double>M;
- M[0] = a * cos(x);
- M[1] = a * sin(x);
-
- return M;
- }
-};
-
-inline vector_t<2,double>& operator+=(vector_t<2,double>& M, const angle_t& theta) {
- M[0] += cos(theta.x);
- M[1] += sin(theta.x);
-
- return M;
-}
-
-inline vector_t<2,double>& operator-=(vector_t<2,double>& M, const angle_t& theta) {
- M[0] -= cos(theta.x);
- M[1] -= sin(theta.x);
-
- return M;
-}
-
diff --git a/lib/circle_group.h b/lib/circle_group.h
deleted file mode 100644
index cb7cadd..0000000
--- a/lib/circle_group.h
+++ /dev/null
@@ -1,46 +0,0 @@
-#pragma once
-
-#include "angle.h"
-
-class circle_group_t {
- public:
- bool is_reflection;
- double x;
-
- circle_group_t() : is_reflection(false), x(0) {}
- circle_group_t(bool x, double y) : is_reflection(x), x(y) {}
-
- angle_t act(const angle_t& theta) const {
- if (is_reflection) {
- return angle_t(fmod(2 * M_PI + x - theta.x, 2 * M_PI));
- } else {
- return angle_t(fmod(x + theta.x, 2 * M_PI));
- }
- }
-
- circle_group_t act(const circle_group_t& r) const {
- if (is_reflection) {
- return circle_group_t(!r.is_reflection, fmod(2 * M_PI + x - r.x, 2 * M_PI));
- } else {
- return circle_group_t(r.is_reflection, fmod(x + r.x, 2 * M_PI));
- }
- }
-
- angle_t act_inverse(const angle_t& theta) const {
- if (is_reflection) {
- return act(theta);
- } else {
- return angle_t(fmod(2 * M_PI + theta.x - x, 2 * M_PI));
- }
- }
-
- circle_group_t act_inverse(const circle_group_t& r) const {
- if (is_reflection) {
- return act(r);
- } else {
- return circle_group_t(r.is_reflection, fmod(2 * M_PI + r.x - x, 2 * M_PI));
- }
- }
-};
-
-
diff --git a/lib/colors.h b/lib/colors.h
deleted file mode 100644
index 04d39a8..0000000
--- a/lib/colors.h
+++ /dev/null
@@ -1,34 +0,0 @@
-#pragma once
-
-#include "types.h"
-
-double hue_to_R(double theta) {
- if (((M_PI / 3 <= theta) && (theta < 2 * M_PI / 3)) || ((4 * M_PI / 3 <= theta) && (theta < 5 * M_PI / 3))) {
- return 1.0 - fabs(fmod(theta / (2 * M_PI / 6), 2) - 1.0);
- } else if (((0 <= theta) && (theta < M_PI / 3)) || ((5 * M_PI / 3 <= theta) && (theta <= 2 * M_PI))) {
- return 1.0;
- } else {
- return 0.0;
- }
-}
-
-double hue_to_G(double theta) {
- if (((0 <= theta) && (theta < M_PI / 3)) || ((M_PI <= theta) && (theta < 4 * M_PI / 3))) {
- return 1.0 - fabs(fmod(theta / (2 * M_PI / 6), 2) - 1.0);
- } else if (((M_PI / 3 <= theta) && (theta < 2 * M_PI / 3)) || ((2 * M_PI / 3 <= theta) && (theta < M_PI))) {
- return 1.0;
- } else {
- return 0.0;
- }
-}
-
-double hue_to_B(double theta) {
- if (((2 * M_PI / 3 <= theta) && (theta < M_PI)) || ((5 * M_PI / 3 <= theta) && (theta <= 2 * M_PI))) {
- return 1.0 - fabs(fmod(theta / (2 * M_PI / 6), 2) - 1.0);
- } else if (((M_PI <= theta) && (theta < 4 * M_PI / 3)) || ((4 * M_PI / 3 <= theta) && (theta < 5 * M_PI / 3))) {
- return 1.0;
- } else {
- return 0.0;
- }
-}
-
diff --git a/lib/convex.c b/lib/convex.c
deleted file mode 100644
index 7255ad4..0000000
--- a/lib/convex.c
+++ /dev/null
@@ -1,102 +0,0 @@
-
-#include "convex.h"
-
-double slope(point_t *P, point_t *Q) {
- return (Q->y - P->y) / ((double)(Q->x) - (double)(P->x));
-}
-
-double *get_convex_minorant(count_t n, double *Gammas) {
- if (n < 2) {
- return Gammas;
- }
-
- list_t *L = (list_t *)calloc(1, sizeof(list_t));
- L->p = (point_t *)calloc(1, sizeof(point_t));
- L->p->x = 0;
- L->p->y = Gammas[0];
-
- list_t *pos = L;
-
- for (count_t i = 1; i < n; i++) {
- pos->next = (list_t *)calloc(1, sizeof(list_t));
- pos->next->p = (point_t *)calloc(1, sizeof(point_t));
- pos->next->p->x = i;
- pos->next->p->y = Gammas[i];
- pos->next->prev = pos;
- pos = pos->next;
- }
-
- pos->next = (list_t *)calloc(1, sizeof(list_t));
- pos->next->p = (point_t *)calloc(1, sizeof(point_t));
- pos->next->p->x = n;
- pos->next->p->y = 0;
- pos->next->prev = pos;
-
- list_t *X = L;
- list_t *Y = L->next;
- list_t *Z = Y->next;
-
- while (true) {
- if (slope(X->p, Y->p) <= slope(Y->p, Z->p)) {
- X = Y;
- Y = Z;
- if (Z->next == NULL) {
- break;
- } else {
- Z = Z->next;
- }
- } else {
- Y->prev->next = Y->next;
- Y->next->prev = Y->prev;
- free(Y->p);
- free(Y);
- if (X->prev != NULL) {
- Y = X;
- X = X->prev;
- } else {
- if (Z->next != NULL) {
- Y = Z;
- Z = Z->next;
- } else {
- break;
- }
- }
- }
- }
-
- pos = L;
-
- double *g = (double *)calloc(n + 1, sizeof(double));
- double rho = 0;
-
- for (count_t i = 0; i < n + 1; i++) {
- if (i > pos->next->p->x) {
- pos = pos->next;
- }
-
- g[i] = pos->p->y + ((double)i - (double)(pos->p->x)) * (pos->next->p->y - pos->p->y) / ((double)(pos->next->p->x) - (double)(pos->p->x));
-
- if (i <n) {
- if (Gammas[i] - g[i] > rho) {
- rho = Gammas[i] - g[i];
- }
- } else {
- if (0 - g[i] > rho) {
- rho = 0 - g[i];
- }
- }
- }
-
- for (count_t i = 0; i < n + 1; i++) {
- g[i] += rho / 2;
- }
-
- while (L != NULL) {
- free(L->p);
- L = L->next;
- free(L);
- }
-
- return g;
-}
-
diff --git a/lib/convex.h b/lib/convex.h
deleted file mode 100644
index 5a405d4..0000000
--- a/lib/convex.h
+++ /dev/null
@@ -1,23 +0,0 @@
-
-#pragma once
-
-#include <inttypes.h>
-#include <stdbool.h>
-#include <stdlib.h>
-#include <string.h>
-
-#include "types.h"
-
-typedef struct {
- count_t x;
- double y;
-} point_t;
-
-typedef struct list_tag {
- struct list_tag *prev;
- struct list_tag *next;
- point_t *p;
-} list_t;
-
-double *get_convex_minorant(count_t n, double *Gammas);
-
diff --git a/lib/correlation.h b/lib/correlation.h
deleted file mode 100644
index 29357a5..0000000
--- a/lib/correlation.h
+++ /dev/null
@@ -1,23 +0,0 @@
-
-#pragma once
-
-#include "types.h"
-#include "state.h"
-
-#include <fftw3.h>
-
-template <class R_t, class X_t>
-double correlation_length(const state_t <R_t, X_t>& s) {
- double total = 0;
-
-#ifdef DIMENSION
- for (D_t j = 0; j < DIMENSION; j++) {
-#else
- for (D_t j = 0; j < s.D; j++) {
-#endif
- total += norm_squared(s.ReF[j]) + norm_squared(s.ImF[j]);
- }
-
- return total / s.D;
-}
-
diff --git a/lib/dihedral.h b/lib/dihedral.h
deleted file mode 100644
index 8d0472b..0000000
--- a/lib/dihedral.h
+++ /dev/null
@@ -1,48 +0,0 @@
-
-#pragma once
-
-#include "types.h"
-#include "potts.h"
-
-template <q_t q>
-class dihedral_t {
- public:
- bool is_reflection;
- q_t x;
-
- dihedral_t() : is_reflection(false), x(0) {}
- dihedral_t(bool x, q_t y) : is_reflection(x), x(y) {}
-
- potts_t<q> act(const potts_t<q>& s) const {
- if (this->is_reflection) {
- return potts_t<q>(((q + this->x) - s.x) % q);
- } else {
- return potts_t<q>((this->x + s.x) % q);
- }
- }
-
- dihedral_t<q> act(dihedral_t<q> r) const {
- if (this->is_reflection) {
- return dihedral_t<q>(!(r.is_reflection), ((q + this->x) - r.x) % q);
- } else {
- return dihedral_t<q>(r.is_reflection, (this->x + r.x) % q);
- }
- }
-
- potts_t<q> act_inverse(potts_t<q> s) const {
- if (this->is_reflection) {
- return this->act(s);
- } else {
- return potts_t<q>(((s.x + q) - this->x) % q);
- }
- }
-
- dihedral_t<q> act_inverse(dihedral_t<q> r) const {
- if (this->is_reflection) {
- return this->act(r);
- } else {
- return dihedral_t<q>(r.is_reflection, ((r.x + q) - this->x) % q);
- }
- }
-};
-
diff --git a/lib/dihedral_inf.h b/lib/dihedral_inf.h
deleted file mode 100644
index a064b48..0000000
--- a/lib/dihedral_inf.h
+++ /dev/null
@@ -1,47 +0,0 @@
-
-#include "types.h"
-#include <cmath>
-#include "height.h"
-
-template <class T>
-class dihedral_inf_t {
- public:
- bool is_reflection;
- T x;
-
- dihedral_inf_t() : is_reflection(false), x(0) {}
- dihedral_inf_t(bool x, T y) : is_reflection(x), x(y) {}
-
- height_t<T> act(const height_t<T>& h) const {
- if (this->is_reflection) {
- return height_t(this->x - h.x);
- } else {
- return height_t(this->x + h.x);
- }
- }
-
- dihedral_inf_t<T> act(const dihedral_inf_t<T>& r) const {
- if (this->is_reflection) {
- return dihedral_inf_t<T>(!r.is_reflection, this->x - r.x);
- } else {
- return dihedral_inf_t<T>(r.is_reflection, this->x + r.x);
- }
- }
-
- height_t<T> act_inverse(const height_t<T>& h) const {
- if (this->is_reflection) {
- return this->act(h);
- } else {
- return height_t(h.x - this->x);
- }
- }
-
- dihedral_inf_t<T> act_inverse(const dihedral_inf_t<T>& r) const {
- if (this->is_reflection) {
- return this->act(r);
- } else {
- return dihedral_inf_t<T>(r.is_reflection, r.x - this->x);
- }
- }
-};
-
diff --git a/lib/height.h b/lib/height.h
deleted file mode 100644
index d2173fe..0000000
--- a/lib/height.h
+++ /dev/null
@@ -1,75 +0,0 @@
-
-#pragma once
-
-#include <cmath>
-#include <stdio.h>
-
-#include "types.h"
-
-/* The following is the minimum definition of a spin class.
- *
- * The class must contain an M_t and an F_t for holding the sum of an
- * integer number of spins and a double-weighted number of spins,
- * respectively.
- *
- * void init(X_t *p);
- * void free_spin(X_t p);
- * void free_spin(M_t p);
- * void free_spin(F_t p);
- * X_t copy(X_t x);
- * void add(M_t *x1, int factor, X_t x2);
- * void add(F_t *x1, double factor, X_t x2);
- * M_t scalar_multiple(int factor, X_t x);
- * F_t scalar_multiple(double factor, X_t x);
- * double norm_squared(F_t x);
- * void write_magnetization(M_t M, FILE *outfile);
- *
- */
-
-template <class T>
-struct height_t {
- T x;
-
- typedef T M_t;
- typedef double F_t;
-
- height_t() : x(0) {}
-
- height_t(T x) : x(x) {}
-
- inline T operator*(v_t a) const {
- return x * a;
- }
-
- inline double operator*(double a) const {
- return x * a;
- }
-
- inline T operator-(const height_t& h) const {
- return x - h.x;
- }
-};
-
-template <class T>
-inline T& operator+=(T& M, const height_t<T> &h) {
- M += h.x;
-
- return M;
-}
-
-template <class T>
-inline T& operator-=(T& M, const height_t<T> &h) {
- M -= h.x;
-
- return M;
-}
-
-double norm_squared(double h) {
- return pow(h, 2);
-}
-
-template <class T>
-void write_magnetization(T M, FILE *outfile) {
- fwrite(&M, sizeof(T), 1, outfile);
-}
-
diff --git a/lib/wolff.h b/lib/include/wolff.hpp
index 141a5b2..c10a211 100644
--- a/lib/wolff.h
+++ b/lib/include/wolff.hpp
@@ -1,9 +1,9 @@
-#include "cluster.h"
-#include "state.h"
+#include "wolff/cluster.hpp"
+#include "wolff/state.hpp"
template <class R_t, class X_t>
-void wolff(count_t N, state_t <R_t, X_t>& s, std::function <R_t(gsl_rng *, X_t s0)> gen_R, std::function <void(const state_t <R_t, X_t>&)> measurements, gsl_rng *r, bool silent) {
+void wolff(count_t N, state_t <R_t, X_t>& s, std::function <R_t(std::mt19937&, X_t)> gen_R, std::function <void(const state_t <R_t, X_t>&)> measurements, std::mt19937& r, bool silent) {
#ifdef FINITE_STATES
#ifdef NOFIELD
@@ -13,11 +13,13 @@ void wolff(count_t N, state_t <R_t, X_t>& s, std::function <R_t(gsl_rng *, X_t s
#endif
#endif
+ std::uniform_int_distribution<v_t> dist(0, s.nv);
+
if (!silent) printf("\n");
for (count_t steps = 0; steps < N; steps++) {
if (!silent) printf("\033[F\033[JWOLFF: step %" PRIu64 " / %" PRIu64 ": E = %.2f, S = %" PRIv "\n", steps, N, s.E, s.last_cluster_size);
- v_t v0 = gsl_rng_uniform_int(r, s.nv);
+ v_t v0 = dist(r);
R_t step = gen_R(r, s.spins[v0]);
flip_cluster <R_t, X_t> (s, v0, step, r);
diff --git a/lib/cluster.h b/lib/include/wolff/cluster.hpp
index f57bb68..104f3c2 100644
--- a/lib/cluster.h
+++ b/lib/include/wolff/cluster.hpp
@@ -1,18 +1,18 @@
#pragma once
-#include <gsl/gsl_randist.h>
-#include <gsl/gsl_rng.h>
+#include <random>
#include <cmath>
#include <vector>
#include <stack>
#include "types.h"
-#include "state.h"
-#include "graph.h"
+#include "state.hpp"
+#include "graph.hpp"
template <class R_t, class X_t>
-void flip_cluster(state_t<R_t, X_t>& s, v_t v0, const R_t& r, gsl_rng *rand) {
+void flip_cluster(state_t<R_t, X_t>& s, v_t v0, const R_t& r, std::mt19937& rand) {
+ std::uniform_real_distribution<double> dist(0.0,1.0);
v_t nv = 0;
std::stack<v_t> stack;
@@ -89,7 +89,7 @@ void flip_cluster(state_t<R_t, X_t>& s, v_t v0, const R_t& r, gsl_rng *rand) {
prob = 1.0 - exp(-dE / s.T);
#endif
- if (gsl_rng_uniform(rand) < prob) {
+ if (dist(rand) < prob) {
stack.push(vn); // push the neighboring vertex to the stack
}
}
diff --git a/lib/finite_states.h b/lib/include/wolff/finite_states.hpp
index 426edad..426edad 100644
--- a/lib/finite_states.h
+++ b/lib/include/wolff/finite_states.hpp
diff --git a/lib/graph.h b/lib/include/wolff/graph.hpp
index de06924..165544a 100644
--- a/lib/graph.h
+++ b/lib/include/wolff/graph.hpp
@@ -17,6 +17,5 @@ class graph_t {
graph_t(D_t D, L_t L);
void add_ext();
-
};
diff --git a/lib/state.h b/lib/include/wolff/state.hpp
index cad453c..1f5e359 100644
--- a/lib/state.h
+++ b/lib/include/wolff/state.hpp
@@ -5,7 +5,7 @@
#include <vector>
#include "types.h"
-#include "graph.h"
+#include "graph.hpp"
template <class R_t, class X_t>
class state_t {
diff --git a/lib/types.h b/lib/include/wolff/types.h
index ec9efaf..ec9efaf 100644
--- a/lib/types.h
+++ b/lib/include/wolff/types.h
diff --git a/lib/ising.h b/lib/ising.h
deleted file mode 100644
index 45058fb..0000000
--- a/lib/ising.h
+++ /dev/null
@@ -1,59 +0,0 @@
-#pragma once
-
-#include <cmath>
-#include <stdio.h>
-
-#include "types.h"
-
-class ising_t {
- public:
- bool x;
-
- typedef int M_t;
- typedef double F_t;
-
- ising_t() : x(false) {}
- ising_t(bool x) : x(x) {}
- ising_t(int x) : x((bool)x) {}
-
- inline int operator*(v_t a) const {
- if (x) {
- return -(int)a;
- } else {
- return (int)a;
- }
- }
-
- inline double operator*(double a) const {
- if (x) {
- return -a;
- } else {
- return a;
- }
- }
-
- inline int operator-(const ising_t &s) const {
- if (x == s.x) {
- return 0;
- } else {
- if (x) {
- return -2;
- } else {
- return 2;
- }
- }
- }
-};
-
-double norm_squared(double s) {
- return pow(s, 2);
-}
-
-void write_magnetization(int M, FILE *outfile) {
- fwrite(&M, sizeof(int), 1, outfile);
-}
-
-#define N_STATES 2
-const ising_t states[2] = {ising_t(0), ising_t(1)};
-q_t state_to_ind(ising_t state) { return (q_t)state.x; }
-
diff --git a/lib/measure.h b/lib/measure.h
deleted file mode 100644
index 2c5ffb7..0000000
--- a/lib/measure.h
+++ /dev/null
@@ -1,63 +0,0 @@
-
-#pragma once
-
-#include "state.h"
-#include "correlation.h"
-#include <functional>
-
-#define POSSIBLE_MEASUREMENTS 4
-const unsigned char measurement_energy = 1 << 0;
-const unsigned char measurement_clusterSize = 1 << 1;
-const unsigned char measurement_magnetization = 1 << 2;
-const unsigned char measurement_fourierZero = 1 << 3;
-
-char const *measurement_labels[] = {"E", "S", "M", "F"};
-
-FILE **measure_setup_files(unsigned char flags, unsigned long timestamp) {
- FILE **files = (FILE **)calloc(POSSIBLE_MEASUREMENTS, sizeof(FILE *));
-
- for (uint8_t i = 0; i < POSSIBLE_MEASUREMENTS; i++) {
- if (flags & (1 << i)) {
- char *filename = (char *)malloc(255 * sizeof(char));
- sprintf(filename, "wolff_%lu_%s.dat", timestamp, measurement_labels[i]);
- files[i] = fopen(filename, "wb");
- free(filename);
- }
- }
-
- return files;
-}
-
-template <class R_t, class X_t>
-std::function <void(const state_t <R_t, X_t>&)> measure_function_write_files(unsigned char flags, FILE **files, std::function <void(const state_t <R_t, X_t>&)> other_f) {
- return [=] (const state_t <R_t, X_t>& s) {
- if (flags & measurement_energy) {
- float smaller_E = (float)s.E;
- fwrite(&smaller_E, sizeof(float), 1, files[0]);
- }
- if (flags & measurement_clusterSize) {
- fwrite(&(s.last_cluster_size), sizeof(uint32_t), 1, files[1]);
- }
- if (flags & measurement_magnetization) {
- write_magnetization(s.M, files[2]);
- }
- if (flags & measurement_fourierZero) {
- float smaller_X = (float)correlation_length(s);
- fwrite(&smaller_X, sizeof(float), 1, files[3]);
- }
-
- other_f(s);
- };
-}
-
-void measure_free_files(unsigned char flags, FILE **files) {
- for (uint8_t i = 0; i < POSSIBLE_MEASUREMENTS; i++) {
- if (flags & (1 << i)) {
- fclose(files[i]);
- }
- }
-
- free(files);
-}
-
-
diff --git a/lib/orthogonal.h b/lib/orthogonal.h
deleted file mode 100644
index e1bf33a..0000000
--- a/lib/orthogonal.h
+++ /dev/null
@@ -1,200 +0,0 @@
-
-#pragma once
-
-#include <stdlib.h>
-#include <gsl/gsl_rng.h>
-#include <gsl/gsl_randist.h>
-#include <cmath>
-
-#include "state.h"
-#include "types.h"
-#include "vector.h"
-
-template <q_t q, class T>
-class orthogonal_t : public std::array<std::array<T, q>, q> {
- public :
- bool is_reflection;
-
- orthogonal_t() : is_reflection(false) {
- for (q_t i = 0; i < q; i++) {
- (*this)[i].fill(0);
- (*this)[i][i] = (T)1;
- }
- }
-
- vector_t<q, T> act(const vector_t <q, T>& v) const {
- vector_t <q, T> v_rot;
- v_rot.fill(0);
-
- if (is_reflection) {
- double prod = 0;
- for (q_t i = 0; i < q; i++) {
- prod += v[i] * (*this)[0][i];
- }
- for (q_t i = 0; i < q; i++) {
- v_rot[i] = v[i] - 2 * prod * (*this)[0][i];
- }
- } else {
- for (q_t i = 0; i < q; i++) {
- for (q_t j = 0; j < q; j++) {
- v_rot[i] += (*this)[i][j] * v[j];
- }
- }
- }
-
- return v_rot;
- }
-
- orthogonal_t<q, T> act(const orthogonal_t <q, T>& m) const {
- orthogonal_t <q, T> m_rot;
-
- m_rot.is_reflection = false;
-
- if (is_reflection) {
- for (q_t i = 0; i < q; i++) {
- double akOki = 0;
-
- for (q_t k = 0; k < q; k++) {
- akOki += (*this)[0][k] * m[k][i];
- }
-
- for (q_t j = 0; j < q; j++) {
- m_rot[j][i] = m[j][i] - 2 * akOki * (*this)[0][j];
- }
- }
- } else {
- for (q_t i = 0; i < q; i++) {
- m_rot[i].fill(0);
- for (q_t j = 0; j < q; j++) {
- for (q_t k = 0; k < q; k++) {
- m_rot[i][j] += (*this)[i][j] * m[j][k];
- }
- }
- }
- }
-
- return m_rot;
- }
-
- vector_t <q, T> act_inverse(const vector_t <q, T>& v) const {
- if (is_reflection) {
- return this->act(v); // reflections are their own inverse
- } else {
- vector_t <q, T> v_rot;
- v_rot.fill(0);
-
- for (q_t i = 0; i < q; i++) {
- for (q_t j = 0; j < q; j++) {
- v_rot[i] += (*this)[j][i] * v[j];
- }
- }
-
- return v_rot;
- }
- }
-
- vector_t <q, T> act_inverse(const orthogonal_t <q, T>& m) const {
- if (is_reflection) {
- return this->act(m); // reflections are their own inverse
- } else {
- orthogonal_t <q, T> m_rot;
- m_rot.is_reflection = false;
-
- for (q_t i = 0; i < q; i++) {
- m_rot[i].fill(0);
- for (q_t j = 0; j < q; j++) {
- for (q_t k = 0; k < q; k++) {
- m_rot[i][j] += (*this)[j][i] * m[j][k];
- }
- }
- }
-
- return m_rot;
- }
- }
-
-};
-
-
-template <q_t q>
-orthogonal_t <q, double> generate_rotation_uniform (gsl_rng *r, const vector_t <q, double>& v) {
- orthogonal_t <q, double> ptr;
- ptr.is_reflection = true;
-
- double v2 = 0;
-
- for (q_t i = 0; i < q; i++) {
- ptr[0][i] = gsl_ran_ugaussian(r);
- v2 += ptr[0][i] * ptr[0][i];
- }
-
- double mag_v = sqrt(v2);
-
- for (q_t i = 0; i < q; i++) {
- ptr[0][i] /= mag_v;
- }
-
- return ptr;
-}
-
-template <q_t q>
-orthogonal_t <q, double> generate_rotation_perturbation (gsl_rng *r, const vector_t <q, double>& v0, double epsilon, unsigned int n) {
- orthogonal_t <q, double> m;
- m.is_reflection = true;
-
- vector_t <q, double> v;
-
- if (n > 1) {
- unsigned int rotation = gsl_rng_uniform_int(r, n);
-
- double cosr = cos(2 * M_PI * rotation / (double)n / 2.0);
- double sinr = sin(2 * M_PI * rotation / (double)n / 2.0);
-
- v[0] = v0[0] * cosr - v0[1] * sinr;
- v[1] = v0[1] * cosr + v0[0] * sinr;
-
- for (q_t i = 2; i < q; i++) {
- v[i] = v0[i];
- }
- } else {
- v = v0;
- }
-
- double m_dot_v = 0;
-
- for (q_t i = 0; i < q; i++) {
- m[0][i] = gsl_ran_ugaussian(r); // create a random vector
- m_dot_v += m[0][i] * v[i];
- }
-
- double v2 = 0;
-
- for (q_t i = 0; i < q; i++) {
- m[0][i] = m[0][i] - m_dot_v * v[i]; // find the component orthogonal to v
- v2 += pow(m[0][i], 2);
- }
-
- double mag_v = sqrt(v2);
-
- for (q_t i = 0; i < q; i++) {
- m[0][i] /= mag_v; // normalize
- }
-
- v2 = 0;
-
- double factor = gsl_ran_gaussian(r, epsilon);
-
- for (q_t i = 0; i < q; i++) {
- m[0][i] += factor * v[i]; // perturb orthogonal vector in original direction
- v2 += pow(m[0][i], 2);
- }
-
- mag_v = sqrt(v2);
-
- for (q_t i = 0; i < q; i++) {
- m[0][i] /= mag_v; // normalize
- }
-
- return m;
-}
-
diff --git a/lib/potts.h b/lib/potts.h
deleted file mode 100644
index 1764e53..0000000
--- a/lib/potts.h
+++ /dev/null
@@ -1,72 +0,0 @@
-#pragma once
-
-#include <cmath>
-#include <stdio.h>
-
-#include "types.h"
-#include "vector.h"
-
-template <q_t q>
-class potts_t {
- public:
- q_t x;
-
- typedef vector_t<q, int> M_t;
- typedef vector_t<q, double> F_t;
-
- potts_t() : x(0) {}
- potts_t(q_t x) : x(x) {}
-
- 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;
- }
-};
-
-// we could inherit norm_squared from vector.h, but convention dictates that
-// potts norms be changed by a constant factor
-template <q_t q>
-double norm_squared(vector_t<q, double> s) {
- double total = 0;
- for (double& x : s) {
- total += pow(x, 2);
- }
-
- return total * (double)q / ((double)q - 1.0);
-}
-
-// we could inherit write_magnetization from vector.h, but since M.x must sum
-// to nv we don't need to write the last element
-template <q_t q>
-void write_magnetization(vector_t<q, int> M, FILE *outfile) {
- for (int& x : M) {
- fwrite(&x, sizeof(int), q - 1, outfile);
- }
-}
-
-// knock yourself out
-const potts_t<POTTSQ> states[256] = {{0}, {1}, {2}, {3}, {4}, {5}, {6}, {7}, {8}, {9}, {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}, {69}, {70}, {71}, {72}, {73}, {74}, {75}, {76}, {77}, {78}, {79}, {80}, {81}, {82}, {83}, {84}, {85}, {86}, {87}, {88}, {89}, {90}, {91}, {92}, {93}, {94}, {95}, {96}, {97}, {98}, {99}, {100}, {101}, {102}, {103}, {104}, {105}, {106}, {107}, {108}, {109}, {110}, {111}, {112}, {113}, {114}, {115}, {116}, {117}, {118}, {119}, {120}, {121}, {122}, {123}, {124}, {125}, {126}, {127}, {128}, {129}, {130}, {131}, {132}, {133}, {134}, {135}, {136}, {137}, {138}, {139}, {140}, {141}, {142}, {143}, {144}, {145}, {146}, {147}, {148}, {149}, {150}, {151}, {152}, {153}, {154}, {155}, {156}, {157}, {158}, {159}, {160}, {161}, {162}, {163}, {164}, {165}, {166}, {167}, {168}, {169}, {170}, {171}, {172}, {173}, {174}, {175}, {176}, {177}, {178}, {179}, {180}, {181}, {182}, {183}, {184}, {185}, {186}, {187}, {188}, {189}, {190}, {191}, {192}, {193}, {194}, {195}, {196}, {197}, {198}, {199}, {200}, {201}, {202}, {203}, {204}, {205}, {206}, {207}, {208}, {209}, {210}, {211}, {212}, {213}, {214}, {215}, {216}, {217}, {218}, {219}, {220}, {221}, {222}, {223}, {224}, {225}, {226}, {227}, {228}, {229}, {230}, {231}, {232}, {233}, {234}, {235}, {236}, {237}, {238}, {239}, {240}, {241}, {242}, {243}, {244}, {245}, {246}, {247}, {248}, {249}, {250}, {251}, {252}, {253}, {254}, {255}};
-template <q_t q>
-q_t state_to_ind(potts_t<q> state) { return (q_t)state.x; }
-
diff --git a/lib/rand.c b/lib/rand.c
deleted file mode 100644
index 76f537d..0000000
--- a/lib/rand.c
+++ /dev/null
@@ -1,20 +0,0 @@
-
-#include <assert.h>
-#include <stdio.h>
-
-unsigned long int rand_seed() {
- /*
- returns a random unsigned long integer read from the standard unix
- pseudorandom device /dev/urandom
- */
-
- FILE *f = fopen("/dev/urandom", "r");
- assert(f != NULL);
-
- unsigned long int seed;
- fread(&seed, sizeof(unsigned long int), 1, f);
-
- fclose(f);
-
- return seed;
-}
diff --git a/lib/rand.h b/lib/rand.h
deleted file mode 100644
index 7bb5354..0000000
--- a/lib/rand.h
+++ /dev/null
@@ -1,16 +0,0 @@
-
-#pragma once
-
-#include <assert.h>
-#include <stdio.h>
-
-#ifdef __cplusplus
-extern "C" {
-#endif
-
-unsigned long int rand_seed();
-
-#ifdef __cplusplus
-}
-#endif
-
diff --git a/lib/graph.cpp b/lib/src/graph.cpp
index ca251f3..4043413 100644
--- a/lib/graph.cpp
+++ b/lib/src/graph.cpp
@@ -1,5 +1,5 @@
-#include "graph.h"
+#include <wolff/graph.hpp>
graph_t::graph_t(D_t D, L_t L) {
nv = pow(L, D);
diff --git a/lib/symmetric.h b/lib/symmetric.h
deleted file mode 100644
index 9e9b6e4..0000000
--- a/lib/symmetric.h
+++ /dev/null
@@ -1,51 +0,0 @@
-
-#pragma once
-
-#include <stdlib.h>
-#include <array>
-#include "types.h"
-#include "potts.h"
-
-template <q_t q>
-class symmetric_t : public std::array<q_t, q> {
- public:
-
- symmetric_t() {
- for (q_t i = 0; i < q; i++) {
- (*this)[i] = i;
- }
- }
-
- potts_t<q> act(const potts_t<q> &s) const {
- return potts_t<q>((*this)[s.x]);
- }
-
- symmetric_t<q> act(const symmetric_t<q>& r) const {
- symmetric_t<q> r_rot;
- for (q_t i = 0; i < q; i++) {
- r_rot[i] = (*this)[r[i]];
- }
-
- return r_rot;
- }
-
- potts_t<q> act_inverse(const potts_t<q>& s) const {
- for (q_t i = 0; i < q; i++) {
- if ((*this)[i] == s.x) {
- return potts_t<q>(i);
- }
- }
-
- exit(EXIT_FAILURE);
- }
-
- symmetric_t<q> act_inverse(const symmetric_t<q>& r) const {
- symmetric_t<q> r_rot;
- for (q_t i = 0; i < q; i++) {
- r_rot[(*this)[i]] = r[i];
- }
-
- return r_rot;
- }
-};
-
diff --git a/lib/torus.h b/lib/torus.h
deleted file mode 100644
index 2aead52..0000000
--- a/lib/torus.h
+++ /dev/null
@@ -1,64 +0,0 @@
-
-#pragma once
-
-#include <cmath>
-#include <array>
-#include "types.h"
-
-template <q_t n>
-class torus_t : public std::array<double, n> {
- public:
- typedef std::array<double, n> M_t;
- typedef std::array<double, n> F_t;
-
- torus_t() {
- this->fill(0);
- }
-
- inline torus_t<n> operator*(v_t a) const {
- torus_t<n> x;
- for (q_t i = 0; i < n; i++) {
- x[i] = a * (*this)[i];
- }
-
- return x;
- }
-
- inline torus_t<n> operator*(double a) const {
- torus_t<n> x;
- for (q_t i = 0; i < n; i++) {
- x[i] = a * (*this)[i];
- }
-
- return x;
- }
-
- inline torus_t<n>& operator+=(const torus_t<n>& x) {
- for (q_t i = 0; i < n; i++) {
- (*this)[i] += x[i];
- }
- }
-
- inline torus_t<n>& operator-=(const torus_t<n>& x) {
- for (q_t i = 0; i < n; i++) {
- (*this)[i] -= x[i];
- }
- }
-};
-
-template <q_t n>
-double norm_squared(const torus_t<n>& x) {
- double tmp = 0;
- for (const double& xi : x) {
- tmp += pow(xi, 2);
- }
- return tmp;
-}
-
-void write_magnetization(const torus_t<n>& x, FILE *outfile) {
- for (const double& xi : x) {
- float tmp_xi = (float)xi;
- fwrite(&tmp_xi, sizeof(float), 1, outfile);
- }
-}
-
diff --git a/lib/vector.h b/lib/vector.h
deleted file mode 100644
index 7d0ee36..0000000
--- a/lib/vector.h
+++ /dev/null
@@ -1,118 +0,0 @@
-
-#pragma once
-
-#include <stdlib.h>
-#include <cmath>
-#include <array>
-
-#include "types.h"
-
-template <q_t q, class T>
-class vector_t : public std::array<T, q> {
- public:
-
- // M_t needs to hold the sum of nv spins
- typedef vector_t <q, T> M_t;
-
- // F_t needs to hold the double-weighted sum of spins
- typedef vector_t <q, double> F_t;
-
- vector_t() {
- this->fill((T)0);
- (*this)[1] = (T)1;
- }
-
- vector_t(const T *x) {
- for (q_t i = 0; i < q; i++) {
- (*this)[i] = x[i];
- }
- }
-
- template <class U>
- inline vector_t<q, T>& operator+=(const vector_t<q, U> &v) {
- for (q_t i = 0; i < q; i++) {
- (*this)[i] += (U)v[i];
- }
- return *this;
- }
-
- template <class U>
- inline vector_t<q, T>& operator-=(const vector_t<q, U> &v) {
- for (q_t i = 0; i < q; i++) {
- (*this)[i] -= (U)v[i];
- }
- return *this;
- }
-
- inline vector_t<q, T> operator*(v_t x) const {
- vector_t<q, T> result;
- for (q_t i = 0; i < q; i++) {
- result[i] = x * (*this)[i];
- }
-
- return result;
- }
-
- inline vector_t<q, double> operator*(double x) const {
- vector_t<q, double> result;
- for (q_t i = 0; i < q; i++) {
- result[i] = x * (*this)[i];
- }
-
- return result;
- }
-
- inline vector_t<q, T> operator-(const vector_t<q, T>& v) const {
- vector_t<q, T> diff = *this;
- diff -= v;
- return diff;
- }
-};
-
-
-template<q_t q, class T>
-double norm_squared(vector_t<q, T> v) {
- double tmp = 0;
- for (T &x : v) {
- tmp += pow(x, 2);
- }
-
- return tmp;
-}
-
-template <q_t q, class T>
-void write_magnetization(vector_t <q, T> M, FILE *outfile) {
- for (q_t i = 0; i < q; i++) {
- fwrite(&(M[i]), sizeof(T), q, outfile);
- }
-}
-
-// below functions and definitions are unnecessary for wolff.h but useful.
-
-template <q_t q> // save some space and don't write whole doubles
-void write_magnetization(vector_t <q, double> M, FILE *outfile) {
- for (q_t i = 0; i < q; i++) {
- float M_tmp = (float)M[i];
- fwrite(&M_tmp, sizeof(float), 1, outfile);
- }
-}
-
-template <q_t q, class T>
-T dot(const vector_t <q, T>& v1, const vector_t <q, T>& v2) {
- T prod = 0;
-
- for (q_t i = 0; i < q; i++) {
- prod += v1[i] * v2[i];
- }
-
- return prod;
-}
-
-template <q_t q, class T>
-double H_vector(const vector_t <q, T>& v1, T *H) {
- vector_t <q, T> H_vec(H);
- return (double)(dot <q, T> (v1, H_vec));
-}
-
-char const *ON_strings[] = {"TRIVIAL", "ISING", "PLANAR", "HEISENBERG"};
-
diff --git a/lib/z2.h b/lib/z2.h
deleted file mode 100644
index a18d740..0000000
--- a/lib/z2.h
+++ /dev/null
@@ -1,53 +0,0 @@
-
-#pragma once
-
-#include "types.h"
-#include "ising.h"
-
-/* The minimum definition for a group type R_t to act on a spin type X_t is
- * given by the following.
- *
- * void init(R_t *p);
- * void free_spin(R_t r);
- * R_t copy(R_t r);
- * X_t act(R_t r, X_t x);
- * R_t act(R_t r, R_t r);
- * X_t act_inverse(R_t r, X_t x);
- * R_t act_inverse(R_t r, R_t r);
- *
- */
-
-class z2_t {
- public:
- bool x;
-
- z2_t() : x(false) {}
-
- z2_t(bool x) : x(x) {}
-
- ising_t act(const ising_t& s) const {
- if (x) {
- return ising_t(!s.x);
- } else {
- return ising_t(s.x);
- }
- }
-
- z2_t act(const z2_t& r) const {
- if (x) {
- return z2_t(!r.x);
- } else {
- return z2_t(r.x);
- }
- }
-
- ising_t act_inverse(const ising_t& s) const {
- return this->act(s);
- }
-
- z2_t act_inverse(const z2_t& r) const {
- return this->act(r);
- }
-};
-
-