def METHOD_NAME(self, x: Union[Tensor, OptPairTensor], edge_index: Adj,
            edge_attr: Tensor = None, size: Size = None) -> Tensor:
    if isinstance(x, Tensor):
        x: OptPairTensor = (x, x)
    x_self = x[1]
    # propagate_type: (x: OptPairTensor)
    out = self.propagate(edge_index, x=x, size=size, edge_attr=edge_attr)
    out = out.mean(dim=1)  # todo: other approach to aggregate heads
    out = out + self.lin_self(x_self)
    if self.normalize_l2:
        out = F.normalize(out, p=2, dim=-1)
    return out