def edge(self, edge_to_find, key=0): """returns edge in this graph with same src and dst""" # TODO: check if this even needed - will be if searching nidb specifically # but that's so rare (that's a design stage if anywhere) src_id = edge_to_find.src dst_id = edge_to_find.dst if self.is_multigraph(): for (src, dst, rkey) in self._graph.edges(src_id, keys=True): if dst == dst_id and rkey == search_key: return DmEdge(self._anm, src, dst, search_key) for (src, dst) in self._graph.edges(src_id): if dst == dst_id: return DmEdge(self._anm, src, dst)
def edges(self, nbunch=None, *args, **kwargs): # nbunch may be single node # TODO: Apply edge filters if nbunch: try: nbunch = nbunch.node_id except AttributeError: # only store the id in overlay nbunch = (n.node_id for n in nbunch) def filter_func(edge): return ( all(getattr(edge, key) for key in args) and all(getattr(edge, key) == val for key, val in kwargs.items()) ) # TODO: See if more efficient way to access underlying data structure # rather than create overlay to throw away if self.is_multigraph(): valid_edges = list((src, dst, key) for (src, dst, key) in self._graph.edges(nbunch, keys=True)) else: default_key = 0 valid_edges = list((src, dst, default_key) for (src, dst) in self._graph.edges(nbunch)) all_edges = [DmEdge(self, src, dst, key) for src, dst, key in valid_edges] return (edge for edge in all_edges if filter_func(edge))
def boundary_edges(self, nbunch, nbunch2=None): nbunch = (n.node_id for n in nbunch) # only store the id in overlay return iter( DmEdge(self, src, dst) for (src, dst) in nx.edge_boundary(self._graph, nbunch, nbunch2))