class_docstr: Concatenating embedding with float features before passing the input
  to DQN
code: def forward(self, state: rlt.FeatureData):
      # id_list is (offset, value); sum pooling
  
      if not state.id_list_features_raw and state.id_list_features:
          for ft_name in self._id_list_feature_names:
              state.id_list_features_raw[
                  ft_name
                  # pyre-ignore
              ] = state.id_list_features[ft_name]
  
      id_list_embeddings = [
          self.embedding_bags[self.feat2table[feature_name]](
              input=v[1], offsets=v[0]
          )
          for feature_name, v in state.id_list_features_raw.items()
      ]
  
      if (
          not state.id_score_list_features_raw
          and state.id_score_list_features
      ):
          for ft_name in self._id_score_list_feature_names:
              state.id_score_list_features_raw[
                  ft_name
              ] = state.id_score_list_features[ft_name]
  
      # id_score_list is (offset, key, value); weighted sum pooling
      id_score_list_embeddings = [
          self.embedding_bags[self.feat2table[feature_name]](
              input=v[1], offsets=v[0], per_sample_weights=v[2]
          )
          for feature_name, v in state.id_score_list_features_raw.items()
      ]
      return torch.cat(
          id_list_embeddings
          + id_score_list_embeddings
          + [state.float_features],
          dim=1,
      )
  
file_path: ReAgent/reagent/models/embedding_bag_concat.py
imports: from typing import Dict, List
  import torch
  from reagent.core import types
  from reagent.core.utils import embedding_bag_configs_from_feature_configs
  from reagent.models.base import ModelBase
  from torchrec import EmbeddingBagConfig
label_desc: Use image node_id 4 for calling the EmbeddingBagConcat obj's underlying member method code with example usage: obj.forward(state) and returns: torch