From 9bdad4a6c9a771e4da49a6f6878ea40b2bfb0a99 Mon Sep 17 00:00:00 2001 From: ppapp Date: Tue, 2 Dec 2025 15:35:58 +0100 Subject: [PATCH] fixes in partitioning and pebbling --- .../pebblingILP/MultiProcessorPebbling.hpp | 4 +++- .../partialILP/AcyclicPartitioningILP.hpp | 17 ++++++----------- tests/ilp_hypergraph_partitioning.cpp | 9 +++++---- 3 files changed, 14 insertions(+), 16 deletions(-) diff --git a/include/osp/pebbling/pebblers/pebblingILP/MultiProcessorPebbling.hpp b/include/osp/pebbling/pebblers/pebblingILP/MultiProcessorPebbling.hpp index 4ace2595..bb40a004 100644 --- a/include/osp/pebbling/pebblers/pebblingILP/MultiProcessorPebbling.hpp +++ b/include/osp/pebbling/pebblers/pebblingILP/MultiProcessorPebbling.hpp @@ -86,6 +86,7 @@ class MultiProcessorPebbling : public Scheduler { VarArray comp_phase_ends; unsigned max_time = 0; + unsigned time_limit_seconds; // problem settings bool slidingPebbles = false; @@ -211,6 +212,7 @@ class MultiProcessorPebbling : public Scheduler { inline void setNeedsBlueAtEnd (const std::set& needs_blue_) {needs_blue_at_end = needs_blue_; } inline void setHasRedInBeginning (const std::vector >& has_red_) {has_red_in_beginning = has_red_; } inline void setVerbose (const bool verbose_) {verbose = verbose_; } + inline void setTimeLimitSeconds(unsigned time_limit_seconds_) { time_limit_seconds = time_limit_seconds_; } bool hasEmptyStep(const BspInstance &instance); }; @@ -223,7 +225,7 @@ void MultiProcessorPebbling::solveILP() { if(!verbose) model.SetIntParam(COPT_INTPARAM_LOGTOCONSOLE, 0); - model.SetDblParam(COPT_DBLPARAM_TIMELIMIT, Scheduler::timeLimitSeconds); + model.SetDblParam(COPT_DBLPARAM_TIMELIMIT, time_limit_seconds); model.SetIntParam(COPT_INTPARAM_THREADS, 128); model.SetIntParam(COPT_INTPARAM_STRONGBRANCHING, 1); diff --git a/include/osp/pebbling/pebblers/pebblingILP/partialILP/AcyclicPartitioningILP.hpp b/include/osp/pebbling/pebblers/pebblingILP/partialILP/AcyclicPartitioningILP.hpp index 7b067f74..de849a0b 100644 --- a/include/osp/pebbling/pebblers/pebblingILP/partialILP/AcyclicPartitioningILP.hpp +++ b/include/osp/pebbling/pebblers/pebblingILP/partialILP/AcyclicPartitioningILP.hpp @@ -25,7 +25,7 @@ limitations under the License. namespace osp{ template -class AcyclicPartitioningILP : public Scheduler { +class AcyclicPartitioningILP { static_assert(is_computational_dag_v, "PebblingSchedule can only be used with computational DAGs."); @@ -64,6 +64,8 @@ class AcyclicPartitioningILP : public Scheduler { std::vector is_original_source; + unsigned time_limit_seconds; + protected: std::vector node_in_partition; std::vector hyperedge_intersects_partition; @@ -84,9 +86,6 @@ class AcyclicPartitioningILP : public Scheduler { RETURN_STATUS computePartitioning(const BspInstance &instance, std::vector& partitioning); - // not used, only here for using scheduler class base functionality (status enums, timelimits, etc) - virtual RETURN_STATUS computeSchedule(BspSchedule &schedule) override; - /** * @brief Enables writing intermediate solutions. * @@ -139,7 +138,7 @@ class AcyclicPartitioningILP : public Scheduler { * * @return The name of the schedule. */ - virtual std::string getScheduleName() const override { return "AcyclicPartitioningILP"; } + virtual std::string getScheduleName() const { return "AcyclicPartitioningILP"; } // getters and setters for problem parameters inline std::pair getMinAndMaxSize() const { return std::make_pair(minPartitionSize, maxPartitionSize); } @@ -149,6 +148,7 @@ class AcyclicPartitioningILP : public Scheduler { inline void setNumberOfParts(const unsigned number_of_parts) {numberOfParts = number_of_parts; } inline void setIgnoreSourceForConstraint(const bool ignore_) {ignore_sources_for_constraint = ignore_; } inline void setIsOriginalSource(const std::vector& is_original_source_) {is_original_source = is_original_source_; } + void setTimeLimitSeconds(unsigned time_limit_seconds_) { time_limit_seconds = time_limit_seconds_; } }; template @@ -156,7 +156,7 @@ void AcyclicPartitioningILP::solveILP() { model.SetIntParam(COPT_INTPARAM_LOGTOCONSOLE, 0); - model.SetDblParam(COPT_DBLPARAM_TIMELIMIT, Scheduler::timeLimitSeconds); + model.SetDblParam(COPT_DBLPARAM_TIMELIMIT, time_limit_seconds); model.SetIntParam(COPT_INTPARAM_THREADS, 128); model.SetIntParam(COPT_INTPARAM_STRONGBRANCHING, 1); @@ -347,9 +347,4 @@ std::vector AcyclicPartitioningILP::returnAssignment(const Bs return node_to_partition; } -template -RETURN_STATUS AcyclicPartitioningILP::computeSchedule(BspSchedule &) { - return RETURN_STATUS::ERROR; -} - } \ No newline at end of file diff --git a/tests/ilp_hypergraph_partitioning.cpp b/tests/ilp_hypergraph_partitioning.cpp index f98797da..b42bbc29 100644 --- a/tests/ilp_hypergraph_partitioning.cpp +++ b/tests/ilp_hypergraph_partitioning.cpp @@ -32,6 +32,7 @@ using namespace osp; BOOST_AUTO_TEST_CASE(test_full) { using graph = computational_dag_vector_impl_def_int_t; + using Hypergraph = Hypergraph_def_t; // Getting root git directory std::filesystem::path cwd = std::filesystem::current_path(); @@ -48,7 +49,7 @@ BOOST_AUTO_TEST_CASE(test_full) { BOOST_CHECK(status); - Hypergraph Hgraph = convert_from_cdag_as_hyperdag(DAG); + Hypergraph Hgraph = convert_from_cdag_as_hyperdag(DAG); BOOST_CHECK_EQUAL(DAG.num_vertices(), Hgraph.num_vertices()); PartitioningProblem instance(Hgraph, 3, 35); @@ -57,7 +58,7 @@ BOOST_AUTO_TEST_CASE(test_full) { // ILP without replication - HypergraphPartitioningILP partitioner; + HypergraphPartitioningILP partitioner; partitioner.setTimeLimitSeconds(60); partitioner.computePartitioning(partition); @@ -83,7 +84,7 @@ BOOST_AUTO_TEST_CASE(test_full) { // ILP with replication - HypergraphPartitioningILPWithReplication partitioner_rep; + HypergraphPartitioningILPWithReplication partitioner_rep; PartitioningWithReplication partition_rep(instance); partitioner_rep.setTimeLimitSeconds(60); @@ -110,7 +111,7 @@ BOOST_AUTO_TEST_CASE(test_full) { // same tests with other replication formulation instance.setMaxWorkWeightExplicitly(35); - partitioner_rep.setReplicationModel(HypergraphPartitioningILPWithReplication<>::REPLICATION_MODEL_IN_ILP::GENERAL); + partitioner_rep.setReplicationModel(HypergraphPartitioningILPWithReplication::REPLICATION_MODEL_IN_ILP::GENERAL); partitioner_rep.setUseInitialSolution(false); partitioner_rep.computePartitioning(partition_rep);