class_docstr: Concatenating embeddings from bag collection with float features before passing the input
  to DQN
class_docstr_tok: ["Concatenating","embeddings","from","bag","collection","with","float","features","before","passing","the","input","to","DQN"]
code: def forward(
      self, state: rlt.FeatureData, action: rlt.FeatureData
  ) -> torch.Tensor:
      dense_features = torch.cat(
          (state.float_features, action.float_features), dim=-1
      )
      batch_size = dense_features.shape[0]
      sparse_features = fetch_id_list_features(state, action)
      # shape: batch_size, num_sparse_features, embedding_dim
      embedded_sparse = self.sparse_arch(sparse_features)
      # shape: batch_size, num_sparse_features * embedding_dim
      embedded_sparse = embedded_sparse.reshape(batch_size, -1)
      concatenated_dense = torch.cat(
          (dense_features, embedded_sparse), dim=-1
      )
  
      return self.q_network(concatenated_dense)
  
file_path: ReAgent/reagent/models/sparse_dqn.py
imports: from typing import List
  import torch
  from reagent.core import types
  from reagent.models import FullyConnectedNetwork
  from reagent.models.base import ModelBase
  from torchrec.models.dlrm import SparseArch
  from torchrec.modules.embedding_modules import EmbeddingBagCollection
  from torchrec.sparse.jagged_tensor import KeyedJaggedTensor
label_desc: Use image node_id 2 for calling the SparseDQN obj's underlying member method code with example usage: obj.forward(state, action) and returns: self