code: def point_pair_features(
      pos_i: Tensor, pos_j: Tensor, normal_i: Tensor, normal_j: Tensor
  ) -> Tensor:
      pseudo = pos_j - pos_i
      return torch.stack(
          [
              pseudo.norm(p=2, dim=1),
              get_angle(normal_i, pseudo),
              get_angle(normal_j, pseudo),
              get_angle(normal_i, normal_j),
          ],
          dim=1,
      )
  
file_path: pytorch_geometric/torch_geometric/nn/conv/ppf_conv.py
imports: from typing import Callable, Optional, Union
  import torch
  from torch import Tensor
  from torch_geometric.nn.conv import MessagePassing
  from torch_geometric.nn.inits import reset
  from torch_geometric.typing import Adj, OptTensor, PairOptTensor, PairTensor, SparseTensor, torch_sparse
  from torch_geometric.utils import add_self_loops, remove_self_loops
label_desc: Use image node_id 2 for calling a global function with example usage: point_pair_features(pos_i, pos_j, normal_i, normal_j) and returns: torch