Hello,

I'm using igraph in R, and I'm trying to randomize the edges of directed
graphs while preserving in- and out-degree distributions.  Since my graphs
are directed, I don't use degree.sequence.game().  Instead, I've been using
rewire().  This function correctly preserves the degree distribution,
however as far as I can tell it completely ignores self loop edges during
the rewiring process.  That is to say, every single self loop in my
original network is also preserved in all my rewired networks.  I did not
expect this based on the documentation:

"simple rewiring algorithm which chooses two arbitrary edges in each step
(namely (a,b) and (c,d)) and substitutes them with (a,d) and (c,b) if they
don't yet exist"

While true that self loops aren't explicitly mentioned, the most general
form of the algorithm allows a==b and c==d.  Thus, this algorithm should
allow for the generation and destruction of self-loops.  For example, a->a
and b->b can be replaced with a->b and b->a if they don't yet exist.  The
reverse should also be a valid swap.  I tested this on the following
networks, just to be sure:

a <- graph(c(0,0,1,1,2,2,3,3)) # 4 nodes, only self loops
b <- graph(c(0,1,1,0,2,3,3,2,0,2,2,0,0,3,3,0,1,2,2,1,1,3,3,1)) # 4 node
complete graph, no self loops

Rewiring using rewire() does nothing to the above graphs.  For a, self
loops are never destroyed, and for b, they are never created.  If I am
missing something, please let me know.  Otherwise, is there a way to rewire
directed graphs that both preserves degree distribution and allows for the
generation and destruction of self-loops?  (Ideally it would be the same
function, with an option to allow self-loops.)

Thanks!
Dov
_______________________________________________
igraph-help mailing list
[email protected]
https://lists.nongnu.org/mailman/listinfo/igraph-help

Reply via email to