From a8cceeeddc40b0fec0001ae23e6129e88f8391da Mon Sep 17 00:00:00 2001 From: Justin Viiret Date: Wed, 27 Jul 2016 09:29:39 +1000 Subject: [PATCH] ng_violet: fix non-determinism in splitEdgesByCut --- src/nfagraph/ng_violet.cpp | 19 ++++++++++--------- 1 file changed, 10 insertions(+), 9 deletions(-) diff --git a/src/nfagraph/ng_violet.cpp b/src/nfagraph/ng_violet.cpp index e806d5c7..8843196f 100644 --- a/src/nfagraph/ng_violet.cpp +++ b/src/nfagraph/ng_violet.cpp @@ -1126,18 +1126,19 @@ static void splitEdgesByCut(NGHolder &h, RoseInGraph &vg, const vector &to_cut, const vector &cut, - const map > &cut_lits) { - set sources; - for (const RoseInEdge &ve : to_cut) { - assert(&h == &*vg[ve].graph); - sources.insert(source(ve, vg)); - } - + const map> &cut_lits) { DEBUG_PRINTF("splitting %s:\n", to_string(h.kind).c_str()); /* create literal vertices and connect preds */ - map > > verts_by_source; - for (RoseInVertex src : sources) { + unordered_set done_sources; + map>> verts_by_source; + for (const RoseInEdge &ve : to_cut) { + assert(&h == &*vg[ve].graph); + RoseInVertex src = source(ve, vg); + if (!done_sources.insert(src).second) { + continue; /* already processed */ + } + /* iterate over cut for determinism */ for (const auto &e : cut) { NFAVertex prev_v = source(e, h);