Files @ 2c86fdd4152e
Branch filter:

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

Tom Bannink
Add start of ccm time evol
2c86fdd4152e
2c86fdd4152e
2c86fdd4152e
2c86fdd4152e
2c86fdd4152e
2c86fdd4152e
2c86fdd4152e
2c86fdd4152e
2c86fdd4152e
2c86fdd4152e
2c86fdd4152e
2c86fdd4152e
2c86fdd4152e
2c86fdd4152e
2c86fdd4152e
2c86fdd4152e
2c86fdd4152e
2c86fdd4152e
2c86fdd4152e
2c86fdd4152e
2c86fdd4152e
2c86fdd4152e
2c86fdd4152e
2c86fdd4152e
2c86fdd4152e
2c86fdd4152e
2c86fdd4152e
2c86fdd4152e
2c86fdd4152e
2c86fdd4152e
2c86fdd4152e
2c86fdd4152e
2c86fdd4152e
2c86fdd4152e
2c86fdd4152e
2c86fdd4152e
2c86fdd4152e
2c86fdd4152e
2c86fdd4152e
2c86fdd4152e
2c86fdd4152e
2c86fdd4152e
2c86fdd4152e
2c86fdd4152e
2c86fdd4152e
2c86fdd4152e
2c86fdd4152e
2c86fdd4152e
2c86fdd4152e
2c86fdd4152e
2c86fdd4152e
2c86fdd4152e
2c86fdd4152e
2c86fdd4152e
2c86fdd4152e
2c86fdd4152e
2c86fdd4152e
2c86fdd4152e
2c86fdd4152e
2c86fdd4152e
2c86fdd4152e
2c86fdd4152e
2c86fdd4152e
2c86fdd4152e
2c86fdd4152e
2c86fdd4152e
2c86fdd4152e
2c86fdd4152e
2c86fdd4152e
2c86fdd4152e
2c86fdd4152e
2c86fdd4152e
2c86fdd4152e
2c86fdd4152e
2c86fdd4152e
2c86fdd4152e
2c86fdd4152e
2c86fdd4152e
2c86fdd4152e
2c86fdd4152e
2c86fdd4152e
2c86fdd4152e
2c86fdd4152e
2c86fdd4152e
2c86fdd4152e
2c86fdd4152e
2c86fdd4152e
2c86fdd4152e
2c86fdd4152e
2c86fdd4152e
2c86fdd4152e
2c86fdd4152e
2c86fdd4152e
2c86fdd4152e
2c86fdd4152e
2c86fdd4152e
2c86fdd4152e
2c86fdd4152e
2c86fdd4152e
2c86fdd4152e
2c86fdd4152e
2c86fdd4152e
2c86fdd4152e
2c86fdd4152e
2c86fdd4152e
2c86fdd4152e
2c86fdd4152e
2c86fdd4152e
2c86fdd4152e
2c86fdd4152e
2c86fdd4152e
2c86fdd4152e
2c86fdd4152e
2c86fdd4152e
2c86fdd4152e
2c86fdd4152e
2c86fdd4152e
2c86fdd4152e
2c86fdd4152e
2c86fdd4152e
2c86fdd4152e
2c86fdd4152e
2c86fdd4152e
2c86fdd4152e
2c86fdd4152e
2c86fdd4152e
2c86fdd4152e
2c86fdd4152e
2c86fdd4152e
2c86fdd4152e
2c86fdd4152e
2c86fdd4152e
2c86fdd4152e
2c86fdd4152e
2c86fdd4152e
2c86fdd4152e
2c86fdd4152e
2c86fdd4152e
2c86fdd4152e
2c86fdd4152e
2c86fdd4152e
2c86fdd4152e
2c86fdd4152e
2c86fdd4152e
2c86fdd4152e
2c86fdd4152e
2c86fdd4152e
2c86fdd4152e
2c86fdd4152e
2c86fdd4152e
#include "exports.hpp"
#include "graph.hpp"
#include "graph_ccm.hpp"
#include "graph_powerlaw.hpp"
#include "switchchain.hpp"
#include <algorithm>
#include <fstream>
#include <iostream>
#include <numeric>
#include <random>
#include <vector>

int main(int argc, char* argv[]) {
    // Simulation parameters
    const int numVerticesMin = 200;
    const int numVerticesMax = 2000;
    const int numVerticesStep = 400;

    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.3f, 2.5f, 2.7f, 2.9f};

    const int totalDegreeSamples = 200;

    auto getMixingTime = [](int n, float tau) {
        return int(50.0f * (50.0f - 30.0f * (tau - 2.0f)) * n);
    };
    auto getMeasurements = [](int n, float tau) {
        (void)n;
        (void)tau;
        return 100;
    };
    auto getMeasureSkip = [](int n, float tau) {
        (void)tau;
        return 10 * 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 << "degreeSamples: " << totalDegreeSamples << std::endl;
    outfile << "mixingTime: 50 * (50 - 30 (tau - 2)) n\n";
    outfile << "measurements: 100\n";
    outfile << "measureSkip: 10 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 << "*)" << 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) {
            // 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 gcmTris1 = 0;
                long long gcmTris2 = 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;
                        gcmTris1 += gtemp.countTriangles();
                    }
                    // Finish all pairings of highest degree first
                    if (constrainedConfigurationModel(ds, gtemp, rng, true)) {
                        ++successrate2;
                        gcmTris2 += gtemp.countTriangles();
                    }
                }

                SwitchChain chain;
                if (!chain.initialize(g)) {
                    std::cerr << "Could not initialize Markov chain.\n";
                    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();
                }

                std::cout << " Finished mixing and measurements." << std::flush;

                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;

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