diff options
| author | Jaron Kent-Dobias <jaron@kent-dobias.com> | 2018-10-15 22:57:17 -0400 | 
|---|---|---|
| committer | Jaron Kent-Dobias <jaron@kent-dobias.com> | 2018-10-15 22:57:17 -0400 | 
| commit | 1343a3fe6bd17a2487f12a0d61be8dc83cd722a0 (patch) | |
| tree | fa937f0f3ba0f4977036c862c846a2ee461540ca /examples/src | |
| parent | 6e8b19e1f1a244ef09e1b63d7593250d6ce01692 (diff) | |
| download | c++-1343a3fe6bd17a2487f12a0d61be8dc83cd722a0.tar.gz c++-1343a3fe6bd17a2487f12a0d61be8dc83cd722a0.tar.bz2 c++-1343a3fe6bd17a2487f12a0d61be8dc83cd722a0.zip | |
many changes, including reworking the measurements system
Diffstat (limited to 'examples/src')
| -rw-r--r-- | examples/src/models/On/wolff_On.cpp | 25 | ||||
| -rw-r--r-- | examples/src/models/ising/ising.hpp | 33 | ||||
| -rw-r--r-- | examples/src/models/ising/wolff_ising.cpp | 25 | ||||
| -rw-r--r-- | examples/src/models/potts/symmetric.hpp | 1 | ||||
| -rw-r--r-- | examples/src/models/potts/wolff_clock.cpp | 22 | ||||
| -rw-r--r-- | examples/src/models/potts/wolff_potts.cpp | 25 | 
6 files changed, 70 insertions, 61 deletions
| diff --git a/examples/src/models/On/wolff_On.cpp b/examples/src/models/On/wolff_On.cpp index ad2ac77..67f28a5 100644 --- a/examples/src/models/On/wolff_On.cpp +++ b/examples/src/models/On/wolff_On.cpp @@ -188,14 +188,12 @@ int main(int argc, char *argv[]) {    fclose(outfile_info); -  FILE **outfiles = measure_setup_files(measurement_flags, timestamp); - -  std::function <void(const On_t&)> other_f; +  std::function <void(const On_t&, const wolff_research_measurements<orthogonal_R_t, vector_R_t>&)> other_f;    uint64_t sum_of_clusterSize = 0;    if (N_is_sweeps) { -    other_f = [&] (const On_t& s) { -      sum_of_clusterSize += s.last_cluster_size; +    other_f = [&] (const On_t& s, const wolff_research_measurements<orthogonal_R_t, vector_R_t>& m) { +      sum_of_clusterSize += m.last_cluster_size;      };    } else if (draw) {  #ifdef HAVE_GLUT @@ -209,7 +207,7 @@ int main(int argc, char *argv[]) {      glLoadIdentity();      gluOrtho2D(0.0, L, 0.0, L); -    other_f = [&] (const On_t& s) { +    other_f = [&] (const On_t& s, const wolff_research_measurements<orthogonal_R_t, vector_R_t>& m) {        glClear(GL_COLOR_BUFFER_BIT);        for (v_t i = 0; i < pow(L, 2); i++) {  #ifdef NOFIELD @@ -228,11 +226,9 @@ int main(int argc, char *argv[]) {      };  #endif    } else { -    other_f = [] (const On_t& s) {}; +    other_f = [] (const On_t& s, const wolff_research_measurements<orthogonal_R_t, vector_R_t>& m) {};    } -  std::function <void(const On_t&)> measurements = measure_function_write_files(measurement_flags, outfiles, other_f); -    std::function <double(const vector_R_t&)> H;    if (modulated_field) { @@ -251,20 +247,21 @@ int main(int argc, char *argv[]) {    state_t <orthogonal_R_t, vector_R_t> s(D, L, T, dot <N_COMP, double>);  #endif +  wolff_research_measurements<orthogonal_R_t, vector_R_t> m(measurement_flags, timestamp, other_f, s, silent); +    if (N_is_sweeps) {      count_t N_rounds = 0;      printf("\n");      while (sum_of_clusterSize < N * s.nv) { -      printf("\033[F\033[J\033[F\033[JWOLFF: sweep %" PRIu64 " / %" PRIu64 ": E = %.2f, S = %" PRIv "\n", (count_t)((double)sum_of_clusterSize / (double)s.nv), N, s.E, s.last_cluster_size); -      wolff <orthogonal_R_t, vector_R_t> (N, s, gen_R, measurements, rng, silent); +      printf("\033[F\033[J\033[F\033[JWOLFF: sweep %" PRIu64 " / %" PRIu64 ": E = %.2f, S = %" PRIv "\n", (count_t)((double)sum_of_clusterSize / (double)s.nv), N, m.E, m.last_cluster_size); +      wolff <orthogonal_R_t, vector_R_t> (N, s, gen_R, m, rng);        N_rounds++;      } -    printf("\033[F\033[J\033[F\033[JWOLFF: sweep %" PRIu64 " / %" PRIu64 ": E = %.2f, S = %" PRIv "\n\n", (count_t)((double)sum_of_clusterSize / (double)s.nv), N, s.E, s.last_cluster_size); +    printf("\033[F\033[J\033[F\033[JWOLFF: sweep %" PRIu64 " / %" PRIu64 ": E = %.2f, S = %" PRIv "\n\n", (count_t)((double)sum_of_clusterSize / (double)s.nv), N, m.E, m.last_cluster_size);    } else { -    wolff <orthogonal_R_t, vector_R_t> (N, s, gen_R, measurements, rng, silent); +    wolff <orthogonal_R_t, vector_R_t> (N, s, gen_R, m, rng);    } -  measure_free_files(measurement_flags, outfiles);    free(H_vec);    return 0; diff --git a/examples/src/models/ising/ising.hpp b/examples/src/models/ising/ising.hpp index ae20840..73b06ed 100644 --- a/examples/src/models/ising/ising.hpp +++ b/examples/src/models/ising/ising.hpp @@ -5,17 +5,31 @@  #include <wolff/types.h> +// all that is required to use wolff.hpp is a default constructor  class ising_t {    public:      bool x; -    typedef int M_t; -    typedef double F_t; -      ising_t() : x(false) {} -    ising_t(bool x) : x(x) {} + +    // optional constructors for syntactic sugar +    ising_t(bool x) : x(x) {}       ising_t(int x) : x((bool)x) {} +    /* below this comment is code required only for using measure.hpp in the +     * examples folder, which provides an interface for measuring several +     * generic features of models. these require +     * +     *  - an M_t, representing the magnetization or sum of all spins +     *  - an F_t, representing a double-weighted version of the magnetization +     *  - the overloaded operator *, which takes a v_t (unsigned int) and returns an M_t +     *  - the overloaded operator *, which takes a double and returns an F_t +     *  - the overloaded operator -, which takes another X_t and returns an M_t +     */ + +    typedef int M_t; +    typedef double F_t; +      inline int operator*(v_t a) const {        if (x) {          return -(int)a; @@ -45,6 +59,12 @@ class ising_t {      }  }; +/* using measure.hpp additionally requires a norm_squared function which takes + * an F_t to a double, and a write_magnetization function, which takes an M_t + * and a FILE pointer and appropriately records the contents of the former to + * the latter. + */ +  double norm_squared(double s) {    return pow(s, 2);  } @@ -53,6 +73,11 @@ void write_magnetization(int M, FILE *outfile) {    fwrite(&M, sizeof(int), 1, outfile);  } +/* these definitions allow wolff/finite_states.hpp to be invoked and provide + * much faster performance for models whose number of possible spin + * configurations is finite. + */ +  #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/examples/src/models/ising/wolff_ising.cpp b/examples/src/models/ising/wolff_ising.cpp index f7a3ada..de04f32 100644 --- a/examples/src/models/ising/wolff_ising.cpp +++ b/examples/src/models/ising/wolff_ising.cpp @@ -127,14 +127,12 @@ int main(int argc, char *argv[]) {      return z2_t(true);    }; -  FILE **outfiles = measure_setup_files(measurement_flags, timestamp); - -  std::function <void(const state_t<z2_t, ising_t>&)> other_f; +  std::function <void(const state_t<z2_t, ising_t>&, const wolff_research_measurements<z2_t, ising_t>&)> other_f;    uint64_t sum_of_clusterSize = 0;    if (N_is_sweeps) { -    other_f = [&] (const state_t<z2_t, ising_t>& s) { -      sum_of_clusterSize += s.last_cluster_size; +    other_f = [&] (const state_t<z2_t, ising_t>& s, const wolff_research_measurements<z2_t, ising_t>& meas) { +      sum_of_clusterSize += meas.last_cluster_size;      };    } else if (draw) {  #ifdef HAVE_GLUT @@ -148,7 +146,7 @@ int main(int argc, char *argv[]) {      glLoadIdentity();      gluOrtho2D(0.0, L, 0.0, L); -    other_f = [] (const state_t <z2_t, ising_t>& s) { +    other_f = [] (const state_t <z2_t, ising_t>& s, const wolff_research_measurements<z2_t, ising_t>& meas) {        glClear(GL_COLOR_BUFFER_BIT);        for (v_t i = 0; i < pow(s.L, 2); i++) {  #ifdef NOFIELD @@ -166,10 +164,10 @@ int main(int argc, char *argv[]) {      };  #endif    } else { -    other_f = [] (const state_t<z2_t, ising_t>& s) {}; +    other_f = [] (const state_t<z2_t, ising_t>& s, const wolff_research_measurements<z2_t, ising_t>& meas) {};    } -  std::function <void(const state_t<z2_t, ising_t>&)> measurements = measure_function_write_files(measurement_flags, outfiles, other_f); +  wolff_research_measurements<z2_t, ising_t> m(measurement_flags, timestamp, other_f, s, silent);    // add line to metadata file with run info    { @@ -185,18 +183,15 @@ int main(int argc, char *argv[]) {      count_t N_rounds = 0;      printf("\n");      while (sum_of_clusterSize < N * s.nv) { -      printf("\033[F\033[J\033[F\033[JWOLFF: sweep %" PRIu64 " / %" PRIu64 ": E = %.2f, S = %" PRIv "\n", (count_t)((double)sum_of_clusterSize / (double)s.nv), N, s.E, s.last_cluster_size); -      wolff(N, s, gen_R, measurements, rng, silent); +      printf("\033[F\033[J\033[F\033[JWOLFF: sweep %" PRIu64 " / %" PRIu64 ": E = %.2f, S = %" PRIv "\n", (count_t)((double)sum_of_clusterSize / (double)s.nv), N, m.E, m.last_cluster_size); +      wolff(N, s, gen_R, m, rng);        N_rounds++;      } -    printf("\033[F\033[J\033[F\033[JWOLFF: sweep %" PRIu64 " / %" PRIu64 ": E = %.2f, S = %" PRIv "\n\n", (count_t)((double)sum_of_clusterSize / (double)s.nv), N, s.E, s.last_cluster_size); +    printf("\033[F\033[J\033[F\033[JWOLFF: sweep %" PRIu64 " / %" PRIu64 ": E = %.2f, S = %" PRIv "\n\n", (count_t)((double)sum_of_clusterSize / (double)s.nv), N, m.E, m.last_cluster_size);    } else { -    wolff(N, s, gen_R, measurements, rng, silent); +    wolff(N, s, gen_R, m, rng);    } -  measure_free_files(measurement_flags, outfiles); -    return 0; -  } diff --git a/examples/src/models/potts/symmetric.hpp b/examples/src/models/potts/symmetric.hpp index 8636f15..bc8673f 100644 --- a/examples/src/models/potts/symmetric.hpp +++ b/examples/src/models/potts/symmetric.hpp @@ -36,6 +36,7 @@ class symmetric_t : public std::array<q_t, q> {          }        } +      printf("Your spin wasn't a valid state!", s.x);        exit(EXIT_FAILURE);      } diff --git a/examples/src/models/potts/wolff_clock.cpp b/examples/src/models/potts/wolff_clock.cpp index 020415d..0706cc5 100644 --- a/examples/src/models/potts/wolff_clock.cpp +++ b/examples/src/models/potts/wolff_clock.cpp @@ -9,6 +9,7 @@  #include "dihedral.hpp"  #include "potts.hpp"  #include <colors.h> +#include <measure.hpp>  // hack to speed things up considerably  #define N_STATES POTTSQ @@ -95,7 +96,7 @@ int main(int argc, char *argv[]) {    std::function <dihedral_t<POTTSQ>(std::mt19937&, potts_t<POTTSQ>)> gen_R = [] (std::mt19937& r, potts_t<POTTSQ> v) -> dihedral_t<POTTSQ> {      dihedral_t<POTTSQ> rot;      rot.is_reflection = true; -    std::uniform_int_distribution<q_t> dist(0, POTTSQ - 1); +    std::uniform_int_distribution<q_t> dist(0, POTTSQ - 2);      q_t x = dist(r);      rot.x = (2 * v.x + x + 1) % POTTSQ; @@ -103,13 +104,11 @@ int main(int argc, char *argv[]) {    };    // define function that updates any number of measurements -  std::function <void(const sim_t&)> measurement; +  std::function <void(const sim_t&, const wolff_research_measurements<dihedral_t<POTTSQ>, potts_t<POTTSQ>>&)> measurement; -  double average_M = 0;    if (!draw) {      // a very simple example: measure the average magnetization -    measurement = [&] (const sim_t& s) { -      average_M += (double)s.M[0] / (double)N / (double)s.nv; +    measurement = [&] (const sim_t& s, const wolff_research_measurements<dihedral_t<POTTSQ>, potts_t<POTTSQ>>&) {      };    } else {      // a more complex example: measure the average magnetization, and draw the spin configuration to the screen @@ -125,8 +124,7 @@ int main(int argc, char *argv[]) {      glLoadIdentity();      gluOrtho2D(0.0, L, 0.0, L); -    measurement = [&] (const sim_t& s) { -      average_M += (double)s.M[0] / (double)N / (double)s.nv; +    measurement = [&] (const sim_t& s, const wolff_research_measurements<dihedral_t<POTTSQ>, potts_t<POTTSQ>>&) {        glClear(GL_COLOR_BUFFER_BIT);        for (v_t i = 0; i < pow(L, 2); i++) {          potts_t<POTTSQ> tmp_s = s.R.act_inverse(s.spins[i]); @@ -138,17 +136,13 @@ int main(int argc, char *argv[]) {  #endif    } -  // run wolff for N cluster flips -  wolff(N, s, gen_R, measurement, rng, silent); +  wolff_research_measurements<dihedral_t<POTTSQ>, potts_t<POTTSQ>> m(0, 0, measurement, s, silent); -  // tell us what we found! -  printf("%" PRIcount " %d-Potts runs completed. D = %" PRID ", L = %" PRIL ", T = %g, H = %g, <M> = %g\n", N, POTTSQ, D, L, T, H_vec[0], average_M); +  // run wolff for N cluster flips +  wolff(N, s, gen_R, m, rng);    // free the random number generator -  if (draw) { -  } -    return 0;  } diff --git a/examples/src/models/potts/wolff_potts.cpp b/examples/src/models/potts/wolff_potts.cpp index a1e9284..7b92ac1 100644 --- a/examples/src/models/potts/wolff_potts.cpp +++ b/examples/src/models/potts/wolff_potts.cpp @@ -119,7 +119,7 @@ int main(int argc, char *argv[]) {    std::function <symmetric_t<POTTSQ>(std::mt19937&, potts_t<POTTSQ>)> gen_R = [] (std::mt19937& r, potts_t<POTTSQ> v) -> symmetric_t<POTTSQ> {      symmetric_t<POTTSQ> rot; -    std::uniform_int_distribution<q_t> dist(0, POTTSQ - 1); +    std::uniform_int_distribution<q_t> dist(0, POTTSQ - 2);      q_t j = dist(r);      q_t swap_v;      if (j < v.x) { @@ -134,14 +134,12 @@ int main(int argc, char *argv[]) {      return rot;    }; -  FILE **outfiles = measure_setup_files(measurement_flags, timestamp); - -  std::function <void(const sim_t&)> other_f; +  std::function <void(const sim_t&, const wolff_research_measurements<symmetric_t<POTTSQ>, potts_t<POTTSQ>>&)> other_f;    uint64_t sum_of_clusterSize = 0;    if (N_is_sweeps) { -    other_f = [&] (const sim_t& s) { -      sum_of_clusterSize += s.last_cluster_size; +    other_f = [&] (const sim_t& s, const wolff_research_measurements<symmetric_t<POTTSQ>, potts_t<POTTSQ>>& m) { +      sum_of_clusterSize += m.last_cluster_size;      };    } else if (draw) {  #ifdef HAVE_GLUT @@ -155,7 +153,7 @@ int main(int argc, char *argv[]) {      glLoadIdentity();      gluOrtho2D(0.0, L, 0.0, L); -    other_f = [] (const sim_t& s) { +    other_f = [] (const sim_t& s, const wolff_research_measurements<symmetric_t<POTTSQ>, potts_t<POTTSQ>>& m) {        glClear(GL_COLOR_BUFFER_BIT);        for (v_t i = 0; i < pow(s.L, 2); i++) {          potts_t<POTTSQ> tmp_s = s.R.act_inverse(s.spins[i]); @@ -166,10 +164,10 @@ int main(int argc, char *argv[]) {      };  #endif    } else { -    other_f = [] (const sim_t& s) {}; +    other_f = [] (const sim_t& s, const wolff_research_measurements<symmetric_t<POTTSQ>, potts_t<POTTSQ>>& m) {};    } -  std::function <void(const sim_t&)> measurements = measure_function_write_files(measurement_flags, outfiles, other_f); +  wolff_research_measurements<symmetric_t<POTTSQ>, potts_t<POTTSQ>> m(measurement_flags, timestamp, other_f, s, silent);    // add line to metadata file with run info    { @@ -194,18 +192,17 @@ int main(int argc, char *argv[]) {      count_t N_rounds = 0;      printf("\n");      while (sum_of_clusterSize < N * s.nv) { -      printf("\033[F\033[J\033[F\033[JWOLFF: sweep %" PRIu64 " / %" PRIu64 ": E = %.2f, S = %" PRIv "\n", (count_t)((double)sum_of_clusterSize / (double)s.nv), N, s.E, s.last_cluster_size); -      wolff(N, s, gen_R, measurements, rng, silent); +      printf("\033[F\033[J\033[F\033[JWOLFF: sweep %" PRIu64 " / %" PRIu64 ": E = %.2f, S = %" PRIv "\n", (count_t)((double)sum_of_clusterSize / (double)s.nv), N, m.E, m.last_cluster_size); +      wolff(N, s, gen_R, m, rng);        N_rounds++;      } -    printf("\033[F\033[J\033[F\033[JWOLFF: sweep %" PRIu64 " / %" PRIu64 ": E = %.2f, S = %" PRIv "\n\n", (count_t)((double)sum_of_clusterSize / (double)s.nv), N, s.E, s.last_cluster_size); +    printf("\033[F\033[J\033[F\033[JWOLFF: sweep %" PRIu64 " / %" PRIu64 ": E = %.2f, S = %" PRIv "\n\n", (count_t)((double)sum_of_clusterSize / (double)s.nv), N, m.E, m.last_cluster_size);    } else { -    wolff(N, s, gen_R, measurements, rng, silent); +    wolff(N, s, gen_R, m, rng);    }    // free the random number generator    free(H_vec); -  measure_free_files(measurement_flags, outfiles);    return 0; | 
