Changeset ba56eb


Ignore:
Timestamp:
02/06/09 00:18:33 (4 years ago)
Author:
Tiago de Paula Peixoto <tiago@…>
Branches:
master, python3
Children:
0c87c4
Parents:
d6422b
git-author:
Tiago de Paula Peixoto <tiago@…> (02/01/09 14:35:18)
git-committer:
Tiago de Paula Peixoto <tiago@…> (02/06/09 00:18:33)
Message:
Fix edge index housekeeping
Location:
src/graph
Files:
4 edited

Legend:

Unmodified
Added
Removed
  • src/graph/graph.cc

    r0ababf rba56eb  
    4141     _vertex_index(get(vertex_index,_mg)), 
    4242     _edge_index(get(edge_index_t(),_mg)), 
     43     _max_edge_index(0), 
     44     _nedges(0), 
    4345     _graph_index(0), 
    4446     _vertex_filter_map(_vertex_index), 
  • src/graph/graph.hh

    rd6422b rba56eb  
    1818#ifndef GRAPH_HH 
    1919#define GRAPH_HH 
     20 
     21#include <deque> 
    2022 
    2123#include <boost/graph/graph_traits.hpp> 
     
    154156    graph_index_map_t  GetGraphIndex()  {return graph_index_map_t(0);} 
    155157 
     158    void           AddEdgeIndex(const edge_t& e); 
     159    void           RemoveEdgeIndex(const edge_t& e); 
     160 
    156161private: 
    157162    // Gets the encapsulated graph view. See graph_filtering.cc for details 
     
    192197    // edge index map 
    193198    edge_index_map_t _edge_index; 
    194     vector<size_t> _free_indexes; // indexes of deleted edges to be used up for 
    195                                   // new edges to avoid needless fragmentation 
    196     size_t _max_edge_index; // needed for property map bounds 
     199    deque<size_t> _free_indexes; // indexes of deleted edges to be used up for 
     200                                 // new edges to avoid very large indexes, and 
     201                                 // property map memory usage 
     202    size_t _max_edge_index; 
    197203 
    198204    // graph index map 
  • src/graph/graph_filtering.cc

    r0ababf rba56eb  
    132132{ 
    133133#ifndef NO_GRAPH_FILTERING 
    134     edge_filter.reserve(max_eindex); 
    135     vertex_filter.reserve(num_vertices(g)); 
    136134    MaskFilter<EdgeFilter> e_filter(edge_filter, e_invert); 
    137135    MaskFilter<VertexFilter> v_filter(vertex_filter, v_invert); 
     
    139137    if (e_active) 
    140138    { 
     139        if (max_eindex > 0) 
     140            edge_filter.reserve(max_eindex+1); 
    141141        if (v_active) 
    142142        { 
     143            if (num_vertices(g) > 0) 
     144                vertex_filter.reserve(num_vertices(g)); 
    143145            typedef filtered_graph<Graph, MaskFilter<EdgeFilter>, 
    144146                                   MaskFilter<VertexFilter> > fg_t; 
     
    163165        if (v_active) 
    164166        { 
     167            if (num_vertices(g) > 0) 
     168                vertex_filter.reserve(num_vertices(g)); 
    165169            typedef filtered_graph<Graph, keep_all, 
    166170                                   MaskFilter<VertexFilter> > fg_t; 
     
    212216        for (tie(e, e_end) = out_edges(*v, _mg); e != e_end; ++e) 
    213217            _edge_index[*e] = index++; 
     218    _max_edge_index =  (index > 0) ? index - 1 : 0; 
     219    _nedges = index; 
     220    _free_indexes.clear(); 
    214221} 
    215222 
     
    232239        for (typeof(deleted_edges.begin()) iter = deleted_edges.begin(); 
    233240             iter != deleted_edges.end(); ++iter) 
    234             remove_edge(*iter, _mg); 
     241            RemoveEdgeIndex(*iter); 
    235242        deleted_edges.clear(); 
    236243    } 
    237     ReIndexEdges(); 
    238244} 
    239245 
  • src/graph/graph_python_interface.cc

    r0ababf rba56eb  
    161161{ 
    162162    template <class Graph, class EdgeIndexMap> 
    163     void operator()(Graph* gp, const GraphInterface& gi, const PythonVertex& s, 
     163    void operator()(Graph* gp, GraphInterface& gi, const PythonVertex& s, 
    164164                    const PythonVertex& t, EdgeIndexMap edge_index, 
    165                     size_t new_index, python::object& new_e) const 
     165                    python::object& new_e) const 
    166166    { 
    167167        Graph& g = *gp; 
     
    169169            add_edge(s.GetDescriptor(), t.GetDescriptor(), g).first; 
    170170        new_e = python::object(PythonEdge<Graph>(gi, e)); 
    171         edge_index[e] = new_index; 
    172     } 
    173 }; 
     171        gi.AddEdgeIndex(e); 
     172    } 
     173}; 
     174 
     175void GraphInterface::AddEdgeIndex(const edge_t& e) 
     176{ 
     177    if (!_free_indexes.empty()) 
     178    { 
     179        _edge_index[e] = _free_indexes.front(); 
     180        _free_indexes.pop_front(); 
     181    } 
     182    else 
     183    { 
     184        _edge_index[e] = _nedges; 
     185        _max_edge_index = _nedges; 
     186    } 
     187    _nedges++; 
     188} 
    174189 
    175190python::object GraphInterface::AddEdge(const python::object& s, 
     
    180195    src.CheckValid(); 
    181196    tgt.CheckValid(); 
    182     size_t new_index; 
    183     if (_free_indexes.empty()) 
    184     { 
    185         new_index = num_edges(_mg); 
    186     } 
    187     else 
    188     { 
    189         new_index = _free_indexes.back(); 
    190         _free_indexes.pop_back(); 
    191     } 
    192197    python::object new_e; 
    193198    run_action<>()(*this, lambda::bind<void>(add_new_edge(), lambda::_1, 
    194199                                             lambda::var(*this), src, tgt, 
    195                                              _edge_index, new_index, 
     200                                             _edge_index, 
    196201                                             lambda::var(new_e)))(); 
    197     _nedges++; 
    198     _max_edge_index = max(_max_edge_index, new_index); 
    199202    return new_e; 
    200203} 
     
    226229    if (!found) 
    227230        throw GraphException("invalid edge descriptor"); 
    228     if (_edge_index[de] != _nedges - 1) 
    229         _free_indexes.push_back(_edge_index[de]); 
     231    RemoveEdgeIndex(de); 
     232} 
     233 
     234void GraphInterface::RemoveEdgeIndex(const edge_t& e) 
     235{ 
     236    size_t index = _edge_index[e]; 
     237    if (index == _max_edge_index) 
     238    { 
     239        if (_max_edge_index - 1 == _free_indexes.back()) 
     240        { 
     241            if (_max_edge_index > 0) 
     242                _max_edge_index--; 
     243            while (_max_edge_index == _free_indexes.back()) 
     244            { 
     245                _free_indexes.pop_back(); 
     246                if (_max_edge_index > 0) 
     247                    _max_edge_index--; 
     248            } 
     249        } 
     250        else 
     251        { 
     252            if (_max_edge_index > 0) 
     253                _max_edge_index--; 
     254        } 
     255    } 
    230256    else 
    231         _max_edge_index = (_nedges > 1) ? _nedges - 2 : 0; 
    232     remove_edge(de, _mg); 
     257    { 
     258        typeof(_free_indexes.begin()) pos = 
     259                lower_bound(_free_indexes.begin(), _free_indexes.end(), index); 
     260        _free_indexes.insert(pos, index); 
     261    } 
    233262    _nedges--; 
     263    remove_edge(e, _mg); 
    234264} 
    235265 
Note: See TracChangeset for help on using the changeset viewer.