summaryrefslogtreecommitdiff
path: root/hadamard_pt.hpp
diff options
context:
space:
mode:
Diffstat (limited to 'hadamard_pt.hpp')
-rw-r--r--hadamard_pt.hpp47
1 files changed, 33 insertions, 14 deletions
diff --git a/hadamard_pt.hpp b/hadamard_pt.hpp
index a3d4657..fba97b5 100644
--- a/hadamard_pt.hpp
+++ b/hadamard_pt.hpp
@@ -6,6 +6,8 @@
void swap(MCMC& s1, MCMC& s2) {
std::swap(s1.M, s2.M);
std::swap(s1.E, s2.E);
+ std::swap(s1.tag, s2.tag);
+ std::swap(s1.c, s2.c);
}
class ParallelMeasurement {
@@ -29,23 +31,41 @@ public:
ParallelMeasurement& B;
std::vector<Measurement*>& As;
- PT(std::list<range> ranges, unsigned n, ParallelMeasurement& B, std::vector<Measurement*>& As)
+ PT(double β₀, double β₁, unsigned n, ParallelMeasurement& B, std::vector<Measurement*>& As)
: B(B), As(As) {
- unsigned count = 0;
- for (range r : ranges) {
- for (unsigned i = 1; i <= r.N; i++) {
- double β = r.β0 + i * (r.β1 - r.β0) / r.N;
- Ms.push_back(MCMC(n, β, *As[count]));
- count++;
- }
+ Ms.reserve(n);
+ for (unsigned i = 1; i <= n; i++) {
+ double β = β₀ + i * (β₁ - β₀) / n;
+ Ms.push_back(MCMC(n, β, *As[i - 1], i - 1));
}
+ Ms[0].c = down;
+ Ms[n - 1].c = up;
}
- void tune(unsigned N, double ε) {
+ void tune(unsigned n, unsigned m, double ε) {
+ std::vector<unsigned> nu(Ms.size());
+ std::vector<unsigned> nd(Ms.size());
+
+ for (unsigned i = 0; i < n; i++) {
+ Ms[0].c = down;
+ Ms[Ms.size() - 1].c = up;
+
#pragma omp parallel for
- for (unsigned i = 0; i < Ms.size(); i++) {
- Ms[i].tune(N, ε);
+ for (unsigned j = 0; j < Ms.size(); j++) {
+ Ms[j].tune(m, ε);
+ }
+ this->sweep(true);
+
+ for (unsigned j = 0; j < Ms.size(); j++) {
+ if (Ms[j].c == up) {
+ nu[j]++;
+ } else if (Ms[j].c == down) {
+ nd[j]++;
+ }
+ }
}
+
+ for (
}
bool step(unsigned i, unsigned j, bool dry = false) {
@@ -64,10 +84,9 @@ public:
}
void sweep(bool dry = false) {
+
for (unsigned i = 0; i < Ms.size() - 1; i++) {
- for (unsigned j = i + 1; j < Ms.size(); j++) {
- this->step(i, j, dry);
- }
+ this->step(i, i + 1, dry);
}
}