Esempio n. 1
0
    def discard_vertex(self, vid: base.VertexID) -> bool:
        """
        Remove the vertex associated with this ID from the graph. If such a vertex does not exist, do nothing. Any
        incident edges to the vertex are also removed. Return a Boolean indicating whether the vertex was present to
        be removed.
        """
        if vid not in self._forward:
            return False

        # Remove labels and data
        if vid in self._vertex_labels:
            del self._vertex_labels[vid]
        if vid in self._vertex_data:
            del self._vertex_data[vid]

        # Remove all incident edges.
        for sink in self._forward[vid]:
            self.discard_edge(base.DirectedEdgeID(vid, sink), ignore=vid)
        for source in self._backward[vid]:
            self.discard_edge(base.DirectedEdgeID(source, vid), ignore=vid)
        for other in self._dual[vid]:
            self.discard_edge(base.UndirectedEdgeID(vid, other), ignore=vid)

        # Remove the vertex itself
        del self._forward[vid]
        del self._backward[vid]
        del self._dual[vid]

        return True
Esempio n. 2
0
 def iter_outbound(self,
                   source: base.VertexID) -> Iterator[base.DirectedEdgeID]:
     """Return an iterator over the IDs of every outbound directed edge from this vertex."""
     try:
         for key in self._read_vertex(source)[SINKS_INDEX]:
             yield base.DirectedEdgeID(source, key)
     except KeyError:
         pass
Esempio n. 3
0
 def iter_inbound(self,
                  sink: base.VertexID) -> Iterator[base.DirectedEdgeID]:
     """Return an iterator over the IDs of every inbound directed edge to this vertex."""
     try:
         for key in self._read_vertex(sink)[SOURCES_INDEX]:
             yield base.DirectedEdgeID(key, sink)
     except KeyError:
         pass
Esempio n. 4
0
 def _decode_key(encoded_key: bytes, prefix: bytes) -> Any:
     """Decode a key from a byte string. This is the inverse of the _encode_key() method."""
     assert encoded_key.startswith(prefix)
     result = ast.literal_eval(encoded_key[len(prefix):].decode())
     if prefix == EID_PREFIX:
         (vid1, vid2), directed = result
         if directed:
             result = base.DirectedEdgeID(vid1, vid2)
         else:
             result = base.UndirectedEdgeID(vid1, vid2)
     return result
Esempio n. 5
0
    def discard_vertex(self, vid: base.VertexID) -> bool:
        """
        Remove the vertex associated with this ID from the graph. If such a vertex does not exist, do nothing. Any
        incident edges to the vertex are also removed. Return a Boolean indicating whether the vertex was present to
        be removed.
        """
        try:
            _, _, sources, sinks, undirected = self._read_vertex(vid)
        except KeyError:
            return False

        for source in sources:
            self.discard_edge(base.DirectedEdgeID(source, vid), ignore=vid)
        for sink in sinks:
            self.discard_edge(base.DirectedEdgeID(vid, sink), ignore=vid)
        for other in undirected:
            self.discard_edge(base.UndirectedEdgeID(vid, other), ignore=vid)

        self._del_vertex(vid)
        self._v_count = self.count_vertices() - 1
        self._v_count_dirty = True

        return True
Esempio n. 6
0
    def iter_edges(self) -> Iterator[base.EdgeID]:
        """Return an iterator over the IDs of every edge in the graph."""
        for source, sinks in self._forward.items():
            for sink in sinks:
                yield base.DirectedEdgeID(source, sink)

        # We have to guarantee that each edge is only yielded once, which is a bit more complicated when edges
        # are undirected. We do that by imposing an artificial order on the IDs (since IDs are not required to be
        # ordered). I know repr is slow, but it's better than building a set to avoid duplicates.
        for left, rights in self._dual.items():
            if left in rights:
                yield base.UndirectedEdgeID(left, left)
            left_repr = repr(left)
            for right in rights:
                if left != right and left_repr < repr(right):
                    yield base.UndirectedEdgeID(left, right)
Esempio n. 7
0
 def iter_outbound(self,
                   source: base.VertexID) -> Iterator[base.DirectedEdgeID]:
     """Return an iterator over the IDs of every outbound directed edge from this vertex."""
     for sink in self._backward.get(source, ()):
         yield base.DirectedEdgeID(source, sink)
Esempio n. 8
0
 def iter_inbound(self,
                  sink: base.VertexID) -> Iterator[base.DirectedEdgeID]:
     """Return an iterator over the IDs of every inbound directed edge to this vertex."""
     for source in self._backward.get(sink, ()):
         yield base.DirectedEdgeID(source, sink)