# Rewire() and degree distribution

Does `rewire(g, keeping_degseq)` preserve the degree sequence (degree of each node is preserved), or the degree distribution? My nodes have identities, and I would like a rewiring that preserves the degree distribution but permits degrees of individual nodes to change as the graph is re-wired.

When you use `rewire` with `keeping_degseq`, edges are only rewired, so nodes are guaranteed to keep the exact same degree. Hence, degrees of individual nodes will never change.

The alternative that you can use is `sample_degseq` which will sample a graph from a degree sequence. Here, the degree for each node will be exactly the degree that is provided. Perhaps this still does not satisfy your needs. If that is the case, you could first create a distribution of node degrees, and then sample degrees from this distribution, and then sample a graph from the sampled degrees. See some of the later examples provided in the documentation for sampling from a particular distribution, for example:

``````## Power-law degree distribution
## Note, that we correct the degree sequence if its sum is odd
degs <- sample(1:100, 100, replace=TRUE, prob=(1:100)^-2)
if (sum(degs) %% 2 != 0) { degs <- degs + 1 }
g <- sample_degseq(degs, method="vl")
all(degree(g) == degs)
``````

I don’t understand the question. Can you show a small example which illustrates what you mean by keeping the degree distribution but not the degree sequence?

Do you have some vertex attributes and you simply want to randomly permute the vertices and change which attribute is assigned to which?

I don’t understand the question. Can you show a small example which illustrates what you mean by keeping the degree distribution but not the degree sequence?

I think one way of asking my question is this.
Consider a graph `g`

``````d0=as.vector(degree(g))
g1=rewire(g, keeping_degseq)
d1=as.vector(degree(g1))
``````

Is it the case that `d1==d0` is `TRUE` everywhere? That is how I understand preserving the degree sequence.

But it could be that `d1` is a permutation of `d0`. (i.e. `d1==d0` is `FALSE` in at least some places but `sort(d1)==sort(d0)` is `TRUE` everywhere). That would preserve the degree distribution but not the degree sequence (at least in the jargon I use).

Do you have some vertex attributes and you simply want to randomly permute the vertices and change which attribute is assigned to which?

I think just permuting the node attributes doesn’t do it, because that preserves the network architecture. For example it retains degree assortativity, average path length… and (all) other aggregate structural properties of the network.

Ahh, perhaps the solution is rewiring preserving degree sequence and then permuting node attributes. That might do it.

I do have another question about re-wiring.
Is it possible to re-wire part of the graph (eg a pre-specified subset of nodes, limiting the re-wiring to the edges within that subset).
Essentially I have a graph of many components and I want to re-wire within each component without changing which nodes are in which component.
I know I could create a subgraph; remove those nodes from the graph; re-wire the subgraph; add the re-wired subgraph back to the larger graph. And do that for each component. But is there a direct way to do it?
I could also write a function to implement the re-wiring algorithm on a subset of nodes, but it might be slow to execute (this is in R).

Thanks (I see I answered you and Szabolcs in the wrong order).