#pragma once #include "graph.hpp" #include "powerlaw.hpp" #include #include template void generatePowerlawGraph(int n, float tau, Graph& g, DegreeSequence& ds, RNG& rng) { ds.resize(n); powerlaw_distribution degDist(tau, 1, n); // Generate a graph // might require multiple tries for (int i = 1;; ++i) { std::generate(ds.begin(), ds.end(), [°Dist, &rng] { return degDist(rng); }); // First check if the sum is even unsigned int sum = std::accumulate(ds.begin(), ds.end(), 0); if (sum % 2) continue; if (g.createFromDegreeSequence(ds)) break; // When 10 tries have not worked, output a warning if (i % 10 == 0) { std::cerr << "Warning: could not create graph from " "degree sequence. Trying again...\n"; } } } void generateCanonicalPowerlawGraph(int n, float tau, Graph &g, DegreeSequence &ds) { ds.resize(n); powerlaw_distribution degDist(tau, 1, n); degDist.getFixedDistribution(n, ds.begin()); unsigned int sum = std::accumulate(ds.begin(), ds.end(), 0); if (sum % 2) ds.back()++; if (g.createFromDegreeSequence(ds)) return; g.reset(n); std::cerr << "ERROR: Canonical ds is not graphical" << std::endl; }