class_docstr: The DeepSet surrogate is similar to the MLP surrogate but makes predictions
  for ensembles rather than single models.
  
  Currently, it does not support the use of dataset features.
code: def _predict(
      self, X: List[Config[EnsembleConfig]]
  ) -> npt.NDArray[np.float32]:
      # Get data
      X_numpy_list = self.config_transformer.transform(X)
      X_numpy = np.concatenate(X_numpy_list)
      X_lengths_numpy = np.array([x.shape[0] for x in X_numpy_list])
  
      dataset = TensorDataset(
          torch.from_numpy(X_numpy).float(),
          torch.from_numpy(X_lengths_numpy).long(),
      )
      test_loader = DataLoader(dataset, batch_size=len(dataset))
  
      # Run prediction
      predictions = []
      for model in self.models_:
          module = DeepSetLightningModule(model, self.loss)
          out = cast(
              List[torch.Tensor],
              self._trainer.predict(module, test_loader),
          )
          predictions.append(out[0].numpy())
  
      return np.concatenate(predictions, axis=-1)
  
imports: from typing import cast, List, Literal, Optional
  import numpy
  import numpy.typing
  import pytorch_lightning
  import torch
  from lightkit.data import DataLoader
  from torch import nn
  from torch.utils.data import TensorDataset
  from tsbench.config import Config, EnsembleConfig
  from tsbench.evaluations.tracking import EnsembleTracker
  from tsbench.surrogate.torch.deepset import DeepSetModel
  from ._base import OutputNormalization, Surrogate
  from ._factory import register_ensemble_surrogate
  from .torch import DeepSetLightningModule, ListMLELoss
  from .transformers import EnsembleConfigTransformer
label_desc: Use image node_id 4 for calling the DeepSetSurrogate obj's underlying member method code with example usage: obj._predict(X) and returns: np