Changeset - aa727817ffa5
[Not reviewed]
0 3 6
Tom Bannink - 8 years ago 2017-09-01 17:46:59
tom.bannink@cwi.nl
Add ECM triangles
2 files changed:
Changeset was too big and was cut off... Show full diff anyway
0 comments (0 inline, 0 general)
cpp/Makefile
Show inline comments
 
@@ -19,6 +19,7 @@ TARGETS += switchchain_ccm_constructionrate
 
TARGETS += switchchain_ccm_cputime
 
TARGETS += switchchain_ccm_initialtris
 
TARGETS += switchchain_ccm_timeevol
 
TARGETS += switchchain_ecm_initialtris
 
TARGETS += switchchain_properties
 
TARGETS += switchchain_exponent
 
TARGETS += switchchain_mixingtime
cpp/switchchain_ecm_initialtris.cpp
Show inline comments
 
new file 100644
 
#include "switchchain.hpp"
 
#include "exports.hpp"
 
#include "graph.hpp"
 
#include "graph_ecm.hpp"
 
#include "graph_powerlaw.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 = 10000;
 
    const int numVerticesStep = 1000;
 

	
 
    float tauValues[] = {2.05f, 2.1f, 2.2f, 2.3f, 2.4f, 2.5f,
 
                         2.6f,  2.7f, 2.8f, 2.9f, 2.95f};
 

	
 
    auto getMixingTime = [](int n, float tau) {
 
        return int(50.0f * (50.0f - 5.0f * (tau - 2.0f)) * n);
 
    };
 
    auto getMeasurements = [](int n, float tau) {
 
        (void)n;
 
        (void)tau;
 
        return 5000;
 
    };
 
    auto getMeasureSkip = [](int n, float tau) {
 
        (void)tau;
 
        return 30 * n; // Take a sample every ... steps
 
    };
 

	
 
    // Output file
 
    std::ofstream outfile;
 
    if (argc >= 2)
 
        outfile.open(argv[1]);
 
    else
 
        outfile.open("graphdata_ecm_initialtris.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 << "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: {uniform tri samples}\n";
 
    outfile << "3: {ECM initial tri samples} \n";
 
    outfile << "*)" << std::endl;
 

	
 
    // Mathematica does not accept normal scientific notation
 
    outfile << std::fixed;
 
    outfile << '{' << '\n';
 
    bool outputComma = false;
 

	
 
    std::mt19937 rng(std::random_device{}());
 
    Graph g;
 
    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.
 
            DegreeSequence ds;
 
            generateCanonicalPowerlawGraph(numVertices, tau, g, ds);
 

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

	
 
            //
 
            // ECM triangles
 
            //
 
            std::vector<int> ECMtris;
 

	
 
            for (int i = 0; i < measurements; ++i) {
 
                Graph gtemp;
 
                if (erasedConfigurationModel(ds, gtemp, rng)) {
 
                    ECMtris.push_back(gtemp.countTriangles());
 
                }
 
            }
 

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

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

	
 
            SwitchChain chain;
 
            if (!chain.initialize(g)) {
 
                std::cerr << "Could not initialize Markov chain.\n";
 
                return 1;
 
            }
 

	
 
            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 uniform samples." << std::flush;
 

	
 
            if (outputComma)
 
                outfile << ',' << '\n';
 
            outputComma = true;
 

	
 
            outfile << '{';
 
            outfile << '{' << numVertices << ',' << tau << '}';
 
            outfile << ',' << uniformTris;
 
            outfile << ',' << ECMtris;
 
            outfile << '}' << std::flush;
 

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

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

0 comments (0 inline, 0 general)