Files
@ 32a7f1c13790
Branch filter:
Location: AENC/switchchain/cpp/switchchain_initialtris.cpp - annotation
32a7f1c13790
4.1 KiB
text/x-c++src
Add cannonical powerlaw ds
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 | 9905828198ec 9905828198ec 32c10aa21482 c9c22e41130d be2f7fe6b220 9905828198ec 9905828198ec 9905828198ec 9905828198ec 9905828198ec 9905828198ec 9905828198ec 9905828198ec 9905828198ec 9905828198ec 9905828198ec 9905828198ec 9905828198ec 9905828198ec 9905828198ec 9905828198ec 9905828198ec 9905828198ec 9905828198ec 9905828198ec 9905828198ec 9905828198ec 9905828198ec 9905828198ec 9905828198ec 9905828198ec 9905828198ec 9905828198ec 9905828198ec c9c22e41130d c9c22e41130d 9905828198ec 9c4226491043 9c4226491043 9c4226491043 9905828198ec 9905828198ec 9905828198ec 9905828198ec 9905828198ec 9905828198ec 9905828198ec 9905828198ec 9905828198ec 9905828198ec 9905828198ec 9905828198ec 9905828198ec 9905828198ec 9905828198ec 9905828198ec 9905828198ec 9905828198ec 9905828198ec 9905828198ec 9905828198ec 9905828198ec 9905828198ec 9905828198ec 9905828198ec 9905828198ec 9905828198ec 9905828198ec 9905828198ec 9905828198ec 9905828198ec 9905828198ec 9905828198ec 9905828198ec 9905828198ec 9c4226491043 9c4226491043 9905828198ec 9905828198ec 9905828198ec 9905828198ec 9905828198ec 9905828198ec 9905828198ec 9905828198ec 9c4226491043 9905828198ec 9905828198ec 9905828198ec 9905828198ec 9905828198ec 9905828198ec 9905828198ec 9905828198ec 9905828198ec 9905828198ec 9905828198ec 9905828198ec 9905828198ec 9905828198ec 9905828198ec 9905828198ec 9905828198ec 9905828198ec 9905828198ec 9905828198ec 9905828198ec 9905828198ec 9905828198ec 9905828198ec 9905828198ec 9905828198ec 9905828198ec 9905828198ec 9905828198ec | #include "exports.hpp"
#include "graph.hpp"
#include "graph_gcm.hpp"
#include "graph_powerlaw.hpp"
#include "switchchain.hpp"
#include <algorithm>
#include <fstream>
#include <iostream>
#include <numeric>
#include <random>
#include <vector>
int main() {
// 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.1f, 2.2f, 2.3f, 2.4f, 2.5f, 2.6f, 2.7f, 2.8f, 2.9f};
Graph g;
std::ofstream outfile("graphdata_initialtris.m");
outfile << '{';
bool outputComma = false;
for (int numVertices = 200; numVertices <= 2000; numVertices += 400) {
for (float tau : tauValues) {
// For a single n,tau take samples over several instances of
// the degree distribution.
for (int degreeSample = 0; degreeSample < 200; ++degreeSample) {
DegreeSequence ds;
generatePowerlawGraph(numVertices, tau, g, ds, rng);
std::cout << "Running n = " << numVertices << ", tau = " << tau
<< "." << std::flush;
//
// Test the GCM1 and GCM2 success rate
//
long long gcmTris1 = 0;
long long gcmTris2 = 0;
int successrate1 = 0;
int successrate2 = 0;
for (int i = 0; i < 100; ++i) {
Graph gtemp;
// Take new highest degree every time
if (greedyConfigurationModel(ds, gtemp, rng, false)) {
++successrate1;
gcmTris1 += gtemp.countTriangles();
}
// Finish all pairings of highest degree first
if (greedyConfigurationModel(ds, gtemp, rng, true)) {
++successrate2;
gcmTris2 += gtemp.countTriangles();
}
}
SwitchChain chain;
if (!chain.initialize(g)) {
std::cerr << "Could not initialize Markov chain.\n";
return 1;
}
int mixingTime = (32.0f - 20.0f * (tau - 2.0f)) * numVertices;
constexpr int measurements = 20;
constexpr int measureSkip = 200;
int movesDone = 0;
long long trianglesTotal = 0;
std::cout << " .. \t" << std::flush;
for (int i = 0; i < mixingTime; ++i) {
if (chain.doMove())
++movesDone;
}
for (int i = 0; i < measurements; ++i) {
for (int j = 0; j < measureSkip; ++j)
if (chain.doMove())
++movesDone;
trianglesTotal += chain.g.countTriangles();
}
std::cout << movesDone << '/' << mixingTime + measurements * measureSkip
<< " moves succeeded ("
<< 100.0f * float(movesDone) /
float(mixingTime + measurements * measureSkip)
<< "%).";
//std::cout << std::endl;
if (outputComma)
outfile << ',' << '\n';
outputComma = true;
float avgTriangles =
float(trianglesTotal) / float(measurements);
outfile << '{';
outfile << '{' << numVertices << ',' << tau << '}';
outfile << ',' << avgTriangles;
outfile << ',' << '{' << gcmTris1 << ',' << successrate1 << '}';
outfile << ',' << '{' << gcmTris2 << ',' << successrate2 << '}';
outfile << '}' << std::flush;
std::cout << std::endl;
}
}
}
outfile << '}';
return 0;
}
|