def forward(self, features: list[torch.Tensor]) -> torch.Tensor:
        """Forward pass of the bottleneck layer.

        Processes multi-scale features through convolution layers, fuses them via
        concatenation, and applies final bottleneck compression.

        Args:
            features (list[torch.Tensor]): List of 3 feature tensors from different
                scales of the encoder network. Expected shapes:
                - features[0]: ``(B, C1, H1, W1)``
                - features[1]: ``(B, C2, H2, W2)``
                - features[2]: ``(B, C3, H3, W3)``
                where B is batch size, Ci are channel dimensions, and Hi, Wi are
                spatial dimensions.

        Returns:
            torch.Tensor: Compressed bottleneck representation with shape
                ``(B, C_out, H_out, W_out)``, where dimensions depend on the input
                feature shapes and stride values.
        """
        # Always assumes that features has length of 3
        feature0 = self.relu(self.bn2(self.conv2(self.relu(self.bn1(self.conv1(features[0]))))))
        feature1 = self.relu(self.bn3(self.conv3(features[1])))
        feature_cat = torch.cat([feature0, feature1, features[2]], 1)
        output = self.bn_layer(feature_cat)

        return output.contiguous()
Forward pass of the bottleneck layer.

        Processes multi-scale features through convolution layers, fuses them via
        concatenation, and applies final bottleneck compression.

        Args:
            features (list[torch.Tensor]): List of 3 feature tensors from different
                scales of the encoder network. Expected shapes:
                - features[0]: ``(B, C1, H1, W1)``
                - features[1]: ``(B, C2, H2, W2)``
                - features[2]: ``(B, C3, H3, W3)``
                where B is batch size, Ci are channel dimensions, and Hi, Wi are
                spatial dimensions.

        Returns:
            torch.Tensor: Compressed bottleneck representation with shape
                ``(B, C_out, H_out, W_out)``, where dimensions depend on the input
                feature shapes and stride values.
        
src/anomalib/models/image/reverse_distillation/components/bottleneck.py