def METHOD_NAME(self, inputs: Dict[str, torch.Tensor]):
    """
    Compute atomic representations/embeddings.
    Args:
        inputs (dict of torch.Tensor): SchNetPack dictionary of input tensors.
    Returns:
        torch.Tensor: atom-wise representation.
        list of torch.Tensor: intermediate atom-wise representations, if
        return_intermediate=True was used.
    """
    # get tensors from input dictionary
    atomic_numbers = inputs[properties.Z]
    r_ij = inputs[properties.Rij]
    idx_i = inputs[properties.idx_i]
    idx_j = inputs[properties.idx_j]
    # compute atom and pair features
    d_ij = torch.norm(r_ij, dim=1, keepdim=True)
    dir_ij = r_ij / d_ij
    Yij = self.sphharm(dir_ij)
    radial_ij = self.radial_basis(d_ij)
    cutoff_ij = self.cutoff_fn(d_ij)[..., None]
    x0 = self.embedding(atomic_numbers)[:, None]
    x = so3.scalar2rsh(x0, int(self.lmax))
    for so3conv, mixing1, mixing2, gating, mixing3 in zip(
            self.so3convs, self.mixings1, self.mixings2, self.gatings, self.mixings3
    ):
        dx = so3conv(x, radial_ij, Yij, cutoff_ij, idx_i, idx_j)
        ddx = mixing1(dx)
        dx = dx + self.so3product(dx, ddx)
        dx = mixing2(dx)
        dx = gating(dx)
        dx = mixing3(dx)
        x = x + dx
    inputs["scalar_representation"] = x[:, 0]
    inputs["multipole_representation"] = x
    # extract cartesian vector from multipoles: [y, z, x] -> [x, y, z]
    if self.return_vector_representation:
        inputs["vector_representation"] = torch.roll(x[:, 1:4], 1, 1)
    return inputs