FAQ#
How do I retrieve a vertex by its property map value?#
There are two ways to achieve this. The first is using the
find_vertex()
function that searches for all
vertices with a given property map value. However, this function has a
\(O(N)\) complexity, where \(N\) is the number of nodes. This
means that it can be inefficient if the search is performed frequently.
The second approach is to perform this lookup quickly, in \(O(1)\) time, but it requires the user to keep her own dictionary that maps vertices to property values, e.g.:
>>> from collections import defaultdict
>>> g = gt.Graph()
>>> g.gp.vmap = g.new_gp("object", val=defaultdict(list))
>>> def add_vertex(g, prop, value):
... v = g.add_vertex()
... prop[v] = value
... g.gp.vmap[value].append(v)
... return g
>>> name = g.new_vp("string")
>>> add_vertex(g, name, "bob")
<...>
>>> add_vertex(g, name, "eve")
<...>
>>> add_vertex(g, name, "steve")
<...>
>>> g.gp.vmap["eve"]
[<Vertex object with index '1' at 0x...>]
Why not include this functionality automatically?
Property map values are not guaranteed to be unique, therefore there’s no inherent bijection between property map values and their corresponding vertices.
Note that, in the example above, the user still needs to manually
modify g.gp.vmap
whenever a value of the property map name
has changed. To enforce this kind of bookkeeping throughout the
library would incur a prohibitive performance cost — not to mention
a significant increase in complexity.
Is it possible to perform modularity maximization with graph-tool
?#
It is in fact possible to perform modularity maximization with
graph-tool
. For that you need to use the
ModularityState
object instead
of graph_tool.inference.BlockState
, as documented in
the section Inferring modular network structure, e.g.
>>> g = gt.collection.data["football"]
>>> state = gt.minimize_blockmodel_dl(g, state=gt.ModularityState)
Danger
Using modularity maximization is almost always a terrible idea.
Modularity maximization is a substantially inferior method to the
inference-based ones that are implemented in graph-tool
, since it
does not possess any kind of statistical regularization. Among many
other problems, the method tends to massively overfit empirical data.
For a more detailed explanation see “Modularity maximization considered harmful”, as well as [peixoto-descriptive-2023].
Do not use this approach in the analysis of networks without
understanding the consequences. This algorithm is included only for
comparison purposes. In general, the inference-based approaches based
on BlockState
,
NestedBlockState
, and
PPBlockState
should be universally
preferred.
How do I cite graph-tool?#
You can cite graph-tool in your publications as follows:
Tiago P. Peixoto, “The graph-tool python library”, figshare. (2014) DOI: 10.6084/m9.figshare.1164194 [sci-hub, @tor]
Here is a more convenient BibTeX entry:
@article{peixoto_graph-tool_2014,
title = {The graph-tool python library},
url = {http://figshare.com/articles/graph_tool/1164194},
doi = {10.6084/m9.figshare.1164194},
urldate = {2014-09-10},
journal = {figshare},
author = {Peixoto, Tiago P.},
year = {2014},
keywords = {all, complex networks, graph, network, other}}
More information can be found at the figshare site.