    def forward(
        self, inputs: torch.Tensor, tags: torch.Tensor, mask: torch.BoolTensor = None
    ) -> torch.Tensor:
        """Computes the log likelihood for the given batch of input sequences $(x,y)$

        Args:
            inputs (torch.Tensor): (batch_size, sequence_length, num_tags) tensor of logits for the inputs $x$
            tags (torch.Tensor): (batch_size, sequence_length) tensor of tags $y$
            mask (torch.BoolTensor, optional): (batch_size, sequence_length) tensor of masking flags.
                Defaults to None.

        Returns:
            torch.Tensor: (batch_size,) log likelihoods $log P(y|x)$ for each input
        """
        if mask is None:
            mask = torch.ones(*tags.size(), dtype=torch.bool, device=inputs.device)
        else:
            # The code below fails in weird ways if this isn't a bool tensor, so we make sure.
            mask = mask.to(torch.bool)

        log_denominator = self._input_likelihood(inputs, self.transitions, mask)
        log_numerator = self._joint_likelihood(inputs, self.transitions, tags, mask)

        return torch.sum(log_numerator - log_denominator)
Computes the log likelihood for the given batch of input sequences $(x,y)$

Args:
inputs (torch.Tensor): (batch_size, sequence_length, num_tags) tensor of logits for the inputs $x$
tags (torch.Tensor): (batch_size, sequence_length) tensor of tags $y$
mask (torch.BoolTensor, optional): (batch_size, sequence_length) tensor of masking flags.
Defaults to None.

Returns:
torch.Tensor: (batch_size,) log likelihoods $log P(y|x)$ for each input
allennlp/modules/conditional_random_field/conditional_random_field.py