Grey::Grey(void) :
optimiseComponentTree(true),
+ calcComponents(true),
performGraphSimplification(true),
prefilterReductions(true),
removeEdgeRedundancy(true),
} while (0)
G_UPDATE(optimiseComponentTree);
+ G_UPDATE(calcComponents);
G_UPDATE(performGraphSimplification);
G_UPDATE(prefilterReductions);
G_UPDATE(removeEdgeRedundancy);
bool optimiseComponentTree;
+ bool calcComponents;
bool performGraphSimplification;
bool prefilterReductions;
bool removeEdgeRedundancy;
// 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) {
reformLeadingDots(*gc);
}
- recalcComponents(g_comp);
+ recalcComponents(g_comp, cc.grey);
}
if (processComponents(*this, expr, g_comp, som)) {
#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"
}));
}
-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;
}
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) {
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)));
}
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
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());
}
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());
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());
}