Changeset ba56eb
- Timestamp:
- 02/06/09 00:18:33 (4 years ago)
- 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)
- Location:
- src/graph
- Files:
-
- 4 edited
-
graph.cc (modified) (1 diff)
-
graph.hh (modified) (3 diffs)
-
graph_filtering.cc (modified) (5 diffs)
-
graph_python_interface.cc (modified) (4 diffs)
Legend:
- Unmodified
- Added
- Removed
-
src/graph/graph.cc
r0ababf rba56eb 41 41 _vertex_index(get(vertex_index,_mg)), 42 42 _edge_index(get(edge_index_t(),_mg)), 43 _max_edge_index(0), 44 _nedges(0), 43 45 _graph_index(0), 44 46 _vertex_filter_map(_vertex_index), -
src/graph/graph.hh
rd6422b rba56eb 18 18 #ifndef GRAPH_HH 19 19 #define GRAPH_HH 20 21 #include <deque> 20 22 21 23 #include <boost/graph/graph_traits.hpp> … … 154 156 graph_index_map_t GetGraphIndex() {return graph_index_map_t(0);} 155 157 158 void AddEdgeIndex(const edge_t& e); 159 void RemoveEdgeIndex(const edge_t& e); 160 156 161 private: 157 162 // Gets the encapsulated graph view. See graph_filtering.cc for details … … 192 197 // edge index map 193 198 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; 197 203 198 204 // graph index map -
src/graph/graph_filtering.cc
r0ababf rba56eb 132 132 { 133 133 #ifndef NO_GRAPH_FILTERING 134 edge_filter.reserve(max_eindex);135 vertex_filter.reserve(num_vertices(g));136 134 MaskFilter<EdgeFilter> e_filter(edge_filter, e_invert); 137 135 MaskFilter<VertexFilter> v_filter(vertex_filter, v_invert); … … 139 137 if (e_active) 140 138 { 139 if (max_eindex > 0) 140 edge_filter.reserve(max_eindex+1); 141 141 if (v_active) 142 142 { 143 if (num_vertices(g) > 0) 144 vertex_filter.reserve(num_vertices(g)); 143 145 typedef filtered_graph<Graph, MaskFilter<EdgeFilter>, 144 146 MaskFilter<VertexFilter> > fg_t; … … 163 165 if (v_active) 164 166 { 167 if (num_vertices(g) > 0) 168 vertex_filter.reserve(num_vertices(g)); 165 169 typedef filtered_graph<Graph, keep_all, 166 170 MaskFilter<VertexFilter> > fg_t; … … 212 216 for (tie(e, e_end) = out_edges(*v, _mg); e != e_end; ++e) 213 217 _edge_index[*e] = index++; 218 _max_edge_index = (index > 0) ? index - 1 : 0; 219 _nedges = index; 220 _free_indexes.clear(); 214 221 } 215 222 … … 232 239 for (typeof(deleted_edges.begin()) iter = deleted_edges.begin(); 233 240 iter != deleted_edges.end(); ++iter) 234 remove_edge(*iter, _mg);241 RemoveEdgeIndex(*iter); 235 242 deleted_edges.clear(); 236 243 } 237 ReIndexEdges();238 244 } 239 245 -
src/graph/graph_python_interface.cc
r0ababf rba56eb 161 161 { 162 162 template <class Graph, class EdgeIndexMap> 163 void operator()(Graph* gp, constGraphInterface& gi, const PythonVertex& s,163 void operator()(Graph* gp, GraphInterface& gi, const PythonVertex& s, 164 164 const PythonVertex& t, EdgeIndexMap edge_index, 165 size_t new_index,python::object& new_e) const165 python::object& new_e) const 166 166 { 167 167 Graph& g = *gp; … … 169 169 add_edge(s.GetDescriptor(), t.GetDescriptor(), g).first; 170 170 new_e = python::object(PythonEdge<Graph>(gi, e)); 171 edge_index[e] = new_index; 172 } 173 }; 171 gi.AddEdgeIndex(e); 172 } 173 }; 174 175 void 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 } 174 189 175 190 python::object GraphInterface::AddEdge(const python::object& s, … … 180 195 src.CheckValid(); 181 196 tgt.CheckValid(); 182 size_t new_index;183 if (_free_indexes.empty())184 {185 new_index = num_edges(_mg);186 }187 else188 {189 new_index = _free_indexes.back();190 _free_indexes.pop_back();191 }192 197 python::object new_e; 193 198 run_action<>()(*this, lambda::bind<void>(add_new_edge(), lambda::_1, 194 199 lambda::var(*this), src, tgt, 195 _edge_index, new_index,200 _edge_index, 196 201 lambda::var(new_e)))(); 197 _nedges++;198 _max_edge_index = max(_max_edge_index, new_index);199 202 return new_e; 200 203 } … … 226 229 if (!found) 227 230 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 234 void 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 } 230 256 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 } 233 262 _nedges--; 263 remove_edge(e, _mg); 234 264 } 235 265
Note: See TracChangeset
for help on using the changeset viewer.


