From 5848d5d68fc0af25e7f602d15de2eb05fe2b14fd Mon Sep 17 00:00:00 2001 From: rbSparky Date: Wed, 21 Feb 2024 00:14:19 +0530 Subject: [PATCH 1/4] agnn hetero --- src/layers/conv.jl | 14 +++++++++----- 1 file changed, 9 insertions(+), 5 deletions(-) diff --git a/src/layers/conv.jl b/src/layers/conv.jl index 006b03091..f33dc2dd6 100644 --- a/src/layers/conv.jl +++ b/src/layers/conv.jl @@ -1030,17 +1030,21 @@ function AGNNConv(; init_beta = 1.0f0, add_self_loops = true, trainable = true) AGNNConv([init_beta], add_self_loops, trainable) end -function (l::AGNNConv)(g::GNNGraph, x::AbstractMatrix) +function (l::AGNNConv)(g::AbstractGNNGraph, x) check_num_nodes(g, x) + xj, xi = expand_srcdst(g, x) + if l.add_self_loops - g = add_self_loops(g) + g = g isa GNNHeteroGraph ? add_self_loops(g, edge_t) : add_self_loops(g) end - xn = x ./ sqrt.(sum(x .^ 2, dims = 1)) - cos_dist = apply_edges(xi_dot_xj, g, xi = xn, xj = xn) + xi_n = xi ./ sqrt.(sum(xi .^ 2, dims = 1)) + xj_n = xj ./ sqrt.(sum(xj .^ 2, dims = 1)) + + cos_dist = apply_edges(xi_dot_xj, g, xi = xi_n, xj = xj_n) α = softmax_edge_neighbors(g, l.β .* cos_dist) - x = propagate(g, +; xj = x, e = α) do xi, xj, α + x = propagate(g, +; xj = xj_n, e = α) do xi, xj, α α .* xj end From 61729794ed62dbd07b86a50f87cf27cfd252eed4 Mon Sep 17 00:00:00 2001 From: rbSparky Date: Fri, 23 Feb 2024 02:14:55 +0530 Subject: [PATCH 2/4] WIP --- .gitignore | 1 + src/layers/conv.jl | 11 ++++++++++- test/layers/heteroconv.jl | 11 +++++++++++ 3 files changed, 22 insertions(+), 1 deletion(-) diff --git a/.gitignore b/.gitignore index 3d1804049..fe8ad6f3a 100644 --- a/.gitignore +++ b/.gitignore @@ -10,3 +10,4 @@ Manifest.toml LocalPreferences.toml .DS_Store /test.jl +try.jl \ No newline at end of file diff --git a/src/layers/conv.jl b/src/layers/conv.jl index f33dc2dd6..14527c1ef 100644 --- a/src/layers/conv.jl +++ b/src/layers/conv.jl @@ -949,6 +949,7 @@ end function (l::CGConv)(g::AbstractGNNGraph, x, e::Union{Nothing, AbstractMatrix} = nothing) + print("CG G TYPES", length(g.etypes), g.etypes) check_num_nodes(g, x) xj, xi = expand_srcdst(g, x) @@ -1033,6 +1034,9 @@ end function (l::AGNNConv)(g::AbstractGNNGraph, x) check_num_nodes(g, x) xj, xi = expand_srcdst(g, x) + edge_t = g isa GNNHeteroGraph ? g.etypes[1] : nothing + + print(edge_t) if l.add_self_loops g = g isa GNNHeteroGraph ? add_self_loops(g, edge_t) : add_self_loops(g) @@ -1041,11 +1045,16 @@ function (l::AGNNConv)(g::AbstractGNNGraph, x) xi_n = xi ./ sqrt.(sum(xi .^ 2, dims = 1)) xj_n = xj ./ sqrt.(sum(xj .^ 2, dims = 1)) + print("\n\n\ng types:", length(g.etypes)) cos_dist = apply_edges(xi_dot_xj, g, xi = xi_n, xj = xj_n) + + print("\n\n\nCos Distances: ", cos_dist) + print("\n\n\nMultiplication: ", l.β .* cos_dist, "\n\n") + α = softmax_edge_neighbors(g, l.β .* cos_dist) x = propagate(g, +; xj = xj_n, e = α) do xi, xj, α - α .* xj + α .* xj .* xi end return x diff --git a/test/layers/heteroconv.jl b/test/layers/heteroconv.jl index f1a07b7a7..c7fc76a4b 100644 --- a/test/layers/heteroconv.jl +++ b/test/layers/heteroconv.jl @@ -109,4 +109,15 @@ @test size(y.A) == (2,2) && size(y.B) == (2,3) end + @testset "AGNNConv" begin + num_nodes_A, num_nodes_B = 5, 3 + feature_dim = 4 + hg = rand_bipartite_heterograph((num_nodes_A, num_nodes_B), 15) + x = (A=rand(Float32, feature_dim, num_nodes_A), + B=rand(Float32, feature_dim, num_nodes_B)) + layers = HeteroGraphConv( (:A, :to, :B) => AGNNConv(init_beta = 1.0f0, add_self_loops = false, trainable = true)); + size(y[:A]) == (feature_dim, num_nodes_A) + size(y[:B]) == (feature_dim, num_nodes_B) + end + end From 5f33344b0d9f66cc75366086592f179d6c69e666 Mon Sep 17 00:00:00 2001 From: rbSparky Date: Mon, 4 Mar 2024 14:45:49 +0530 Subject: [PATCH 3/4] WIP --- src/layers/conv.jl | 17 +++++------------ 1 file changed, 5 insertions(+), 12 deletions(-) diff --git a/src/layers/conv.jl b/src/layers/conv.jl index 78bc1c59d..0041be232 100644 --- a/src/layers/conv.jl +++ b/src/layers/conv.jl @@ -1236,28 +1236,21 @@ end function (l::AGNNConv)(g::AbstractGNNGraph, x) check_num_nodes(g, x) - xj, xi = expand_srcdst(g, x) + xi, xj = expand_srcdst(g, x) edge_t = g isa GNNHeteroGraph ? g.etypes[1] : nothing - print(edge_t) - if l.add_self_loops g = g isa GNNHeteroGraph ? add_self_loops(g, edge_t) : add_self_loops(g) end - xi_n = xi ./ sqrt.(sum(xi .^ 2, dims = 1)) - xj_n = xj ./ sqrt.(sum(xj .^ 2, dims = 1)) - - print("\n\n\ng types:", length(g.etypes)) - cos_dist = apply_edges(xi_dot_xj, g, xi = xi_n, xj = xj_n) - - print("\n\n\nCos Distances: ", cos_dist) - print("\n\n\nMultiplication: ", l.β .* cos_dist, "\n\n") + xi_n = xi ./ sqrt.(sum(xi .^ 2, dims = 2)) + xj_n = xj ./ sqrt.(sum(xj .^ 2, dims = 2)) + cos_dist = apply_edges(xi_dot_xj, g, xi = xi_n, xj = xj_n) α = softmax_edge_neighbors(g, l.β .* cos_dist) x = propagate(g, +; xj = xj_n, e = α) do xi, xj, α - α .* xj .* xi + α .* xj end return x From a5f19b6ac995a9c07b0be5d4982226369c1e76ee Mon Sep 17 00:00:00 2001 From: rbSparky Date: Mon, 11 Mar 2024 23:05:24 +0530 Subject: [PATCH 4/4] still doesnt work --- src/layers/conv.jl | 4 ++-- test/layers/heteroconv.jl | 15 +++++++-------- 2 files changed, 9 insertions(+), 10 deletions(-) diff --git a/src/layers/conv.jl b/src/layers/conv.jl index 0041be232..eb80de453 100644 --- a/src/layers/conv.jl +++ b/src/layers/conv.jl @@ -1249,8 +1249,8 @@ function (l::AGNNConv)(g::AbstractGNNGraph, x) cos_dist = apply_edges(xi_dot_xj, g, xi = xi_n, xj = xj_n) α = softmax_edge_neighbors(g, l.β .* cos_dist) - x = propagate(g, +; xj = xj_n, e = α) do xi, xj, α - α .* xj + x = propagate(g, +; xi = xi_n, xj = xj_n, e = α) do xi, xj, α + α .* xj .* xi end return x diff --git a/test/layers/heteroconv.jl b/test/layers/heteroconv.jl index 060cb81c0..73fffc810 100644 --- a/test/layers/heteroconv.jl +++ b/test/layers/heteroconv.jl @@ -126,14 +126,13 @@ end @testset "AGNNConv" begin - num_nodes_A, num_nodes_B = 5, 3 - feature_dim = 4 - hg = rand_bipartite_heterograph((num_nodes_A, num_nodes_B), 15) - x = (A=rand(Float32, feature_dim, num_nodes_A), - B=rand(Float32, feature_dim, num_nodes_B)) - layers = HeteroGraphConv( (:A, :to, :B) => AGNNConv(init_beta = 1.0f0, add_self_loops = false, trainable = true)); - size(y[:A]) == (feature_dim, num_nodes_A) - size(y[:B]) == (feature_dim, num_nodes_B) + x = (A = rand(Float32, 2, 2), B = rand(Float32, 3, 3)) + + layers = HeteroGraphConv((:A, :to, :B) => AGNNConv(init_beta=1.0, add_self_loops=true, trainable=true), + (:B, :to, :A) => AGNNConv(init_beta=1.0, add_self_loops=true, trainable=true)); + + y = layers(hg, x); + @test size(y.A) == (2, 2) && size(y.B) == (2, 3) end @testset "GINConv" begin