Files @ 717d9916f17e
Branch filter:

Location: AENC/switchchain/cpp/switchchain_ccm_initialtris.cpp - annotation

Tom Bannink
Add improved ccm-initial-tris-distribution plots
717d9916f17e
2c86fdd4152e
2c86fdd4152e
2c86fdd4152e
2c86fdd4152e
2c86fdd4152e
2c86fdd4152e
2c86fdd4152e
2c86fdd4152e
2c86fdd4152e
2c86fdd4152e
2c86fdd4152e
717d9916f17e
2c86fdd4152e
ae292ff3308e
ae292ff3308e
ae292ff3308e
2c86fdd4152e
717d9916f17e
717d9916f17e
30d182b86860
2c86fdd4152e
2c86fdd4152e
717d9916f17e
2c86fdd4152e
2c86fdd4152e
2c86fdd4152e
2c86fdd4152e
717d9916f17e
2c86fdd4152e
2c86fdd4152e
2c86fdd4152e
717d9916f17e
2c86fdd4152e
2c86fdd4152e
2c86fdd4152e
2c86fdd4152e
2c86fdd4152e
2c86fdd4152e
2c86fdd4152e
2c86fdd4152e
2c86fdd4152e
2c86fdd4152e
2c86fdd4152e
2c86fdd4152e
2c86fdd4152e
2c86fdd4152e
2c86fdd4152e
2c86fdd4152e
2c86fdd4152e
2c86fdd4152e
717d9916f17e
717d9916f17e
717d9916f17e
717d9916f17e
2c86fdd4152e
2c86fdd4152e
717d9916f17e
717d9916f17e
717d9916f17e
2c86fdd4152e
717d9916f17e
2c86fdd4152e
2c86fdd4152e
2c86fdd4152e
2c86fdd4152e
2c86fdd4152e
2c86fdd4152e
2c86fdd4152e
2c86fdd4152e
2c86fdd4152e
2c86fdd4152e
717d9916f17e
717d9916f17e
717d9916f17e
717d9916f17e
2c86fdd4152e
2c86fdd4152e
717d9916f17e
717d9916f17e
717d9916f17e
717d9916f17e
717d9916f17e
717d9916f17e
717d9916f17e
717d9916f17e
717d9916f17e
717d9916f17e
717d9916f17e
717d9916f17e
717d9916f17e
717d9916f17e
717d9916f17e
717d9916f17e
717d9916f17e
2c86fdd4152e
717d9916f17e
717d9916f17e
717d9916f17e
2c86fdd4152e
717d9916f17e
2c86fdd4152e
717d9916f17e
2c86fdd4152e
717d9916f17e
717d9916f17e
2c86fdd4152e
717d9916f17e
717d9916f17e
717d9916f17e
717d9916f17e
717d9916f17e
2c86fdd4152e
717d9916f17e
717d9916f17e
717d9916f17e
717d9916f17e
717d9916f17e
717d9916f17e
717d9916f17e
717d9916f17e
717d9916f17e
2c86fdd4152e
717d9916f17e
2c86fdd4152e
717d9916f17e
717d9916f17e
717d9916f17e
2c86fdd4152e
717d9916f17e
717d9916f17e
717d9916f17e
717d9916f17e
717d9916f17e
717d9916f17e
2c86fdd4152e
717d9916f17e
2c86fdd4152e
2c86fdd4152e
2c86fdd4152e
2c86fdd4152e
2c86fdd4152e
#include "switchchain.hpp"
#include "exports.hpp"
#include "graph.hpp"
#include "graph_ccm.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 = 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.5f, 2.9f};

    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_ccm_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: {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 << '{';
    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;

            //
            // 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());
                }
                // 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;

            // 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 mixing and measurements." << std::flush;

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

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

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