code: def forward(self, src):
      # Input: [*, in_channels]
      # Output: [*, out_channels]
  
      if self.groups > 1:
          size = src.size()[:-1]
          src = src.view(
              -1, self.groups, self.in_channels // self.groups
          )
          src = src.transpose(0, 1).contiguous()
          out = torch.matmul(src, self.weight)
          out = out.transpose(1, 0).contiguous()
          out = out.view(size + (self.out_channels,))
      else:
          out = torch.matmul(src, self.weight.squeeze(0))
  
      if self.bias is not None:
          out = out + self.bias
  
      return out
  
imports: import math
  from typing import Optional
  import torch
  import torch.nn.functional
  from torch import Tensor
  from torch.nn import Parameter
  from torch_geometric.nn.conv import MessagePassing
  from torch_geometric.nn.conv.gcn_conv import gcn_norm
  from torch_geometric.nn.inits import kaiming_uniform, uniform
  from torch_geometric.typing import Adj, OptPairTensor, OptTensor, SparseTensor
label_desc: Use image node_id 3 for calling the Linear obj's underlying member method code with example usage: obj.forward(src) and returns: out