#include #include #include "algorithm/king.h" #include "algorithm/henzinger_king.h" #include #include #include using namespace graph; TEST_SUITE("Dynamic Reachability Bench") { ankerl::nanobench::Bench dynBench; TEST_CASE("King") { std::ifstream fgeneral{ "resources/dag.txt" }; std::vector> dagGraph; int fu, fv; while (fgeneral >> fu >> fv) dagGraph.push_back({ fu, fv }); graph::Digraph G; for (const auto& [u, v] : dagGraph) G.insert(u, v); algo::King* k = new algo::King(G); k->init(); std::random_device rd; std::mt19937 mt(rd()); std::ranges::shuffle(dagGraph, mt); std::vector> delEdges(dagGraph.begin(), dagGraph.begin() + 20); dynBench.epochs(1).run("K::remove", [&] { k->remove(delEdges); } ); std::uniform_int_distribution<> dist(1, 200); dynBench.epochs(1).run("K::query", [&] { for (int i = 0; i < 50; ++i) k->query(dist(mt), dist(mt)); } ); std::vector insEdges; for (int i = 0; i < 50; ++i) insEdges.push_back(dist(mt)); dynBench.epochs(1).run("K::insert", [&] { k->insert(50, insEdges); } ); } TEST_CASE("HenzingerKing") { std::ifstream fgeneral{ "resources/general.txt" }; std::vector> generalGraph; int fu, fv; while (fgeneral >> fu >> fv) generalGraph.push_back({ fu, fv }); graph::Digraph G; for (const auto& [u, v] : generalGraph) G.insert(u, v); algo::HenzingerKing* hk = new algo::HenzingerKing(G); hk->init(); std::random_device rd; std::mt19937 mt(rd()); std::ranges::shuffle(generalGraph, mt); std::vector> delEdges(generalGraph.begin(), generalGraph.begin() + 20); dynBench.epochs(1).run("HK::remove", [&] { hk->remove(delEdges); } ); std::uniform_int_distribution<> dist(1, 200); dynBench.epochs(1).run("HK::query", [&] { for (int i = 0; i < 50; ++i) hk->query(dist(mt), dist(mt)); } ); std::vector insEdges; for (int i = 0; i < 50; ++i) insEdges.push_back(dist(mt)); dynBench.epochs(1).run("HK::insert", [&] { hk->insert(50, insEdges); } ); } }