From 85a07a091764c9bb66f05e98927f41583ede1619 Mon Sep 17 00:00:00 2001
From: Florent Jaillet <florent.jaillet@lis-lab.fr>
Date: Thu, 8 Feb 2018 14:30:30 +0100
Subject: [PATCH] Performing acceleration only after checking domination to
 improve performance

---
 src/main.hpp                |  2 +-
 src/mincoversetcomputer.cpp | 41 ++++++++++++++++++++++---------------
 src/mincoversetcomputer.hpp | 17 ++++++++-------
 tests/tests_main.cpp        |  4 ++--
 4 files changed, 37 insertions(+), 27 deletions(-)

diff --git a/src/main.hpp b/src/main.hpp
index 9a5fd03..e8ee2b5 100644
--- a/src/main.hpp
+++ b/src/main.hpp
@@ -43,7 +43,7 @@
 #include "mincoversetcomputer.hpp"
 
 
-#define VERSION_NUMBER "1.0.2"  ///< Version number of the application
+#define VERSION_NUMBER "1.0.3"  ///< Version number of the application
 
 /**
  * \brief Set of flags parametrizing the output sent to stdout by the
diff --git a/src/mincoversetcomputer.cpp b/src/mincoversetcomputer.cpp
index 374619e..8ed0ed7 100644
--- a/src/mincoversetcomputer.cpp
+++ b/src/mincoversetcomputer.cpp
@@ -92,28 +92,35 @@ void MinCoverSetComputer::monotone_pruning(const MonotonePruningParam& param) {
       tmp_marking.add_omegaless_marking(
           mapping_diff_[candidate.ind_transition]);
 
-      // NOTE: The following lines allow to choose between
-      // MinCoverSetComputer::accelerate() and OrderedTuples::accelerate()
-      // to perform the acceleration step. Note that both functions are not
-      // exactly equivalent (see the documentation of
-      // OrderedTuples::accelerate() for more details).
-      // Note also that neither of the two functions exactly implements the
-      // acceleration described in the reference paper, as the acceleration is
-      // done in-place here (see the documentation of
-      // MinCoverSetComputer::monotone_pruning() for more details).
-      if (param.use_orderedtuples_for_accelerate) {
-        p_curr_node_->mark_ancestors();
-        ord_tuples_.accelerate(tmp_marking);
-      } else {
-        accelerate(p_curr_node_, tmp_marking);
-      }
-      ++computation_stats_.nb_accelerated;
-
       param.bfs_traversal ? wait_.pop_front() : wait_.pop_back();
 
       if (!(param.use_orderedtuples_for_is_dominated ?
           ord_tuples_.is_dominated(tmp_marking) :
           is_dominated(tmp_marking, p_root_))) {
+        // NOTE: To improve the processing speed of this implementation,
+        // the following acceleration is only done after checking the condition
+        // above.
+        // Note that this differs from what is described in the reference paper
+        // where the acceleration is systematically done before checking the
+        // condition.
+
+        // NOTE: The following lines allow to choose between
+        // MinCoverSetComputer::accelerate() and OrderedTuples::accelerate()
+        // to perform the acceleration step.
+        // Note that both functions are not exactly equivalent (see the
+        // documentation of OrderedTuples::accelerate() for more details).
+        // Note also that neither of the two functions exactly implements the
+        // acceleration described in the reference paper, as the acceleration
+        // is done in-place here (see the documentation of
+        // MinCoverSetComputer::monotone_pruning() for more details).
+        if (param.use_orderedtuples_for_accelerate) {
+          p_curr_node_->mark_ancestors();
+          ord_tuples_.accelerate(tmp_marking);
+        } else {
+          accelerate(p_curr_node_, tmp_marking);
+        }
+        ++computation_stats_.nb_accelerated;
+
         // NOTE: In this implementation, a new node is created only when
         // reaching the following line. Note that this differs from what is
         // described in the reference paper (see the documentation of
diff --git a/src/mincoversetcomputer.hpp b/src/mincoversetcomputer.hpp
index 5b800bb..a43c6dc 100644
--- a/src/mincoversetcomputer.hpp
+++ b/src/mincoversetcomputer.hpp
@@ -256,13 +256,16 @@ private:
    *       \ref article "[Reynier]". The implementation differs from the
    *       algorithm in the article in two places:
    *       * The acceleration of the new omega-marking (cf. line 7 of algorithm
-   *         2 in \ref article "[Reynier]") is done in-place in this
-   *         implementation, which can lead to some over-acceleration compared
-   *         to the acceleration function described in the section 3.1 of
-   *         \ref article "[Reynier]". This doesn't affect the validity of
-   *         the algorithm which still converges to the right solution. It can
-   *         only in the best case reduce the number of iterations needed to
-   *         reach the solution compared to the version in the paper.
+   *         2 in \ref article "[Reynier]") is only performed after
+   *         checking the domination condition (cf. line 9 of algorithm 2 in
+   *         \ref article "[Reynier]"). Furthermore, the acceleration of the
+   *         new omega-marking is done in-place in this implementation, which
+   *         can lead to some over-acceleration compared to the acceleration
+   *         function described in the section 3.1 of \ref article "[Reynier]".
+   *         This doesn't affect the validity of the algorithm which still
+   *         converges to the right solution. It can only in the best case
+   *         reduce the number of iterations needed to reach the solution
+   *         compared to the version in the paper.
    *       * In the paper, a new node *n* is created and added to the set of
    *         nodes for each acceleration (cf. lines 7 and 8 of algorithm 2 in
    *         \ref article "[Reynier]"), but in the case where the condition
diff --git a/tests/tests_main.cpp b/tests/tests_main.cpp
index a9171cd..b57a470 100644
--- a/tests/tests_main.cpp
+++ b/tests/tests_main.cpp
@@ -224,7 +224,7 @@ TEST_CASE("parse_args_and_compute()", "[main]") {
 
       std::string expected_stats_bfs =
           "Nb wait: 11\n"
-          "Nb accelerated: 10\n"
+          "Nb accelerated: 8\n"
           "Nb nodes: 9\n"
           "Nb min. cover. set: 6\n";
 
@@ -243,7 +243,7 @@ TEST_CASE("parse_args_and_compute()", "[main]") {
 
       std::string expected_stats_dfs =
           "Nb wait: 15\n"
-          "Nb accelerated: 15\n"
+          "Nb accelerated: 12\n"
           "Nb nodes: 13\n"
           "Nb min. cover. set: 6\n";
 
-- 
GitLab