def forward(self, x: "torch.Tensor") -> "torch.Tensor":
        """
        Performs the forward pass of the convolutional layer in the interval (box) domain by using
        the equivalent dense representation.

        :param x: interval representation of the datapoint.
        :return: output of the convolutional layer on x
        """
        x = torch.reshape(x, (x.shape[0], 2, -1))

        center = (x[:, 1] + x[:, 0]) / 2
        radius = (x[:, 1] - x[:, 0]) / 2

        center = torch.matmul(center, torch.transpose(self.dense_weights, 0, 1)) + self.bias
        radius = torch.matmul(radius, torch.abs(torch.transpose(self.dense_weights, 0, 1)))

        center = torch.unsqueeze(center, dim=1)
        radius = torch.unsqueeze(radius, dim=1)

        x = torch.cat([center - radius, center + radius], dim=1)
        return x.reshape((-1, 2, self.out_channels, self.output_height, self.output_width))

        Performs the forward pass of the convolutional layer in the interval (box) domain by using
        the equivalent dense representation.

        :param x: interval representation of the datapoint.
        :return: output of the convolutional layer on x
        
art/estimators/certification/interval/interval.py