Files @ 3e647eb7b5b3
Branch filter:

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

Tom Bannink
Add improved construction rate dataset and plot
2c86fdd4152e
2c86fdd4152e
2c86fdd4152e
2c86fdd4152e
2c86fdd4152e
2c86fdd4152e
2c86fdd4152e
2c86fdd4152e
2c86fdd4152e
2c86fdd4152e
2c86fdd4152e
2c86fdd4152e
2c86fdd4152e
2c86fdd4152e
2c86fdd4152e
2c86fdd4152e
2c86fdd4152e
2c86fdd4152e
2c86fdd4152e
2c86fdd4152e
2c86fdd4152e
096e40410087
096e40410087
2c86fdd4152e
2c86fdd4152e
2c86fdd4152e
2c86fdd4152e
2c86fdd4152e
2c86fdd4152e
2c86fdd4152e
2c86fdd4152e
2c86fdd4152e
2c86fdd4152e
2c86fdd4152e
2c86fdd4152e
2c86fdd4152e
2c86fdd4152e
2c86fdd4152e
2c86fdd4152e
2c86fdd4152e
2c86fdd4152e
2c86fdd4152e
2c86fdd4152e
2c86fdd4152e
096e40410087
096e40410087
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
096e40410087
2c86fdd4152e
2c86fdd4152e
2c86fdd4152e
2c86fdd4152e
2c86fdd4152e
2c86fdd4152e
2c86fdd4152e
2c86fdd4152e
2c86fdd4152e
2c86fdd4152e
2c86fdd4152e
2c86fdd4152e
2c86fdd4152e
2c86fdd4152e
096e40410087
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 = 1000;
    const int numVerticesMax = 1000;
    const int numVerticesStep = 1000;

    //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 = 10;
    const int totalDegreeSamples = 1;

    auto getMixingTime = [](int n, float tau) {
        return int(1.0f * (50.0f - 10.0f * (tau - 2.0f)) * n);
    };

    // Output file
    std::ofstream outfile;
    if (argc >= 2)
        outfile.open(argv[1]);
    else
        outfile.open("graphdata_ccm_timeevol.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 << "canonical ds" << std::endl;
    outfile << "mixingTime: 0.5 * (50 - 10 (tau - 2)) n\n";
    outfile << "measurements: full time evol\n";
    outfile << "data:\n";
    outfile << "1: {n,tau}\n";
    outfile << "2: edges\n";
    outfile << "3: HH triangle seq\n";
    outfile << "4: {ccm1 failed attempts, triangle seq}\n";
    outfile << "5: {ccm2 failed attempts, triangle seq}\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);

            // 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;

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

                std::vector<int> triangleSeq(mixingTime);
                for (int i = 0; i < mixingTime; ++i) {
                    chain.doMove(true);
                    triangleSeq[i] = chain.g.getTrackedTriangles();
                }

                std::cout << " Finished HH time evol." << std::flush;


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

                outfile << '{';
                outfile << '{' << numVertices << ',' << tau << '}';
                outfile << ',' << g.edgeCount();
                outfile << ',' << triangleSeq;

                for (int ccmType = 1; ccmType <= 2; ++ccmType) {
                    bool ccmMethod = (ccmType == 1 ? false : true);
#if 0
                    outfile << ',' << '{';
                    for (int i = 0; i < 10; ++i) {
                        if (i != 0)
                            outfile << ',';
                        Graph gtemp;
                        if (constrainedConfigurationModel(ds, gtemp, rng,
                                                          ccmMethod)) {
                            chain.initialize(gtemp, true);
                            for (int i = 0; i < mixingTime; ++i) {
                                chain.doMove(true);
                                triangleSeq[i] = chain.g.getTrackedTriangles();
                            }
                            outfile << triangleSeq;
                        } else {
                            outfile << '{' << '}';
                        }
                    }
                    outfile << '}';
#endif
                    bool failed = true;
                    for (int i = 0; i < 1000; ++i) {
                        Graph gtemp;
                        if (constrainedConfigurationModel(ds, gtemp, rng,
                                                          ccmMethod)) {
                            chain.initialize(gtemp, true);
                            for (int i = 0; i < mixingTime; ++i) {
                                chain.doMove(true);
                                triangleSeq[i] = chain.g.getTrackedTriangles();
                            }
                            outfile << ',' << '{' << i << ',' << triangleSeq << '}';
                            failed = false;
                            break;
                        }
                    }
                    if (failed)
                        outfile << ",{1000,{}}";
                }

                outfile << '}' << std::flush;

                std::cout << " Finished CCM time evols." << std::flush;

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