code: def assemble_features(
      self,
      F,
      feat_static_cat: Tensor,  # (batch_size, num_features)
      time_feat: Tensor,  # (batch_size, history_length, num_features)
  ) -> Tensor:
      embedded_cat = self.embedder(
          feat_static_cat
      )  # (batch_size, num_features * embedding_size)
  
      # a workaround when you wish to repeat without knowing the number
      # of repeats
      helper_ones = F.ones_like(
          F.slice_axis(time_feat, axis=2, begin=-1, end=None)
      )
      # (batch_size, history_length, num_features * embedding_size)
      repeated_cat = F.batch_dot(
          helper_ones, F.expand_dims(embedded_cat, axis=1)
      )
  
      # putting together all the features
      input_feat = F.concat(repeated_cat, time_feat, dim=2)
      return input_feat
  
file_path: gluonts/src/gluonts/mx/model/canonical/_network.py
imports: from mxnet.gluon import HybridBlock
  from gluonts.core.component import validated
  from gluonts.mx import Tensor
  from gluonts.mx.block.feature import FeatureEmbedder
  from gluonts.mx.block.scaler import MeanScaler
  from gluonts.mx.distribution import DistributionOutput
label_desc: Use image node_id 2 for calling the CanonicalNetworkBase obj's underlying member method code with example usage: obj.assemble_features(F, feat_static_cat, time_feat) and returns: input_feat