code: def forward(
      self,
      past_target: torch.Tensor,
      past_observed_values: torch.Tensor,
      past_feat_dynamic_real: torch.Tensor,
      past_feat_dynamic_cat: torch.Tensor,
      feat_dynamic_real: torch.Tensor,
      feat_dynamic_cat: torch.Tensor,
      feat_static_real: torch.Tensor,
      feat_static_cat: torch.Tensor,
  ) -> torch.Tensor:
      (
          past_covariates,
          future_covariates,
          static_covariates,
          offset,
          scale,
      ) = self._preprocess(
          past_target,
          past_observed_values,
          past_feat_dynamic_real,
          past_feat_dynamic_cat,
          feat_dynamic_real,
          feat_dynamic_cat,
          feat_static_real,
          feat_static_cat,
      )
  
      preds = super().forward(
          past_observed_values,
          past_covariates,
          future_covariates,
          static_covariates,
      )
  
      preds = self._postprocess(preds, offset, scale)
      return preds.permute(0, 2, 1)
  
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 pts.model import weighted_average
  from .tft_modules import FeatureProjector, FeatureEmbedder, VariableSelectionNetwork, GatedResidualNetwork, TemporalFusionEncoder, TemporalFusionDecoder
  from .tft_output import QuantileOutput
label_desc: Use image node_id 1 for calling the TemporalFusionTransformerPredictionNetwork obj's underlying member method code with example usage: obj.forward(past_target, past_observed_values, past_feat_dynamic_real, past_feat_dynamic_cat, feat_dynamic_real, feat_dynamic_cat, feat_static_real, feat_static_cat) and returns: preds