def __call__(
        self,
        inputs: Array,
        return_full_covariance: bool = False,
    ) -> Tuple[Array, Array]:
        """
        Computes Gaussian process outputs.

        Parameters
        ----------
        inputs: Array
            The nd-array of shape (batch_size, ..., input_dim).
        return_full_covariance: bool
            Whether to return the full covariance matrix, shape
            (batch_size, batch_size), or only return the predictive variances with
            shape (batch_size, ).

        Returns
        -------
        Tuple[Array, Array]
          A tuple of predictive logits, predictive covariance and (optionally)
          random Fourier features.
        """
        gp_inputs = self.sngp_norm_layer(inputs) if self.normalize_input else inputs
        gp_features = self.sngp_random_features_layer(gp_inputs)

        gp_logits = self.sngp_dense_layer(gp_features)
        gp_covariance = self.sngp_covariance_layer(
            gp_features, gp_logits, diagonal_only=not return_full_covariance
        )
        return gp_logits, gp_covariance

        Computes Gaussian process outputs.

        Parameters
        ----------
        inputs: Array
            The nd-array of shape (batch_size, ..., input_dim).
        return_full_covariance: bool
            Whether to return the full covariance matrix, shape
            (batch_size, batch_size), or only return the predictive variances with
            shape (batch_size, ).

        Returns
        -------
        Tuple[Array, Array]
          A tuple of predictive logits, predictive covariance and (optionally)
          random Fourier features.
        
fortuna/model/utils/random_features.py