Skip to content

Commit e1910ca

Browse files
authored
Add GNNLux temporal convolutional layers docstrings and docs (#516)
* Add TGCN docs * Add A3TGCN docs * Add GConvGRU docs * Add GConvLASTM docs * Add DCGRU docs * Add EvolveGNCO docs * Change title * Add temporal conv
1 parent b063263 commit e1910ca

File tree

4 files changed

+264
-3
lines changed

4 files changed

+264
-3
lines changed

GNNLux/docs/make.jl

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -23,7 +23,8 @@ makedocs(;
2323
pages = ["Home" => "index.md",
2424
"API Reference" => [
2525
"Basic" => "api/basic.md",
26-
"Convolutional layers" => "api/conv.md"]]
26+
"Convolutional layers" => "api/conv.md",
27+
"Temporal Convolutional layers" => "api/temporalconv.md",]]
2728
)
2829

2930

GNNLux/docs/src/api/basic.md

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,8 @@
22
CurrentModule = GNNLux
33
```
44

5-
## GNNLayer
5+
## Basic Layers
6+
67
```@docs
78
GNNLayer
89
GNNChain

GNNLux/docs/src/api/temporalconv.md

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,15 @@
1+
```@meta
2+
CurrentModule = GNNLux
3+
```
4+
5+
# Temporal Graph-Convolutional Layers
6+
7+
Convolutions for time-varying graphs (temporal graphs) such as the [`TemporalSnapshotsGNNGraph`](@ref).
8+
9+
## Docs
10+
11+
```@autodocs
12+
Modules = [GNNLux]
13+
Pages = ["layers/temporalconv.jl"]
14+
Private = false
15+
```

GNNLux/src/layers/temporalconv.jl

Lines changed: 245 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -56,8 +56,96 @@ function Base.show(io::IO, tgcn::TGCNCell)
5656
print(io, "TGCNCell($(tgcn.in_dims) => $(tgcn.out_dims))")
5757
end
5858

59+
"""
60+
TGCN(in => out; use_bias = true, init_weight = glorot_uniform, init_state = zeros32, init_bias = zeros32, add_self_loops = false, use_edge_weight = true)
61+
62+
Temporal Graph Convolutional Network (T-GCN) recurrent layer from the paper [T-GCN: A Temporal Graph Convolutional Network for Traffic Prediction](https://arxiv.org/pdf/1811.05320.pdf).
63+
64+
Performs a layer of GCNConv to model spatial dependencies, followed by a Gated Recurrent Unit (GRU) cell to model temporal dependencies.
65+
66+
# Arguments
67+
68+
- `in`: Number of input features.
69+
- `out`: Number of output features.
70+
- `use_bias`: Add learnable bias. Default `true`.
71+
- `init_weight`: Weights' initializer. Default `glorot_uniform`.
72+
- `init_state`: Initial state of the hidden stat of the GRU layer. Default `zeros32`.
73+
- `init_bias`: Bias initializer. Default `zeros32`.
74+
- `add_self_loops`: Add self loops to the graph before performing the convolution. Default `false`.
75+
- `use_edge_weight`: If `true`, consider the edge weights in the input graph (if available).
76+
If `add_self_loops=true` the new weights will be set to 1.
77+
This option is ignored if the `edge_weight` is explicitly provided in the forward pass.
78+
Default `false`.
79+
80+
81+
82+
# Examples
83+
84+
```julia
85+
using GNNLux, Lux, Random
86+
87+
# initialize random number generator
88+
rng = Random.default_rng()
89+
90+
# create data
91+
g = rand_graph(rng, 5, 10)
92+
x = rand(rng, Float32, 2, 5)
93+
94+
# create TGCN layer
95+
tgcn = TGCN(2 => 6)
96+
97+
# setup layer
98+
ps, st = LuxCore.setup(rng, tgcn)
99+
100+
# forward pass
101+
y, st = tgcn(g, x, ps, st) # result size (6, 5)
102+
```
103+
"""
59104
TGCN(ch::Pair{Int, Int}; kwargs...) = GNNLux.StatefulRecurrentCell(TGCNCell(ch; kwargs...))
60105

106+
"""
107+
A3TGCN(in => out; use_bias = true, init_weight = glorot_uniform, init_state = zeros32, init_bias = zeros32, add_self_loops = false, use_edge_weight = true)
108+
109+
Attention Temporal Graph Convolutional Network (A3T-GCN) model from the paper [A3T-GCN: Attention Temporal Graph
110+
Convolutional Network for Traffic Forecasting](https://arxiv.org/pdf/2006.11583.pdf).
111+
112+
Performs a TGCN layer, followed by a soft attention layer.
113+
114+
# Arguments
115+
116+
- `in`: Number of input features.
117+
- `out`: Number of output features.
118+
- `use_bias`: Add learnable bias. Default `true`.
119+
- `init_weight`: Weights' initializer. Default `glorot_uniform`.
120+
- `init_state`: Initial state of the hidden stat of the GRU layer. Default `zeros32`.
121+
- `init_bias`: Bias initializer. Default `zeros32`.
122+
- `add_self_loops`: Add self loops to the graph before performing the convolution. Default `false`.
123+
- `use_edge_weight`: If `true`, consider the edge weights in the input graph (if available).
124+
If `add_self_loops=true` the new weights will be set to 1.
125+
This option is ignored if the `edge_weight` is explicitly provided in the forward pass.
126+
Default `false`.
127+
# Examples
128+
129+
```julia
130+
using GNNLux, Lux, Random
131+
132+
# initialize random number generator
133+
rng = Random.default_rng()
134+
135+
# create data
136+
g = rand_graph(rng, 5, 10)
137+
x = rand(rng, Float32, 2, 5)
138+
139+
# create A3TGCN layer
140+
l = A3TGCN(2 => 6)
141+
142+
# setup layer
143+
ps, st = LuxCore.setup(rng, l)
144+
145+
# forward pass
146+
y, st = l(g, x, ps, st) # result size (6, 5)
147+
```
148+
"""
61149
@concrete struct A3TGCN <: GNNContainerLayer{(:tgcn, :dense1, :dense2)}
62150
in_dims::Int
63151
out_dims::Int
@@ -94,7 +182,7 @@ function Base.show(io::IO, l::A3TGCN)
94182
print(io, "A3TGCN($(l.in_dims) => $(l.out_dims))")
95183
end
96184

97-
@concrete struct GConvGRUCell <: GNNContainerLayer{(:conv_x_r, :conv_h_r, :conv_x_z, :conv_h_z, :conv_x_h, :conv_h_h)}
185+
@concrete struct GConvGRUCell <: GNNContainerLayer{(:conv_x_r, :conv_h_r, :conv_x_z, :conv_h_z, :conv_x_h, :conv_h_h)}
98186
in_dims::Int
99187
out_dims::Int
100188
k::Int
@@ -147,6 +235,45 @@ end
147235

148236
LuxCore.outputsize(l::GConvGRUCell) = (l.out_dims,)
149237

238+
"""
239+
GConvGRU(in => out, k; use_bias = true, init_weight = glorot_uniform, init_state = zeros32, init_bias = zeros32)
240+
241+
Graph Convolutional Gated Recurrent Unit (GConvGRU) recurrent layer from the paper [Structured Sequence Modeling with Graph Convolutional Recurrent Networks](https://arxiv.org/pdf/1612.07659).
242+
243+
Performs a layer of ChebConv to model spatial dependencies, followed by a Gated Recurrent Unit (GRU) cell to model temporal dependencies.
244+
245+
# Arguments
246+
247+
- `in`: Number of input features.
248+
- `out`: Number of output features.
249+
- `k`: Chebyshev polynomial order.
250+
- `use_bias`: Add learnable bias. Default `true`.
251+
- `init_weight`: Weights' initializer. Default `glorot_uniform`.
252+
- `init_state`: Initial state of the hidden stat of the GRU layer. Default `zeros32`.
253+
- `init_bias`: Bias initializer. Default `zeros32`.
254+
255+
# Examples
256+
257+
```julia
258+
using GNNLux, Lux, Random
259+
260+
# initialize random number generator
261+
rng = Random.default_rng()
262+
263+
# create data
264+
g = rand_graph(rng, 5, 10)
265+
x = rand(rng, Float32, 2, 5)
266+
267+
# create layer
268+
l = GConvGRU(2 => 5, 2)
269+
270+
# setup layer
271+
ps, st = LuxCore.setup(rng, l)
272+
273+
# forward pass
274+
y, st = l(g, x, ps, st) # result size (5, 5)
275+
```
276+
"""
150277
GConvGRU(ch::Pair{Int, Int}, k::Int; kwargs...) = GNNLux.StatefulRecurrentCell(GConvGRUCell(ch, k; kwargs...))
151278

152279
@concrete struct GConvLSTMCell <: GNNContainerLayer{(:conv_x_i, :conv_h_i, :dense_i, :conv_x_f, :conv_h_f, :dense_f, :conv_x_c, :conv_h_c, :dense_c, :conv_x_o, :conv_h_o, :dense_o)}
@@ -230,6 +357,45 @@ end
230357

231358
LuxCore.outputsize(l::GConvLSTMCell) = (l.out_dims,)
232359

360+
"""
361+
GConvLSTM(in => out, k; use_bias = true, init_weight = glorot_uniform, init_state = zeros32, init_bias = zeros32)
362+
363+
Graph Convolutional Long Short-Term Memory (GConvLSTM) recurrent layer from the paper [Structured Sequence Modeling with Graph Convolutional Recurrent Networks](https://arxiv.org/pdf/1612.07659).
364+
365+
Performs a layer of ChebConv to model spatial dependencies, followed by a Long Short-Term Memory (LSTM) cell to model temporal dependencies.
366+
367+
# Arguments
368+
369+
- `in`: Number of input features.
370+
- `out`: Number of output features.
371+
- `k`: Chebyshev polynomial order.
372+
- `use_bias`: Add learnable bias. Default `true`.
373+
- `init_weight`: Weights' initializer. Default `glorot_uniform`.
374+
- `init_state`: Initial state of the hidden stat of the GRU layer. Default `zeros32`.
375+
- `init_bias`: Bias initializer. Default `zeros32`.
376+
377+
# Examples
378+
379+
```julia
380+
using GNNLux, Lux, Random
381+
382+
# initialize random number generator
383+
rng = Random.default_rng()
384+
385+
# create data
386+
g = rand_graph(rng, 5, 10)
387+
x = rand(rng, Float32, 2, 5)
388+
389+
# create GConvLSTM layer
390+
l = GConvLSTM(2 => 5, 2)
391+
392+
# setup layer
393+
ps, st = LuxCore.setup(rng, l)
394+
395+
# forward pass
396+
y, st = l(g, x, ps, st) # result size (5, 5)
397+
```
398+
"""
233399
GConvLSTM(ch::Pair{Int, Int}, k::Int; kwargs...) = GNNLux.StatefulRecurrentCell(GConvLSTMCell(ch, k; kwargs...))
234400

235401
@concrete struct DCGRUCell <: GNNContainerLayer{(:dconv_u, :dconv_r, :dconv_c)}
@@ -272,8 +438,86 @@ end
272438

273439
LuxCore.outputsize(l::DCGRUCell) = (l.out_dims,)
274440

441+
"""
442+
DCGRU(in => out, k; use_bias = true, init_weight = glorot_uniform, init_state = zeros32, init_bias = zeros32)
443+
444+
Diffusion Convolutional Recurrent Neural Network (DCGRU) layer from the paper [Diffusion Convolutional Recurrent Neural
445+
Network: Data-driven Traffic Forecasting](https://arxiv.org/pdf/1707.01926).
446+
447+
Performs a Diffusion Convolutional layer to model spatial dependencies, followed by a Gated Recurrent Unit (GRU) cell to model temporal dependencies.
448+
449+
# Arguments
450+
451+
- `in`: Number of input features.
452+
- `out`: Number of output features.
453+
- `k`: Diffusion step.
454+
- `use_bias`: Add learnable bias. Default `true`.
455+
- `init_weight`: Weights' initializer. Default `glorot_uniform`.
456+
- `init_state`: Initial state of the hidden stat of the GRU layer. Default `zeros32`.
457+
- `init_bias`: Bias initializer. Default `zeros32`.
458+
459+
# Examples
460+
461+
```julia
462+
using GNNLux, Lux, Random
463+
464+
# initialize random number generator
465+
rng = Random.default_rng()
466+
467+
# create data
468+
g = rand_graph(rng, 5, 10)
469+
x = rand(rng, Float32, 2, 5)
470+
471+
# create layer
472+
l = DCGRU(2 => 5, 2)
473+
474+
# setup layer
475+
ps, st = LuxCore.setup(rng, l)
476+
477+
# forward pass
478+
y, st = l(g, x, ps, st) # result size (5, 5)
479+
```
480+
"""
275481
DCGRU(ch::Pair{Int, Int}, k::Int; kwargs...) = GNNLux.StatefulRecurrentCell(DCGRUCell(ch, k; kwargs...))
276482

483+
"""
484+
EvolveGCNO(ch; use_bias = true, init_weight = glorot_uniform, init_state = zeros32, init_bias = zeros32)
485+
486+
Evolving Graph Convolutional Network (EvolveGCNO) layer from the paper [EvolveGCN: Evolving Graph Convolutional Networks for Dynamic Graphs](https://arxiv.org/pdf/1902.10191).
487+
488+
Perfoms a Graph Convolutional layer with parameters derived from a Long Short-Term Memory (LSTM) layer across the snapshots of the temporal graph.
489+
490+
491+
# Arguments
492+
493+
- `in`: Number of input features.
494+
- `out`: Number of output features.
495+
- `use_bias`: Add learnable bias. Default `true`.
496+
- `init_weight`: Weights' initializer. Default `glorot_uniform`.
497+
- `init_state`: Initial state of the hidden stat of the GRU layer. Default `zeros32`.
498+
- `init_bias`: Bias initializer. Default `zeros32`.
499+
500+
# Examples
501+
502+
```julia
503+
using GNNLux, Lux, Random
504+
505+
# initialize random number generator
506+
rng = Random.default_rng()
507+
508+
# create data
509+
tg = TemporalSnapshotsGNNGraph([rand_graph(rng, 10, 20; ndata = rand(rng, 4, 10)), rand_graph(rng, 10, 14; ndata = rand(rng, 4, 10)), rand_graph(rng, 10, 22; ndata = rand(rng, 4, 10))])
510+
511+
# create layer
512+
l = EvolveGCNO(4 => 5)
513+
514+
# setup layer
515+
ps, st = LuxCore.setup(rng, l)
516+
517+
# forward pass
518+
y, st = l(tg, tg.ndata.x , ps, st) # result size 3, size y[1] (5, 10)
519+
```
520+
"""
277521
@concrete struct EvolveGCNO <: GNNLayer
278522
in_dims::Int
279523
out_dims::Int

0 commit comments

Comments
 (0)