Files
@ 3e647eb7b5b3
Branch filter:
Location: AENC/switchchain/cpp/bruteforce_triangles.cpp - annotation
3e647eb7b5b3
2.1 KiB
text/x-c++src
Add improved construction rate dataset and plot
b9691ef87e6d b9691ef87e6d b9691ef87e6d b9691ef87e6d b9691ef87e6d b9691ef87e6d b9691ef87e6d b9691ef87e6d b9691ef87e6d b9691ef87e6d b9691ef87e6d b9691ef87e6d b9691ef87e6d b9691ef87e6d b9691ef87e6d b9691ef87e6d b9691ef87e6d b9691ef87e6d b9691ef87e6d b9691ef87e6d b9691ef87e6d b9691ef87e6d b9691ef87e6d b9691ef87e6d b9691ef87e6d b9691ef87e6d b9691ef87e6d b9691ef87e6d b9691ef87e6d b9691ef87e6d b9691ef87e6d b9691ef87e6d b9691ef87e6d b9691ef87e6d b9691ef87e6d b9691ef87e6d b9691ef87e6d b9691ef87e6d b9691ef87e6d b9691ef87e6d b9691ef87e6d 1bdb42fca62f b9691ef87e6d b9691ef87e6d b9691ef87e6d b9691ef87e6d b9691ef87e6d b9691ef87e6d 1bdb42fca62f b9691ef87e6d b9691ef87e6d 1bdb42fca62f b9691ef87e6d b9691ef87e6d 1bdb42fca62f b9691ef87e6d b9691ef87e6d b9691ef87e6d b9691ef87e6d b9691ef87e6d 1bdb42fca62f b9691ef87e6d | #include "exports.hpp"
#include "graph.hpp"
#include <iostream>
#include <map>
int main() {
// Bruteforce over all graphs of n nodes
constexpr int n = 8;
constexpr int E = n * (n - 1) / 2;
std::map<DegreeSequence, unsigned int> optimalTriangles;
std::cout << "Iterating over all graphs with " << n << " vertices." << std::endl;
Graph g;
for (int edgeMask = 0; edgeMask < (1 << E); ++edgeMask) {
g.reset(n);
int mask = edgeMask;
for (auto i = 0u; i < n; ++i) {
for (auto j = i + 1; j < n; ++j) {
if (mask & 1) {
g.addEdge({i, j});
}
mask >>= 1;
}
}
auto triangles = g.countTriangles();
auto ds = g.getDegreeSequence();
std::sort(ds.begin(), ds.end());
auto iter = optimalTriangles.find(ds);
if (iter != optimalTriangles.end()) {
if (iter->second < triangles)
iter->second = triangles;
} else {
optimalTriangles[ds] = triangles;
}
}
std::cout << "Comparing with Erdos-Gallai triangles." << std::endl;
int total = 0;
int unequal = 0;
int differenceSum = 0;
for (auto &keyvalue : optimalTriangles) {
auto ds = keyvalue.first;
auto optimalTris = keyvalue.second;
g.createFromDegreeSequence(ds);
auto EGtris = g.countTriangles();
if (EGtris < optimalTris) {
int difference = optimalTris - EGtris;
std::cout << "Erdos-Gallai triangles: " << EGtris
<< "; Optimal triangles: " << optimalTris
<< "; Difference: " << difference
<< "; ds = " << ds << std::endl;
unequal++;
differenceSum += difference;
}
total++;
}
std::cout << "Done." << std::endl;
std::cout << unequal << " out of " << total << " degree sequences gave non-optimal triangles.\n";
std::cout << "Average difference of those: " << float(differenceSum) / float(unequal) << std::endl;
}
|