diff --git a/cpp/switchchain_ccm_initialtris.cpp b/cpp/switchchain_ccm_initialtris.cpp index 435181dcde762aeb587ad3c04117d08a924b1e1b..57d67b905836eef7e203f7c70fb829a07fffac03 100644 --- a/cpp/switchchain_ccm_initialtris.cpp +++ b/cpp/switchchain_ccm_initialtris.cpp @@ -1,8 +1,8 @@ +#include "switchchain.hpp" #include "exports.hpp" #include "graph.hpp" #include "graph_ccm.hpp" #include "graph_powerlaw.hpp" -#include "switchchain.hpp" #include #include #include @@ -10,28 +10,27 @@ #include #include -int main(int argc, char* argv[]) { +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.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 = 200; - auto getMixingTime = [](int n, float tau) { - return int(50.0f * (50.0f - 30.0f * (tau - 2.0f)) * n); + return int(50.0f * (50.0f - 5.0f * (tau - 2.0f)) * n); }; auto getMeasurements = [](int n, float tau) { (void)n; (void)tau; - return 100; + return 5000; }; auto getMeasureSkip = [](int n, float tau) { (void)tau; - return 10 * n; // Take a sample every ... steps + return 30 * n; // Take a sample every ... steps }; // Output file @@ -50,17 +49,17 @@ int main(int argc, char* argv[]) { outfile << "n from " << numVerticesMin << " to " << numVerticesMax << " step " << numVerticesStep << std::endl; outfile << "tauValues: " << tauValues << std::endl; - outfile << "degreeSamples: " << totalDegreeSamples << std::endl; - outfile << "mixingTime: 50 * (50 - 30 (tau - 2)) n\n"; - outfile << "measurements: 100\n"; - outfile << "measureSkip: 10 n\n"; + outfile << "Canonical degree sequence.\n"; + outfile << "mixingTime: 50 * (50 - 5 (tau - 2)) n\n"; + outfile << "measurements: 5000\n"; + outfile << "measureSkip: 30 n\n"; outfile << "data:\n"; outfile << "1: {n,tau}\n"; - outfile << "2: avgTriangles\n"; - outfile << "3: {ccmTris1, ccmsrate1} \n"; - outfile << "4: {ccmTris2, ccmsrate2} \n"; + outfile << "2: {uniform tri samples}\n"; + outfile << "3: {CCMdu initial tri samples} \n"; + outfile << "4: {CCMd initial tri samples} \n"; outfile << "*)" << std::endl; - + // Mathematica does not accept normal scientific notation outfile << std::fixed; outfile << '{'; @@ -71,80 +70,71 @@ int main(int argc, char* argv[]) { for (int numVertices = numVerticesMin; numVertices <= numVerticesMax; numVertices += numVerticesStep) { for (float tau : tauValues) { + int mixingTime = getMixingTime(numVertices, tau); + int measurements = getMeasurements(numVertices, tau); + int measureSkip = getMeasureSkip(numVertices, tau); + // 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 - // - long long gcmTris1tot = 0; - long long gcmTris2tot = 0; - int successrate1 = 0; - int successrate2 = 0; - for (int i = 0; i < 100; ++i) { - Graph gtemp; - // Take new highest degree every time - if (constrainedConfigurationModel(ds, gtemp, rng, false)) { - ++successrate1; - gcmTris1tot += gtemp.countTriangles(); - } - // Finish all pairings of highest degree first - if (constrainedConfigurationModel(ds, gtemp, rng, true)) { - ++successrate2; - gcmTris2tot += gtemp.countTriangles(); - } + DegreeSequence ds; + generateCanonicalPowerlawGraph(numVertices, tau, g, ds); + + std::cout << "Running (n,tau) = (" << numVertices << ',' << tau + << "). " << std::flush; + + // + // CCM triangles + // + std::vector CCMduTris; + std::vector CCMdTris; + + for (int i = 0; i < measurements; ++i) { + Graph gtemp; + // Take new highest degree every time + if (constrainedConfigurationModel(ds, gtemp, rng, false)) { + CCMduTris.push_back(gtemp.countTriangles()); } - float gcmTris1 = float(gcmTris1tot) / float(successrate1); - float gcmTris2 = float(gcmTris2tot) / float(successrate2); - - SwitchChain chain; - if (!chain.initialize(g)) { - std::cerr << "Could not initialize Markov chain.\n"; - return 1; + // Finish all pairings of highest degree first + if (constrainedConfigurationModel(ds, gtemp, rng, true)) { + CCMdTris.push_back(gtemp.countTriangles()); } + } + std::cout << " Finished CCM samples." << std::flush; - long long trianglesTotal = 0; + // Uniform triangles + std::vector uniformTris; - std::cout << " Finished CCM generation." << std::flush; + SwitchChain chain; + if (!chain.initialize(g)) { + std::cerr << "Could not initialize Markov chain.\n"; + return 1; + } - int mixingTime = getMixingTime(numVertices, tau); - for (int i = 0; i < mixingTime; ++i) { - chain.doMove(); - } - chain.g.getTrackedTriangles() = chain.g.countTriangles(); - int measurements = getMeasurements(numVertices, tau); - int measureSkip = getMeasureSkip(numVertices, tau); - for (int i = 0; i < measurements; ++i) { - for (int j = 0; j < measureSkip; ++j) - chain.doMove(true); - trianglesTotal += chain.g.getTrackedTriangles(); - } + for (int i = 0; i < mixingTime; ++i) { + chain.doMove(); + } + chain.g.getTrackedTriangles() = chain.g.countTriangles(); + for (int i = 0; i < measurements; ++i) { + for (int j = 0; j < measureSkip; ++j) + chain.doMove(true); + uniformTris.push_back(chain.g.getTrackedTriangles()); + } - std::cout << " Finished mixing and measurements." << std::flush; + std::cout << " Finished mixing and measurements." << std::flush; - if (outputComma) - outfile << ',' << '\n'; - outputComma = true; + 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; + outfile << '{'; + outfile << '{' << numVertices << ',' << tau << '}'; + outfile << ',' << uniformTris; + outfile << ',' << CCMduTris; + outfile << ',' << CCMdTris; + outfile << '}' << std::flush; - std::cout << std::endl; - } + std::cout << std::endl; } } outfile << '}';