docstr: Predicts samples, all tensors should have NTC layout.
  Parameters
  ----------
  feat_static_cat : (batch_size, num_features)
  feat_static_real : (batch_size, num_features)
  past_time_feat : (batch_size, history_length, num_features)
  past_target : (batch_size, history_length, *target_shape)
  past_observed_values : (batch_size, history_length, *target_shape)
  future_time_feat : (batch_size, prediction_length, num_features)
  
  Returns
  -------
  Tensor
      Predicted samples
docstr_tok: ["Predicts","samples",",","all","tensors","should","have","NTC","layout",".","Parameters","--","--","--","--","--","feat_static_cat",":","(","batch_size",",","num_features",")","feat_static_real",":","(","batch_size",",","num_features",")","past_time_feat",":","(","batch_size",",","history_length",",","num_features",")","past_target",":","(","batch_size",",","history_length",",","*","target_shape",")","past_observed_values",":","(","batch_size",",","history_length",",","*","target_shape",")","future_time_feat",":","(","batch_size",",","prediction_length",",","num_features",")","Returns","--","--","--","-","Tensor","Predicted","samples"]
code: def forward(
      self,
      feat_static_cat: torch.Tensor,  # (batch_size, num_features)
      feat_static_real: torch.Tensor,  # (batch_size, num_features)
      past_time_feat: torch.Tensor,  # (batch_size, history_length, num_features)
      past_target: torch.Tensor,  # (batch_size, history_length, *target_shape)
      past_observed_values: torch.Tensor,  # (batch_size, history_length, *target_shape)
      future_time_feat: torch.Tensor,  # (batch_size, prediction_length, num_features)
      past_control: torch.Tensor,
      future_control: torch.Tensor,
  ) -> torch.Tensor:
      """
      Predicts samples, all tensors should have NTC layout.
      Parameters
      ----------
      feat_static_cat : (batch_size, num_features)
      feat_static_real : (batch_size, num_features)
      past_time_feat : (batch_size, history_length, num_features)
      past_target : (batch_size, history_length, *target_shape)
      past_observed_values : (batch_size, history_length, *target_shape)
      future_time_feat : (batch_size, prediction_length, num_features)
  
      Returns
      -------
      Tensor
          Predicted samples
      """
  
      # unroll the decoder in "prediction mode", i.e. with past data only
      _, state, scale, control_scale, static_feat = self.unroll_encoder(
          feat_static_cat=feat_static_cat,
          feat_static_real=feat_static_real,
          past_time_feat=past_time_feat,
          past_target=past_target,
          past_observed_values=past_observed_values,
          past_control=past_control,
          future_time_feat=None,
          future_target=None,
          future_control=None,
      )
  
      return self.sampling_decoder(
          past_target=past_target,
          past_control=past_control,
          time_feat=future_time_feat,
          static_feat=static_feat,
          future_control=future_control,
          scale=scale,
          control_scale=control_scale,
          begin_states=state,
      )
  
imports: from typing import List, Optional, Tuple, Union
  import numpy
  import torch
  import torch.nn
  from torch.distributions import Distribution
  from gluonts.core.component import validated
  from gluonts.torch.modules.distribution_output import DistributionOutput
  from pts.model import weighted_average
  from pts.modules import MeanScaler, NOPScaler, FeatureEmbedder
label_desc: Use image node_id 3 for calling the CausalDeepARPredictionNetwork obj's underlying member method code with example usage: obj.forward(feat_static_cat, feat_static_real, past_time_feat, past_target, past_observed_values, future_time_feat, past_control, future_control) and returns: self