code: def validate_qmin_qmax(quant_min: int, quant_max: int) -> None:
      r"""Validates that the user-specified quantization range is properly initialized
      and within the given bound supported by the observer dtype.
  
      To accommodate lower-bit quantization with respect to the existing torch.qint8 and
      torch.quint8 datatypes, the user can choose to use dynamic quantization range by passing
      in a tuple of initial qmin and qmax values. One use case is these customized qmin and qmax
      values are used to calculate static estimates of the scale and zero point for aggressive lower-bit
      fake quantization. These estimates are compared against parameters learned through backpropagation.
      The related literatures for scale and zero point via backpropagation are as follows:
  
      Learned Step Size Quantization: https://openreview.net/pdf?id=rkgO66VKDS
      Trained Quantization Thresholds: https://arxiv.org/pdf/1903.08066.pdf
      """
      # The variable names are prefixed with "initial" because their values (qmin and qmax) might be adjusted
      # based on whether quantization range is reduced and the datatype (signed/unsigned) used by the observer.
      assert (
          quant_min <= 0 <= quant_max
      ), "Used-specified quantization range must include 0."
      assert (
          quant_min < quant_max
      ), "qmin must be strictly less than qmax for user-specified quantization range."
  
imports: import functools
  import warnings
  from collections import OrderedDict
  from inspect import getfullargspec, signature
  from typing import Any, Callable, Dict, Optional, Tuple, Union
  import torch
  from torch.ao.quantization.quant_type import QuantType
  from torch.fx import Node
  from torch.nn.utils.parametrize import is_parametrized
label_desc: Use image node_id 28 for calling a global function with example usage: validate_qmin_qmax(quant_min, quant_max) without return types