class_docstr: The encoder for the InfoGraph model. It is a message passing graph convolutional
  network that produces encoded representations for molecular graph inputs.
  
  Parameters
  ----------
  num_features: int
      Number of node features for each input
  edge_features: int
      Number of edge features for each input
  embedding_dim: int
      Dimension of the embedding
  
  Example
  -------
  >>> import numpy as np
  >>> from deepchem.models.torch_models.infograph import InfoGraphEncoder
  >>> from deepchem.feat.graph_data import GraphData
  >>> encoder = InfoGraphEncoder(num_features=25, edge_features=10, embedding_dim=32)
  >>> node_features = np.random.randn(10, 25)
  >>> edge_index = np.array([[0, 1, 2], [1, 2, 3]])
  >>> edge_features = np.random.randn(3, 10)
  >>> graph_index = np.array([0, 0, 0, 0, 0, 0, 0, 0, 0, 0])
  >>> data = GraphData(node_features=node_features, edge_index=edge_index, edge_features=edge_features, graph_index=graph_index).numpy_to_torch()
  >>> embedding, feature_map = encoder(data)
  >>> print(embedding.shape)
  torch.Size([1, 64])
code: def __init__(self, num_features, edge_features, embedding_dim):
      super().__init__()
      self.lin0 = torch.nn.Linear(num_features, embedding_dim)
  
      nn = Sequential(
          Linear(edge_features, 128),
          ReLU(),
          Linear(128, embedding_dim * embedding_dim),
      )
      self.conv = NNConv(
          embedding_dim,
          embedding_dim,
          nn,
          aggr="mean",
          root_weight=False,
      )
      self.gru = GRU(embedding_dim, embedding_dim)
  
      self.set2set = Set2Set(embedding_dim, processing_steps=3)
  
imports: import torch
  import torch.nn
  import torch.nn.functional
  from torch.nn import GRU, Linear, ReLU, Sequential
  from typing import Iterable, List, Tuple, Optional, Dict, Literal
  from deepchem.metrics import to_one_hot
  import deepchem
  from deepchem.models.losses import SoftmaxCrossEntropy
  from deepchem.feat.graph_data import BatchGraphData
  from deepchem.models.losses import GlobalMutualInformationLoss, LocalMutualInformationLoss
  from deepchem.models.torch_models.layers import MultilayerPerceptron
  from deepchem.models.torch_models.modular import ModularTorchModel
label_desc: Use image node_id 1 to create a new InfoGraphEncoder object from inherited base classes: torch.nn with example: obj = InfoGraphEncoder(num_features, edge_features, embedding_dim)