code: def _unroll_mac(model, obs_tensor):
      """Computes the estimated Q values for an entire trajectory batch"""
      B = obs_tensor.size(0)
      T = obs_tensor.size(1)
      n_agents = obs_tensor.size(2)
  
      mac_out = []
      h = [
          s.expand([B, n_agents, -1]) for s in model.get_initial_state()
      ]
      for t in range(T):
          q, h = _mac(model, obs_tensor[:, t], h)
          mac_out.append(q)
      mac_out = torch.stack(mac_out, dim=1)  # Concat over time
  
      return mac_out
  
imports: import logging
  from typing import Dict, List, Optional, Tuple
  import gymnasium
  import numpy
  import tree
  from rllib_qmix.qmix.mixers import QMixer, VDNMixer
  from rllib_qmix.qmix.model import RNNModel, _get_size
  from ray.rllib.env.multi_agent_env import ENV_STATE
  from ray.rllib.env.wrappers.group_agents_wrapper import GROUP_REWARDS
  from ray.rllib.models.catalog import ModelCatalog
  from ray.rllib.models.modelv2 import _unpack_obs
  from ray.rllib.models.torch.torch_action_dist import TorchCategorical
  from ray.rllib.policy.rnn_sequencing import chop_into_sequences
  from ray.rllib.policy.sample_batch import SampleBatch
  from ray.rllib.policy.torch_policy import TorchPolicy
  from ray.rllib.utils.annotations import override
  from ray.rllib.utils.framework import try_import_torch
  from ray.rllib.utils.metrics.learner_info import LEARNER_STATS_KEY
  from ray.rllib.utils.torch_utils import apply_grad_clipping
  from ray.rllib.utils.typing import TensorType
label_desc: Use image node_id 3 for calling a global function with example usage: _unroll_mac(model, obs_tensor) and returns: mac_out