Files @ eba8261885e8
Branch filter:

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

Tom Bannink
Change trimeevol plot for thesis
634d9c963986
634d9c963986
634d9c963986
634d9c963986
634d9c963986
634d9c963986
634d9c963986
634d9c963986
634d9c963986
634d9c963986
634d9c963986
634d9c963986
634d9c963986
634d9c963986
634d9c963986
d0883e1df741
d0883e1df741
634d9c963986
634d9c963986
634d9c963986
d0883e1df741
634d9c963986
634d9c963986
634d9c963986
634d9c963986
634d9c963986
634d9c963986
634d9c963986
634d9c963986
634d9c963986
634d9c963986
634d9c963986
634d9c963986
634d9c963986
634d9c963986
634d9c963986
634d9c963986
634d9c963986
634d9c963986
634d9c963986
634d9c963986
634d9c963986
634d9c963986
634d9c963986
634d9c963986
634d9c963986
634d9c963986
634d9c963986
634d9c963986
634d9c963986
634d9c963986
634d9c963986
634d9c963986
634d9c963986
634d9c963986
d0883e1df741
634d9c963986
634d9c963986
634d9c963986
634d9c963986
634d9c963986
634d9c963986
634d9c963986
634d9c963986
634d9c963986
634d9c963986
634d9c963986
634d9c963986
634d9c963986
634d9c963986
634d9c963986
634d9c963986
634d9c963986
634d9c963986
634d9c963986
634d9c963986
634d9c963986
634d9c963986
634d9c963986
634d9c963986
634d9c963986
634d9c963986
634d9c963986
634d9c963986
634d9c963986
634d9c963986
634d9c963986
634d9c963986
d0883e1df741
d0883e1df741
d0883e1df741
d0883e1df741
634d9c963986
634d9c963986
634d9c963986
634d9c963986
634d9c963986
634d9c963986
634d9c963986
634d9c963986
634d9c963986
634d9c963986
634d9c963986
634d9c963986
634d9c963986
634d9c963986
634d9c963986
634d9c963986
634d9c963986
634d9c963986
634d9c963986
634d9c963986
634d9c963986
634d9c963986
634d9c963986
634d9c963986
634d9c963986
634d9c963986
634d9c963986
634d9c963986
634d9c963986
634d9c963986
634d9c963986
634d9c963986
634d9c963986
634d9c963986
634d9c963986
634d9c963986
634d9c963986
634d9c963986
634d9c963986
634d9c963986
634d9c963986
634d9c963986
634d9c963986
634d9c963986
634d9c963986
634d9c963986
634d9c963986
634d9c963986
634d9c963986
d0883e1df741
d0883e1df741
d0883e1df741
d0883e1df741
d0883e1df741
d0883e1df741
d0883e1df741
d0883e1df741
d0883e1df741
d0883e1df741
d0883e1df741
d0883e1df741
d0883e1df741
d0883e1df741
d0883e1df741
d0883e1df741
d0883e1df741
d0883e1df741
d0883e1df741
d0883e1df741
634d9c963986
634d9c963986
634d9c963986
634d9c963986
634d9c963986
634d9c963986
634d9c963986
634d9c963986
634d9c963986
634d9c963986
634d9c963986
#include "exports.hpp"
#include "graph.hpp"
#include "graph_ccm.hpp"
#include "graph_powerlaw.hpp"
#include "switchchain.hpp"
#include <algorithm>
#include <chrono>
#include <fstream>
#include <iostream>
#include <numeric>
#include <random>
#include <vector>

int main(int argc, char* argv[]) {
    // Simulation parameters
    const int numVerticesMin = 10000;
    const int numVerticesMax = 10000;
    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.5f, 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_cputime.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 timed triangle seq\n";
    outfile << "4: {ccm1 failed attempts, timed triangle seq}\n";
    outfile << "5: {ccm2 failed attempts, timed triangle seq}\n";
    outfile << "6: slow-sort-HH timed 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;
                std::vector<std::pair<double, unsigned int>> triangleSeq(mixingTime);
                {
                    // record start time
                    auto start = std::chrono::high_resolution_clock::now();
                    // Incorporate Havel-Hakimi time
                    g.createFromDegreeSequence(ds);
                    if (!chain.initialize(g, true)) {
                        std::cerr << "Could not initialize Markov chain.\n";
                        return 1;
                    }
                    for (int i = 0; i < mixingTime; ++i) {
                        auto now = std::chrono::high_resolution_clock::now();
                        std::chrono::duration<double> dt = now - start;
                        triangleSeq[i] =
                            std::make_pair(dt.count(), chain.g.getTrackedTriangles());
                        chain.doMove(true);
                    }
                }

                std::cout << " Finished timed 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);

                    // record start time
                    auto start = std::chrono::high_resolution_clock::now();

                    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) {
                                auto now =
                                    std::chrono::high_resolution_clock::now();
                                std::chrono::duration<double> dt = now - start;
                                triangleSeq[i] = std::make_pair(
                                    dt.count(), chain.g.getTrackedTriangles());
                                chain.doMove(true);
                            }
                            outfile << ',' << '{' << i << ',' << triangleSeq << '}';
                            failed = false;
                            break;
                        }
                    }
                    if (failed)
                        outfile << ",{1000,{}}";
                }

                // Slow sort method
                {
                    // record start time
                    auto start = std::chrono::high_resolution_clock::now();
                    // Incorporate Havel-Hakimi time
                    g.createFromDegreeSequence(ds, true);
                    if (!chain.initialize(g, true)) {
                        std::cerr << "Could not initialize Markov chain.\n";
                        return 1;
                    }
                    for (int i = 0; i < mixingTime; ++i) {
                        auto now = std::chrono::high_resolution_clock::now();
                        std::chrono::duration<double> dt = now - start;
                        triangleSeq[i] =
                            std::make_pair(dt.count(), chain.g.getTrackedTriangles());
                        chain.doMove(true);
                    }
                }
                outfile << ',' << triangleSeq;

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

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

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