code: def test_inspector_gat_conv() -> None:
      inspector = Inspector(GATConv)
      assert str(inspector) == "Inspector(GATConv)"
      assert inspector.implements("message")
      assert not inspector.implements("message_and_aggregate")
  
      out = inspector.inspect_signature(GATConv.message)
      assert isinstance(out, Signature)
      assert out.param_dict == {
          "x_j": Parameter("x_j", Tensor, "Tensor", inspect._empty),
          "alpha": Parameter("alpha", Tensor, "Tensor", inspect._empty),
      }
      assert out.return_type == Tensor
      assert inspector.get_flat_params(["message", "message"]) == [
          Parameter("x_j", Tensor, "Tensor", inspect._empty),
          Parameter("alpha", Tensor, "Tensor", inspect._empty),
      ]
      assert inspector.get_flat_param_names(["message"]) == [
          "x_j",
          "alpha",
      ]
  
      kwargs = {"x_j": torch.randn(5), "alpha": torch.randn(5)}
      data = inspector.collect_param_data("message", kwargs)
      assert len(data) == 2
      assert torch.allclose(data["x_j"], kwargs["x_j"])
      assert torch.allclose(data["alpha"], kwargs["alpha"])
  
      assert inspector.get_params_from_method_call(
          SAGEConv.propagate
      ) == {
          "x": Parameter(
              "x", OptPairTensor, "OptPairTensor", inspect._empty
          ),
          "alpha": Parameter("alpha", Tensor, "Tensor", inspect._empty),
      }
  
file_path: pytorch_geometric/test/test_inspector.py
imports: import inspect
  from typing import Any, Dict, Final, List, Optional, Set, Tuple, Union
  import torch
  from torch import Tensor
  from torch_geometric.inspector import Inspector, Parameter, Signature
  from torch_geometric.nn import GATConv, SAGEConv
  from torch_geometric.typing import OptPairTensor
label_desc: Use image node_id 4 for calling a global function with example usage: test_inspector_gat_conv() without return types