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>
 
@@ -16,22 +16,21 @@ int main(int argc, char* argv[]) {
 
    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,15 +49,15 @@ 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
 
@@ -71,38 +70,40 @@ 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);
 
            generateCanonicalPowerlawGraph(numVertices, tau, g, ds);
 

	
 
            std::cout << "Running (n,tau) = (" << numVertices << ',' << tau
 
                      << "). " << std::flush;
 

	
 
            //
 
                // Test the GCM1 and GCM2 success rate
 
            // CCM triangles
 
            //
 
                long long gcmTris1tot = 0;
 
                long long gcmTris2tot = 0;
 
                int successrate1 = 0;
 
                int successrate2 = 0;
 
                for (int i = 0; i < 100; ++i) {
 
            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)) {
 
                        ++successrate1;
 
                        gcmTris1tot += gtemp.countTriangles();
 
                    CCMduTris.push_back(gtemp.countTriangles());
 
                }
 
                // Finish all pairings of highest degree first
 
                if (constrainedConfigurationModel(ds, gtemp, rng, true)) {
 
                        ++successrate2;
 
                        gcmTris2tot += gtemp.countTriangles();
 
                    CCMdTris.push_back(gtemp.countTriangles());
 
                }
 
            }
 
                float gcmTris1 = float(gcmTris1tot) / float(successrate1);
 
                float gcmTris2 = float(gcmTris2tot) / float(successrate2);
 

	
 
            std::cout << " Finished CCM samples." << std::flush;
 

	
 
            // Uniform triangles
 
            std::vector<int> uniformTris;
 

	
 
            SwitchChain chain;
 
            if (!chain.initialize(g)) {
 
@@ -110,22 +111,14 @@ int main(int argc, char* argv[]) {
 
                return 1;
 
            }
 

	
 

	
 
                long long trianglesTotal = 0;
 

	
 
                std::cout << " Finished CCM generation." << std::flush;
 

	
 
                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();
 
                uniformTris.push_back(chain.g.getTrackedTriangles());
 
            }
 

	
 
            std::cout << " Finished mixing and measurements." << std::flush;
 
@@ -134,19 +127,16 @@ int main(int argc, char* argv[]) {
 
                outfile << ',' << '\n';
 
            outputComma = true;
 

	
 
                float avgTriangles =
 
                    float(trianglesTotal) / float(measurements);
 
            outfile << '{';
 
            outfile << '{' << numVertices << ',' << tau << '}';
 
                outfile << ',' << avgTriangles;
 
                outfile << ',' << '{' << gcmTris1 << ',' << successrate1 << '}';
 
                outfile << ',' << '{' << gcmTris2 << ',' << successrate2 << '}';
 
            outfile << ',' << uniformTris;
 
            outfile << ',' << CCMduTris;
 
            outfile << ',' << CCMdTris;
 
            outfile << '}' << std::flush;
 

	
 
            std::cout << std::endl;
 
        }
 
    }
 
    }
 
    outfile << '}';
 
    return 0;
 
}

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

0 comments (0 inline, 0 general)