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
    """
    net_output = model(**sample["net_input"])
    emissions = net_output["encoder_out"].transpose(0, 1).contiguous()
    B = emissions.size(0)
    T = emissions.size(1)
    device = emissions.device
    target = torch.IntTensor(B, T)
    target_size = torch.IntTensor(B)
    using_linseg = self.linseg_step()
    for b in range(B):
        initial_target_size = sample["target_lengths"][b].item()
        if initial_target_size == 0:
            raise ValueError("target size cannot be zero")
        tgt = sample["target"][b, :initial_target_size].tolist()
        tgt = self.replace_eos_with_silence(tgt)
        tgt = pack_replabels(tgt, self.tgt_dict, self.max_replabel)
        tgt = tgt[:T]
        if using_linseg:
            tgt = [tgt[t * len(tgt) // T] for t in range(T)]
        target[b][: len(tgt)] = torch.IntTensor(tgt)
        target_size[b] = len(tgt)
    loss = self.asg.METHOD_NAME(emissions, target.to(device), target_size.to(device))
    if reduce:
        loss = torch.sum(loss)
    sample_size = (
        sample["target"].size(0) if self.args.sentence_avg else sample["ntokens"]
    )
    logging_output = {
        "loss": utils.item(loss.data) if reduce else loss.data,
        "ntokens": sample["ntokens"],
        "nsentences": sample["target"].size(0),
        "sample_size": sample_size,
    }
    return loss, sample_size, logging_output