From 9e3726c6c7762f6292333f85117546acc01f5568 Mon Sep 17 00:00:00 2001 From: Jaron Kent-Dobias Date: Mon, 23 Sep 2019 17:12:55 -0400 Subject: more work, need to finish implementation of searches and make sure existing ones correctly exclude the cycle edges --- lib/src/network.cpp | 55 +++++++++++++++++++++++++++++++++-------------------- 1 file changed, 34 insertions(+), 21 deletions(-) diff --git a/lib/src/network.cpp b/lib/src/network.cpp index 6b3873b..2a187c5 100644 --- a/lib/src/network.cpp +++ b/lib/src/network.cpp @@ -78,16 +78,18 @@ void network::get_cycle_edges_helper(std::set& cycle_edges, std::set& seen_vertices, unsigned v_prev, unsigned v_cur) const { for (unsigned ei : G.dual_vertices[v_cur].ne) { - const std::array& e = G.dual_edges[ei].v; - unsigned vn = e[0] == v_cur ? e[1] : e[0]; - - if (vn != v_prev) { - auto it = seen_vertices.find(vn); - if (it == seen_vertices.end()) { - // if (seen_vertices.contains()) { // need to wait for better c++20 support... - cycle_edges.insert(vn); - } else { - this->get_cycle_edges_helper(cycle_edges, seen_vertices, v_cur, vn); + if (fuses[ei]) { + const std::array& e = G.dual_edges[ei].v; + unsigned vn = e[0] == v_cur ? e[1] : e[0]; + + if (vn != v_prev) { + auto it = seen_vertices.find(vn); + if (it == seen_vertices.end()) { + // if (seen_vertices.contains()) { // need to wait for better c++20 support... + cycle_edges.insert(vn); + } else { + this->get_cycle_edges_helper(cycle_edges, seen_vertices, v_cur, vn); + } } } } @@ -102,20 +104,31 @@ std::set network::get_cycle_edges(unsigned v0) const { return cycle_edges; } -std::array network::find_cycle(const std::set& cycle_edges, unsigned v0, unsigned v1) const { - for (unsigned ei : G.dual_vertices[v0].ne) { - const std::array& e = G.dual_edges[ei].v; - unsigned vn = e[0] == v0 ? e[1] : e[0]; - if (vn == v1) { - return {ei}; - } else { - std::list edges = this->get_cycle_edges(vn, v1); - edges.splice(edges.end(), {ei}); - return edges; +bool network::find_cycle_helper(std::array& sig, const std::set& cycle_edges, unsigned vPrev, unsigned vCur, unsigned vEnd) const { + for (unsigned ei : G.dual_vertices[vCur].ne) { + if (fuses[ei]) { + const std::array& e = G.dual_edges[ei].v; + unsigned vn = e[0] == vCur ? e[1] : e[0]; + if (vn != vPrev) { + if (vn == vEnd) { + return true; + } else { + if (find_cycle_helper(sig, cycle_edges, vCur, vn, vEnd)) { + if (G.dual_edges[ei].crossings[0]) sig[0]++; + if (G.dual_edges[ei].crossings[1]) sig[1]++; + return true; + } + } + } } } - return {}; + return false; +} + +std::array network::find_cycle(const std::set& cycle_edges, unsigned v0, unsigned v1) const { + std::array sig; + this->find_cycle_helper(sig, cycle_edges, v0, v0, } void network::update_backbone(const std::vector& c) { -- cgit v1.2.3-54-g00ecf