code: def _build_discrete_net(self, input_layer, action_space):
      num_actions = len(action_space.actions)
      self.actions = tf.placeholder(tf.int32, [None], name="actions")
  
      self.old_policy_mean = tf.placeholder(
          tf.float32, [None, num_actions], "old_policy_mean"
      )
      self.old_policy_std = tf.placeholder(
          tf.float32, [None, num_actions], "old_policy_std"
      )
  
      # Policy Head
      self.input = [self.actions, self.old_policy_mean]
      policy_values = self.dense_layer(num_actions)(
          input_layer, name="policy_fc"
      )
      self.policy_mean = tf.nn.softmax(policy_values, name="policy")
  
      # define the distributions for the policy and the old policy
      self.policy_distribution = tf.contrib.distributions.Categorical(
          probs=self.policy_mean
      )
      self.old_policy_distribution = (
          tf.contrib.distributions.Categorical(
              probs=self.old_policy_mean
          )
      )
  
      self.output = self.policy_mean
  
file_path: coach/rl_coach/architectures/tensorflow_components/heads/ppo_head.py
imports: import numpy
  import tensorflow
  from rl_coach.architectures.tensorflow_components.layers import Dense
  from rl_coach.architectures.tensorflow_components.heads.head import Head, normalized_columns_initializer
  from rl_coach.base_parameters import AgentParameters, DistributedTaskParameters
  from rl_coach.core_types import ActionProbabilities
  from rl_coach.spaces import BoxActionSpace, DiscreteActionSpace
  from rl_coach.spaces import SpacesDefinition
  from rl_coach.utils import eps
label_desc: Use image node_id 3 for calling the PPOHead obj's underlying member method code with example usage: obj._build_discrete_net(input_layer, action_space) without return types