def METHOD_NAME(self, x: Tensor) -> Tensor:
    F = self.F
    # masking data NaN's with ones to prevent NaN gradients
    x_non_nan = F.where(x != x, F.ones_like(x), x)
    # calculate likelihood for values which are not NaN
    non_nan_dist_log_likelihood = F.where(
        x != x,
        -x.ones_like() / 0.0,
        self.components[0].METHOD_NAME(x_non_nan),
    )
    log_mix_weights = F.log(self.mixture_probs)
    # stack log probabilities of components
    component_log_likelihood = F.stack(
        *[non_nan_dist_log_likelihood, self.components[1].METHOD_NAME(x)],
        axis=-1,
    )
    # compute mixture log probability by log-sum-exp
    summands = log_mix_weights + component_log_likelihood
    max_val = F.max_axis(summands, axis=-1, keepdims=True)
    sum_exp = F.sum(
        F.exp(F.broadcast_minus(summands, max_val)), axis=-1, keepdims=True
    )
    log_sum_exp = F.log(sum_exp) + max_val
    return log_sum_exp.squeeze(axis=-1)