Files @ 530154e12814
Branch filter:

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

Tom Bannink
Add Histogram class
5027d9d4aa05
5027d9d4aa05
5027d9d4aa05
5027d9d4aa05
530154e12814
5027d9d4aa05
5027d9d4aa05
5027d9d4aa05
5027d9d4aa05
5027d9d4aa05
5027d9d4aa05
5027d9d4aa05
5027d9d4aa05
5027d9d4aa05
5027d9d4aa05
530154e12814
530154e12814
530154e12814
5027d9d4aa05
5027d9d4aa05
5027d9d4aa05
530154e12814
530154e12814
5027d9d4aa05
5027d9d4aa05
5027d9d4aa05
5027d9d4aa05
5027d9d4aa05
5027d9d4aa05
530154e12814
5027d9d4aa05
5027d9d4aa05
5027d9d4aa05
5027d9d4aa05
5027d9d4aa05
5027d9d4aa05
5027d9d4aa05
5027d9d4aa05
5027d9d4aa05
5027d9d4aa05
5027d9d4aa05
5027d9d4aa05
5027d9d4aa05
5027d9d4aa05
5027d9d4aa05
5027d9d4aa05
5027d9d4aa05
5027d9d4aa05
5027d9d4aa05
5027d9d4aa05
5027d9d4aa05
5027d9d4aa05
5027d9d4aa05
530154e12814
530154e12814
5027d9d4aa05
5027d9d4aa05
530154e12814
5027d9d4aa05
5027d9d4aa05
5027d9d4aa05
530154e12814
530154e12814
5027d9d4aa05
5027d9d4aa05
5027d9d4aa05
5027d9d4aa05
5027d9d4aa05
5027d9d4aa05
5027d9d4aa05
5027d9d4aa05
5027d9d4aa05
5027d9d4aa05
5027d9d4aa05
5027d9d4aa05
5027d9d4aa05
5027d9d4aa05
5027d9d4aa05
5027d9d4aa05
5027d9d4aa05
5027d9d4aa05
5027d9d4aa05
5027d9d4aa05
5027d9d4aa05
5027d9d4aa05
5027d9d4aa05
5027d9d4aa05
5027d9d4aa05
5027d9d4aa05
5027d9d4aa05
5027d9d4aa05
5027d9d4aa05
5027d9d4aa05
5027d9d4aa05
5027d9d4aa05
5027d9d4aa05
5027d9d4aa05
5027d9d4aa05
5027d9d4aa05
5027d9d4aa05
5027d9d4aa05
5027d9d4aa05
5027d9d4aa05
5027d9d4aa05
530154e12814
530154e12814
530154e12814
5027d9d4aa05
5027d9d4aa05
530154e12814
5027d9d4aa05
5027d9d4aa05
5027d9d4aa05
5027d9d4aa05
5027d9d4aa05
530154e12814
5027d9d4aa05
5027d9d4aa05
5027d9d4aa05
5027d9d4aa05
5027d9d4aa05
5027d9d4aa05
5027d9d4aa05
5027d9d4aa05
5027d9d4aa05
5027d9d4aa05
5027d9d4aa05
5027d9d4aa05
5027d9d4aa05
5027d9d4aa05
5027d9d4aa05
530154e12814
5027d9d4aa05
5027d9d4aa05
5027d9d4aa05
530154e12814
5027d9d4aa05
5027d9d4aa05
5027d9d4aa05
5027d9d4aa05
5027d9d4aa05
5027d9d4aa05
5027d9d4aa05
5027d9d4aa05
5027d9d4aa05
#include "exports.hpp"
#include "graph.hpp"
#include "graph_powerlaw.hpp"
#include "graph_spectrum.hpp"
#include "histogram.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 = 2000;
    const int numVerticesMax = 5000;
    const int numVerticesStep = 1000;

    float tauValues[] = {2.1f, 2.3f, 2.5f, 2.7f, 2.9f};

    const int sampleRuns = 100000;

    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 100000;
    };
    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_canonical_mixingtime.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 << "sample runs: " << sampleRuns << std::endl;
    outfile << "time stamps: {0.1 n, 0.2 n, ... , 20.0 n}\n";
    outfile << "For uniform samples:\n";
    outfile << "mixingTime: 50 * (50 - 5 (tau - 2)) n\n";
    outfile << "measurements: 100000\n";
    outfile << "measureSkip: 30 n\n";
    outfile << "data:\n";
    outfile << "1: {n,tau}\n";
    outfile << "2: { {timestamp 1, {histogram}}, {timestamp 2, {histogram}} }\n";
    outfile << "3: {uniform histogram}\n";
    outfile << "*)" << std::endl;

    // Mathematica does not accept normal scientific notation
    outfile << std::fixed;
    outfile << '{' << '\n';
    bool outputComma = false;

    SwitchChain chain;
    Graph g;
    for (int numVertices = numVerticesMin; numVertices <= numVerticesMax;
         numVertices += numVerticesStep) {
        for (float tau : tauValues) {
            DegreeSequence ds;
            generateCanonicalPowerlawGraph(numVertices, tau, g, ds);

            std::cout << "Running (n,tau) = (" << numVertices << ',' << tau
                      << "). " << std::flush;
            if (outputComma)
                outfile << ',' << '\n';
            outputComma = true;
            outfile << '{' << '{' << numVertices << ',' << tau << '}';

#if 0
            std::vector<int> samples;
            outfile << ',' << '{';
            for (int maxTime = numVertices; maxTime <= 20 * numVertices;
                 maxTime += numVertices) {
                samples.clear();
                for (int sample = 0; sample < 1000; ++sample) {
                    chain.initialize(g, true);
                    for (int i = 0; i < maxTime; ++i)
                        chain.doMove(true);
                    samples.push_back(chain.g.getTrackedTriangles());
                }
                if (maxTime != numVertices)
                    outfile << ',';
                outfile << '{' << maxTime << ',' << samples << '}';
                std::cout << "t=" << maxTime << ' ' << std::flush;
            }
            outfile << '}';
#else
            std::vector<std::pair<int, Histogram>> samples;
            for (int i = 1; i <= 200; i++) {
                samples.push_back({(i * numVertices / 10), Histogram()});
            }

            for (int sample = 0; sample < 100000; ++sample) {
                chain.initialize(g, true);
                int curTime = 0;
                for (auto &piv : samples) {
                    for (; curTime < piv.first; ++curTime)
                        chain.doMove(true);
                    piv.second.add(chain.g.getTrackedTriangles());
                }
            }
            outfile << ',' << samples;
#endif

            std::cout << "\nTaking uniform samples." << std::flush;
            // Uniform samples
            chain.initialize(g);
            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);
            Histogram usamples;
            for (int i = 0; i < measurements; ++i) {
                for (int j = 0; j < measureSkip; ++j)
                    chain.doMove(true);
                usamples.add(chain.g.getTrackedTriangles());
            }
            outfile << ',' << usamples;
            outfile << '}' << std::flush;
            std::cout << std::endl;
        }
    }
    outfile << '\n' << '}';
    return 0;
}