text: from abc import ABCMeta, abstractmethod
  
  from ray.rllib.utils.framework import check_framework
  
  
  class Schedule(metaclass=ABCMeta):
      """
      Schedule classes implement various time-dependent scheduling schemas, such
      as:
      - Constant behavior.
      - Linear decay.
      - Piecewise decay.
  
      Useful for backend-agnostic rate/weight changes for learning rates,
      exploration epsilons, beta parameters for prioritized replay, loss weights
      decay, etc..
  
      Each schedule can be called directly with the `t` (absolute time step)
      value and returns the value dependent on the Schedule and the passed time.
      """
  
      def __init__(self, framework=None):
          # TODO(sven): replace with .tf_value() / torch_value() methods that
          # can be applied late binding, so no need to set framework during
          # construction.
          self.framework = check_framework(framework)
  
      @abstractmethod
      def value(self, t):
          """
          Returns the value based on a time value.
  
          Args:
              t (int): The time value (e.g. a time step).
                  NOTE: This could be a tf.Tensor.
  
          Returns:
              any: The calculated value depending on the schedule and `t`.
          """
          raise NotImplementedError
  
      def __call__(self, t):
          """
          Simply calls `self.value(t)`.
          """
          return self.value(t)
  