code: def forward(
      self, theta: torch.Tensor, futr_exog: torch.Tensor
  ) -> Tuple[torch.Tensor, torch.Tensor]:
      backcast_basis = futr_exog[:, : -self.forecast_size, :].permute(
          0, 2, 1
      )
      forecast_basis = futr_exog[:, -self.forecast_size :, :].permute(
          0, 2, 1
      )
      cut_point = forecast_basis.shape[1]
      backcast_theta = theta[:, cut_point:]
      forecast_theta = theta[:, :cut_point].reshape(
          len(theta), cut_point, -1
      )
  
      backcast = torch.einsum(
          "bp,bpt->bt", backcast_theta, backcast_basis
      )
      forecast = torch.einsum(
          "bpq,bpt->btq", forecast_theta, forecast_basis
      )
  
      return backcast, forecast
  
imports: from typing import Tuple, Optional
  import numpy
  import torch
  import torch.nn
  from ..losses.pytorch import MAE
  from ..common._base_windows import BaseWindows
label_desc: Use image node_id 2 for calling the ExogenousBasis obj's underlying member method code with example usage: obj.forward(theta, futr_exog) and returns: backcast,  forecast