class_docstr: An optimizer which applies some "post-processing operation" per variable
  (e.g. clipping, quantization) after the gradient update.
class_docstr_tok: ["An","optimizer","which","applies","some","``","post-processing","operation","''","per","variable","(","e.g",".","clipping",",","quantization",")","after","the","gradient","update","."]
code: def apply_gradients(
      self, grads_and_vars, global_step=None, name=None
  ):
      update_op = super(PostProcessOptimizer, self).apply_gradients(
          grads_and_vars, global_step
      )
      ops = []
      with tf.control_dependencies([update_op]):
          for _, var in grads_and_vars:
              with self._maybe_colocate(var):
                  op = self._func(var)
                  if op is not None:
                      assert isinstance(op, tf.Operation), op
                      ops.append(op)
      update_op = tf.group(update_op, *ops, name=name)
      return update_op
  
imports: from contextlib import contextmanager
  import tensorflow
  from ..tfutils.common import get_tf_version_tuple
  from ..compat import tfv1
  from ..utils.develop import HIDE_DOC
  from .gradproc import FilterNoneGrad, GradientProcessor
label_desc: Use image node_id 2 for calling the PostProcessOptimizer obj's underlying member method code with example usage: obj.apply_gradients(grads_and_vars, global_step, name) and returns: update_op