Skip to content

Instantly share code, notes, and snippets.

@dungdt88
Last active August 29, 2015 14:10
Show Gist options
  • Save dungdt88/bcade6070dd7133a815c to your computer and use it in GitHub Desktop.
Save dungdt88/bcade6070dd7133a815c to your computer and use it in GitHub Desktop.
Graph generation with fixed degree
insufficient[degs_, edgelist_, donelist_] := Catch[Module[
{j, k, n = Length[degs], diff},
For[j = 1; j <= n, j++,
If[degs[[j]] == 0, Continue[]];
diff = degs[[j]] - Length[Union[donelist, edgelist[[j]]]];
If[diff <= 0, Throw[True]];
];
False
]]
decode[val_, degs_] :=
Module[{j = 0, k = 0}, While[val > k && j < Length[degs], j++;
k += degs[[j]];];
j]
decode[val_, degs_, skip_] :=
Module[{j = 0, k = 0}, While[val > k && j < Length[degs], j++;
If[! MemberQ[skip, j], k += degs[[j]]];];
j]
randomDegreeGraph[degrees : {_Integer ..}, tries_: Infinity] :=
Catch[Module[
{edgelist, degs, n = Length[degrees], nedges, npairs, j, v1, v2,
subtot, try = 0, donelist = {}, prob},
If[(tries =!= Infinity && (! IntegerQ[tries] || tries < 0)),
Throw[$Failed]];
If[! EvenQ[Total[degrees]], Throw[$Failed]];
While[try < tries, try++;
npairs = n*(n - 1)/2;
nedges = Total[degrees]/2;
edgelist = Table[{j}, {j, n}];
degs = degrees;
While[npairs >= nedges > 0,
j = RandomInteger[{1, 2*nedges}];
v1 = decode[j, degs];
subtot = 2*nedges - Total[degs[[edgelist[[v1]]]]];
If[subtot <= 0, Break[]];
j = RandomInteger[{1, subtot}];
v2 = decode[j, degs, edgelist[[v1]]];
nedges--;
npairs--;
edgelist[[v1]] = Append[edgelist[[v1]], v2];
edgelist[[v2]] = Append[edgelist[[v2]], v1];
degs[[v1]] = degs[[v1]] - 1;
degs[[v2]] = degs[[v2]] - 1;
If[(degs[[v1]] == 0 || degs[[v2]] == 0) &&
insufficient[degs, edgelist, donelist], Break[]];
If[degs[[v1]] == 0, donelist = Append[donelist, v1];
npairs = npairs - (n - Length[Union[donelist, edgelist[[v1]]]])];
If[degs[[v2]] == 0, donelist = Append[donelist, v2];
npairs =
npairs - (n - Length[Union[donelist, edgelist[[v2]]]])];];
If[nedges == 0, Throw[Map[Sort, edgelist[[All, 2 ;; -1]]]]];];
Throw[$Failed["too many iterations"]];]]
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment