class_docstr: Determines whether input-weight equalization can help improve quantization for certain modules.
  
  Specifically, this list of modules includes:
      linear
      conv
  
  Determines whether input-weight equalization is recommended based on the comp stat:
      s_c = sqrt(w_c/W)/sqrt(i_c/I)
      where:
          w_c is range of weight for channel c, W is range of weight over all channels
          i_c is range of input for channel c, I is range of input over all channels
  
      if s_c >= threshold or <= 1 / threshold, recommends input-weight equalization
  
  Args:
      ratio_threshold (float): The threshold for s_c to determine if input-weight equalization is suggested
          Should be between 0 and 1 (both non-inclusive)
      ch_axis (int, optional): The channel axis being observed to determine input weight equalization
          Default: 1
  
  * :attr:`ratio_threshold`: The threshold for s_c to determine if input-weight equalization is suggested
      Should be between 0 and 1
  
  * :attr:`ch_axis`: The channel axis being observed to determine input weight equalization
  
  * :attr:`SUPPORTED_MODULES`: This specifies the modules that are supported for input-weight equalization
  
  * :attr:`DEFAULT_PRE_OBSERVER_NAME`: The name of the pre-observer to be inserted for this detector
class_docstr_tok: ["Determines","whether","input-weight","equalization","can","help","improve","quantization","for","certain","modules",".","Specifically",",","this","list","of","modules","includes",":","linear","conv","Determines","whether","input-weight","equalization","is","recommended","based","on","the","comp","stat",":","s_c","=","sqrt","(","w_c\/W",")","\/sqrt","(","i_c\/I",")","where",":","w_c","is","range","of","weight","for","channel","c",",","W","is","range","of","weight","over","all","channels","i_c","is","range","of","input","for","channel","c",",","I","is","range","of","input","over","all","channels","if","s_c",">","=","threshold","or","<","=","1","\/","threshold",",","recommends","input-weight","equalization","Args",":","ratio_threshold","(","float",")",":","The","threshold","for","s_c","to","determine","if","input-weight","equalization","is","suggested","Should","be","between","0","and","1","(","both","non-inclusive",")","ch_axis","(","int",",","optional",")",":","The","channel","axis","being","observed","to","determine","input","weight","equalization","Default",":","1","*",":","attr",":","`","ratio_threshold","`",":","The","threshold","for","s_c","to","determine","if","input-weight","equalization","is","suggested","Should","be","between","0","and","1","*",":","attr",":","`","ch_axis","`",":","The","channel","axis","being","observed","to","determine","input","weight","equalization","*",":","attr",":","`","SUPPORTED_MODULES","`",":","This","specifies","the","modules","that","are","supported","for","input-weight","equalization","*",":","attr",":","`","DEFAULT_PRE_OBSERVER_NAME","`",":","The","name","of","the","pre-observer","to","be","inserted","for","this","detector"]
docstr: Takes in an info dict and calculates the s_c matrix.
  
  Args:
      info_dict (dict): A dictionary of either input or weight range info
      info_str (str): A str describing whether currently looking at weight or input info
          Either "weight" or "input"
      module_fqn (str): The fqn of the module we are looking at
  
  Returns a tensor of values, where each value is the s_c stat for a different channel
docstr_tok: ["Takes","in","an","info","dict","and","calculates","the","s_c","matrix",".","Args",":","info_dict","(","dict",")",":","A","dictionary","of","either","input","or","weight","range","info","info_str","(","str",")",":","A","str","describing","whether","currently","looking","at","weight","or","input","info","Either","``","weight","''","or","``","input","''","module_fqn","(","str",")",":","The","fqn","of","the","module","we","are","looking","at","Returns","a","tensor","of","values",",","where","each","value","is","the","s_c","stat","for","a","different","channel"]
code: def _calculate_range_ratio(
      self, info_dict: Dict, info_str: str, module_fqn: str
  ) -> torch.Tensor:
      r"""
      Takes in an info dict and calculates the s_c matrix.
  
      Args:
          info_dict (dict): A dictionary of either input or weight range info
          info_str (str): A str describing whether currently looking at weight or input info
              Either "weight" or "input"
          module_fqn (str): The fqn of the module we are looking at
  
      Returns a tensor of values, where each value is the s_c stat for a different channel
      """
      # calculate the ratios of the info
      # get the prefix str
      prefix_str = (
          self.ACTIVATION_PREFIX
          if info_str == self.INPUT_STR
          else self.WEIGHT_PREFIX
      )
  
      per_channel_range = (
          info_dict[prefix_str + self.PER_CHANNEL_MAX_KEY]
          - info_dict[prefix_str + self.PER_CHANNEL_MIN_KEY]
      )
      global_range = (
          info_dict[prefix_str + self.GLOBAL_MAX_KEY]
          - info_dict[prefix_str + self.GLOBAL_MIN_KEY]
      )
  
      if global_range == 0:
          range_zero_explanation = "We recommend removing this channel as it doesn't provide any useful information."
          raise ValueError(
              "The range of the {} data for module {} is 0, which means you have a constant value channel. {}".format(
                  info_str, module_fqn, range_zero_explanation
              )
          )
  
      ratio = per_channel_range / global_range
  
      return ratio
  
imports: from typing import Any, Dict, Set, Tuple, Callable, List
  import torch
  import torch.nn
  import torch.ao.nn.qat
  from abc import ABC, abstractmethod
  from torch.ao.quantization.fake_quantize import FakeQuantize
  from torch.ao.quantization.fx.graph_module import GraphModule
  from torch.ao.quantization.fx._model_report.model_report_observer import ModelReportObserver
  from torch.ao.quantization.qconfig import QConfig, default_qconfig, _assert_valid_qconfig
  from torch.ao.quantization.observer import ObserverBase, default_dynamic_quant_observer, default_per_channel_weight_observer, default_observer, default_weight_observer
  from torch.ao.quantization.fx._equalize import default_equalization_qconfig, EqualizationQConfig
  from torch.ao.quantization.observer import _is_activation_post_process
label_desc: Use image node_id 8 for calling the InputWeightEqualizationDetector obj's underlying member method code with example usage: obj._calculate_range_ratio(info_dict, info_str, module_fqn) and returns: ratio