code: def simulate(self, action):
      
      with tf.name_scope('environment/simulate'):
        if action.dtype in (tf.float16, tf.float32, tf.float64):
          action = tf.check_numerics(action, 'action')
        observ_dtype = self._parse_dtype(self._batch_env.observation_space)
        observ, reward, done = tf.py_func(
            lambda a: self._batch_env.step(a)[:3], [action],
            [observ_dtype, tf.float32, tf.bool], name='step')
        observ = tf.check_numerics(observ, 'observ')
        reward = tf.check_numerics(reward, 'reward')
        return tf.group(
            self._observ.assign(observ),
            self._action.assign(action),
            self._reward.assign(reward),
            self._done.assign(done))
docs: Step the batch of environments.
  
      The results of the step can be accessed from the variables defined below.
  
      Args:
        action: Tensor holding the batch of actions to apply.
  
      Returns:
        Operation.