Private constructor for direct construction of
        a DirectedGraph from its consituents.

def _raw(cls, vertices, edges, heads, tails):
        """
        Private constructor for direct construction of
        a DirectedGraph from its consituents.

        """
        self = object.__new__(cls)
        self._vertices = vertices
        self._edges = edges
        self._heads = heads
        self._tails = tails

        # For future use, map each vertex to its outward and inward edges.
        # These could be computed on demand instead of precomputed.
        self._out_edges = collections.defaultdict(set)
        self._in_edges = collections.defaultdict(set)
        for edge in self._edges:
            self._out_edges[self._tails[edge]].add(edge)
            self._in_edges[self._heads[edge]].add(edge)
        return self