Files @ c051e4ae1c78
Branch filter:

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

Tom Bannink
Update exponent cpp file
0dfa56d35c81
0dfa56d35c81
c9c22e41130d
c051e4ae1c78
be2f7fe6b220
0dfa56d35c81
0dfa56d35c81
0dfa56d35c81
0dfa56d35c81
0dfa56d35c81
0dfa56d35c81
0dfa56d35c81
c051e4ae1c78
c051e4ae1c78
c051e4ae1c78
c051e4ae1c78
c051e4ae1c78
0dfa56d35c81
c051e4ae1c78
c051e4ae1c78
0dfa56d35c81
c051e4ae1c78
c051e4ae1c78
c051e4ae1c78
c051e4ae1c78
c051e4ae1c78
c051e4ae1c78
c051e4ae1c78
c051e4ae1c78
c051e4ae1c78
c051e4ae1c78
c051e4ae1c78
c051e4ae1c78
c051e4ae1c78
c051e4ae1c78
c051e4ae1c78
c051e4ae1c78
c051e4ae1c78
c051e4ae1c78
c051e4ae1c78
c051e4ae1c78
c051e4ae1c78
c051e4ae1c78
c051e4ae1c78
c051e4ae1c78
c051e4ae1c78
c051e4ae1c78
c051e4ae1c78
c051e4ae1c78
c051e4ae1c78
c051e4ae1c78
c051e4ae1c78
c051e4ae1c78
c051e4ae1c78
c051e4ae1c78
c051e4ae1c78
c051e4ae1c78
c051e4ae1c78
c051e4ae1c78
c051e4ae1c78
0dfa56d35c81
c051e4ae1c78
c051e4ae1c78
c051e4ae1c78
0dfa56d35c81
0dfa56d35c81
c051e4ae1c78
c051e4ae1c78
c051e4ae1c78
c051e4ae1c78
0dfa56d35c81
0dfa56d35c81
0dfa56d35c81
c051e4ae1c78
c051e4ae1c78
c9c22e41130d
c9c22e41130d
0dfa56d35c81
0dfa56d35c81
0dfa56d35c81
0dfa56d35c81
0dfa56d35c81
0dfa56d35c81
0dfa56d35c81
c051e4ae1c78
c051e4ae1c78
0dfa56d35c81
c051e4ae1c78
c051e4ae1c78
c051e4ae1c78
c051e4ae1c78
c051e4ae1c78
0dfa56d35c81
c051e4ae1c78
0dfa56d35c81
0dfa56d35c81
c051e4ae1c78
0dfa56d35c81
c051e4ae1c78
c051e4ae1c78
0dfa56d35c81
0dfa56d35c81
c051e4ae1c78
c051e4ae1c78
0dfa56d35c81
c051e4ae1c78
c051e4ae1c78
0dfa56d35c81
c051e4ae1c78
0dfa56d35c81
0dfa56d35c81
0dfa56d35c81
0dfa56d35c81
0dfa56d35c81
0dfa56d35c81
c051e4ae1c78
c051e4ae1c78
0dfa56d35c81
c051e4ae1c78
0dfa56d35c81
0dfa56d35c81
0dfa56d35c81
c051e4ae1c78
0dfa56d35c81
0dfa56d35c81
#include "exports.hpp"
#include "graph.hpp"
#include "graph_powerlaw.hpp"
#include "graph_spectrum.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 = 10000;
    const int numVerticesMax = 50000;
    const int numVerticesStep = 10000;

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

    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 500;
    };
    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_exponent_new.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 - 5 (tau - 2)) n\n";
    outfile << "measurements: 500\n";
    outfile << "measureSkip: 30 n\n";
    outfile << "data:\n";
    outfile << "1: {n,tau}\n";
    outfile << "2: avgTriangles\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) {
            // 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);

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

                std::cout << "Running (n,tau) = (" << numVertices << ','
                          << tau << "). " << std::flush;

                // Mix
                int mixingTime = getMixingTime(numVertices, tau);
                for (int i = 0; i < mixingTime; ++i) {
                    chain.doMove();
                }

                std::cout << "Mixing done. " << std::flush;

                long long trianglesTotal = 0;
                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();
                }
                float avgTriangles =
                    float(trianglesTotal) / float(measurements);

                std::cout << "Measuring done." << std::flush;

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

                outfile << '{' << '{' << numVertices << ',' << tau << '}';
                outfile << ',' << avgTriangles;
                outfile << '}' << std::flush;

                std::cout << "Output done." << std::endl;
            }
        }
    }
    outfile << ',' << '}';
    return 0;
}