@@ -48,7 +48,9 @@ function rand_graph(n::Integer, m::Integer; seed=-1, kws...)
48
48
return rand_graph (rng, n, m; kws... )
49
49
end
50
50
51
- function rand_graph (rng:: AbstractRNG , n:: Integer , m:: Integer ; bidirected = true , edge_weight = nothing , kws... )
51
+ function rand_graph (rng:: AbstractRNG , n:: Integer , m:: Integer ;
52
+ bidirected:: Bool = true ,
53
+ edge_weight:: Union{AbstractVector, Nothing} = nothing , kws... )
52
54
if bidirected
53
55
@assert iseven (m) lazy " Need even number of edges for bidirected graphs, given m=$m."
54
56
s, t, _ = _rand_edges (rng, n, m ÷ 2 ; directed= false , self_loops= false )
@@ -63,13 +65,13 @@ function rand_graph(rng::AbstractRNG, n::Integer, m::Integer; bidirected = true,
63
65
end
64
66
65
67
"""
66
- rand_heterograph(n, m; seed=-1, bidirected=false, kws...)
68
+ rand_heterograph([rng,] n, m; bidirected=false, kws...)
67
69
68
- Construct an [`GNNHeteroGraph`](@ref) with number of nodes and edges
70
+ Construct an [`GNNHeteroGraph`](@ref) with random edges and with number of nodes and edges
69
71
specified by `n` and `m` respectively. `n` and `m` can be any iterable of pairs
70
72
specifing node/edge types and their numbers.
71
73
72
- Use a `seed > 0` for reproducibility .
74
+ Pass a random number generator as a first argument to make the generation reproducible .
73
75
74
76
Setting `bidirected=true` will generate a bidirected graph, i.e. each edge will have a reverse edge.
75
77
Therefore, for each edge type `(:A, :rel, :B)` a corresponding reverse edge type `(:B, :rel, :A)`
@@ -92,16 +94,25 @@ function rand_heterograph end
92
94
# for generic iterators of pairs
93
95
rand_heterograph (n, m; kws... ) = rand_heterograph (Dict (n), Dict (m); kws... )
94
96
95
- function rand_heterograph (n:: NDict , m:: EDict ; bidirected = false , seed = - 1 , kws... )
96
- rng = seed > 0 ? MersenneTwister (seed) : Random. GLOBAL_RNG
97
+ function rand_heterograph (n:: NDict , m:: EDict ; seed= - 1 , kws... )
98
+ if seed != - 1
99
+ Base. depwarn (" Keyword argument `seed` is deprecated, pass an rng as first argument instead." , :rand_heterograph )
100
+ rng = MersenneTwister (seed)
101
+ else
102
+ rng = Random. default_rng ()
103
+ end
104
+ return rand_heterograph (rng, n, m; kws... )
105
+ end
106
+
107
+ function rand_heterograph (rng:: AbstractRNG , n:: NDict , m:: EDict ; bidirected:: Bool = false , kws... )
97
108
if bidirected
98
109
return _rand_bidirected_heterograph (rng, n, m; kws... )
99
110
end
100
111
graphs = Dict (k => _rand_edges (rng, (n[k[1 ]], n[k[3 ]]), m[k]) for k in keys (m))
101
112
return GNNHeteroGraph (graphs; num_nodes = n, kws... )
102
113
end
103
114
104
- function _rand_bidirected_heterograph (rng, n:: NDict , m:: EDict ; kws... )
115
+ function _rand_bidirected_heterograph (rng:: AbstractRNG , n:: NDict , m:: EDict ; kws... )
105
116
for k in keys (m)
106
117
if reverse (k) ∈ keys (m)
107
118
@assert m[k] == m[reverse (k)] " Number of edges must be the same in reverse edge types for bidirected graphs."
@@ -121,35 +132,58 @@ end
121
132
122
133
123
134
"""
124
- rand_bipartite_heterograph(n1, n2, m; [bidirected, seed, node_t, edge_t, kws...])
125
- rand_bipartite_heterograph((n1, n2), m; ...)
126
- rand_bipartite_heterograph((n1, n2), (m1, m2); ...)
135
+ rand_bipartite_heterograph([rng,]
136
+ (n1, n2), (m12, m21);
137
+ bidirected = true,
138
+ node_t = (:A, :B),
139
+ edge_t = :to,
140
+ kws...)
127
141
128
- Construct an [`GNNHeteroGraph`](@ref) with number of nodes and edges
129
- specified by `n1`, `n2` and `m1` and `m2` respectively .
142
+ Construct an [`GNNHeteroGraph`](@ref) with random edges representing a bipartite graph.
143
+ The graph will have two types of nodes, and edges will only connect nodes of different types .
130
144
131
- See [`rand_heterograph`](@ref) for a more general version.
145
+ The first argument is a tuple `(n1, n2)` specifying the number of nodes of each type.
146
+ The second argument is a tuple `(m12, m21)` specifying the number of edges connecting nodes of type `1` to nodes of type `2`
147
+ and vice versa.
132
148
133
- # Keyword arguments
149
+ The type of nodes and edges can be specified with the `node_t` and `edge_t` keyword arguments,
150
+ which default to `(:A, :B)` and `:to` respectively.
134
151
135
- - `bidirected`: whether to generate a bidirected graph. Default is `true`.
136
- - `seed`: random seed. Default is `-1` (no seed).
137
- - `node_t`: node types. If `bipartite=true`, this should be a tuple of two node types, otherwise it should be a single node type.
138
- - `edge_t`: edge types. If `bipartite=true`, this should be a tuple of two edge types, otherwise it should be a single edge type.
139
- """
140
- function rand_bipartite_heterograph end
152
+ If `bidirected=true` (default), the reverse edge of each edge will be present. In this case
153
+ `m12 == m21` is required.
141
154
142
- rand_bipartite_heterograph (n1 :: Int , n2 :: Int , m :: Int ; kws ... ) = rand_bipartite_heterograph ((n1, n2), (m, m); kws ... )
155
+ A random number generator can be passed as the first argument to make the generation reproducible.
143
156
144
- rand_bipartite_heterograph ((n1, n2) :: NTuple{2,Int} , m :: Int ; kws ... ) = rand_bipartite_heterograph ((n1, n2), (m, m); kws ... )
157
+ Additional keyword arguments will be passed to the [`GNNHeteroGraph`](@ref) constructor.
145
158
146
- function rand_bipartite_heterograph ((n1, n2):: NTuple{2,Int} , (m1, m2):: NTuple{2,Int} ; bidirected= true ,
147
- node_t = (:A , :B ), edge_t = :to , kws... )
148
- if edge_t isa Symbol
149
- edge_t = (edge_t, edge_t)
159
+ See [`rand_heterograph`](@ref) for a more general version.
160
+
161
+ # Examples
162
+
163
+ ```julia-repl
164
+ julia> g = rand_bipartite_heterograph((10, 15), 20)
165
+ GNNHeteroGraph:
166
+ num_nodes: (:A => 10, :B => 15)
167
+ num_edges: ((:A, :to, :B) => 20, (:B, :to, :A) => 20)
168
+
169
+ julia> g = rand_bipartite_heterograph((10, 15), (20, 0), node_t=(:user, :item), edge_t=:-, bidirected=false)
170
+ GNNHeteroGraph:
171
+ num_nodes: Dict(:item => 15, :user => 10)
172
+ num_edges: Dict((:item, :-, :user) => 0, (:user, :-, :item) => 20)
173
+ ```
174
+ """
175
+ rand_bipartite_heterograph (n, m; kws... ) = rand_bipartite_heterograph (Random. default_rng (), n, m; kws... )
176
+
177
+ function rand_bipartite_heterograph (rng:: AbstractRNG , (n1, n2):: NTuple{2,Int} , m; bidirected= true ,
178
+ node_t = (:A , :B ), edge_t:: Symbol = :to , kws... )
179
+ if m isa Integer
180
+ m12 = m21 = m
181
+ else
182
+ m12, m21 = m
150
183
end
151
- return rand_heterograph (Dict (node_t[1 ] => n1, node_t[2 ] => n2),
152
- Dict ((node_t[1 ], edge_t[1 ], node_t[2 ]) => m1, (node_t[2 ], edge_t[2 ], node_t[1 ]) => m2);
184
+
185
+ return rand_heterograph (rng, Dict (node_t[1 ] => n1, node_t[2 ] => n2),
186
+ Dict ((node_t[1 ], edge_t, node_t[2 ]) => m12, (node_t[2 ], edge_t, node_t[1 ]) => m21);
153
187
bidirected, kws... )
154
188
end
155
189
0 commit comments