]> git.ipfire.org Git - thirdparty/vectorscan.git/commitdiff
ng_calc_components: add Grey box control
authorJustin Viiret <justin.viiret@intel.com>
Mon, 20 Mar 2017 23:58:26 +0000 (10:58 +1100)
committerMatthew Barr <matthew.barr@intel.com>
Wed, 26 Apr 2017 05:18:13 +0000 (15:18 +1000)
src/grey.cpp
src/grey.h
src/nfagraph/ng.cpp
src/nfagraph/ng_calc_components.cpp
src/nfagraph/ng_calc_components.h
unit/internal/nfagraph_comp.cpp

index ea92fdb596abf4b38b2ccf2d9f9b1e43e8709405..24140c05bdbfcd9c646e71483ee1bf19854a9c18 100644 (file)
@@ -42,6 +42,7 @@ namespace ue2 {
 
 Grey::Grey(void) :
                    optimiseComponentTree(true),
+                   calcComponents(true),
                    performGraphSimplification(true),
                    prefilterReductions(true),
                    removeEdgeRedundancy(true),
@@ -209,6 +210,7 @@ void applyGreyOverrides(Grey *g, const string &s) {
         } while (0)
 
         G_UPDATE(optimiseComponentTree);
+        G_UPDATE(calcComponents);
         G_UPDATE(performGraphSimplification);
         G_UPDATE(prefilterReductions);
         G_UPDATE(removeEdgeRedundancy);
index 5fde7b4b7c4da9bb37fafed42e94e799157c3ff1..5051941813d8f431811eeef010de820ab5fc123b 100644 (file)
@@ -41,6 +41,7 @@ struct Grey {
 
     bool optimiseComponentTree;
 
+    bool calcComponents;
     bool performGraphSimplification;
     bool prefilterReductions;
     bool removeEdgeRedundancy;
index bdd767e989c5f4e07844806e0135121e6e9d7873..dc74dceefd292a570504f4692b0b08abc840c0bf 100644 (file)
@@ -437,7 +437,7 @@ bool NG::addGraph(ExpressionInfo &expr, unique_ptr<NGHolder> g_ptr) {
     // Split the graph into a set of connected components and process those.
     // Note: this invalidates g_ptr.
 
-    auto g_comp = calcComponents(std::move(g_ptr));
+    auto g_comp = calcComponents(std::move(g_ptr), cc.grey);
     assert(!g_comp.empty());
 
     if (!som) {
@@ -446,7 +446,7 @@ bool NG::addGraph(ExpressionInfo &expr, unique_ptr<NGHolder> g_ptr) {
             reformLeadingDots(*gc);
         }
 
-        recalcComponents(g_comp);
+        recalcComponents(g_comp, cc.grey);
     }
 
     if (processComponents(*this, expr, g_comp, som)) {
index ff0d0fe1e3647922c109c71323510a0a5da360bd..2c1dbcdb4a4f3bd044390c4660072246973bde1a 100644 (file)
@@ -55,6 +55,7 @@
 #include "ng_prune.h"
 #include "ng_undirected.h"
 #include "ng_util.h"
+#include "grey.h"
 #include "ue2common.h"
 #include "util/graph_range.h"
 #include "util/make_unique.h"
@@ -376,12 +377,13 @@ void splitIntoComponents(unique_ptr<NGHolder> g,
                   }));
 }
 
-deque<unique_ptr<NGHolder>> calcComponents(unique_ptr<NGHolder> g) {
+deque<unique_ptr<NGHolder>> calcComponents(unique_ptr<NGHolder> g,
+                                           const Grey &grey) {
     deque<unique_ptr<NGHolder>> comps;
 
     // For trivial cases, we needn't bother running the full
     // connected_components algorithm.
-    if (isAlternationOfClasses(*g)) {
+    if (!grey.calcComponents || isAlternationOfClasses(*g)) {
         comps.push_back(std::move(g));
         return comps;
     }
@@ -402,7 +404,11 @@ deque<unique_ptr<NGHolder>> calcComponents(unique_ptr<NGHolder> g) {
     return comps;
 }
 
-void recalcComponents(deque<unique_ptr<NGHolder>> &comps) {
+void recalcComponents(deque<unique_ptr<NGHolder>> &comps, const Grey &grey) {
+    if (!grey.calcComponents) {
+        return;
+    }
+
     deque<unique_ptr<NGHolder>> out;
 
     for (auto &gc : comps) {
@@ -415,7 +421,7 @@ void recalcComponents(deque<unique_ptr<NGHolder>> &comps) {
             continue;
         }
 
-        auto gc_comps = calcComponents(std::move(gc));
+        auto gc_comps = calcComponents(std::move(gc), grey);
         out.insert(end(out), std::make_move_iterator(begin(gc_comps)),
                    std::make_move_iterator(end(gc_comps)));
     }
index 0359f4a0b6f0b22852af3a60b9c163d78d380a6f..1bcdc5f81e117b14ec6e2d7c602272c1c7d3b78b 100644 (file)
 namespace ue2 {
 
 class NGHolder;
+struct Grey;
 
 bool isAlternationOfClasses(const NGHolder &g);
 
 std::deque<std::unique_ptr<NGHolder>>
-calcComponents(std::unique_ptr<NGHolder> g);
+calcComponents(std::unique_ptr<NGHolder> g, const Grey &grey);
 
-void recalcComponents(std::deque<std::unique_ptr<NGHolder>> &comps);
+void recalcComponents(std::deque<std::unique_ptr<NGHolder>> &comps,
+                      const Grey &grey);
 
 } // namespace ue2
 
index 8aae951934c274ca893397bd7e7d2cfd3f116aae..61b05a465531280e2b9c9aed4286f34dc79dce0f 100644 (file)
@@ -43,7 +43,9 @@ TEST(NFAGraph, CalcComp1) {
     auto graph = constructGraph("abc|def|ghi", 0);
     ASSERT_TRUE(graph != nullptr);
 
-    auto comps = calcComponents(std::move(graph));
+    Grey grey;
+    grey.calcComponents = true;
+    auto comps = calcComponents(std::move(graph), grey);
     ASSERT_EQ(3, comps.size());
 }
 
@@ -51,7 +53,9 @@ TEST(NFAGraph, CalcComp2) {
     auto graph = constructGraph("a|b|c|d|e|f|g|h|i", 0);
     ASSERT_TRUE(graph != nullptr);
 
-    auto comps = calcComponents(std::move(graph));
+    Grey grey;
+    grey.calcComponents = true;
+    auto comps = calcComponents(std::move(graph), grey);
 
     // We should be identifying this as a trivial case and not splitting it.
     ASSERT_EQ(1, comps.size());
@@ -62,7 +66,9 @@ TEST(NFAGraph, RecalcComp1) {
     comps.push_back(constructGraph("abc|def|ghi", 0));
     ASSERT_TRUE(comps.back() != nullptr);
 
-    recalcComponents(comps);
+    Grey grey;
+    grey.calcComponents = true;
+    recalcComponents(comps, grey);
 
     ASSERT_EQ(3, comps.size());
 }