docstr: Parameters
  ----------
  F
      Function space module.
  feat_static_cat
      Shape: (batch_size, num_features).
  past_time_feat
      Shape: (batch_size, history_length, num_features).
  future_time_feat
      Shape: (batch_size, history_length, num_features).
  past_target
      Shape: (batch_size, history_length).
  
  Returns
  -------
  Tensor
      a batch of prediction samples
      Shape: (batch_size, prediction_length, num_sample_paths)
docstr_tok: ["Parameters","--","--","--","--","--","F","Function","space","module",".","feat_static_cat","Shape",":","(","batch_size",",","num_features",")",".","past_time_feat","Shape",":","(","batch_size",",","history_length",",","num_features",")",".","future_time_feat","Shape",":","(","batch_size",",","history_length",",","num_features",")",".","past_target","Shape",":","(","batch_size",",","history_length",")",".","Returns","--","--","--","-","Tensor","a","batch","of","prediction","samples","Shape",":","(","batch_size",",","prediction_length",",","num_sample_paths",")"]
code: def hybrid_forward(  # type: ignore
      self,
      F,
      feat_static_cat: Tensor,
      past_time_feat: Tensor,
      future_time_feat: Tensor,
      past_target: Tensor,
  ) -> Tensor:
      """
      Parameters
      ----------
      F
          Function space module.
      feat_static_cat
          Shape: (batch_size, num_features).
      past_time_feat
          Shape: (batch_size, history_length, num_features).
      future_time_feat
          Shape: (batch_size, history_length, num_features).
      past_target
          Shape: (batch_size, history_length).
  
      Returns
      -------
      Tensor
          a batch of prediction samples
          Shape: (batch_size, prediction_length, num_sample_paths)
      """
  
      _, target_scale = self.scaler(
          past_target,
          F.ones_like(
              past_target
          ),  # TODO: pass the actual observed here
      )
  
      time_feat = (
          F.concat(past_time_feat, future_time_feat, dim=1)
          if self.is_sequential
          else future_time_feat
      )
  
      input_feat = self.assemble_features(F, feat_static_cat, time_feat)
  
      outputs = self.model(input_feat)
  
      if self.is_sequential:
          outputs = F.slice_axis(
              outputs, axis=1, begin=-self.prediction_len, end=None
          )
  
      distr = self.distr_output.distribution(
          self.proj_distr_args(outputs), scale=target_scale
      )
      samples = distr.sample(
          self.num_parallel_samples
      )  # (num_samples, batch_size, prediction_length, 1)
  
      return samples.swapaxes(0, 1)
  
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 CanonicalPredictionNetwork obj's underlying member method code with example usage: obj.hybrid_forward(F, feat_static_cat, past_time_feat, future_time_feat, past_target) and returns: samples