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: Returns the DetectorQConfigInfo for each module_fqn relevant
  Args
      model (nn.Module or subclass): model to find observer insertion points
  
  Returns a Dict mapping from unique observer fqns (where we want to insert them) to:
      A DetectorQConfigInfo with the information to generate a QConfig for a specific module
docstr_tok: ["Returns","the","DetectorQConfigInfo","for","each","module_fqn","relevant","Args","model","(","nn.Module","or","subclass",")",":","model","to","find","observer","insertion","points","Returns","a","Dict","mapping","from","unique","observer","fqns","(","where","we","want","to","insert","them",")","to",":","A","DetectorQConfigInfo","with","the","information","to","generate","a","QConfig","for","a","specific","module"]
code: def get_qconfig_info(self, model) -> Dict[str, DetectorQConfigInfo]:
      r"""Returns the DetectorQConfigInfo for each module_fqn relevant
      Args
          model (nn.Module or subclass): model to find observer insertion points
  
      Returns a Dict mapping from unique observer fqns (where we want to insert them) to:
          A DetectorQConfigInfo with the information to generate a QConfig for a specific module
      """
      # run the helper function to populate the dictionary
      # find the range of inputs
      input_values: Dict[str, Dict] = self._extract_input_info(model)
  
      # find the range of weights
      weight_values: Dict[str, Dict] = self._extract_weight_info(model)
  
      # calculate per_channel comparison statistic s_c
      comp_stats: Dict[
          str, torch.Tensor
      ] = self._generate_comparison_values(input_values, weight_values)
  
      # generate the return dictionary
      input_weight_equalization_info: Dict[
          str, Dict
      ] = self._generate_dict_info(
          input_values, weight_values, comp_stats
      )
  
      # we actually have a qconfig info object we are populating
      module_fqn_to_detector_qconfig_info = {}
  
      for module_fqn in input_weight_equalization_info:
          # create a detector info instance
          detector_qconfig_info = DetectorQConfigInfo(module_fqn)
  
          # see if per channel quantization is supported
          input_weight_recommended: bool = (
              input_weight_equalization_info[module_fqn][
                  self.RECOMMENDED_KEY
              ]
          )
          detector_qconfig_info.is_equalization_recommended = (
              input_weight_recommended
          )
          module_fqn_to_detector_qconfig_info[
              module_fqn
          ] = detector_qconfig_info
  
      return module_fqn_to_detector_qconfig_info
  
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 3 for calling the InputWeightEqualizationDetector obj's underlying member method code with example usage: obj.get_qconfig_info(model) and returns: module_fqn_to_detector_qconfig_info