def METHOD_NAME(self, x: Union[Tensor, PairTensor],
            pos: Union[Tensor, PairTensor], edge_index: Adj) -> Tensor:
    if isinstance(x, Tensor):
        alpha = (self.lin_src(x), self.lin_dst(x))
        x: PairTensor = (self.lin(x), x)
    else:
        alpha = (self.lin_src(x[0]), self.lin_dst(x[1]))
        x = (self.lin(x[0]), x[1])
    if isinstance(pos, Tensor):
        pos: PairTensor = (pos, pos)
    if self.add_self_loops:
        if isinstance(edge_index, Tensor):
            edge_index, _ = remove_self_loops(edge_index)
            edge_index, _ = add_self_loops(
                edge_index, num_nodes=min(pos[0].size(0), pos[1].size(0)))
        elif isinstance(edge_index, SparseTensor):
            edge_index = torch_sparse.set_diag(edge_index)
    # propagate_type: (x: PairTensor, pos: PairTensor, alpha: PairTensor)
    out = self.propagate(edge_index, x=x, pos=pos, alpha=alpha, size=None)
    return out