Ë
    g^(h³~  ã                   ó  — d dl Z d dlZd dlmZmZmZ d dlZd dlmZ d dl	m
Z
 ddlmZmZ ddlmZ ddlmZmZmZ dd	lmZ dd
lmZ ddlmZ ddlmZmZmZ ddlmZm Z  ddl!m"Z" deeejF                  jH                  f   de%e&ef   ddfd„Z'dejF                  jH                  ddfd„Z(deddfd„Z)dejF                  jH                  ddfd„Z*	 	 d0dede+deee%e&ef   df   deee%e&ef   df   def
d„Z,	 	 	 	 d1dejF                  jH                  dee"e%e&ef   f   de+de-edf   deee%e&ef   df   deee"e%e&ef   f      deee%e&ef   df   de+defd „Z.	 	 d0dejF                  jH                  dee"e%e&ef   f   de+de-edf   deee%e&ef   df   deee%e&ef   df   defd!„Z/	 	 d0dejF                  jH                  deee%e&ef   df   deee%e&ef   df   defd"„Z0	 	 	 d2dejF                  jH                  dee"e%e&ef   f   de-edf   deee%e&ef   df   deee"e%e&ef   f      deee%e&ef   df   defd#„Z1	 	 d0dejF                  jH                  dee"e%e&ef   f   de-edf   deee%e&ef   df   deee%e&ef   df   defd$„Z2	 	 	 	 	 	 	 d3d%ed&e+d'eee%e&ef   df   de+d(e+dee"e%e&ef   df   deee%e&ef   df   d)e+d*e+defd+„Z3	 	 	 	 	 d4d%ed'eee%e&ef   df   d(e+dee"e%e&ef   df   deee%e&ef   df   d*e+defd,„Z4	 	 	 	 d5d%ed'eee%e&ef   df   d(e+dee"e%e&ef   df   deee%e&ef   df   defd-„Z5	 	 	 d2d%ed'eee%e&ef   df   dee"e%e&ef   df   deee%e&ef   df   def
d.„Z6	 	 d6d%ed&e+d'eee%e&ef   df   defd/„Z7y)7é    N)ÚAnyÚOptionalÚUnion)ÚGraphModule)Ú_USER_PRESERVED_ATTRIBUTES_KEYé   )ÚBackendConfigÚget_tensorrt_backend_config)Úconvert)ÚConvertCustomConfigÚFuseCustomConfigÚPrepareCustomConfig)Úfuse)ÚObservedGraphModule)Úprepare)ÚQuantizationTracerÚScopeÚScopeContextManager)Úget_custom_module_class_keysÚ#get_skipped_module_name_and_classes)ÚQConfigMappingÚmodelÚpreserved_attrsÚreturnc                 ó¼   — t        j                   |«      | j                  t        <   | j                  t           j                  «       D ]  \  }}t	        | ||«       Œ y)zXStore preserved attributes to the model.meta so that it can be preserved during deepcopyN)ÚcopyÚmetar   ÚitemsÚsetattr)r   r   Ú	attr_nameÚattrs       ú_/var/www/skyplay_api_hub/venv/lib/python3.12/site-packages/torch/ao/quantization/quantize_fx.pyÚattach_preserved_attrs_to_modelr#      sP   € ô
 26·±¸?Ó1K€E‡J�JÔ-Ñ.ð !Ÿ:™:Ô&DÑE×KÑKÓMò (‰ˆ	�4Ü��y $Õ'ñ(ó    c                 óp   — t        | t        «      s&t        dt        t	        | «      «      z   dz   dz   «      ‚y )Nz,input model must be a GraphModule, Got type:z Please make zsure to follow the tutorials.)Ú
isinstancer   Ú
ValueErrorÚstrÚtype)r   s    r"   Ú_check_is_graph_moduler*   #   sH   € Ü�eœ[Ô)Üðä”$�u“+Óñð ñð .ñ	.ó
ð 	
ð *r$   c                 ób   — | j                   j                  D ]  }t        |d«      rŒi |_        Œ y)a¾  Attach meta field to all nodes of the graph if it does not exist,
    meta field is a field stores some meta information about the node, such
    as dtype and shape information for output of the node, this only exists
    if the program is captured by make_fx (used in quantize_pt2e flow), if
    the program is captured by torch.fx symbolic tracing, this field may not exist,
    so we add it here to avoid checking this all over the places
    r   N)ÚgraphÚnodesÚhasattrr   )r   Únodes     r"   Ú!_attach_meta_to_node_if_not_existr0   .   s.   € ð —‘×!Ñ!ò ˆÜ�t˜VÕ$ØˆD�Iñr$   c                 óˆ  — g }| j                  «       D ]Z  \  }}t        |t        j                  j                  j
                  j                  «      r|j                  |«       ŒPt        |«       Œ\ |D ]N  }| j                  |= t        j                  j                  j
                  j                  «       | j                  |<   ŒP y)z+Swap FloatFunctional with FXFloatFunctionalN)Únamed_childrenr&   ÚtorchÚaoÚnnÚ	quantizedÚFloatFunctionalÚappendÚ_swap_ff_with_fxffÚ_modulesÚFXFloatFunctional)r   Úmodules_to_swapÚnameÚmodules       r"   r9   r9   ;   s›   € à€OØ×,Ñ,Ó.ò '‰ˆˆfÜ�fœeŸh™hŸk™k×3Ñ3×CÑCÔDØ×"Ñ" 4Õ(ä˜vÕ&ð	'ð  ò IˆØ�N‰N˜4Ð Ü$Ÿx™xŸ{™{×4Ñ4×FÑFÓHˆ�‰�tÒñIr$   Úis_qatÚfuse_custom_configÚbackend_configc                 ó4   — t        | «       t        | |||«      S )zªInternal helper function to fuse modules in preparation for quantization

    Args:
        model: GraphModule object from symbolic tracing (torch.fx.symbolic_trace)
    )r*   r   )r   r?   r@   rA   s       r"   Ú_fuse_fxrC   I   s#   € ô ˜5Ô!ÜØˆvÐ)¨>óð r$   Úqconfig_mappingÚexample_inputs.Úprepare_custom_configÚ_equalization_configÚis_standalone_modulec                 ót  — |€
t        «       }|€
t        «       }t        |t        «      r1t	        j
                  dt        d¬«       t        j                  |«      }t        | «       t        ||«      \  }}	|j                  }
|
D �ci c]  }t        | |«      r|t        | |«      “Œ }}t        ||	«      }t        | |j                  | «      «      }t!        |«       t#        «       j%                  |j                  «      }t'        ||||«      }t)        ||||j*                  |||||¬«	      }t-        ||«       |S c c}w )aZ  Internal helper function for prepare_fx
        Args:
          `model`, `qconfig_mapping`, `prepare_custom_config`, `_equalization_config`:
          see docs for :func:`~torch.ao.quantization.prepare_fx`
          `is_standalone_module`: a boolean flag indicates whether we are
          quantizing a standalone module or not, a standalone module
          is a submodule of the parent module that is not inlined in the
    forward graph of the parent module,
          the way we quantize standalone module is described in:
          :func:`~torch.ao.quantization._prepare_standalone_module_fx`
    zšPassing a prepare_custom_config_dict to prepare is deprecated and will not be supported in a future version. Please pass in a PrepareCustomConfig instead.é   ©Ú
stacklevel)rE   rF   rG   rA   rH   )r   r   r&   ÚdictÚwarningsÚwarnÚFutureWarningÚ	from_dictr9   r   Úpreserved_attributesr.   Úgetattrr   r   Útracer0   r   Úset_preserved_attributesrC   r   Únode_name_to_scoper#   )r   rD   r?   rE   rF   rG   rA   rH   Úskipped_module_namesÚskipped_module_classesÚpreserved_attr_namesr!   r   ÚtracerÚgraph_moduler@   Úprepareds                    r"   Ú_prepare_fxr]   Z   s[  € ð* Ð$Ü 3Ó 5ÐØÐ#Ü-Ó/ÐäÐ'¬Ô.Ü�‰ðQäØõ		
ô !4× =Ñ =Ð>SÓ TÐô �uÔä3VØÐ3ó4Ñ0ÐÐ0ð 1×EÑEÐð )öàÜ�5˜$Ôð 	Œg�e˜TÓ"Ñ"ð€Oð ô  Ð 4Ð6LÓM€FÜ˜u f§l¡l°5Ó&9Ó:€LÜ% lÔ3ä)Ó+×DÑDØ×2Ñ2óÐô ˜L¨&Ð2DÀnÓU€LÜØØØØ×!Ñ!Ø%Ø3Ø1Ø%Ø1ô
€Hô $ H¨oÔ>Ø€Oùò7s   Â D5c           	      ó&   — t        | |||||d¬«      S )a  [Internal use only] Prepare a standalone module, so that it can be used when quantizing the
    parent module.
    standalone_module means it a submodule that is not inlined in parent module,
    and will be quantized separately as one unit.

    How the standalone module is observed is specified by `input_quantized_idxs` and
    `output_quantized_idxs` in the prepare_custom_config for the standalone module

    Returns:

        * model(GraphModule): prepared standalone module. It has these attributes in
          model.meta:

            * `standalone_module_input_quantized_idxs(List[Int])`: a list of
              indexes for the graph input that is expected to be quantized,
              same as input_quantized_idxs configuration provided
              for the standalone module
            * `standalone_module_output_quantized_idxs(List[Int])`: a list of
              indexs for the graph output that is quantized
              same as input_quantized_idxs configuration provided
              for the standalone module

    T)rA   rH   )r]   )r   rD   r?   rE   rF   rA   s         r"   Ú_prepare_standalone_module_fxr_   ¢   s&   € ô> ØØØØØØ%Ø!ôð r$   c                 óÔ  — |€
t        «       }t        |t        «      r1t        j                  dt
        d¬«       t        j                  |«      }t        j                  j                  d«       |j                  }|D �ci c]  }t        | |«      r|t        | |«      “Œ }}t        j                  j                  | «      }t        |«       t!        |d||«      }t#        ||«       |S c c}w )a  Fuse modules like conv+bn, conv+bn+relu etc, model must be in eval mode.
    Fusion rules are defined in torch.ao.quantization.fx.fusion_pattern.py

    Args:

        * `model` (torch.nn.Module): a torch.nn.Module model
        * `fuse_custom_config` (FuseCustomConfig): custom configurations for fuse_fx.
            See :class:`~torch.ao.quantization.fx.custom_config.FuseCustomConfig` for more details
    Example::

        from torch.ao.quantization import fuse_fx
        m = Model().eval()
        m = fuse_fx(m)

    z‘Passing a fuse_custom_config_dict to fuse is deprecated and will not be supported in a future version. Please pass in a FuseCustomConfig instead.é   rK   z$quantization_api.quantize_fx.fuse_fxF)r   r&   rM   rN   rO   rP   rQ   r3   Ú_CÚ_log_api_usage_oncerR   r.   rS   ÚfxÚsymbolic_tracer0   rC   r#   )r   r@   rA   rY   r!   r   r[   s          r"   Úfuse_fxrf   Ì   sâ   € ð( Ð!Ü-Ó/ÐäÐ$¤dÔ+Ü�‰ðNäØõ		
ô .×7Ñ7Ð8JÓKÐä	‡H�H× Ñ Ð!GÔHØ-×BÑBÐð )öàÜ�5˜$Ôð 	Œg�e˜TÓ"Ñ"ð€Oð ô —8‘8×*Ñ*¨5Ó1€LÜ% lÔ3Ü˜L¨%Ð1CÀ^ÓT€Lä# L°/ÔBØÐùòs   Á= C%c           	      ób   — t         j                  j                  d«       t        | |d||||«      S )aÜ   Prepare a model for post training quantization

    Args:
      * `model` (torch.nn.Module): torch.nn.Module model

      * `qconfig_mapping` (QConfigMapping): QConfigMapping object to configure how a model is
         quantized, see :class:`~torch.ao.quantization.qconfig_mapping.QConfigMapping`
         for more details

      * `example_inputs` (Tuple[Any, ...]): Example inputs for forward function of the model,
         Tuple of positional args (keyword args can be passed as positional args as well)

      * `prepare_custom_config` (PrepareCustomConfig): customization configuration for quantization tool.
          See :class:`~torch.ao.quantization.fx.custom_config.PrepareCustomConfig` for more details

      * `_equalization_config`: config for specifying how to perform equalization on the model

      * `backend_config` (BackendConfig): config that specifies how operators are quantized
         in a backend, this includes how the operators are observed,
         supported fusion patterns, how quantize/dequantize ops are
         inserted, supported dtypes etc. See :class:`~torch.ao.quantization.backend_config.BackendConfig` for more details

    Return:
      A GraphModule with observer (configured by qconfig_mapping), ready for calibration

    Example::

        import torch
        from torch.ao.quantization import get_default_qconfig_mapping
        from torch.ao.quantization.quantize_fx import prepare_fx

        class Submodule(torch.nn.Module):
            def __init__(self) -> None:
                super().__init__()
                self.linear = torch.nn.Linear(5, 5)
            def forward(self, x):
                x = self.linear(x)
                return x

        class M(torch.nn.Module):
            def __init__(self) -> None:
                super().__init__()
                self.linear = torch.nn.Linear(5, 5)
                self.sub = Submodule()

            def forward(self, x):
                x = self.linear(x)
                x = self.sub(x) + x
                return x

        # initialize a floating point model
        float_model = M().eval()

        # define calibration function
        def calibrate(model, data_loader):
            model.eval()
            with torch.no_grad():
                for image, target in data_loader:
                    model(image)

        # qconfig is the configuration for how we insert observers for a particular
        # operator
        # qconfig = get_default_qconfig("fbgemm")
        # Example of customizing qconfig:
        # qconfig = torch.ao.quantization.QConfig(
        #    activation=MinMaxObserver.with_args(dtype=torch.qint8),
        #    weight=MinMaxObserver.with_args(dtype=torch.qint8))
        # `activation` and `weight` are constructors of observer module

        # qconfig_mapping is a collection of quantization configurations, user can
        # set the qconfig for each operator (torch op calls, functional calls, module calls)
        # in the model through qconfig_mapping
        # the following call will get the qconfig_mapping that works best for models
        # that target "fbgemm" backend
        qconfig_mapping = get_default_qconfig_mapping("fbgemm")

        # We can customize qconfig_mapping in different ways.
        # e.g. set the global qconfig, which means we will use the same qconfig for
        # all operators in the model, this can be overwritten by other settings
        # qconfig_mapping = QConfigMapping().set_global(qconfig)
        # e.g. quantize the linear submodule with a specific qconfig
        # qconfig_mapping = QConfigMapping().set_module_name("linear", qconfig)
        # e.g. quantize all nn.Linear modules with a specific qconfig
        # qconfig_mapping = QConfigMapping().set_object_type(torch.nn.Linear, qconfig)
        # for a more complete list, please see the docstring for :class:`torch.ao.quantization.QConfigMapping`
        # argument

        # example_inputs is a tuple of inputs, that is used to infer the type of the
        # outputs in the model
        # currently it's not used, but please make sure model(*example_inputs) runs
        example_inputs = (torch.randn(1, 3, 224, 224),)

        # TODO: add backend_config after we split the backend_config for fbgemm and qnnpack
        # e.g. backend_config = get_default_backend_config("fbgemm")
        # `prepare_fx` inserts observers in the model based on qconfig_mapping and
        # backend_config. If the configuration for an operator in qconfig_mapping
        # is supported in the backend_config (meaning it's supported by the target
        # hardware), we'll insert observer modules according to the qconfig_mapping
        # otherwise the configuration in qconfig_mapping will be ignored
        #
        # Example:
        # in qconfig_mapping, user sets linear module to be quantized with quint8 for
        # activation and qint8 for weight:
        # qconfig = torch.ao.quantization.QConfig(
        #     observer=MinMaxObserver.with_args(dtype=torch.quint8),
        #     weight=MinMaxObserver.with-args(dtype=torch.qint8))
        # Note: current qconfig api does not support setting output observer, but
        # we may extend this to support these more fine grained control in the
        # future
        #
        # qconfig_mapping = QConfigMapping().set_object_type(torch.nn.Linear, qconfig)
        # in backend config, linear module also supports in this configuration:
        # weighted_int8_dtype_config = DTypeConfig(
        #   input_dtype=torch.quint8,
        #   output_dtype=torch.quint8,
        #   weight_dtype=torch.qint8,
        #   bias_type=torch.float)

        # linear_pattern_config = BackendPatternConfig(torch.nn.Linear) \
        #    .set_observation_type(ObservationType.OUTPUT_USE_DIFFERENT_OBSERVER_AS_INPUT) \
        #    .add_dtype_config(weighted_int8_dtype_config) \
        #    ...

        # backend_config = BackendConfig().set_backend_pattern_config(linear_pattern_config)
        # `prepare_fx` will check that the setting requested by suer in qconfig_mapping
        # is supported by the backend_config and insert observers and fake quant modules
        # in the model
        prepared_model = prepare_fx(float_model, qconfig_mapping, example_inputs)
        # Run calibration
        calibrate(prepared_model, sample_inference_data)
    z'quantization_api.quantize_fx.prepare_fxF©r3   rb   rc   r]   )r   rD   rE   rF   rG   rA   s         r"   Ú
prepare_fxri   ü   s:   € ôV 
‡H�H× Ñ Ð!JÔKÜØØØØØØØóð r$   c                 ób   — t         j                  j                  d«       t        | |d|||¬«      S )að  Prepare a model for quantization aware training

    Args:
      * `model` (torch.nn.Module): torch.nn.Module model
      * `qconfig_mapping` (QConfigMapping): see :func:`~torch.ao.quantization.prepare_fx`
      * `example_inputs` (Tuple[Any, ...]): see :func:`~torch.ao.quantization.prepare_fx`
      * `prepare_custom_config` (PrepareCustomConfig): see :func:`~torch.ao.quantization.prepare_fx`
      * `backend_config` (BackendConfig): see :func:`~torch.ao.quantization.prepare_fx`

    Return:
      A GraphModule with fake quant modules (configured by qconfig_mapping and backend_config), ready for
      quantization aware training

    Example::

        import torch
        from torch.ao.quantization import get_default_qat_qconfig_mapping
        from torch.ao.quantization.quantize_fx import prepare_qat_fx

        class Submodule(torch.nn.Module):
            def __init__(self) -> None:
                super().__init__()
                self.linear = torch.nn.Linear(5, 5)
            def forward(self, x):
                x = self.linear(x)
                return x

        class M(torch.nn.Module):
            def __init__(self) -> None:
                super().__init__()
                self.linear = torch.nn.Linear(5, 5)
                self.sub = Submodule()

            def forward(self, x):
                x = self.linear(x)
                x = self.sub(x) + x
                return x

        # initialize a floating point model
        float_model = M().train()
        # (optional, but preferred) load the weights from pretrained model
        # float_model.load_weights(...)

        # define the training loop for quantization aware training
        def train_loop(model, train_data):
            model.train()
            for image, target in data_loader:
                ...

        # qconfig is the configuration for how we insert observers for a particular
        # operator
        # qconfig = get_default_qconfig("fbgemm")
        # Example of customizing qconfig:
        # qconfig = torch.ao.quantization.QConfig(
        #    activation=FakeQuantize.with_args(observer=MinMaxObserver.with_args(dtype=torch.qint8)),
        #    weight=FakeQuantize.with_args(observer=MinMaxObserver.with_args(dtype=torch.qint8)))
        # `activation` and `weight` are constructors of observer module

        # qconfig_mapping is a collection of quantization configurations, user can
        # set the qconfig for each operator (torch op calls, functional calls, module calls)
        # in the model through qconfig_mapping
        # the following call will get the qconfig_mapping that works best for models
        # that target "fbgemm" backend
        qconfig_mapping = get_default_qat_qconfig("fbgemm")

        # We can customize qconfig_mapping in different ways, please take a look at
        # the docstring for :func:`~torch.ao.quantization.prepare_fx` for different ways
        # to configure this

        # example_inputs is a tuple of inputs, that is used to infer the type of the
        # outputs in the model
        # currently it's not used, but please make sure model(*example_inputs) runs
        example_inputs = (torch.randn(1, 3, 224, 224),)

        # TODO: add backend_config after we split the backend_config for fbgemm and qnnpack
        # e.g. backend_config = get_default_backend_config("fbgemm")
        # `prepare_qat_fx` inserts observers in the model based on qconfig_mapping and
        # backend_config, if the configuration for an operator in qconfig_mapping
        # is supported in the backend_config (meaning it's supported by the target
        # hardware), we'll insert fake_quantize modules according to the qconfig_mapping
        # otherwise the configuration in qconfig_mapping will be ignored
        # see :func:`~torch.ao.quantization.prepare_fx` for a detailed explanation of
        # how qconfig_mapping interacts with backend_config
        prepared_model = prepare_qat_fx(float_model, qconfig_mapping, example_inputs)
        # Run training
        train_loop(prepared_model, train_loop)

    z+quantization_api.quantize_fx.prepare_qat_fxT)rA   rh   )r   rD   rE   rF   rA   s        r"   Úprepare_qat_fxrk   “  s7   € ô~ 
‡H�H× Ñ Ð!NÔOÜØØØØØØ%ôð r$   r[   Úis_referenceÚconvert_custom_configÚ_remove_qconfigÚis_decomposedÚkeep_original_weightsc	                 ód  — |€
t        «       }t        |t        «      r1t        j                  dt
        d¬«       t        j                  |«      }t        | «       |j                  }	|	D �
ci c]  }
t        | |
«      r|
t        | |
«      “Œ }}
t        | ||||||||¬«	      }t        ||«       |S c c}
w )z_`is_standalone_module`: see docs in :func:`~torch.ao.quantization.prepare_standalone_module_fx`zšPassing a convert_custom_config_dict to convert is deprecated and will not be supported in a future version. Please pass in a ConvertCustomConfig instead.rJ   rK   )Ú_remove_qconfig_flagrD   rA   ro   rp   )r   r&   rM   rN   rO   rP   rQ   r*   rR   r.   rS   r   r#   )r[   rl   rm   rH   rn   rD   rA   ro   rp   rY   r!   r   r6   s                r"   Ú_convert_fxrs   ý  sÑ   € ð Ð$Ü 3Ó 5ÐäÐ'¬Ô.Ü�‰ðQäØõ		
ô !4× =Ñ =Ð>SÓ TÐä˜<Ô(Ø0×EÑEÐð )öàÜ�< Ô&ð 	Œg�l DÓ)Ñ)ð€Oð ô ØØØØØ,Ø'Ø%Ø#Ø3ô
€Iô $ I¨Ô?ØÐùò's   Á) B-c           	      ód   — t         j                  j                  d«       t        | d|||||¬«      S )a�
  Convert a calibrated or trained model to a quantized model

    Args:
        * `graph_module` (torch.fx.GraphModule): A prepared and calibrated/trained model (GraphModule)

        * `convert_custom_config` (ConvertCustomConfig): custom configurations for convert function.
            See :class:`~torch.ao.quantization.fx.custom_config.ConvertCustomConfig` for more details

        * `_remove_qconfig` (bool): Option to remove the qconfig attributes in the model after convert.

        * `qconfig_mapping` (QConfigMapping): config for specifying how to convert a model for quantization.

           The keys must include the ones in the qconfig_mapping passed to `prepare_fx` or `prepare_qat_fx`,
           with the same values or `None`. Additional keys can be specified with values set to `None`.

          For each entry whose value is set to None, we skip quantizing that entry in the model::

            qconfig_mapping = QConfigMapping
                .set_global(qconfig_from_prepare)
                .set_object_type(torch.nn.functional.add, None)  # skip quantizing torch.nn.functional.add
                .set_object_type(torch.nn.functional.linear, qconfig_from_prepare)
                .set_module_name("foo.bar", None)  # skip quantizing module "foo.bar"

         * `backend_config` (BackendConfig): A configuration for the backend which describes how
            operators should be quantized in the backend, this includes quantization
            mode support (static/dynamic/weight_only), dtype support (quint8/qint8 etc.),
            observer placement for each operators and fused operators.
            See :class:`~torch.ao.quantization.backend_config.BackendConfig` for more details

    Return:
        A quantized model (torch.nn.Module)

    Example::

        # prepared_model: the model after prepare_fx/prepare_qat_fx and calibration/training
        # convert_fx converts a calibrated/trained model to a quantized model for the
        # target hardware, this includes converting the model first to a reference
        # quantized model, and then lower the reference quantized model to a backend
        # Currently, the supported backends are fbgemm (onednn), qnnpack (xnnpack) and
        # they share the same set of quantized operators, so we are using the same
        # lowering procedure
        #
        # backend_config defines the corresponding reference quantized module for
        # the weighted modules in the model, e.g. nn.Linear
        # TODO: add backend_config after we split the backend_config for fbgemm and qnnpack
        # e.g. backend_config = get_default_backend_config("fbgemm")
        quantized_model = convert_fx(prepared_model)

    z'quantization_api.quantize_fx.convert_fxF)rl   rm   rn   rD   rA   rp   ©r3   rb   rc   rs   )r[   rm   rn   rD   rA   rp   s         r"   Ú
convert_fxrv   -  s:   € ôr 
‡H�H× Ñ Ð!JÔKÜØØØ3Ø'Ø'Ø%Ø3ôð r$   c                 ób   — t         j                  j                  d«       t        | d||||¬«      S )a}  Convert a calibrated or trained model to a reference quantized model,
    see https://github.com/pytorch/rfcs/blob/master/RFC-0019-Extending-PyTorch-Quantization-to-Custom-Backends.md for more details,
    reference quantized model is a standard representation of a quantized model provided
    by FX Graph Mode Quantization, it can be further lowered to run on the target
    hardware, like accelerators

    Args:
        * `graph_module` (GraphModule): A prepared and calibrated/trained model (GraphModule)

        * `convert_custom_config` (ConvertCustomConfig): custom configurations for convert function.
            See :func:`~torch.ao.quantization.quantize_fx.convert_fx` for more details.

        * `_remove_qconfig` (bool): Option to remove the qconfig attributes in the model after convert.

        * `qconfig_mapping` (QConfigMapping): config for specifying how to convert a model for quantization.
            See :func:`~torch.ao.quantization.quantize_fx.convert_fx` for more details.

         * `backend_config` (BackendConfig): A configuration for the backend which describes how
            operators should be quantized in the backend. See
            :func:`~torch.ao.quantization.quantize_fx.convert_fx` for more details.

    Return:
        A reference quantized model (GraphModule)

    Example::

        # prepared_model: the model after prepare_fx/prepare_qat_fx and calibration/training
        # TODO: add backend_config after we split the backend_config for fbgemm and qnnpack
        # e.g. backend_config = get_default_backend_config("fbgemm")
        reference_quantized_model = convert_to_reference_fx(prepared_model)

    z4quantization_api.quantize_fx.convert_to_reference_fxT)rl   rm   rn   rD   rA   ru   )r[   rm   rn   rD   rA   s        r"   Úconvert_to_reference_fxrx   r  s7   € ôN 
‡H�H× Ñ Ð!WÔXÜØØØ3Ø'Ø'Ø%ôð r$   c           	      ód   — t         j                  j                  d«       t        | d|d||d¬«      S )a  Convert a calibrated or trained model to a reference quantized model, with
    decomposed representation for quantized Tensor
    see https://github.com/pytorch/rfcs/blob/master/RFC-0019-Extending-PyTorch-Quantization-to-Custom-Backends.md for more details,
    reference quantized model is a standard representation of a quantized model provided
    by FX Graph Mode Quantization, it can be further lowered to run on the target
    hardware, like accelerators

    Note: this is not public API

    Args:
        * `graph_module` (GraphModule): A prepared and calibrated/trained model (GraphModule)

        * `convert_custom_config` (ConvertCustomConfig): custom configurations for convert function.
            See :func:`~torch.ao.quantization.quantize_fx.convert_fx` for more details.

        * `_remove_qconfig` (bool): Option to remove the qconfig attributes in the model after convert.

        * `qconfig_mapping` (QConfigMapping): config for specifying how to convert a model for quantization.
            See :func:`~torch.ao.quantization.quantize_fx.convert_fx` for more details.

         * `backend_config` (BackendConfig): A configuration for the backend which describes how
            operators should be quantized in the backend. See
            :func:`~torch.ao.quantization.quantize_fx.convert_fx` for more details.

    Return:
        A reference quantized model (GraphModule) with operators working with decomposed quantized Tensor

    Example::

        # prepared_model: the model after prepare_fx/prepare_qat_fx and calibration/training
        # TODO: add backend_config after we split the backend_config for fbgemm and qnnpack
        # e.g. backend_config = get_default_backend_config("fbgemm")
        reference_quantized_model = _convert_to_reference_decomposed_fx(prepared_model)

    z@quantization_api.quantize_fx._convert_to_reference_decomposed_fxTF)rl   rm   rn   rD   rA   ro   ru   )r[   rm   rD   rA   s       r"   Ú#_convert_to_reference_decomposed_fxrz   ¤  s>   € ôR 
‡H�H× Ñ ØJôô ØØØ3ØØ'Ø%Øôð r$   c                 ó    — t        | ||d¬«      S )av  [Internal use only] Convert a model produced by :func:`~torch.ao.quantization.prepare_standalone_module_fx`
    and convert it to a quantized model

    Returns a quantized standalone module, whether input/output is quantized is
    specified by prepare_custom_config, with
    input_quantized_idxs, output_quantized_idxs, please
    see docs for prepare_fx for details
    T)rH   )rs   )r[   rl   rm   s      r"   Ú_convert_standalone_module_fxr|   Û  s   € ô ØØØØ!ô	ð r$   )NN)NNNF)NNN)NFTNNFF)NTNNF)NTNN)FN)8r   rN   Útypingr   r   r   r3   Útorch.fxr   Útorch.fx.graph_moduler   rA   r	   r
   Ú
fx.convertr   Úfx.custom_configr   r   r   Úfx.fuser   Úfx.graph_moduler   Ú
fx.preparer   Ú	fx.tracerr   r   r   Úfx.utilsr   r   rD   r   r5   ÚModulerM   r(   r#   r*   r0   r9   ÚboolrC   Útupler]   r_   rf   ri   rk   rs   rv   rx   rz   r|   © r$   r"   ú<module>r‹      s  ðÛ Û ß 'Ñ 'ã Ý  Ý @ç FÝ ß XÑ XÝ Ý 0Ý ß EÑ E÷õ ,ð	(Ø�˜eŸh™hŸo™oÐ-Ñ.ð	(à˜#˜s˜(‘^ð	(ð 
ó	(ð
 %§(¡(§/¡/ð 
°dó 
ð
¨[ð 
¸Tó 
ðI˜eŸh™hŸo™oð I°$ó Ið" IMØAEñ	Øðàðð Ð.°°S¸#°X±ÀÐDÑEðð ˜-¨¨c°3¨h©¸Ð=Ñ>ð	ð
 óð, OSØLPØAEØ!&ñEØ�8‰8�?‰?ðEà˜>¨4°°S°©>Ð9Ñ:ðEð ðEð ˜#˜s˜(‘Oð	Eð
 !Ð!4°d¸3À¸8±nÀdÐ!JÑKðEð # 5¨¸¸cÀ3¸h¹Ð)GÑ#HÑIðEð ˜-¨¨c°3¨h©¸Ð=Ñ>ðEð ðEð óEðZ OSØAEñ'Ø�8‰8�?‰?ð'à˜>¨4°°S°©>Ð9Ñ:ð'ð ð'ð ˜#˜s˜(‘Oð	'ð
 !Ð!4°d¸3À¸8±nÀdÐ!JÑKð'ð ˜-¨¨c°3¨h©¸Ð=Ñ>ð'ð ó'ðX IMØAEñ-Ø�8‰8�?‰?ð-àÐ.°°S¸#°X±ÀÐDÑEð-ð ˜-¨¨c°3¨h©¸Ð=Ñ>ð-ð ó	-ðh OSØLPØAEñTØ�8‰8�?‰?ðTà˜>¨4°°S°©>Ð9Ñ:ðTð ˜#˜s˜(‘OðTð !Ð!4°d¸3À¸8±nÀdÐ!JÑKð	Tð
 # 5¨¸¸cÀ3¸h¹Ð)GÑ#HÑIðTð ˜-¨¨c°3¨h©¸Ð=Ñ>ðTð óTðv OSØAEñgØ�8‰8�?‰?ðgà˜>¨4°°S°©>Ð9Ñ:ðgð ˜#˜s˜(‘Oðgð !Ð!4°d¸3À¸8±nÀdÐ!JÑKð	gð
 ˜-¨¨c°3¨h©¸Ð=Ñ>ðgð ógðZ OSØ!&Ø ØCGØAEØØ"'ñ-Øð-àð-ð !Ð!4°d¸3À¸8±nÀdÐ!JÑKð-ð ð	-ð
 ð-ð ˜>¨4°°S°©>¸4Ð?Ñ@ð-ð ˜-¨¨c°3¨h©¸Ð=Ñ>ð-ð ð-ð  ð-ð ó-ðd OSØ ØCGØAEØ"'ñBØðBà Ð!4°d¸3À¸8±nÀdÐ!JÑKðBð ðBð ˜>¨4°°S°©>¸4Ð?Ñ@ð	Bð
 ˜-¨¨c°3¨h©¸Ð=Ñ>ðBð  ðBð óBðN OSØ ØCGØAEñ/Øð/à Ð!4°d¸3À¸8±nÀdÐ!JÑKð/ð ð/ð ˜>¨4°°S°©>¸4Ð?Ñ@ð	/ð
 ˜-¨¨c°3¨h©¸Ð=Ñ>ð/ð ó/ðh OSØCGØAEñ	4Øð4à Ð!4°d¸3À¸8±nÀdÐ!JÑKð4ð ˜>¨4°°S°©>¸4Ð?Ñ@ð4ð ˜-¨¨c°3¨h©¸Ð=Ñ>ð	4ð
 ó4ðr ØNRñØðàðð !Ð!4°d¸3À¸8±nÀdÐ!JÑKðð ô	r$   