diff --git a/benchmark/dynamic_reachability_bench.cc b/benchmark/dynamic_reachability_bench.cc index c02332d..171b26a 100644 --- a/benchmark/dynamic_reachability_bench.cc +++ b/benchmark/dynamic_reachability_bench.cc @@ -1,8 +1,97 @@ #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); } + ); + } } \ No newline at end of file