From 02bff5563d5a0150bde4ae3de9222a1837aefa98 Mon Sep 17 00:00:00 2001 From: Jaron Kent-Dobias Date: Mon, 10 Oct 2022 20:49:04 +0200 Subject: Merged Graph and AztecDiamond classes. --- uniform.cpp | 113 +++++------------------------------------------------------- 1 file changed, 8 insertions(+), 105 deletions(-) (limited to 'uniform.cpp') diff --git a/uniform.cpp b/uniform.cpp index 2c123ff..c6f7869 100644 --- a/uniform.cpp +++ b/uniform.cpp @@ -4,101 +4,6 @@ #include "rbmp.hpp" -using Real = long double; - -class AztecDiamond { - -public: - typedef struct Edge { - std::stack weights; - Real probability = 0; - } Edge; - -private: - std::tuple face(unsigned i, unsigned j) { - unsigned x0 = n - i; - unsigned xx = 2 * (j % i); - unsigned yy = 2 * (j / i); - - Edge& e1 = edges[2 * n * (x0 + yy) + x0 + xx]; - Edge& e2 = edges[2 * n * (x0 + yy) + x0 + xx + 1]; - Edge& e3 = edges[2 * n * (x0 + yy + 1) + x0 + xx]; - Edge& e4 = edges[2 * n * (x0 + yy + 1) + x0 + xx + 1]; - - return {e1, e2, e3, e4}; - } - -public: - unsigned n; - std::vector edges; - - AztecDiamond(unsigned n) : edges(pow(2 * n, 2)), n(n) {} - - void computeWeights() { - for (unsigned i = n; i > 0; i--) { -#pragma omp parallel for - for (unsigned j = 0; j < pow(i, 2); j++) { - auto [e1, e2, e3, e4] = face(i, j); - - Real w = e1.weights.top(); - Real x = e2.weights.top(); - Real y = e3.weights.top(); - Real z = e4.weights.top(); - - Real cellFactor = w * z + x * y; - - e1.weights.push(z / cellFactor); - e2.weights.push(y / cellFactor); - e3.weights.push(x / cellFactor); - e4.weights.push(w / cellFactor); - } - } - - // This process computes one extra weight per edge. - for (Edge& e : edges) { - e.weights.pop(); - } - } - - Real computeProbabilities() { // destroys *all* weights - Real partitionFunction = 1; - - for (unsigned i = 1; i <= n; i++) { -#pragma omp parallel for - for (unsigned j = 0; j < pow(i, 2); j++) { - auto [e1, e2, e3, e4] = face(i, j); - - Real p = e1.probability; - Real q = e2.probability; - Real r = e3.probability; - Real s = e4.probability; - - Real w = e1.weights.top(); - Real x = e2.weights.top(); - Real y = e3.weights.top(); - Real z = e4.weights.top(); - - Real cellFactor = w * z + x * y; - Real deficit = 1 - p - q - r - s; - - e1.probability = s + deficit * w * z / cellFactor; - e2.probability = r + deficit * x * y / cellFactor; - e3.probability = q + deficit * x * y / cellFactor; - e4.probability = p + deficit * w * z / cellFactor; - - e1.weights.pop(); - e2.weights.pop(); - e3.weights.pop(); - e4.weights.pop(); - - partitionFunction *= cellFactor; - } - } - - return partitionFunction; - } -}; - int main(int argc, char* argv[]) { unsigned n = 100; unsigned m = 100; @@ -125,7 +30,7 @@ int main(int argc, char* argv[]) { std::string filename = "order_" + std::to_string(n) + "_" + std::to_string(T) + ".dat"; Rng r; - AztecDiamond a(n); + AztecDiamond a(n, r); std::vector avgProbabilities(a.edges.size()); @@ -142,15 +47,13 @@ int main(int argc, char* argv[]) { } } - Graph G(n, r); - - std::vector data_x(G.vertices.size()); - std::vector data_y(G.vertices.size()); + std::vector data_x(a.vertices.size()); + std::vector data_y(a.vertices.size()); - for (unsigned i = 0; i < G.edges.size(); i++) { - const Graph::Edge& e = G.edges[i]; - const Graph::Vertex& vt = e.halfedges[0].getTail(); - const Graph::Vertex& vh = e.halfedges[0].getHead(); + for (unsigned i = 0; i < a.edges.size(); i++) { + const AztecDiamond::Edge& e = a.edges[i]; + const AztecDiamond::Vertex& vt = *e.tail; + const AztecDiamond::Vertex& vh = *e.head; data_x[vt.index] += avgProbabilities[i] * (vt.coordinate[0] - vh.coordinate[0]); data_y[vt.index] += avgProbabilities[i] * (vt.coordinate[1] - vh.coordinate[1]); data_x[vh.index] += avgProbabilities[i] * (vt.coordinate[0] - vh.coordinate[0]); @@ -159,7 +62,7 @@ int main(int argc, char* argv[]) { std::ofstream output(filename); - for (unsigned i = 0; i < G.vertices.size(); i++) { + for (unsigned i = 0; i < a.vertices.size(); i++) { output << data_x[i] << " " << data_y[i] << std::endl; } -- cgit v1.2.3-70-g09d2