def METHOD_NAME(
    self,
    feat_static_cat: torch.Tensor,
    feat_static_real: torch.Tensor,
    past_time_feat: torch.Tensor,
    past_target: torch.Tensor,
    past_observed_values: torch.Tensor,
    future_time_feat: torch.Tensor,
    num_parallel_samples: Optional[int] = None,
) -> torch.Tensor:
    """
    Generates the predicted sample paths.
    Parameters
    ----------
    feat_static_cat
        Static categorical features (batch_size, num_feat_static_cat)
    feat_static_real
        Static real-valued features (batch_size, num_feat_static_real)
    past_time_feat
        Past time features (batch_size, history_length, num_features)
    past_target
        Past target values (batch_size, history_length)
    past_observed_values
        Indicator whether or not the values were observed
        (batch_size, history_length)
    future_time_feat
        Future time features (batch_size, prediction_length, num_features)
    num_parallel_samples
        Number of parallel sample paths generated for each time series
    Returns
    -------
    sample_paths
        Sample paths (batch_size, num_parallel_samples, prediction_length)
    """
    if num_parallel_samples is None:
        num_parallel_samples = self.num_parallel_samples
    _, scale, hidden_state, _, _ = self.unroll_lagged_rnn(
        feat_static_cat,
        feat_static_real,
        past_time_feat,
        past_target,
        past_observed_values,
        future_time_feat[:, :1],
    )
    hidden_state = hidden_state[:, : self.context_length]
    distr = self.output_distribution(
        self.picnn, hidden_state, inference=True
    )
    unscaled_future_samples = distr.sample(
        sample_shape=(num_parallel_samples,)
    )
    return unscaled_future_samples * scale.unsqueeze(-1)