Files @ a410aaa16af7
Branch filter:

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

Tom Bannink
Remove spectrum computation from canonical switchchain
f7f1afb7a925
f7f1afb7a925
c9c22e41130d
be2f7fe6b220
f7f1afb7a925
f7f1afb7a925
f7f1afb7a925
f7f1afb7a925
f7f1afb7a925
f7f1afb7a925
f7f1afb7a925
f7f1afb7a925
f7f1afb7a925
f7f1afb7a925
f7f1afb7a925
f7f1afb7a925
f7f1afb7a925
f7f1afb7a925
f7f1afb7a925
f7f1afb7a925
f7f1afb7a925
f7f1afb7a925
f7f1afb7a925
f7f1afb7a925
f7f1afb7a925
f7f1afb7a925
f7f1afb7a925
f7f1afb7a925
f7f1afb7a925
f7f1afb7a925
f7f1afb7a925
f7f1afb7a925
f7f1afb7a925
f7f1afb7a925
f7f1afb7a925
f7f1afb7a925
f7f1afb7a925
f7f1afb7a925
f7f1afb7a925
f7f1afb7a925
f7f1afb7a925
f7f1afb7a925
f7f1afb7a925
f7f1afb7a925
f7f1afb7a925
f7f1afb7a925
f7f1afb7a925
f7f1afb7a925
c9c22e41130d
c9c22e41130d
f7f1afb7a925
f7f1afb7a925
f7f1afb7a925
f7f1afb7a925
f7f1afb7a925
f7f1afb7a925
f7f1afb7a925
f7f1afb7a925
f7f1afb7a925
f7f1afb7a925
f7f1afb7a925
f7f1afb7a925
f7f1afb7a925
f7f1afb7a925
f7f1afb7a925
f7f1afb7a925
f7f1afb7a925
f7f1afb7a925
f7f1afb7a925
f7f1afb7a925
f7f1afb7a925
f7f1afb7a925
f7f1afb7a925
f7f1afb7a925
f7f1afb7a925
f7f1afb7a925
f7f1afb7a925
f7f1afb7a925
f7f1afb7a925
f7f1afb7a925
f7f1afb7a925
f7f1afb7a925
f7f1afb7a925
f7f1afb7a925
f7f1afb7a925
f7f1afb7a925
f7f1afb7a925
f7f1afb7a925
f7f1afb7a925
f7f1afb7a925
f7f1afb7a925
f7f1afb7a925
f7f1afb7a925
f7f1afb7a925
f7f1afb7a925
f7f1afb7a925
f7f1afb7a925
f7f1afb7a925
f7f1afb7a925
f7f1afb7a925
f7f1afb7a925
f7f1afb7a925
f7f1afb7a925
f7f1afb7a925
f7f1afb7a925
f7f1afb7a925
f7f1afb7a925
f7f1afb7a925
f7f1afb7a925
f7f1afb7a925
f7f1afb7a925
f7f1afb7a925
f7f1afb7a925
f7f1afb7a925
f7f1afb7a925
f7f1afb7a925
f7f1afb7a925
f7f1afb7a925
f7f1afb7a925
f7f1afb7a925
f7f1afb7a925
f7f1afb7a925
f7f1afb7a925
f7f1afb7a925
f7f1afb7a925
f7f1afb7a925
f7f1afb7a925
f7f1afb7a925
f7f1afb7a925
f7f1afb7a925
f7f1afb7a925
f7f1afb7a925
f7f1afb7a925
f7f1afb7a925
#include "exports.hpp"
#include "graph.hpp"
#include "graph_powerlaw.hpp"
#include "switchchain.hpp"
#include <algorithm>
#include <array>
#include <fstream>
#include <iostream>
#include <numeric>
#include <random>
#include <vector>

int main(int argc, char* argv[]) {
    // Generate a random degree sequence
    std::mt19937 rng(std::random_device{}());

    // Goal:
    // Degrees follow a power-law distribution with some parameter tau
    // Expect:  #tri = const * n^{ something }
    // The goal is to find the 'something' by finding the number of triangles
    // for different values of n and tau
    //float tauValues[] = {2.5f};
    float tauValues[] = {2.1f, 2.2f, 2.3f, 2.4f, 2.5f, 2.6f, 2.7f, 2.8f, 2.9f};

    Graph g;
    Graph g1;
    Graph g2;

    std::ofstream outfile;

    if (argc >= 2)
        outfile.open(argv[1]);
    else   
        outfile.open("graphdata_etmt.m");

    if (!outfile.is_open()) {
        std::cout << "ERROR: Could not open output file.\n";
        return 1;
    }

    outfile << '{';
    bool outputComma = false;

    for (int numVertices = 100; numVertices <= 1000; numVertices += 100) {
        for (float tau : tauValues) {
            // For a single n,tau take samples over several instances of
            // the degree distribution.
            for (int degreeSample = 0; degreeSample < 200; ++degreeSample) {
                DegreeSequence ds;
                generatePowerlawGraph(numVertices, tau, g, ds, rng);


                // Multiple runs from the same degree sequence
                for (int i = 0; i < 5; ++i) {

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

                std::cout << "Running n = " << numVertices << ", tau = " << tau
                          << ". \t" << std::flush;

                //int mixingTime = (32.0f - 26.0f*(tau - 2.0f)) * numVertices; //40000;
                //constexpr int measurements = 50;
                //constexpr int measureSkip =
                //    200; // Take a sample every ... steps
                int mixingTime = 0;
                constexpr int measurements = 50000;
                constexpr int measureSkip = 1;

                int movesTotal = 0;
                int movesSuccess = 0;

                int triangles[measurements];

                for (int i = 0; i < mixingTime; ++i) {
                    ++movesTotal;
                    if (chain.doMove()) {
                        ++movesSuccess;
                    }
                }

                for (int i = 0; i < measurements; ++i) {
                    for (int j = 0; j < measureSkip; ++j) {
                        ++movesTotal;
                        if (chain.doMove()) {
                            ++movesSuccess;
                        }
                    }
                    triangles[i] = chain.g.countTriangles();
                }

                std::cout << '('
                          << 100.0f * float(movesSuccess) / float(movesTotal)
                          << "% successrate). " << std::flush;
                // std::cout << std::endl;

                // Take the average over the last 20%
                auto trianglesTotal = 0uL;
                auto count = 0u;
                for (int i = measurements - (measurements / 5); i < measurements; ++i) {
                    trianglesTotal += triangles[i];
                    count++;
                }
                double trianglesAvg = double(trianglesTotal)/double(count);

                // Find the ETMT
                int ETMT = 0;
                for (int i = 0; i < measurements; ++i) {
                    if (triangles[i] < trianglesAvg) {
                        ETMT = i;
                        break;
                    }
                }

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

                std::sort(ds.begin(), ds.end());
                outfile << '{' << '{' << numVertices << ',' << tau << '}';
                outfile << ',' << ETMT;
                outfile << '}' << std::flush;

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