Files
@ c9c22e41130d
Branch filter:
Location: AENC/switchchain/cpp/switchchain_spectrum.cpp - annotation
c9c22e41130d
3.7 KiB
text/x-c++src
Move degree sequence generation to separate file
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 | 56cc6fa35193 56cc6fa35193 56cc6fa35193 56cc6fa35193 56cc6fa35193 c9c22e41130d 56cc6fa35193 56cc6fa35193 56cc6fa35193 56cc6fa35193 56cc6fa35193 56cc6fa35193 56cc6fa35193 56cc6fa35193 56cc6fa35193 56cc6fa35193 56cc6fa35193 56cc6fa35193 56cc6fa35193 56cc6fa35193 56cc6fa35193 56cc6fa35193 56cc6fa35193 56cc6fa35193 56cc6fa35193 56cc6fa35193 56cc6fa35193 56cc6fa35193 56cc6fa35193 56cc6fa35193 56cc6fa35193 56cc6fa35193 56cc6fa35193 56cc6fa35193 56cc6fa35193 56cc6fa35193 56cc6fa35193 56cc6fa35193 56cc6fa35193 56cc6fa35193 56cc6fa35193 56cc6fa35193 56cc6fa35193 56cc6fa35193 56cc6fa35193 56cc6fa35193 56cc6fa35193 c9c22e41130d c9c22e41130d 56cc6fa35193 56cc6fa35193 56cc6fa35193 56cc6fa35193 56cc6fa35193 56cc6fa35193 56cc6fa35193 56cc6fa35193 56cc6fa35193 56cc6fa35193 56cc6fa35193 56cc6fa35193 56cc6fa35193 56cc6fa35193 56cc6fa35193 56cc6fa35193 56cc6fa35193 56cc6fa35193 56cc6fa35193 56cc6fa35193 56cc6fa35193 56cc6fa35193 56cc6fa35193 56cc6fa35193 56cc6fa35193 56cc6fa35193 56cc6fa35193 56cc6fa35193 56cc6fa35193 56cc6fa35193 56cc6fa35193 56cc6fa35193 56cc6fa35193 56cc6fa35193 56cc6fa35193 56cc6fa35193 56cc6fa35193 56cc6fa35193 56cc6fa35193 56cc6fa35193 56cc6fa35193 56cc6fa35193 56cc6fa35193 56cc6fa35193 56cc6fa35193 56cc6fa35193 56cc6fa35193 56cc6fa35193 56cc6fa35193 56cc6fa35193 56cc6fa35193 56cc6fa35193 56cc6fa35193 56cc6fa35193 56cc6fa35193 56cc6fa35193 56cc6fa35193 56cc6fa35193 56cc6fa35193 56cc6fa35193 56cc6fa35193 56cc6fa35193 56cc6fa35193 56cc6fa35193 56cc6fa35193 56cc6fa35193 56cc6fa35193 | #include "switchchain.hpp"
#include "exports.hpp"
#include "graph.hpp"
#include "graph_gcm.hpp"
#include "graph_spectrum.hpp"
#include "graph_powerlaw.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.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_spectrum.m");
if (!outfile.is_open()) {
std::cout << "ERROR: Could not open output file.\n";
return 1;
}
outfile << '{';
bool outputComma = false;
for (int numVertices = 500; numVertices <= 500; 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 < 5; ++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.0f - 26.0f*(tau - 2.0f)) * numVertices; //40000;
//constexpr int measurements = 50;
//constexpr int measureSkip =
// 200; // Take a sample every ... steps
int mixingTime = 0;
constexpr int measurements = 50000;
constexpr int measureSkip = 1;
int movesTotal = 0;
int movesSuccess = 0;
int triangles[measurements];
for (int i = 0; i < mixingTime; ++i) {
++movesTotal;
if (chain.doMove()) {
++movesSuccess;
}
}
for (int i = 0; i < measurements; ++i) {
for (int j = 0; j < measureSkip; ++j) {
++movesTotal;
if (chain.doMove()) {
++movesSuccess;
}
}
triangles[i] = chain.g.countTriangles();
}
std::cout << '('
<< 100.0f * float(movesSuccess) / float(movesTotal)
<< "% successrate). " << std::flush;
// std::cout << std::endl;
GraphSpectrum gs(g);
if (outputComma)
outfile << ',' << '\n';
outputComma = true;
//std::sort(ds.begin(), ds.end());
outfile << '{' << '{' << numVertices << ',' << tau << '}';
outfile << ',' << triangles;
outfile << ',' << g.edgeCount();
outfile << ',' << gs.computeAdjacencySpectrum();
outfile << ',' << gs.computeLaplacianSpectrum();
outfile << '}' << std::flush;
std::cout << std::endl;
}
}
}
outfile << '}';
return 0;
}
|