Commit 808318a6 authored by Tiago Peixoto's avatar Tiago Peixoto

Implement vertex reordering during graph copy

parent cbc77236
...@@ -59,7 +59,8 @@ class GraphInterface ...@@ -59,7 +59,8 @@ class GraphInterface
public: public:
GraphInterface(); GraphInterface();
GraphInterface(const GraphInterface& g, bool keep_ref, GraphInterface(const GraphInterface& g, bool keep_ref,
python::object ovprops, python::object oeprops); python::object ovprops, python::object oeprops,
python::object vorder);
~GraphInterface(); ~GraphInterface();
// useful enums // useful enums
......
...@@ -83,12 +83,13 @@ struct do_graph_copy ...@@ -83,12 +83,13 @@ struct do_graph_copy
{ {
template <class GraphTgt, class GraphSrc, class TgtVertexIndexMap, template <class GraphTgt, class GraphSrc, class TgtVertexIndexMap,
class SrcVertexIndexMap, class TgtEdgeIndexMap, class SrcVertexIndexMap, class TgtEdgeIndexMap,
class SrcEdgeIndexMap> class SrcEdgeIndexMap, class OrderMap>
void operator()(const GraphSrc& src, GraphTgt& tgt, void operator()(const GraphSrc& src, GraphTgt& tgt,
TgtVertexIndexMap src_vertex_index, TgtVertexIndexMap src_vertex_index,
SrcVertexIndexMap tgt_vertex_index, SrcVertexIndexMap tgt_vertex_index,
TgtEdgeIndexMap, TgtEdgeIndexMap,
SrcEdgeIndexMap tgt_edge_index, SrcEdgeIndexMap tgt_edge_index,
OrderMap vertex_order,
vector<pair<reference_wrapper<boost::any>,reference_wrapper<boost::any> > >& vprops, vector<pair<reference_wrapper<boost::any>,reference_wrapper<boost::any> > >& vprops,
vector<pair<reference_wrapper<boost::any>,reference_wrapper<boost::any> > >& eprops) const vector<pair<reference_wrapper<boost::any>,reference_wrapper<boost::any> > >& eprops) const
{ {
...@@ -98,7 +99,8 @@ struct do_graph_copy ...@@ -98,7 +99,8 @@ struct do_graph_copy
{ {
if (src_vertex_index[*v] >= index_map.size()) if (src_vertex_index[*v] >= index_map.size())
index_map.resize(src_vertex_index[*v]+1); index_map.resize(src_vertex_index[*v]+1);
typename graph_traits<GraphTgt>::vertex_descriptor new_v = typename graph_traits<GraphTgt>::vertex_descriptor new_v = get(vertex_order, *v);
while (new_v >= num_vertices(tgt))
add_vertex(tgt); add_vertex(tgt);
index_map[src_vertex_index[*v]] = tgt_vertex_index[new_v]; index_map[src_vertex_index[*v]] = tgt_vertex_index[new_v];
...@@ -126,7 +128,8 @@ struct do_graph_copy ...@@ -126,7 +128,8 @@ struct do_graph_copy
// copy constructor // copy constructor
GraphInterface::GraphInterface(const GraphInterface& gi, bool keep_ref, GraphInterface::GraphInterface(const GraphInterface& gi, bool keep_ref,
python::object ovprops, python::object oeprops) python::object ovprops, python::object oeprops,
python::object vorder)
:_mg(keep_ref ? gi._mg : shared_ptr<multigraph_t>(new multigraph_t())), :_mg(keep_ref ? gi._mg : shared_ptr<multigraph_t>(new multigraph_t())),
_vertex_index(get(vertex_index, *_mg)), _vertex_index(get(vertex_index, *_mg)),
_edge_index(get(edge_index_t(), *_mg)), _edge_index(get(edge_index_t(), *_mg)),
...@@ -159,7 +162,7 @@ GraphInterface::GraphInterface(const GraphInterface& gi, bool keep_ref, ...@@ -159,7 +162,7 @@ GraphInterface::GraphInterface(const GraphInterface& gi, bool keep_ref,
(const_cast<GraphInterface&>(gi), (const_cast<GraphInterface&>(gi),
bind<void>(do_graph_copy(), _1, ref(*_mg), bind<void>(do_graph_copy(), _1, ref(*_mg),
gi._vertex_index, _vertex_index, gi._vertex_index, _vertex_index,
gi._edge_index, _edge_index, ref(vprops), gi._edge_index, _edge_index, _2, ref(vprops),
ref(eprops)))(); ref(eprops)), vertex_scalar_properties())(avorder);
// filters will be copied in python // filters will be copied in python
} }
...@@ -1020,6 +1020,10 @@ class Graph(object): ...@@ -1020,6 +1020,10 @@ class Graph(object):
``prune``, to specify a different behavior to vertex, edge, and reversal ``prune``, to specify a different behavior to vertex, edge, and reversal
filters, respectively. filters, respectively.
If ``vorder`` is specified, it should correspond to a vertex
:class:`~graph_tool.PropertyMap` specifying the ordering of the vertices in
the copied graph.
The graph is implemented as an `adjacency list`_, where both vertex and edge The graph is implemented as an `adjacency list`_, where both vertex and edge
lists are C++ STL vectors. lists are C++ STL vectors.
...@@ -1027,7 +1031,7 @@ class Graph(object): ...@@ -1027,7 +1031,7 @@ class Graph(object):
""" """
def __init__(self, g=None, directed=True, prune=False): def __init__(self, g=None, directed=True, prune=False, vorder=None):
self.__properties = {} self.__properties = {}
self.__known_properties = {} self.__known_properties = {}
self.__filter_state = {"reversed": False, self.__filter_state = {"reversed": False,
...@@ -1055,6 +1059,11 @@ class Graph(object): ...@@ -1055,6 +1059,11 @@ class Graph(object):
for k, v in g.edge_properties.items(): for k, v in g.edge_properties.items():
eprops.append([_prop("e", g, v), libcore.any()]) eprops.append([_prop("e", g, v), libcore.any()])
# The vertex ordering
if vorder is None:
vorder = g.new_vertex_property("int")
vorder.fa = numpy.arange(g.num_vertices())
# The actual copying of the graph and property maps # The actual copying of the graph and property maps
self.__graph = libcore.GraphInterface(g.__graph, False, vprops, eprops) self.__graph = libcore.GraphInterface(g.__graph, False, vprops, eprops)
......
Markdown is supported
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment