def forward(self, x_in: PLModuleInput) -> torch.Tensor:
        # x_hist contains the historical time series data and the historical
        """TSMixer model forward pass.

        Parameters
        ----------
        x_in
            comes as Tuple `(x_past, x_future, x_static)` where `x_past` is the input/past chunk and
            `x_future` is the output/future chunk. Input dimensions are `(batch_size, time_steps,
            components)`.

        Returns
        -------
        torch.torch.Tensor
            The output  Tensorof shape `(batch_size, output_chunk_length, output_dim, nr_params)`.
        """
        # B: batch size
        # L: input chunk length
        # T: output chunk length
        # C: target components
        # P: past cov features
        # F: future cov features
        # S: static cov features
        # H = C + P + F: historic features
        # H_S: hidden Size
        # N_P: likelihood parameters

        # `x`: (B, L, H), `x_future`: (B, T, F), `x_static`: (B, C or 1, S)
        x, x_future, x_static = x_in

        # swap feature and time dimensions (B, L, H) -> (B, H, L)
        x = _time_to_feature(x)
        # linear transformations to horizon (B, H, L) -> (B, H, T)
        x = self.fc_hist(x)
        # (B, H, T) -> (B, T, H)
        x = _time_to_feature(x)

        # feature mixing for historical features (B, T, H) -> (B, T, H_S)
        x = self.feature_mixing_hist(x)
        if self.future_cov_dim:
            # feature mixing for future features (B, T, F) -> (B, T, H_S)
            x_future = self.feature_mixing_future(x_future)
            # (B, T, H_S) + (B, T, H_S) -> (B, T, 2*H_S)
            x = torch.cat([x, x_future], dim=-1)

        if self.static_cov_dim:
            # (B, C, S) -> (B, 1, C * S)
            x_static = x_static.reshape(x_static.shape[0], 1, -1)
            # repeat to match horizon (B, 1, C * S) -> (B, T, C * S)
            x_static = x_static.repeat(1, self.output_chunk_length, 1)

        for mixing_layer in self.conditional_mixer:
            # conditional mixer layers with static covariates (B, T, 2 * H_S), (B, T, C * S) -> (B, T, H_S)
            x = mixing_layer(x, x_static=x_static)

        # linear transformation to generate the forecast (B, T, H_S) -> (B, T, C * N_P)
        x = self.fc_out(x)
        # (B, T, C * N_P) -> (B, T, C, N_P)
        x = x.view(-1, self.output_chunk_length, self.output_dim, self.nr_params)
        return x
TSMixer model forward pass.

        Parameters
        ----------
        x_in
            comes as Tuple `(x_past, x_future, x_static)` where `x_past` is the input/past chunk and
            `x_future` is the output/future chunk. Input dimensions are `(batch_size, time_steps,
            components)`.

        Returns
        -------
        torch.torch.Tensor
            The output  Tensorof shape `(batch_size, output_chunk_length, output_dim, nr_params)`.
        
darts/models/forecasting/tsmixer_model.py