def forward(self, local_obs: torch.Tensor, global_obs: torch.Tensor) -> ttorch.Tensor:
        """
        **Overview**:
            The computation graph of CTDE actor-critic network, processing all agents' ``local_obs`` and ``global_obs`` and output
            corresponding policy logit and value in parallel.
            There are two possible designs for ``global_obs`` : The former is a shared global state for all agents, i.e. $$(B, S)$$.
            Tha latter is a kind of agent-specific global state, i.e. $$(B, A, S')$$.
            For more details, you can refer to <link https://di-engine-docs.readthedocs.io/zh_CN/latest/04_best_practice/marl_zh.html#id10 link>.
        """
        # Call policy network with local obs and critic network with global obs respectively.
        policy = self.policy_head(self.local_encoder(local_obs))
        value = self.value_head(self.global_encoder(global_obs))
        return ttorch.as_tensor({
            'logit': policy,
            'value': value,
        })

        **Overview**:
            The computation graph of CTDE actor-critic network, processing all agents' ``local_obs`` and ``global_obs`` and output
            corresponding policy logit and value in parallel.
            There are two possible designs for ``global_obs`` : The former is a shared global state for all agents, i.e. $$(B, S)$$.
            Tha latter is a kind of agent-specific global state, i.e. $$(B, A, S')$$.
            For more details, you can refer to <link https://di-engine-docs.readthedocs.io/zh_CN/latest/04_best_practice/marl_zh.html#id10 link>.
        
chapter6_marl/marl_network.py