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")
        def step(action):
          step_response = self._batch_env.step(action)
          # Current env doesn't return `info`, but EnvProblem does.
          # TODO(afrozm): The proper way to do this is to make T2TGymEnv return
          # an empty info return value.
          if len(step_response) == 3:
            (observ, reward, done) = step_response
          else:
            (observ, reward, done, _) = step_response
          return (observ, reward.astype(np.float32), done)
        observ, reward, done = tf.py_func(
            step, [action],
            [self.observ_dtype, tf.float32, tf.bool], name="step")
        reward = tf.check_numerics(reward, "reward")
        reward.set_shape((len(self),))
        done.set_shape((len(self),))
        with tf.control_dependencies([self._observ.assign(observ)]):
          return tf.identity(reward), tf.identity(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.