def forward(self, x):
        """
        :param x: (batch_size, feature_size)

        Returns a tensor of size (batch_size, num_classes) with
        negative distance of each element in the mini-batch
        with respect to each class.
        """
        if self.class_means_dict == {}:
            self.init_missing_classes(range(self.max_class + 1), x.shape[1], x.device)

        assert self.class_means_dict != {}, "no class means available."

        if self.tukey:
            x = self._tukey_transforms(x)

        maha_dist = torch.ones(self.max_class + 1, x.shape[0]) * np.inf
        for class_id, prototype in self.class_means_dict.items():
            cov = self.class_cov_dict[class_id]
            dist = self._mahalanobis(x, prototype, cov)
            maha_dist[class_id] = dist

        # n_classes, batch_size
        maha_dis = maha_dist.T

        # (batch_size, num_classes)
        return -maha_dis

        :param x: (batch_size, feature_size)

        Returns a tensor of size (batch_size, num_classes) with
        negative distance of each element in the mini-batch
        with respect to each class.
        
avalanche/models/fecam.py