Files
@ 32a7f1c13790
Branch filter:
Location: AENC/switchchain/cpp/switchchain_exponent.cpp - annotation
32a7f1c13790
3.0 KiB
text/x-c++src
Add cannonical powerlaw ds
0dfa56d35c81 0dfa56d35c81 c9c22e41130d be2f7fe6b220 0dfa56d35c81 0dfa56d35c81 0dfa56d35c81 0dfa56d35c81 0dfa56d35c81 0dfa56d35c81 0dfa56d35c81 0dfa56d35c81 0dfa56d35c81 0dfa56d35c81 0dfa56d35c81 0dfa56d35c81 0dfa56d35c81 0dfa56d35c81 0dfa56d35c81 0dfa56d35c81 0dfa56d35c81 0dfa56d35c81 0dfa56d35c81 0dfa56d35c81 854fca81cf23 0dfa56d35c81 0dfa56d35c81 0dfa56d35c81 854fca81cf23 0dfa56d35c81 0dfa56d35c81 0dfa56d35c81 552662b431c8 c9c22e41130d c9c22e41130d 0dfa56d35c81 0dfa56d35c81 0dfa56d35c81 0dfa56d35c81 0dfa56d35c81 0dfa56d35c81 0dfa56d35c81 0dfa56d35c81 0dfa56d35c81 0dfa56d35c81 854fca81cf23 0dfa56d35c81 0dfa56d35c81 0dfa56d35c81 0dfa56d35c81 0dfa56d35c81 0dfa56d35c81 0dfa56d35c81 0dfa56d35c81 0dfa56d35c81 0dfa56d35c81 0dfa56d35c81 0dfa56d35c81 0dfa56d35c81 0dfa56d35c81 0dfa56d35c81 0dfa56d35c81 0dfa56d35c81 0dfa56d35c81 0dfa56d35c81 0dfa56d35c81 0dfa56d35c81 0dfa56d35c81 0dfa56d35c81 0dfa56d35c81 0dfa56d35c81 0dfa56d35c81 0dfa56d35c81 0dfa56d35c81 0dfa56d35c81 0dfa56d35c81 0dfa56d35c81 0dfa56d35c81 0dfa56d35c81 0dfa56d35c81 0dfa56d35c81 0dfa56d35c81 0dfa56d35c81 0dfa56d35c81 0dfa56d35c81 0dfa56d35c81 0dfa56d35c81 0dfa56d35c81 | #include "exports.hpp"
#include "graph.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_exponent_hightau.m");
outfile << '{';
bool outputComma = false;
for (int numVertices = 1000; numVertices <= 10000; 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;
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
int movesDone = 0;
long long trianglesTotal = 0;
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 << '{' << '{' << numVertices << ',' << tau << '}';
outfile << ',' << avgTriangles << '}' << std::flush;
std::cout << std::endl;
}
}
}
outfile << '}';
return 0;
}
|