class_docstr: Piecewise constant decay with warmup schedule.
code: def __call__(self, step):
      if tf.executing_eagerly():
          return self._get_learning_rate(step)
  
      # In an eager function or graph, the current implementation of optimizer
      # repeatedly call and thus create ops for the learning rate schedule. To
      # avoid this, we cache the ops if not executing eagerly.
      graph = tf.compat.v1.get_default_graph()
      if graph not in self.learning_rate_ops_cache:
          if self.compute_lr_on_cpu:
              with tf.device("/device:CPU:0"):
                  self.learning_rate_ops_cache[
                      graph
                  ] = self._get_learning_rate(step)
          else:
              self.learning_rate_ops_cache[
                  graph
              ] = self._get_learning_rate(step)
      return self.learning_rate_ops_cache[graph]
  
imports: from __future__ import absolute_import
  from __future__ import division
  from __future__ import print_function
  import os
  from absl import flags
  import numpy
  import tensorflow
  from tensorflow.python.keras.optimizer_v2 import gradient_descent
  from utils.flags import core
  from utils.misc import keras_utils
label_desc: Use image node_id 2 for calling the PiecewiseConstantDecayWithWarmup obj's underlying member method code with example usage: obj.__call__(step) and returns: self, self