def __init__(self, obs_shape: int, action_shape: List[int]) -> None:
        """
        **Overview**:
            The definition of multi discrete action policy network used in PPO, which uses multiple discrete head.
        """
        # PyTorch necessary requirements for extending ``nn.Module`` . Our network should also subclass this class.
        super(MultiDiscretePolicyNetwork, self).__init__()
        # Define encoder module, which maps raw state into embedding vector.
        # It could be different for various state, such as Convolution Neural Network (CNN) for image state and Multilayer perceptron (MLP) for vector state, respectively.
        # Here we use one-layer MLP for vector state, i.e.
        # $$y = max(Wx+b, 0)$$
        self.encoder = nn.Sequential(
            nn.Linear(obs_shape, 32),
            nn.ReLU(),
        )
        # Define multiple discrete head according to the concrete sub action size.
        self.head = nn.ModuleList()
        for size in action_shape:
            self.head.append(nn.Linear(32, size))

        **Overview**:
            The definition of multi discrete action policy network used in PPO, which uses multiple discrete head.
        
chapter2_action/discrete_tutorial.py