def METHOD_NAME(
    self,
    past_target: torch.Tensor,
    past_observed_values: torch.Tensor,
) -> Tuple[Tuple[torch.Tensor, ...], torch.Tensor, torch.Tensor]:
    # scale the input
    past_target_scaled, loc, scale = self.scaler(
        past_target, past_observed_values
    )
    lags = lagged_sequence_values(
        self.lags_seq,
        past_target_scaled[:, : -self.context_length, ...],
        past_target_scaled[:, -self.context_length :, ...],
        dim=-1,
    )
    # add loc and scale to past_target_patches as additional features
    log_abs_loc = loc.abs().log1p()
    log_scale = scale.log()
    expanded_static_feat = unsqueeze_expand(
        torch.cat([log_abs_loc, log_scale], dim=-1),
        dim=1,
        size=lags.shape[1],
    )
    inputs = torch.cat((lags, expanded_static_feat), dim=-1)
    # project patches
    enc_in = self.patch_proj(inputs)
    embed_pos = self.positional_encoding(enc_in.size())
    # transformer encoder with positional encoding
    enc_out = self.encoder(enc_in + embed_pos)
    # flatten and project to prediction length * d_model
    flatten_out = self.flatten(enc_out.flatten(start_dim=1))
    # project to distribution arguments
    distr_args = self.args_proj(
        flatten_out.reshape(-1, self.prediction_length, self.d_model)
    )
    return distr_args, loc, scale