1
1
import LightGraphs. LinAlg: adjacency_matrix
2
+ import LightGraphs: induced_subgraph
2
3
3
- adjacency_matrix (g:: StaticGraph{I,U} , T:: DataType ; dir = :out ) where I<: Integer where U<: Integer =
4
+ adjacency_matrix (g:: StaticGraph{I,U} , T:: DataType ; dir = :out! ) where I<: Integer where U<: Integer =
4
5
SparseMatrixCSC {T,I} (nv (g), nv (g), g. f_ind, g. f_vec, ones (T, ne (g)* 2 ))
5
6
6
7
function adjacency_matrix (g:: StaticDiGraph{I,U} , T:: DataType ; dir = :out ) where I<: Integer where U<: Integer
@@ -11,3 +12,52 @@ function adjacency_matrix(g::StaticDiGraph{I,U}, T::DataType; dir = :out) where
11
12
dir != :out && @warn (" direction `$dir ` not defined for adjacency matrices on StaticGraphs; defaulting to `out`" )
12
13
return z
13
14
end
15
+
16
+ # induced subgraphs preserve the eltypes of the vertices.
17
+ function induced_subgraph (g:: StaticDiGraph{I, U} , vlist:: AbstractVector{T} ) where T <: Integer where I <: Integer where U<: Integer
18
+ vlist_len = length (vlist)
19
+ f_vec = Vector {I} ()
20
+ b_vec = Vector {I} ()
21
+ f_ind = Vector {U} ([1 ])
22
+ b_ind = Vector {U} ([1 ])
23
+
24
+ let vset = I .(vlist) # needed because of julialang/julia/ issue #15276
25
+ sizehint! (f_ind, vlist_len+ 1 )
26
+ sizehint! (b_ind, vlist_len+ 1 )
27
+
28
+ vlist_len == length (vset) || throw (ArgumentError (" Vertices in subgraph list must be unique" ))
29
+ fpos = 1
30
+ bpos = 1
31
+ @inbounds for v in vlist
32
+ o = filter (x -> x in vset, outneighbors (g, v))
33
+ i = filter (x -> x in vset, inneighbors (g, v))
34
+
35
+ fpos += length (o)
36
+ bpos += length (i)
37
+
38
+ append! (f_vec, o)
39
+ append! (b_vec, i)
40
+ push! (f_ind, fpos)
41
+ push! (b_ind, bpos)
42
+ end
43
+ end
44
+ return StaticDiGraph (f_vec, f_ind, b_vec, b_ind), T .(vlist)
45
+ end
46
+
47
+ function induced_subgraph (g:: StaticGraph{I, U} , vlist:: AbstractVector{T} ) where T <: Integer where I <: Integer where U<: Integer
48
+ vlist_len = length (vlist)
49
+ f_vec = Vector {I} ()
50
+ f_ind = Vector {U} ([1 ])
51
+ let vset = I .(vlist) # needed because of julialang/julia/ issue #15276
52
+ sizehint! (f_ind, vlist_len + 1 )
53
+ vlist_len == length (vset) || throw (ArgumentError (" Vertices in subgraph list must be unique" ))
54
+ fpos = 1
55
+ for v in vlist
56
+ o = filter (x -> x in vset, outneighbors (g, v))
57
+ fpos += length (o)
58
+ append! (f_vec, o)
59
+ push! (f_ind, fpos)
60
+ end
61
+ end
62
+ return StaticGraph (f_vec, f_ind), T .(vlist)
63
+ end
0 commit comments