diff --git a/kaminpar-cli/kaminpar_arguments.cc b/kaminpar-cli/kaminpar_arguments.cc index 58bda95f..bef53198 100644 --- a/kaminpar-cli/kaminpar_arguments.cc +++ b/kaminpar-cli/kaminpar_arguments.cc @@ -123,6 +123,13 @@ CLI::Option_group *create_coarsening_options(CLI::App *app, Context &ctx) { - sparsifying-clustering: like clustering with additionale edge sparsification)") ->capture_default_str(); + coarsening->add_option("--c-sparsification", ctx.coarsening.algorithm) + ->transform(CLI::CheckedTransformer(get_sparsification_algorithms()).description("")) + ->description(R"(One of the following options: + - random: unform random sampling + - forest-fire: sampling by forest fire scores)") + ->capture_default_str(); + coarsening ->add_option( "--c-contraction-limit", diff --git a/kaminpar-shm/coarsening/sparsification/UniformRandomSampler.cpp b/kaminpar-shm/coarsening/sparsification/UniformRandomSampler.cpp index d660324f..42c98973 100644 --- a/kaminpar-shm/coarsening/sparsification/UniformRandomSampler.cpp +++ b/kaminpar-shm/coarsening/sparsification/UniformRandomSampler.cpp @@ -9,8 +9,6 @@ namespace kaminpar::shm::sparsification { StaticArray UniformRandomSampler::sample(const CSRGraph &g) { - unsigned int backedges_deleted = 0; - unsigned int backedges = 0; unsigned int frontedges = 0; StaticArray sample = StaticArray(g.m()); unsigned int edges_deleted = 0; diff --git a/kaminpar-shm/coarsening/sparsifing_cluster_coarsener.cc b/kaminpar-shm/coarsening/sparsifing_cluster_coarsener.cc index 17ba3c99..bde27e2c 100644 --- a/kaminpar-shm/coarsening/sparsifing_cluster_coarsener.cc +++ b/kaminpar-shm/coarsening/sparsifing_cluster_coarsener.cc @@ -27,9 +27,7 @@ SparsifingClusteringCoarsener::SparsifingClusteringCoarsener( const Context &ctx, const PartitionContext &p_ctx ) : _clustering_algorithm(factory::create_clusterer(ctx)), - _sampling_algorithm(std::make_unique( - sparsification::ForestFireSampler(0.3, 0.9, 0.01) - )), + _sampling_algorithm(factory::create_sampler(ctx)), _c_ctx(ctx.coarsening), _p_ctx(p_ctx) {} diff --git a/kaminpar-shm/context_io.cc b/kaminpar-shm/context_io.cc index 1ca16748..cc27d1f8 100644 --- a/kaminpar-shm/context_io.cc +++ b/kaminpar-shm/context_io.cc @@ -69,6 +69,13 @@ std::unordered_map get_coarsening_algorithms() }; } +std::unordered_map get_sparsification_algorithms() { + return { + {"forest-fire", SparsificationAlgorithm::FOREST_FIRE}, + {"random", SparsificationAlgorithm::UNIFORM_RANDOM_SAMPLING} + }; +} + std::ostream &operator<<(std::ostream &out, const CoarseningAlgorithm algorithm) { switch (algorithm) { case CoarseningAlgorithm::NOOP: diff --git a/kaminpar-shm/context_io.h b/kaminpar-shm/context_io.h index 76b41f78..fab27237 100644 --- a/kaminpar-shm/context_io.h +++ b/kaminpar-shm/context_io.h @@ -25,6 +25,8 @@ std::ostream &operator<<(std::ostream &out, CoarseningAlgorithm algorithm); std::unordered_map get_coarsening_algorithms(); +std::unordered_map get_sparsification_algorithms(); + std::ostream &operator<<(std::ostream &out, ClusteringAlgorithm algorithm); std::unordered_map get_clustering_algorithms(); diff --git a/kaminpar-shm/factories.cc b/kaminpar-shm/factories.cc index b8b0daa0..06a1fff8 100644 --- a/kaminpar-shm/factories.cc +++ b/kaminpar-shm/factories.cc @@ -25,6 +25,8 @@ #include "kaminpar-shm/coarsening/noop_coarsener.h" // Refinement +#include "coarsening/sparsification/ForestFireSampler.h" +#include "coarsening/sparsification/UniformRandomSampler.h" #include "coarsening/sparsifing_cluster_coarsener.h" #include "kaminpar-shm/refinement/adapters/mtkahypar_refiner.h" @@ -87,6 +89,17 @@ std::unique_ptr create_coarsener(const Context &ctx, const PartitionC __builtin_unreachable(); } +std::unique_ptr create_sampler(const Context &ctx) { + switch (ctx.coarsening.sparsification_algorithm) { + case SparsificationAlgorithm::FOREST_FIRE: + return std::make_unique(0.3, 0.9, 0.01); + case SparsificationAlgorithm::UNIFORM_RANDOM_SAMPLING: + return std::make_unique(0.5); + } + + __builtin_unreachable(); +} + namespace { std::unique_ptr create_refiner(const Context &ctx, const RefinementAlgorithm algorithm) { switch (algorithm) { diff --git a/kaminpar-shm/factories.h b/kaminpar-shm/factories.h index eb0d11c3..2f4e94c3 100644 --- a/kaminpar-shm/factories.h +++ b/kaminpar-shm/factories.h @@ -8,6 +8,8 @@ ******************************************************************************/ #pragma once +#include "coarsening/sparsification/Sampler.h" + #include "kaminpar-shm/coarsening/clusterer.h" #include "kaminpar-shm/coarsening/coarsener.h" #include "kaminpar-shm/datastructures/graph.h" @@ -23,5 +25,7 @@ std::unique_ptr create_clusterer(const Context &ctx); std::unique_ptr create_coarsener(const Context &ctx, const PartitionContext &p_ctx); std::unique_ptr create_coarsener(const Context &ctx); +std::unique_ptr create_sampler(const Context &ctx); + std::unique_ptr create_refiner(const Context &ctx); } // namespace kaminpar::shm::factory diff --git a/kaminpar-shm/kaminpar.h b/kaminpar-shm/kaminpar.h index f8489ad4..b4ce9662 100644 --- a/kaminpar-shm/kaminpar.h +++ b/kaminpar-shm/kaminpar.h @@ -84,7 +84,8 @@ enum class CoarseningAlgorithm { }; enum class SparsificationAlgorithm { - UniformRandomSampling + UNIFORM_RANDOM_SAMPLING, + FOREST_FIRE }; enum class ClusteringAlgorithm {