def METHOD_NAME(self, model, sample, reduce=True):
    """Compute the loss for the given sample.
    Returns a tuple with three elements:
    1) the loss
    2) the sample size, which is used as the denominator for the gradient
    3) logging outputs to display while training
    """
    assert (
        hasattr(model.decoder, "adaptive_softmax")
        and model.decoder.adaptive_softmax is not None
    )
    adaptive_softmax = model.decoder.adaptive_softmax
    net_output = model(**sample["net_input"])
    orig_target = model.get_targets(sample, net_output)
    nsentences = orig_target.size(0)
    orig_target = orig_target.view(-1)
    bsz = orig_target.size(0)
    logits, target = adaptive_softmax(net_output[0], orig_target)
    assert len(target) == len(logits)
    loss = net_output[0].new(1 if reduce else bsz).zero_()
    for i in range(len(target)):
        if target[i] is not None:
            assert target[i].min() >= 0 and target[i].max() <= logits[i].size(1)
            loss += F.cross_entropy(
                logits[i],
                target[i],
                ignore_index=self.padding_idx,
                reduction="sum" if reduce else "none",
            )
    orig = utils.strip_pad(orig_target, self.padding_idx)
    ntokens = orig.numel()
    sample_size = sample["target"].size(0) if self.sentence_avg else ntokens
    logging_output = {
        "loss": loss.data,
        "ntokens": ntokens,
        "nsentences": nsentences,
        "sample_size": sample_size,
    }
    return loss, sample_size, logging_output