Files
@ 3e647eb7b5b3
Branch filter:
Location: AENC/switchchain/cpp/switchchain_ccm_constructionrate.cpp - annotation
3e647eb7b5b3
3.6 KiB
text/x-c++src
Add improved construction rate dataset and plot
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 | 30d182b86860 30d182b86860 30d182b86860 30d182b86860 30d182b86860 30d182b86860 30d182b86860 30d182b86860 30d182b86860 30d182b86860 30d182b86860 30d182b86860 30d182b86860 30d182b86860 30d182b86860 30d182b86860 30d182b86860 30d182b86860 30d182b86860 30d182b86860 30d182b86860 30d182b86860 30d182b86860 30d182b86860 30d182b86860 30d182b86860 30d182b86860 30d182b86860 30d182b86860 30d182b86860 30d182b86860 30d182b86860 30d182b86860 30d182b86860 30d182b86860 30d182b86860 30d182b86860 30d182b86860 30d182b86860 30d182b86860 30d182b86860 30d182b86860 30d182b86860 30d182b86860 30d182b86860 30d182b86860 30d182b86860 30d182b86860 30d182b86860 30d182b86860 30d182b86860 30d182b86860 30d182b86860 30d182b86860 30d182b86860 30d182b86860 30d182b86860 30d182b86860 30d182b86860 30d182b86860 30d182b86860 30d182b86860 30d182b86860 30d182b86860 30d182b86860 30d182b86860 30d182b86860 30d182b86860 30d182b86860 30d182b86860 30d182b86860 30d182b86860 30d182b86860 30d182b86860 30d182b86860 30d182b86860 30d182b86860 30d182b86860 30d182b86860 30d182b86860 30d182b86860 30d182b86860 30d182b86860 30d182b86860 30d182b86860 30d182b86860 30d182b86860 30d182b86860 30d182b86860 30d182b86860 30d182b86860 30d182b86860 30d182b86860 30d182b86860 30d182b86860 30d182b86860 30d182b86860 30d182b86860 30d182b86860 30d182b86860 30d182b86860 30d182b86860 30d182b86860 30d182b86860 30d182b86860 30d182b86860 30d182b86860 | #include "exports.hpp"
#include "graph.hpp"
#include "graph_ccm.hpp"
#include "graph_powerlaw.hpp"
#include "switchchain.hpp"
#include <algorithm>
#include <fstream>
#include <iostream>
#include <numeric>
#include <random>
#include <vector>
int main(int argc, char* argv[]) {
// Simulation parameters
const int numVerticesMin = 1000;
const int numVerticesMax = 1000;
const int numVerticesStep = 500;
//float tauValues[] = {2.1f, 2.2f, 2.3f, 2.4f, 2.5f, 2.6f, 2.7f, 2.8f, 2.9f};
float tauValues[] = {2.1f, 2.5f, 2.9f};
const int totalDegreeSamples = 5000;
const int ccmConstructionAttemps = 200;
// Output file
std::ofstream outfile;
if (argc >= 2)
outfile.open(argv[1]);
else
outfile.open("graphdata_ccm_constructionrate.m");
if (!outfile.is_open()) {
std::cout << "ERROR: Could not open output file.\n";
return 1;
}
// Output Mathematica-style comment to indicate file contents
outfile << "(*\n";
outfile << "n from " << numVerticesMin << " to " << numVerticesMax
<< " step " << numVerticesStep << std::endl;
outfile << "tauValues: " << tauValues << std::endl;
outfile << "degreeSamples: " << totalDegreeSamples << std::endl;
outfile << "mixingTime: -\n";
outfile << "measurements: -\n";
outfile << "measureSkip: -\n";
outfile << "ccm construction attemps: " << ccmConstructionAttemps << std::endl;
outfile << "data:\n";
outfile << "1: {n,tau}\n";
outfile << "3: CCMdu construction rate \n";
outfile << "4: CCMd construction rate \n";
outfile << "*)" << std::endl;
// Mathematica does not accept normal scientific notation
outfile << std::fixed;
outfile << '{';
bool outputComma = false;
std::mt19937 rng(std::random_device{}());
Graph g;
for (int numVertices = numVerticesMin; numVertices <= numVerticesMax;
numVertices += numVerticesStep) {
for (float tau : tauValues) {
// For a single n,tau take samples over several instances of
// the degree distribution.
for (int degreeSample = 0; degreeSample < totalDegreeSamples;
++degreeSample) {
DegreeSequence ds;
generatePowerlawGraph(numVertices, tau, g, ds, rng);
std::cout << "Running (n,tau) = (" << numVertices << ',' << tau
<< "). " << std::flush;
//
// Test the GCM1 and GCM2 success rate
//
int successrate1 = 0;
int successrate2 = 0;
for (int i = 0; i < ccmConstructionAttemps; ++i) {
Graph gtemp;
// Take new highest degree every time
if (constrainedConfigurationModel(ds, gtemp, rng, false)) {
++successrate1;
}
// Finish all pairings of highest degree first
if (constrainedConfigurationModel(ds, gtemp, rng, true)) {
++successrate2;
}
}
std::cout << "Done." << std::flush;
if (outputComma)
outfile << ',' << '\n';
outputComma = true;
outfile << '{';
outfile << '{' << numVertices << ',' << tau << '}';
outfile << ',' << float(successrate1)/float(ccmConstructionAttemps);
outfile << ',' << float(successrate2)/float(ccmConstructionAttemps);
outfile << '}' << std::flush;
std::cout << std::endl;
}
}
}
outfile << '}';
return 0;
}
|