summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJaron Kent-Dobias <jaron@kent-dobias.com>2021-02-11 14:25:52 +0100
committerJaron Kent-Dobias <jaron@kent-dobias.com>2021-02-11 14:25:52 +0100
commite5163658f659f6863ee4ef6473f9124884e7957c (patch)
tree80b2db1d84fb78ea385a39741c757e044a27151d
parent07a5acbdf79153bb505771708202a9a5fc6f98f0 (diff)
downloadcode-master.tar.gz
code-master.tar.bz2
code-master.zip
Added aging code.HEADmaster
-rw-r--r--hmm_aging.cpp125
-rw-r--r--hmm_correlation.cpp8
2 files changed, 129 insertions, 4 deletions
diff --git a/hmm_aging.cpp b/hmm_aging.cpp
new file mode 100644
index 0000000..522dac6
--- /dev/null
+++ b/hmm_aging.cpp
@@ -0,0 +1,125 @@
+
+#include "hadamard_mcmc.hpp"
+#include "matrices.hpp"
+
+#include <chrono>
+#include <fstream>
+#include <iostream>
+#include <list>
+
+std::string getFilename(unsigned n, double β1, double β2, double θ₀, unsigned m, unsigned s) {
+ auto tag = std::chrono::high_resolution_clock::now();
+ return "aging_" + std::to_string(n) + "_" + std::to_string(β1) + "_" + std::to_string(β2) + "_" +
+ std::to_string(θ₀) + "_" + std::to_string(m) + "_" + std::to_string(s) + "_" + std::to_string(tag.time_since_epoch().count()) + ".dat";
+}
+
+class Correlation {
+ public:
+ Orthogonal M0;
+ std::list<double> C;
+
+ Correlation(const Orthogonal& M) : M0(M) {}
+
+ void add(const Orthogonal& M) {
+ C.push_back(M0 * M);
+ }
+};
+
+class MeasureCorrelation : public Measurement {
+public:
+ unsigned s;
+ unsigned n;
+ unsigned N;
+ std::list<Correlation> Cs;
+
+ MeasureCorrelation(unsigned m, unsigned skip) : N(m), s(skip) {
+ n = 0;
+ }
+
+ void after_sweep(double, double, const Orthogonal& M) override {
+ if (n % N == 0) {
+ Cs.push_back(Correlation(M));
+ }
+
+ if (n % s == 0) {
+ for (Correlation& C : Cs) {
+ C.add(M);
+ }
+ }
+
+ n++;
+ }
+};
+
+int main(int argc, char* argv[]) {
+ // model parameters
+ unsigned n = 2; // matrix size over four
+
+ // simulation settings
+ double β1 = 5; // temperature
+ double β2 = 15; // temperature
+ unsigned M = 1e4; // number of relaxation sweeps
+ unsigned N = 1e4; // number of measurement sweeps
+ unsigned m = 1e3;
+ unsigned s = 10;
+ double θ₀ = 0.05; // standard deviation of step size
+
+ bool loadDataFromFile = false;
+
+ int opt;
+
+ while ((opt = getopt(argc, argv, "n:b:c:M:N:m:t:s:")) != -1) {
+ switch (opt) {
+ case 'n':
+ n = atoi(optarg);
+ break;
+ case 'b':
+ β1 = atof(optarg);
+ break;
+ case 'c':
+ β2 = atof(optarg);
+ break;
+ case 'M':
+ M = (unsigned)atof(optarg);
+ break;
+ case 'N':
+ N = (unsigned)atof(optarg);
+ break;
+ case 'm':
+ m = (unsigned)atof(optarg);
+ break;
+ case 't':
+ θ₀ = atof(optarg);
+ break;
+ case 's':
+ s = (unsigned)atof(optarg);
+ break;
+ default:
+ exit(1);
+ }
+ }
+
+ MeasureCorrelation Q(m, s);
+ MCMC simulation(n, β1, Q, θ₀);
+
+ simulation.run(M, true);
+ std::cout << "Finished initial relaxation at " << β1 << ", quenching to " << β2 << "." << std::endl;
+
+ simulation.β = β2;
+ simulation.run(N * m);
+
+ std::cout << "Finished simulation." << std::endl;
+
+ std::string filename = getFilename(n, β1, β2, θ₀, m, s);
+ std::ofstream file(filename);
+
+ for (const Correlation& C : Q.Cs) {
+ for (double x : C.C) {
+ file << x << " ";
+ }
+ file << std::endl;
+ }
+
+ return 0;
+}
+
diff --git a/hmm_correlation.cpp b/hmm_correlation.cpp
index 80a6927..522367f 100644
--- a/hmm_correlation.cpp
+++ b/hmm_correlation.cpp
@@ -7,9 +7,9 @@
#include <fstream>
#include <iostream>
-std::string getFilename(unsigned n, double β, double θ₀, unsigned lag, unsigned skip) {
+std::string getFilename(unsigned n, double β, double θ₀, unsigned m, unsigned lag, unsigned skip) {
return "correlation_" + std::to_string(n) + "_" + std::to_string(β) + "_" +
- std::to_string(θ₀) + "_" + std::to_string(lag) + "_" + std::to_string(skip)
+ std::to_string(θ₀) + "_" + std::to_string(m) + "_" + std::to_string(lag) + "_" + std::to_string(skip)
+ ".dat";
}
@@ -77,7 +77,7 @@ int main(int argc, char* argv[]) {
MCMC simulation(n, β, Q, θ₀);
if (loadDataFromFile) {
- Q.Q.read(getFilename(n, β, θ₀, l, s));
+ Q.Q.read(getFilename(n, β, θ₀, m, l, s));
std::cout << "Imported data from file, number of steps " << Q.Q.num_added() << "." << std::endl;
}
@@ -86,7 +86,7 @@ int main(int argc, char* argv[]) {
simulation.run(N);
std::cout << "Finished simulation of " << β << ", writing output file." << std::endl;
- std::string filename = getFilename(n, β, θ₀, l, s);
+ std::string filename = getFilename(n, β, θ₀, m, l, s);
Q.Q.write(filename);
return 0;