class_docstr: Graph attention layer from `Graph Attention Networks
  <https://arxiv.org/pdf/1710.10903.pdf>`__, with the sparse aggregation
  accelerated by cugraph-ops.
  
  See :class:`dgl.nn.pytorch.conv.GATConv` for mathematical model.
  
  This module depends on :code:`pylibcugraphops` package, which can be
  installed via :code:`conda install -c nvidia pylibcugraphops=23.04`.
  :code:`pylibcugraphops` 23.04 requires python 3.8.x or 3.10.x.
  
  .. note::
      This is an **experimental** feature.
  
  Parameters
  ----------
  in_feats : int
      Input feature size.
  out_feats : int
      Output feature size.
  num_heads : int
      Number of heads in Multi-Head Attention.
  feat_drop : float, optional
      Dropout rate on feature. Defaults: ``0``.
  negative_slope : float, optional
      LeakyReLU angle of negative slope. Defaults: ``0.2``.
  residual : bool, optional
      If True, use residual connection. Defaults: ``False``.
  activation : callable activation function/layer or None, optional.
      If not None, applies an activation function to the updated node features.
      Default: ``None``.
  bias : bool, optional
      If True, learns a bias term. Defaults: ``True``.
  
  Examples
  --------
  >>> import dgl
  >>> import torch
  >>> from dgl.nn import CuGraphGATConv
  >>> device = 'cuda'
  >>> g = dgl.graph(([0,1,2,3,2,5], [1,2,3,4,0,3])).to(device)
  >>> g = dgl.add_self_loop(g)
  >>> feat = torch.ones(6, 10).to(device)
  >>> conv = CuGraphGATConv(10, 2, num_heads=3).to(device)
  >>> res = conv(g, feat)
  >>> res
  tensor([[[ 0.2340,  1.9226],
          [ 1.6477, -1.9986],
          [ 1.1138, -1.9302]],
          [[ 0.2340,  1.9226],
          [ 1.6477, -1.9986],
          [ 1.1138, -1.9302]],
          [[ 0.2340,  1.9226],
          [ 1.6477, -1.9986],
          [ 1.1138, -1.9302]],
          [[ 0.2340,  1.9226],
          [ 1.6477, -1.9986],
          [ 1.1138, -1.9302]],
          [[ 0.2340,  1.9226],
          [ 1.6477, -1.9986],
          [ 1.1138, -1.9302]],
          [[ 0.2340,  1.9226],
          [ 1.6477, -1.9986],
          [ 1.1138, -1.9302]]], device='cuda:0', grad_fn=<ViewBackward0>)
code: def __init__(
      self,
      in_feats,
      out_feats,
      num_heads,
      feat_drop=0.0,
      negative_slope=0.2,
      residual=False,
      activation=None,
      bias=True,
  ):
      if HAS_PYLIBCUGRAPHOPS is False:
          raise ModuleNotFoundError(
              f"{self.__class__.__name__} requires pylibcugraphops=23.04. "
              f"Install via `conda install -c nvidia 'pylibcugraphops=23.04'`."
              f"pylibcugraphops requires Python 3.8 or 3.10."
          )
      super().__init__()
      self.in_feats = in_feats
      self.out_feats = out_feats
      self.num_heads = num_heads
      self.feat_drop = nn.Dropout(feat_drop)
      self.negative_slope = negative_slope
      self.activation = activation
  
      self.fc = nn.Linear(in_feats, out_feats * num_heads, bias=False)
      self.attn_weights = nn.Parameter(
          torch.Tensor(2 * num_heads * out_feats)
      )
  
      if bias:
          self.bias = nn.Parameter(torch.Tensor(num_heads * out_feats))
      else:
          self.register_buffer("bias", None)
  
      if residual:
          if in_feats == out_feats * num_heads:
              self.res_fc = nn.Identity()
          else:
              self.res_fc = nn.Linear(
                  in_feats, out_feats * num_heads, bias=False
              )
      else:
          self.register_buffer("res_fc", None)
  
      self.reset_parameters()
  
file_path: dgl/python/dgl/nn/pytorch/conv/cugraph_gatconv.py
imports: import torch
  from torch import nn
  from .cugraph_base import CuGraphBaseConv
label_desc: Use image node_id 1 to create a new CuGraphGATConv object from inherited base classes: CuGraphBaseConv with example: obj = CuGraphGATConv(in_feats, out_feats, num_heads, feat_drop, negative_slope, residual, activation, bias)