Ticket #5180: subgraph-remove-edge-e.2.patch

File subgraph-remove-edge-e.2.patch, 4.7 KB (added by joachim.falk@…, 12 years ago)

fixed NDEBGU typo in patch

  • subgraph.hpp

    old new  
    7878    typedef graph_traits<Graph> Traits;
    7979    typedef std::list<subgraph<Graph>*> ChildrenList;
    8080public:
    81 // Graph requirements
    82 typedef typename Traits::vertex_descriptor         vertex_descriptor;
    83 typedef typename Traits::edge_descriptor           edge_descriptor;
    84 typedef typename Traits::directed_category         directed_category;
    85 typedef typename Traits::edge_parallel_category    edge_parallel_category;
    86 typedef typename Traits::traversal_category        traversal_category;
     81    // Graph requirements
     82    typedef typename Traits::vertex_descriptor         vertex_descriptor;
     83    typedef typename Traits::edge_descriptor           edge_descriptor;
     84    typedef typename Traits::directed_category         directed_category;
     85    typedef typename Traits::edge_parallel_category    edge_parallel_category;
     86    typedef typename Traits::traversal_category        traversal_category;
    8787
    8888    // IncidenceGraph requirements
    8989    typedef typename Traits::out_edge_iterator         out_edge_iterator;
     
    196196    std::pair<vertex_descriptor, bool>
    197197    find_vertex(vertex_descriptor u_global) const {
    198198        if (is_root()) return std::make_pair(u_global, true);
    199         typename std::map<vertex_descriptor, vertex_descriptor>::const_iterator
    200             i = m_local_vertex.find(u_global);
     199        typename LocalVertexMap::const_iterator i = m_local_vertex.find(u_global);
    201200        bool valid = i != m_local_vertex.end();
    202201        return std::make_pair((valid ? (*i).second : null_vertex()), valid);
    203202    }
    204203
     204    // Is edge e (of the root graph) contained in this subgraph?
     205    // If so, return the matching local edge.
     206    std::pair<edge_descriptor, bool>
     207    find_edge(edge_descriptor e_global) const {
     208        if (is_root()) return std::make_pair(e_global, true);
     209        typename LocalEdgeMap::const_iterator i =
     210          m_local_edge.find(get(get(edge_index, root().m_graph), e_global));
     211        bool valid = i != m_local_edge.end();
     212        return std::make_pair((valid ? (*i).second : edge_descriptor()), valid);
     213    }
     214
    205215    // Return the parent graph.
    206216    subgraph& parent() { return *m_parent; }
    207217    const subgraph& parent() const { return *m_parent; }
     
    617627
    618628    //-------------------------------------------------------------------------
    619629    // implementation of remove_edge(e,g)
    620     template <typename Edge, typename Graph>
    621     void remove_edge_recur_down(Edge e_global, subgraph<Graph>& g);
    622630
    623     template <typename Edge, typename Children>
     631    template <typename G, typename Edge, typename Children>
    624632    void children_remove_edge(Edge e_global, Children& c)
    625633    {
    626634        for(typename Children::iterator i = c.begin(); i != c.end(); ++i) {
    627             if((*i)->find_vertex(source(e_global, **i)).second &&
    628                (*i)->find_vertex(target(e_global, **i)).second)
    629             {
    630                 remove_edge_recur_down(source(e_global, **i),
    631                                        target(e_global, **i),
    632                                        **i);
     635            std::pair<typename subgraph<G>::edge_descriptor, bool> found =
     636              (*i)->find_edge(e_global);
     637            if (!found.second) {
     638              continue;
    633639            }
    634         }
    635     }
    636 
    637     template <typename Edge, typename Graph>
    638     void remove_edge_recur_down(Edge e_global, subgraph<Graph>& g)
    639     {
    640         remove_edge(g.global_to_local(e_global), g.m_graph);
    641         children_remove_edge(e_global, g.m_children);
    642     }
    643 
    644     template <typename Edge, typename Graph>
    645     void remove_edge_recur_up(Edge e_global, subgraph<Graph>& g)
    646     {
    647         if (g.is_root()) {
    648             remove_edge(e_global, g.m_graph);
    649             children_remove_edge(e_global, g.m_children);
    650         } else {
    651             remove_edge_recur_up(e_global, *g.m_parent);
     640            children_remove_edge<G>(e_global, (*i)->m_children);
     641            remove_edge(found.first, (*i)->m_graph);
    652642        }
    653643    }
    654644
     
    672662void
    673663remove_edge(typename subgraph<G>::edge_descriptor e, subgraph<G>& g)
    674664{
    675     if(g.is_root()) {
    676         detail::remove_edge_recur_up(e, g);
    677     } else {
    678         detail::remove_edge_recur_up(g.local_to_global(e), g);
    679     }
     665    typename subgraph<G>::edge_descriptor e_global = g.local_to_global(e);
     666#ifndef NDEBUG
     667    std::pair<typename subgraph<G>::edge_descriptor, bool> fe = g.find_edge(e_global);
     668    assert(fe.second && fe.first == e);
     669#endif //NDEBUG
     670    subgraph<G> &root = g.root(); // chase to root
     671    detail::children_remove_edge<G>(e_global, root.m_children);
     672    remove_edge(e_global, root.m_graph); // kick edge from root
    680673}
    681674
    682675// This is slow, but there may not be a good way to do it safely otherwise