How to instantiate and extend Python igraph Vertex class

Question:

I’d like to extend the igraph Vertex class with some extra variables methods I need for a simulation study. However, when I try to import and extend the vertex class, I get an error.

from igraph import Vertex

v = Vertex()

TypeError: cannot create ‘igraph.Vertex’ instances

Likewise, the same error occurs when I try to extend the class.

from igraph import Vertex

class MyVertex(Vertex):

    def __init__(self):
        super().__init__()

my_vertex = MyVertex()

TypeError: cannot create ‘MyVertex’ instances

How can I instantiate igraph vertices and extend the igraph Vertex class?

Asked By: Ian Cero

||

Answers:

Vertex instances are not meant to be instantiated; this is intentional. A Vertex is simply a wrapper around a reference to a graph and a vertex index, and it provides a few convenience methods that are usually just proxies to the same method on the associated graph instance. Even if you created your own Vertex subclass, there is currently no way to tell an igraph Graph object to start returning your Vertex subclass for expressions like graph.vs[x] instead of Vertex itself.

If you want to create your own vertex-like classes, you can try composition instead of inheritance, i.e. you create a MyVertex class that takes a Vertex as its constructor argument, stores the vertex and then forwards method calls to it, depending on what you need to support in your own MyVertex instance:

class MyVertex:
    def __init__(self, v):
        self._v = v

    def degree(self, *args, **kwds):
        return self._v.degree(*args, **kwds)
    
    ...

Note that since Vertex instances are simply wrappers for a graph and a vertex ID, things can get confusing if you remove vertices from a graph because the remaining vertices are re-indexed by the underlying C library to ensure that their IDs are always in the range [0; n-1] for n vertices.

Answered By: Tamás