summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--uniform.cpp64
1 files changed, 27 insertions, 37 deletions
diff --git a/uniform.cpp b/uniform.cpp
index 0c6c125..519e6c0 100644
--- a/uniform.cpp
+++ b/uniform.cpp
@@ -1,29 +1,19 @@
#include <functional>
#include <iostream>
-#include <fstream>
#include <list>
-#include <cmath>
-#include <random>
-
#include "randutils/randutils.hpp"
#include "pcg-cpp/include/pcg_random.hpp"
using Rng = randutils::random_generator<pcg32>;
using Real = long double;
-class Edge {
-public:
+typedef struct Edge {
std::list<Real> weights;
Real probability = 0;
-};
+} Edge;
-class Face {
-public:
- std::array<std::reference_wrapper<Edge>, 4> edges;
-
- Face(Edge& a, Edge& b, Edge& c, Edge& d) : edges({a, b, c, d}) {}
-};
+using Face = std::array<std::reference_wrapper<Edge>, 4>;
class AztecDiamond {
public:
@@ -37,12 +27,12 @@ public:
for (unsigned j = 0; j < pow(i, 2); j++) {
unsigned x = 2 * (j % i);
unsigned y = 2 * (j / i);
- faces[n - i].push_back(Face(
+ faces[n - i].push_back({
edges[2 * n * (x0 + y) + x0 + x],
edges[2 * n * (x0 + y) + x0 + x + 1],
edges[2 * n * (x0 + y + 1) + x0 + x],
edges[2 * n * (x0 + y + 1) + x0 + x + 1]
- ));
+ });
}
}
}
@@ -50,17 +40,17 @@ public:
void computeWeights() {
for (std::vector<Face>& fs : faces) {
for (Face& f : fs) {
- Real w = f.edges[0].get().weights.back();
- Real x = f.edges[1].get().weights.back();
- Real y = f.edges[2].get().weights.back();
- Real z = f.edges[3].get().weights.back();
+ Real w = f[0].get().weights.back();
+ Real x = f[1].get().weights.back();
+ Real y = f[2].get().weights.back();
+ Real z = f[3].get().weights.back();
Real cellFactor = w * z + x * y;
- f.edges[0].get().weights.push_back(z / cellFactor);
- f.edges[1].get().weights.push_back(y / cellFactor);
- f.edges[2].get().weights.push_back(x / cellFactor);
- f.edges[3].get().weights.push_back(w / cellFactor);
+ f[0].get().weights.push_back(z / cellFactor);
+ f[1].get().weights.push_back(y / cellFactor);
+ f[2].get().weights.push_back(x / cellFactor);
+ f[3].get().weights.push_back(w / cellFactor);
}
}
@@ -73,25 +63,25 @@ public:
void computeProbabilities() {
for (auto it = faces.rbegin(); it != faces.rend(); it++) {
for (Face& f : *it) {
- Real p = f.edges[0].get().probability;
- Real q = f.edges[1].get().probability;
- Real r = f.edges[2].get().probability;
- Real s = f.edges[3].get().probability;
+ Real p = f[0].get().probability;
+ Real q = f[1].get().probability;
+ Real r = f[2].get().probability;
+ Real s = f[3].get().probability;
- Real w = f.edges[0].get().weights.back();
- Real x = f.edges[1].get().weights.back();
- Real y = f.edges[2].get().weights.back();
- Real z = f.edges[3].get().weights.back();
+ Real w = f[0].get().weights.back();
+ Real x = f[1].get().weights.back();
+ Real y = f[2].get().weights.back();
+ Real z = f[3].get().weights.back();
Real cellFactor = w * z + x * y;
Real deficit = 1 - p - q - r - s;
- f.edges[0].get().probability = s + deficit * w * z / cellFactor;
- f.edges[1].get().probability = r + deficit * x * y / cellFactor;
- f.edges[2].get().probability = q + deficit * x * y / cellFactor;
- f.edges[3].get().probability = p + deficit * w * z / cellFactor;
+ f[0].get().probability = s + deficit * w * z / cellFactor;
+ f[1].get().probability = r + deficit * x * y / cellFactor;
+ f[2].get().probability = q + deficit * x * y / cellFactor;
+ f[3].get().probability = p + deficit * w * z / cellFactor;
- for (Edge& e : f.edges) {
+ for (Edge& e : f) {
e.weights.pop_back();
}
}
@@ -144,7 +134,7 @@ int main(int argc, char* argv[]) {
for (Real& x : avgProbabilities) {
std::cout << x << " ";
}
- std::cout <<std::endl;
+ std::cout << std::endl;
return 0;
}