Files
@ 5027d9d4aa05
Branch filter:
Location: AENC/switchchain/cpp/switchchain_successrates.cpp - annotation
5027d9d4aa05
4.1 KiB
text/x-c++src
Add new mixingtime method
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 | c95330463954 c95330463954 c9c22e41130d be2f7fe6b220 c95330463954 c95330463954 c95330463954 c95330463954 c95330463954 c95330463954 c95330463954 c95330463954 c95330463954 c95330463954 c95330463954 c95330463954 c95330463954 c95330463954 c95330463954 c95330463954 c95330463954 c95330463954 c95330463954 c95330463954 c95330463954 c95330463954 c95330463954 c95330463954 c95330463954 c95330463954 c95330463954 b9486351acf3 c95330463954 c95330463954 c95330463954 c95330463954 c95330463954 c95330463954 c95330463954 c95330463954 c95330463954 c95330463954 c95330463954 c95330463954 c95330463954 b9486351acf3 c9c22e41130d c9c22e41130d c95330463954 c95330463954 c95330463954 c95330463954 c95330463954 c95330463954 c95330463954 c95330463954 c95330463954 c95330463954 c02bb6630c20 c02bb6630c20 c02bb6630c20 c02bb6630c20 c02bb6630c20 c02bb6630c20 c02bb6630c20 c02bb6630c20 c02bb6630c20 c02bb6630c20 c95330463954 c95330463954 c95330463954 c95330463954 c95330463954 c95330463954 c95330463954 c95330463954 c95330463954 c95330463954 c95330463954 c95330463954 c95330463954 c95330463954 c02bb6630c20 c02bb6630c20 c02bb6630c20 c02bb6630c20 c95330463954 c95330463954 c95330463954 c95330463954 c95330463954 c02bb6630c20 c95330463954 c95330463954 c95330463954 c02bb6630c20 c02bb6630c20 c95330463954 c95330463954 c95330463954 c95330463954 c95330463954 c95330463954 c95330463954 c95330463954 c95330463954 c95330463954 c95330463954 b9486351acf3 b9486351acf3 b9486351acf3 b9486351acf3 b9486351acf3 b9486351acf3 b9486351acf3 c95330463954 b9486351acf3 c02bb6630c20 c02bb6630c20 c95330463954 c95330463954 c95330463954 c95330463954 c95330463954 c95330463954 c95330463954 c95330463954 c95330463954 | #include "exports.hpp"
#include "graph.hpp"
#include "graph_powerlaw.hpp"
#include "switchchain.hpp"
#include <algorithm>
#include <array>
#include <fstream>
#include <iostream>
#include <numeric>
#include <random>
#include <vector>
int main(int argc, char* argv[]) {
// Generate a random degree sequence
std::mt19937 rng(std::random_device{}());
// Goal:
// Degrees follow a power-law distribution with some parameter tau
// Expect: #tri = const * n^{ something }
// The goal is to find the 'something' by finding the number of triangles
// for different values of n and tau
//float tauValues[] = {2.5f};
float tauValues[] = {2.1f, 2.2f, 2.3f, 2.4f, 2.5f, 2.6f, 2.7f, 2.8f, 2.9f};
Graph g;
std::ofstream outfile;
if (argc >= 2)
outfile.open(argv[1]);
else
outfile.open("graphdata_successrates.m");
if (!outfile.is_open()) {
std::cout << "ERROR: Could not open output file.\n";
return 1;
}
outfile << '{';
bool outputComma = false;
for (int numVertices = 1000; numVertices <= 1000; numVertices += 1000) {
for (float tau : tauValues) {
// For a single n,tau take samples over several instances of
// the degree distribution.
for (int degreeSample = 0; degreeSample < 2000; ++degreeSample) {
DegreeSequence ds;
generatePowerlawGraph(numVertices, tau, g, ds, rng);
SwitchChain chain;
if (!chain.initialize(g)) {
std::cerr << "Could not initialize Markov chain.\n";
return 1;
}
std::cout << "Running n = " << numVertices << ", tau = " << tau
<< ". \t" << std::flush;
// Non time evol
int mixingTime = 32*(32.0f - 15.0f*(tau - 2.0f)) * numVertices; //40000;
constexpr int measurements = 50;
constexpr int measureSkip =
200; // Take a sample every ... steps
// Time Evol
//int mixingTime = 0;
//constexpr int measurements = 500;
//constexpr int measureSkip = 100;
int movesTotal = 0;
int movesSuccess = 0;
int triangles[measurements];
for (int i = 0; i < mixingTime; ++i) {
++movesTotal;
if (chain.doMove()) {
++movesSuccess;
}
}
// Time Evol
//std::vector<int> successRates;
//successRates.reserve(measurements);
//int successrate = 0;
for (int i = 0; i < measurements; ++i) {
for (int j = 0; j < measureSkip; ++j) {
++movesTotal;
if (chain.doMove()) {
++movesSuccess;
//++successrate;
}
}
triangles[i] = chain.g.countTriangles();
//successRates.push_back(successrate);
//successrate = 0;
}
std::cout << '('
<< 100.0f * float(movesSuccess) / float(movesTotal)
<< "% successrate). " << std::flush;
// std::cout << std::endl;
if (outputComma)
outfile << ',' << '\n';
outputComma = true;
long long trianglesTotal = 0;
for (int i = 0; i < measurements; ++i)
trianglesTotal += triangles[i];
float avgTriangles =
float(trianglesTotal) / float(measurements);
outfile << '{' << '{' << numVertices << ',' << tau << '}';
outfile << ',' << avgTriangles;
//outfile << ',' << successRates;
outfile << ',' << float(movesSuccess) / float(movesTotal);
outfile << '}' << std::flush;
std::cout << std::endl;
}
}
}
outfile << '}';
return 0;
}
|