Changeset - 717d9916f17e
[Not reviewed]
0 4 0
Tom Bannink - 8 years ago 2017-08-25 14:32:48
tom.bannink@cwi.nl
Add improved ccm-initial-tris-distribution plots
1 file changed:
Changeset was too big and was cut off... Show full diff anyway
0 comments (0 inline, 0 general)
cpp/switchchain_ccm_initialtris.cpp
Show inline comments
 
#include "switchchain.hpp"
 
#include "exports.hpp"
 
#include "graph.hpp"
 
#include "graph_ccm.hpp"
 
#include "graph_powerlaw.hpp"
 
#include "switchchain.hpp"
 
#include <algorithm>
 
#include <fstream>
 
#include <iostream>
 
@@ -10,28 +10,27 @@
 
#include <random>
 
#include <vector>
 

	
 
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<int> CCMduTris;
 
            std::vector<int> 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<int> 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 << '}';

Changeset was too big and was cut off... Show full diff anyway

0 comments (0 inline, 0 general)