class_docstr: The spline-based convolutional operator from the `"SplineCNN: Fast
  Geometric Deep Learning with Continuous B-Spline Kernels"
  <https://arxiv.org/abs/1711.08920>`_ paper.
  
  .. math::
      \mathbf{x}^{\prime}_i = \frac{1}{|\mathcal{N}(i)|} \sum_{j \in
      \mathcal{N}(i)} \mathbf{x}_j \cdot
      h_{\mathbf{\Theta}}(\mathbf{e}_{i,j}),
  
  where :math:`h_{\mathbf{\Theta}}` denotes a kernel function defined
  over the weighted B-Spline tensor product basis.
  
  .. note::
  
      Pseudo-coordinates must lay in the fixed interval :math:`[0, 1]` for
      this method to work as intended.
  
  Args:
      in_channels (int or tuple): Size of each input sample, or :obj:`-1` to
          derive the size from the first input(s) to the forward method.
          A tuple corresponds to the sizes of source and target
          dimensionalities.
      out_channels (int): Size of each output sample.
      dim (int): Pseudo-coordinate dimensionality.
      kernel_size (int or [int]): Size of the convolving kernel.
      is_open_spline (bool or [bool], optional): If set to :obj:`False`, the
          operator will use a closed B-spline basis in this dimension.
          (default :obj:`True`)
      degree (int, optional): B-spline basis degrees. (default: :obj:`1`)
      aggr (str, optional): The aggregation scheme to use
          (:obj:`"add"`, :obj:`"mean"`, :obj:`"max"`).
          (default: :obj:`"mean"`)
      root_weight (bool, optional): If set to :obj:`False`, the layer will
          not add transformed root node features to the output.
          (default: :obj:`True`)
      bias (bool, optional): If set to :obj:`False`, the layer will not learn
          an additive bias. (default: :obj:`True`)
      **kwargs (optional): Additional arguments of
          :class:`torch_geometric.nn.conv.MessagePassing`.
class_docstr_tok: ["The","spline-based","convolutional","operator","from","the","`","``","SplineCNN",":","Fast","Geometric","Deep","Learning","with","Continuous","B-Spline","Kernels","''","<","https",":","\/\/arxiv.org\/abs\/1711.08920",">","`","_","paper",".","..","math",":",":","\\mathbf","{","x","}","^","{","\\prime","}","_i","=","\\frac","{","1","}","{","|\\mathcal","{","N","}","(","i",")","|","}","\\sum_","{","j","\\in","\\mathcal","{","N","}","(","i",")","}","\\mathbf","{","x","}","_j","\\cdot","h_","{","\\mathbf","{","\\Theta","}","}","(","\\mathbf","{","e","}","_","{","i",",","j","}",")",",","where",":","math",":","`","h_","{","\\mathbf","{","\\Theta","}","}","`","denotes","a","kernel","function","defined","over","the","weighted","B-Spline","tensor","product","basis",".","..","note",":",":","Pseudo-coordinates","must","lay","in","the","fixed","interval",":","math",":","`","[","0",",","1","]","`","for","this","method","to","work","as","intended",".","Args",":","in_channels","(","int","or","tuple",")",":","Size","of","each","input","sample",",","or",":","obj",":","`","-1","`","to","derive","the","size","from","the","first","input","(","s",")","to","the","forward","method",".","A","tuple","corresponds","to","the","sizes","of","source","and","target","dimensionalities",".","out_channels","(","int",")",":","Size","of","each","output","sample",".","dim","(","int",")",":","Pseudo-coordinate","dimensionality",".","kernel_size","(","int","or","[","int","]",")",":","Size","of","the","convolving","kernel",".","is_open_spline","(","bool","or","[","bool","]",",","optional",")",":","If","set","to",":","obj",":","`","False","`",",","the","operator","will","use","a","closed","B-spline","basis","in","this","dimension",".","(","default",":","obj",":","`","True","`",")","degree","(","int",",","optional",")",":","B-spline","basis","degrees",".","(","default",":",":","obj",":","`","1","`",")","aggr","(","str",",","optional",")",":","The","aggregation","scheme","to","use","(",":","obj",":","`","``","add","''","`",",",":","obj",":","`","``","mean","''","`",",",":","obj",":","`","``","max","''","`",")",".","(","default",":",":","obj",":","`","``","mean","''","`",")","root_weight","(","bool",",","optional",")",":","If","set","to",":","obj",":","`","False","`",",","the","layer","will","not","add","transformed","root","node","features","to","the","output",".","(","default",":",":","obj",":","`","True","`",")","bias","(","bool",",","optional",")",":","If","set","to",":","obj",":","`","False","`",",","the","layer","will","not","learn","an","additive","bias",".","(","default",":",":","obj",":","`","True","`",")","*","*","kwargs","(","optional",")",":","Additional","arguments","of",":","class",":","`","torch_geometric.nn.conv.MessagePassing","`","."]
code: def message(self, x_j: Tensor, edge_attr: Tensor) -> Tensor:
      data = spline_basis(
          edge_attr, self.kernel_size, self.is_open_spline, self.degree
      )
      return spline_weighting(x_j, self.weight, *data)
  
file_path: pytorch_geometric/torch_geometric/nn/conv/spline_conv.py
imports: import warnings
  from typing import List, Tuple, Union
  import torch
  from torch import Tensor, nn
  from torch.nn import Parameter
  from torch_geometric.nn.conv import MessagePassing
  from torch_geometric.nn.dense.linear import Linear
  from torch_geometric.nn.inits import uniform, zeros
  from torch_geometric.typing import Adj, OptPairTensor, OptTensor, Size
  from torch_geometric.utils.repeat import repeat
label_desc: Use image node_id 4 for calling the SplineConv obj's underlying member method code with example usage: obj.message(x_j, edge_attr) and returns: spline_weighting