Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Uninformative Error when using GATConv / GATv2Conv when using WithGraph #348

Open
hv10 opened this issue Oct 25, 2022 · 0 comments
Open
Labels
bug Something isn't working

Comments

@hv10
Copy link

hv10 commented Oct 25, 2022

Package Version

[7e08b658] GeometricFlux v0.13.7

Julia Version

1.8.0

OS / Environment

MacOS 12.6 Monterey, M1 Mac.
Ubuntu based Linux (on Headless Server).

Describe the bug

When using the GATConv or GATv2Conv isolated nodes result in an error, as the message passing for GAT convolutions does not catch the edge case where a node has no reachable neighbours, when using WithGraph.
When using a dynamic graph approach it does fail with the error that vertices need to have a self loop.

Steps to Reproduce

using GeometricFlux
using Graphs
g = erdos_renyi(20,0.1) # generate random graph
add_vertex!(g) # ensure at least one isolated node exists
fg = FeaturedGraph(g)
m = WithGraph(fg, GATConv(2=>1))
m(rand(2,21)) # leads to the uninformative error

Expected Results

I would have expected to either get the same error as with the dynamic case, or that the Layer just adds self loops anyways (although I understand that this would be very ambigous in practice).

Observed Results

The error is highly uninformative of the actual problem (the wrong input graph type) when using the Static Graph approach.

Relevant log output

WithGraphs case:

ERROR: ArgumentError: reducing over an empty collection is not allowed
Stacktrace:
  [1] _empty_reduce_error()
    @ Base ./reduce.jl:306
  [2] reducedim_init(f::Function, op::typeof(max), A::SubArray{Float64, 4, Array{Float64, 4}, Tuple{Base.Slice{Base.OneTo{Int64}}, Base.Slice{Base.OneTo{Int64}}, Vector{Int64}, Base.Slice{Base.OneTo{Int64}}}, false}, region::Int64)
    @ Base ./reducedim.jl:134
  [3] _mapreduce_dim
    @ ./reducedim.jl:371 [inlined]
  [4] #mapreduce#764
    @ ./reducedim.jl:357 [inlined]
  [5] #_maximum#806
    @ ./reducedim.jl:1023 [inlined]
  [6] _maximum
    @ ./reducedim.jl:1023 [inlined]
  [7] #_maximum#805
    @ ./reducedim.jl:1022 [inlined]
  [8] _maximum
    @ ./reducedim.jl:1022 [inlined]
  [9] #maximum#779
    @ ./reducedim.jl:994 [inlined]
 [10] softmax!(out::SubArray{Float64, 4, Array{Float64, 4}, Tuple{Base.Slice{Base.OneTo{Int64}}, Base.Slice{Base.OneTo{Int64}}, Vector{Int64}, Base.Slice{Base.OneTo{Int64}}}, false}, x::SubArray{Float64, 4, Array{Float64, 4}, Tuple{Base.Slice{Base.OneTo{Int64}}, Base.Slice{Base.OneTo{Int64}}, Vector{Int64}, Base.Slice{Base.OneTo{Int64}}}, false}; dims::Int64)
    @ NNlib ~/.julia/packages/NNlib/0QnJJ/src/softmax.jl:61
 [11] #softmax!#159
    @ ~/.julia/packages/NNlib/0QnJJ/src/softmax.jl:58 [inlined]
 [12] indexed_softmax(x::Array{Float64, 4}, xs::Vector{UInt32}, N::Int64; dims::Int64)
    @ GeometricFlux ~/.julia/packages/GeometricFlux/XpzlC/src/operation.jl:40
 [13] update_batch_edge(gat::GATConv{Float32, Matrix{Float32}, Vector{Float32}, typeof(identity)}, el::NamedTuple{(:N, :E, :es, :nbrs, :xs), Tuple{Int64, Int64, Vector{UInt32}, Vector{UInt32}, Vector{UInt32}}}, E::Nothing, X::Array{Float64, 3}, u::Nothing)
    @ GeometricFlux ~/.julia/packages/GeometricFlux/XpzlC/src/layers/graph_conv.jl:310
 [14] update_batch_edge(gat::GATConv{Float32, Matrix{Float32}, Vector{Float32}, typeof(identity)}, el::NamedTuple{(:N, :E, :es, :nbrs, :xs), Tuple{Int64, Int64, Vector{UInt32}, Vector{UInt32}, Vector{UInt32}}}, E::Nothing, X::Matrix{Float64}, u::Nothing)
    @ GeometricFlux ~/.julia/packages/GeometricFlux/XpzlC/src/layers/graph_conv.jl:297
 [15] propagate
    @ ~/.julia/packages/GeometricFlux/XpzlC/src/layers/gn.jl:173 [inlined]
 [16] GATConv
    @ ~/.julia/packages/GeometricFlux/XpzlC/src/layers/graph_conv.jl:348 [inlined]
 [17] (::WithGraph{GATConv{Float32, Matrix{Float32}, Vector{Float32}, typeof(identity)}, NamedTuple{(:N, :E, :es, :nbrs, :xs), Tuple{Int64, Int64, Vector{UInt32}, Vector{UInt32}, Vector{UInt32}}}, Nothing})(args::Matrix{Float64})
    @ GeometricFlux ~/.julia/packages/GeometricFlux/XpzlC/src/layers/msgpass.jl:66
 [18] top-level scope
    @ REPL[99]:1

Dynamic Case:

ERROR: AssertionError: a vertex must have self loop (receive a message from itself).
Stacktrace:
 [1] (::GATConv{Float32, Matrix{Float32}, Vector{Float32}, typeof(identity)})(fg::FeaturedGraph{SparseGraph{false, SparseMatrixCSC{Float32, UInt32}, Vector{UInt32}, Int64}, GraphSignals.NodeSignal{Matrix{Float64}}, GraphSignals.NullGraphSignal, GraphSignals.NullGraphSignal, GraphSignals.NullDomain})
   @ GeometricFlux ~/.julia/packages/GeometricFlux/XpzlC/src/layers/graph_conv.jl:338
 [2] top-level scope
   @ REPL[94]:1
@hv10 hv10 added the bug Something isn't working label Oct 25, 2022
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
bug Something isn't working
Projects
None yet
Development

No branches or pull requests

1 participant