This repository has been archived by the owner on Jun 1, 2021. It is now read-only.
-
Notifications
You must be signed in to change notification settings - Fork 1
/
Copy pathutil.jl
88 lines (78 loc) · 2.31 KB
/
util.jl
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
function Graphs.simple_adjlist{Tv,Ti}(S::SparseMatrixCSC{Tv,Ti})
issym(S) || ishermitian(S) || error("S must be symmetric or Hermitian")
n = size(S,1)
colpt = S.colptr
nedge = 0
alist = [@compat sizehint!(Ti[],colpt[j+1]-colpt[j]) for j in 1:n]
for j in 1:n
for k in colpt[j]:(colpt[j+1]-1)
i = S.rowval[k]
if i != j # omit self-edges
push!(alist[j],i)
i > j && (nedge += 1)
end
end
end
g = SimpleAdjacencyList(false,1:n,nedge,alist)
return g
end
function partToPerm(sizes,part)
offsets = cumsum(vcat(0,sizes))
p = zeros(part)
for j in 1:length(p)
pv = part[j]
p[offsets[pv+1] += 1] = j
end
p
end
function bisect(g)
n = length(g.vertices)
nedges = 0
alist = [sizehint!(Int[],length(g.adjlist[s])) for s in 1:n] ;
for s=1:n
for t in g.adjlist[s]
if t <= n
push!(alist[s],t)
t > s && (nedges += 1)
end
end
end
gPruned = SimpleAdjacencyList(false,1:n,nedges,alist)
sizes, part = vertexSep(gPruned)
p = partToPerm(sizes,part)
p_inv = invperm(p)
sizeL = Int(sizes[1])
sizeR = Int(sizes[2])
alistL = [sizehint!(Int[],length(g.adjlist[s])) for s in 1:n] ;
alistR = [sizehint!(Int[],length(g.adjlist[s])) for s in 1:n] ;
nedgesL = 0
nedgesR = 0
for s=1:n
if part[s] == 0
sMap = Int(p_inv[s])
for t in g.adjlist[s]
if t <= n
tMap = Int(p_inv[t])
push!(alistL[sMap],tMap)
else
push!(alistL[sMap],t)
end
nedgesL += 1
end
elseif part[s] == 1
sMap = Int(p_inv[s]-sizeL)
for t in g.adjlist[s]
if t <= n
tMap = Int(p_inv[t]-sizeL)
push!(alistR[sMap],tMap)
else
push!(alistR[sMap],t-sizeL)
end
nedgesR += 1
end
end
end
gL = SimpleAdjacencyList(true,1:Int(sizeL),nedgesL,alistL)
gR = SimpleAdjacencyList(true,1:Int(sizeR),nedgesR,alistR)
gL, gR, p, p_inv
end