
    h                     b   S SK Jr  S SKJrJrJr  S SKJrJr  S SK	J
r
Jr  S SKJrJrJr  SSKJr  SSKJr  S	S
KJrJrJr  S	SKJr  S	SKJrJr  SSKJrJrJ r   / SQr! " S S\5      r" " S S\5      r# " S S\5      r$\" SS9\" SS 4S9SSSS.S\\\$\4      S \%S!\%S"\S#\#4
S$ jj5       5       r&g)%    )partial)AnyOptionalUnion)nnTensor)DeQuantStub	QuantStub)InvertedResidualMobileNet_V2_WeightsMobileNetV2   )Conv2dNormActivation)ImageClassification   )register_modelWeightsWeightsEnum)_IMAGENET_CATEGORIES)_ovewrite_named_paramhandle_legacy_interface   )_fuse_modules_replace_reluquantize_model)QuantizableMobileNetV2MobileNet_V2_QuantizedWeightsmobilenet_v2c                   f   ^  \ rS rSrS\S\SS4U 4S jjrS\S\4S jrSS	\\	   SS4S
 jjr
SrU =r$ )QuantizableInvertedResidual   argskwargsreturnNc                 l   > [         TU ]  " U0 UD6  [        R                  R	                  5       U l        g N)super__init__r   	quantizedFloatFunctionalskip_addselfr"   r#   	__class__s      c/var/www/auris/envauris/lib/python3.13/site-packages/torchvision/models/quantization/mobilenetv2.pyr(   $QuantizableInvertedResidual.__init__   s)    $)&)446    xc                     U R                   (       a*  U R                  R                  XR                  U5      5      $ U R                  U5      $ r&   )use_res_connectr+   addconvr-   r2   s     r/   forward#QuantizableInvertedResidual.forward   s6    ==$$Q		!5599Q<r1   is_qatc           	          [        [        U R                  5      5       H[  n[        U R                  U   5      [        R
                  L d  M.  [        U R                  [        U5      [        US-   5      /USS9  M]     g )Nr   Tinplace)rangelenr6   typer   Conv2dr   str)r-   r:   idxs      r/   
fuse_model&QuantizableInvertedResidual.fuse_model"   sV    TYY(CDIIcN#ryy0dii#c(CaL)A6SWX )r1   )r+   r&   __name__
__module____qualname____firstlineno__r   r(   r   r8   r   boolrD   __static_attributes____classcell__r.   s   @r/   r    r       sP    7c 7S 7T 7   F  Y$ Y4 Y Yr1   r    c                   f   ^  \ rS rSrS\S\SS4U 4S jjrS\S\4S jrSS	\\	   SS4S
 jjr
SrU =r$ )r   (   r"   r#   r$   Nc                 b   > [         TU ]  " U0 UD6  [        5       U l        [	        5       U l        g)zQ
MobileNet V2 main class

Args:
   Inherits args from floating point MobileNetV2
N)r'   r(   r
   quantr	   dequantr,   s      r/   r(   QuantizableMobileNetV2.__init__)   s)     	$)&)[
"}r1   r2   c                 l    U R                  U5      nU R                  U5      nU R                  U5      nU$ r&   )rR   _forward_implrS   r7   s     r/   r8   QuantizableMobileNetV2.forward4   s1    JJqMq!LLOr1   r:   c                     U R                  5        HH  n[        U5      [        L a  [        U/ SQUSS9  [        U5      [        L d  M7  UR                  U5        MJ     g )N)012Tr<   )modulesr@   r   r   r    rD   )r-   r:   ms      r/   rD   !QuantizableMobileNetV2.fuse_model:   sF    AAw..a&$GAw55V$	  r1   )rS   rR   r&   rF   rN   s   @r/   r   r   (   sL    	%c 	%S 	%T 	% F %$ %4 % %r1   r   c                   f    \ rS rSr\" S\" \SS9SS\SS\R                  S	S
SS.0SSSS.
S9r
\
rSrg)r   B   zOhttps://download.pytorch.org/models/quantized/mobilenet_v2_qnnpack_37f702c5.pth   )	crop_sizeiz5 )r   r   qnnpackzUhttps://github.com/pytorch/vision/tree/main/references/classification#qat-mobilenetv2zImageNet-1Kg'1Q@gV@)zacc@1zacc@5g$C?gMb@z
                These weights were produced by doing Quantization Aware Training (eager mode) on top of the unquantized
                weights listed below.
            )

num_paramsmin_size
categoriesbackendrecipeunquantized_metrics_ops
_file_size_docs)url
transformsmeta N)rG   rH   rI   rJ   r   r   r   r   r   IMAGENET1K_V1IMAGENET1K_QNNPACK_V1DEFAULTrL   rq   r1   r/   r   r   B   s_    #].#>!. m/==##  
0 $Gr1   r   quantized_mobilenet_v2)name
pretrainedc                 p    U R                  SS5      (       a  [        R                  $ [        R                  $ )NquantizeF)getr   rs   r   rr   )r#   s    r/   <lambda>r{   b   s1    zz*e,, *?? 4%334r1   )weightsNTF)r|   progressry   r|   r}   ry   r#   r$   c                    U(       a  [         O[        R                  U 5      n U bM  [        US[	        U R
                  S   5      5        SU R
                  ;   a  [        USU R
                  S   5        UR                  SS5      n[        SS[        0UD6n[        U5        U(       a  [        XT5        U b  UR                  U R                  USS95        U$ )	az  
Constructs a MobileNetV2 architecture from
`MobileNetV2: Inverted Residuals and Linear Bottlenecks
<https://arxiv.org/abs/1801.04381>`_.

.. note::
    Note that ``quantize = True`` returns a quantized model with 8 bit
    weights. Quantized models only support inference and run on CPUs.
    GPU inference is not yet supported.

Args:
    weights (:class:`~torchvision.models.quantization.MobileNet_V2_QuantizedWeights` or :class:`~torchvision.models.MobileNet_V2_Weights`, optional): The
        pretrained weights for the model. See
        :class:`~torchvision.models.quantization.MobileNet_V2_QuantizedWeights` below for
        more details, and possible values. By default, no pre-trained
        weights are used.
    progress (bool, optional): If True, displays a progress bar of the download to stderr. Default is True.
    quantize (bool, optional): If True, returns a quantized version of the model. Default is False.
    **kwargs: parameters passed to the ``torchvision.models.quantization.QuantizableMobileNetV2``
        base class. Please refer to the `source code
        <https://github.com/pytorch/vision/blob/main/torchvision/models/quantization/mobilenetv2.py>`_
        for more details about this class.
.. autoclass:: torchvision.models.quantization.MobileNet_V2_QuantizedWeights
    :members:
.. autoclass:: torchvision.models.MobileNet_V2_Weights
    :members:
    :noindex:
num_classesrf   rg   rc   blockT)r}   
check_hashrq   )r   r   verifyr   r?   rp   popr   r    r   r   load_state_dictget_state_dict)r|   r}   ry   r#   rg   models         r/   r   r   ^   s    \ 19,>RZZ[bcGfmSl9S5TU$!&)W\\)5LMjjI.G"O)DOOE%u&g44hSW4XYLr1   )'	functoolsr   typingr   r   r   torchr   r   torch.ao.quantizationr	   r
   torchvision.models.mobilenetv2r   r   r   ops.miscr   transforms._presetsr   _apir   r   r   _metar   _utilsr   r   utilsr   r   r   __all__r    r   r   rK   r   rq   r1   r/   <module>r      s     ' '  8 ^ ^ , 6 7 7 ( C ? ?Y"2 Y"%[ %4$K $8 -.	
	 UY	3e9;OOPQ3 3 	3
 3 3	 /3r1   