code: def forward(self, historical_inputs, future_inputs, cs, ch, cc):
      # [N,X_in,L] -> [N,hidden_size,L]
      historical_features, _ = self.history_vsn(historical_inputs, cs)
      history, state = self.history_encoder(
          historical_features, (ch, cc)
      )
  
      future_features, _ = self.future_vsn(future_inputs, cs)
      future, _ = self.future_encoder(future_features, state)
      # torch.cuda.synchronize() # this call gives prf boost for unknown reasons
  
      input_embedding = torch.cat(
          [historical_features, future_features], dim=1
      )
      temporal_features = torch.cat([history, future], dim=1)
      temporal_features = self.input_gate(temporal_features)
      temporal_features = temporal_features + input_embedding
      temporal_features = self.input_gate_ln(temporal_features)
      return temporal_features
  
imports: import torch
  import torch.nn
  import torch.nn.functional
  from torch import Tensor
  from torch.nn import LayerNorm
  import logging
  import warnings
  from typing import Tuple, Optional
  from ..losses.pytorch import MAE
  from ..common._base_windows import BaseWindows
label_desc: Use image node_id 2 for calling the TemporalCovariateEncoder obj's underlying member method code with example usage: obj.forward(historical_inputs, future_inputs, cs, ch, cc) and returns: temporal_features