diff options
-rw-r--r-- | n_to_p.cpp | 87 | ||||
-rw-r--r-- | percolation.cpp | 62 |
2 files changed, 122 insertions, 27 deletions
diff --git a/n_to_p.cpp b/n_to_p.cpp new file mode 100644 index 0000000..04c162f --- /dev/null +++ b/n_to_p.cpp @@ -0,0 +1,87 @@ + +#include <cinttypes> +#include <cmath> +#include <fstream> +#include <sstream> +#include <string> +#include <vector> +#include <iostream> + +long double lfactorial(unsigned i) { return lgamma((long double)(i + 1)); } + +long double lbinom(unsigned N, unsigned n) { + return lfactorial(N) - lfactorial(n) - lfactorial(N-n); +} + +long double B(unsigned N, unsigned n, long double p) { + return expl(lbinom(N, n) + log(p) * n + log(1-p) * (N - n)); +} + +int main(int argc, char *argv[]) { + std::vector<std::string> all_args; + + if (argc > 1) { + all_args.assign(argv + 1, argv + argc); + } + + for (std::string filename : all_args) { + std::ifstream in_file; + in_file.open(filename); + + std::vector<std::vector<double>> dat; + + unsigned line_num = 0; + std::string line; + while (std::getline(in_file, line)) { + dat.resize(line_num + 1); + std::istringstream iss(line); + double a; + while (iss >> a) { + dat[line_num].push_back(a); + } + line_num++; + } + + in_file.close(); + + unsigned n_moms = dat.size(); + unsigned n_ps = 10000; + + std::vector<std::vector<double>> output(n_moms); + + for (unsigned i = 0; i < n_moms; i++) { + output[i].resize(n_ps); + } + + for (unsigned i = 0; i < n_moms; i++) { + unsigned N = dat[i].size(); + for (unsigned j = 0; j < n_ps; j++) { + long double p = (1.0 / (n_ps + 1)) * (j + 1); + long double mom_p = pow(1 - p, N); + long double tot = pow(1 - p, N); + + for (unsigned n = 1; n <= N; n++) { + mom_p += B(N, n, p) * dat[i][n - 1]; + tot += B(N, n, p); + } + + output[i][j] = mom_p; + } + } + + std::ofstream out_file; + out_file.open(filename + ".ps"); + + for (unsigned i = 0; i < n_moms; i++) { + for (unsigned j = 0; j < output[i].size(); j++) { + out_file << output[i][j] << " "; + } + out_file << "\n"; + } + + out_file.close(); + } + + return 0; +} + diff --git a/percolation.cpp b/percolation.cpp index 3f82cc4..2f17f40 100644 --- a/percolation.cpp +++ b/percolation.cpp @@ -12,14 +12,13 @@ class Tree { private: std::vector<signed> p; std::vector<unsigned> o; + unsigned nc; public: - unsigned largest; - std::vector<unsigned> c; + std::vector<double> m; - Tree(unsigned n) : p(n, -1), o(n, 1), c(n, 0) { - largest = 1; - c[0] = n; + Tree(unsigned n, unsigned n_moments) : p(n, -1), o(n, 1), m(n_moments, 1) { + nc = n; } unsigned findroot(unsigned i) { @@ -30,22 +29,24 @@ public: } void join(unsigned i, unsigned j) { - c[o[i] - 1]--; - c[o[j] - 1]--; + for (unsigned k = 1; k <= m.size(); k++) { + m[k - 1] -= pow(o[i], k) / nc; + m[k - 1] -= pow(o[j], k) / nc; + } + + nc--; if (o[i] < o[j]) { p[i] = j; o[j] += o[i]; - c[o[j] - 1]++; - if (o[j] > largest) { - largest = o[j]; + for (unsigned k = 1; k <= m.size(); k++) { + m[k - 1] = ((nc + 1) * m[k - 1] + pow(o[j], k)) / nc; } } else { p[j] = i; o[i] += o[j]; - c[o[i] - 1]++; - if (o[i] > largest) { - largest = o[i]; + for (unsigned k = 1; k <= m.size(); k++) { + m[k - 1] = ((nc + 1) * m[k - 1] + pow(o[i], k)) / nc; } } } @@ -60,21 +61,24 @@ public: } }; -void update_distribution_file(std::string id, const std::vector<std::vector<uint64_t>>& data, +void update_distribution_file(std::string id, unsigned n, const std::vector<std::vector<double>>& data, std::string model_string) { std::string filename = model_string + id + ".dat"; std::ifstream file(filename); - std::vector<std::vector<uint64_t>> data_old(data.size()); + unsigned n_old = 0; + std::vector<std::vector<double>> data_old(data.size()); for (unsigned i = 0; i < data.size(); i++) { - data_old[i].resize(data[0].size()); + data_old[i].resize(data[i].size()); } if (file.is_open()) { + file >> n_old; + for (unsigned i = 0; i < data.size(); i++) { - for (unsigned j = 0; j < data[0].size(); j++) { - uint64_t num; + for (unsigned j = 0; j < data[i].size(); j++) { + double num; file >> num; data_old[i][j] = num; } @@ -85,9 +89,11 @@ void update_distribution_file(std::string id, const std::vector<std::vector<uint std::ofstream file_out(filename); + file_out << n_old + n << "\n"; + for (unsigned i = 0; i < data.size(); i++) { - for (unsigned j = 0; j < data[0].size(); j++) { - file_out << std::fixed << data_old[i][j] + data[i][j] << " "; + for (unsigned j = 0; j < data[i].size(); j++) { + file_out << std::fixed << (data_old[i][j] * n_old + data[i][j]) / (n_old + n) << " "; } file_out << "\n"; } @@ -132,26 +138,28 @@ int main(int argc, char* argv[]) { bonds[2 * v_i + 1] = {v_i, L * (((v_i / L) + 1) % L) + v_i % L}; } - std::vector<std::vector<uint64_t>> sn(n_bonds); + unsigned n_moments = 5; + + std::vector<std::vector<double>> sn(n_moments); - for (std::vector<uint64_t>& sni : sn) { - sni.resize(n_vertices); + for (std::vector<double>& sni : sn) { + sni.resize(n_bonds); } for (unsigned trial = 0; trial < N; trial++) { - Tree t(n_vertices); + Tree t(n_vertices, n_moments); std::shuffle(bond_indices.begin(), bond_indices.end(), rng); for (unsigned p = 0; p < n_bonds; p++) { t.add_bond(bonds[bond_indices[p]]); - for (unsigned i = 0; i < t.largest; i++) { - sn[p][i] += t.c[i]; + for (unsigned i = 0; i < n_moments; i++) { + sn[i][p] += t.m[i]; } } } - update_distribution_file("sn", sn, "percolation_" + std::to_string(L) + "_"); + update_distribution_file("sn", N, sn, "percolation_" + std::to_string(L) + "_"); return 0; } |