Ë
    þÍ:j‡F  ã                   óZ  — d dl m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mZmZmZ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mZ ddlmZmZm Z  g d¢Z! G d„ de«      Z" G d„ de«      Z# G d„ de«      Z$de%ee"e#f      de&e'   dee   de(de(dede$fd„Z)deddd d!œZ* G d"„ d#e«      Z+ G d$„ d%e«      Z, G d&„ d'e«      Z- G d(„ d)e«      Z. ed*¬+«       ed,d-„ f¬.«      dd/d0d1œdeee+ef      de(de(dede$f
d2„«       «       Z/ ed3¬+«       ed,d4„ f¬.«      dd/d0d1œdeee,ef      de(de(dede$f
d5„«       «       Z0 ed6¬+«       ed,d7„ f¬.«      dd/d0d1œdeee-ef      de(de(dede$f
d8„«       «       Z1 ed9¬+«       ed,d:„ f¬.«      dd/d0d1œdeee.ef      de(de(dede$f
d;„«       «       Z2y)<é    )Úpartial)ÚAnyÚOptionalÚUnionN)ÚTensor)Ú
BasicBlockÚ
BottleneckÚResNetÚResNet18_WeightsÚResNet50_WeightsÚResNeXt101_32X8D_WeightsÚResNeXt101_64X4D_Weightsé   )ÚImageClassificationé   )Úregister_modelÚWeightsÚWeightsEnum)Ú_IMAGENET_CATEGORIES)Ú_ovewrite_named_paramÚhandle_legacy_interfaceé   )Ú_fuse_modulesÚ_replace_reluÚquantize_model)	ÚQuantizableResNetÚResNet18_QuantizedWeightsÚResNet50_QuantizedWeightsÚ!ResNeXt101_32X8D_QuantizedWeightsÚ!ResNeXt101_64X4D_QuantizedWeightsÚresnet18Úresnet50Úresnext101_32x8dÚresnext101_64x4dc                   óT   ‡ — e Zd Zdededdfˆ fd„Zdedefd„Zd
dee   ddfd	„Z	ˆ xZ
S )ÚQuantizableBasicBlockÚargsÚkwargsÚreturnNc                 ó~   •— t        ‰| �  |i |¤Ž t        j                  j                  j                  «       | _        y ©N)ÚsuperÚ__init__ÚtorchÚnnÚ	quantizedÚFloatFunctionalÚadd_relu©Úselfr'   r(   Ú	__class__s      €ú{/home/mcse/projects/srt_converter/srt-converter-venv/lib/python3.12/site-packages/torchvision/models/quantization/resnet.pyr-   zQuantizableBasicBlock.__init__&   s/   ø€ Ü‰Ñ˜$Ð) &Ò)ÜŸ™×*Ñ*×:Ñ:Ó<ˆ�ó    Úxc                 ó&  — |}| j                  |«      }| j                  |«      }| j                  |«      }| j                  |«      }| j	                  |«      }| j
                  �| j                  |«      }| j                  j                  ||«      }|S r+   )Úconv1Úbn1ÚreluÚconv2Úbn2Ú
downsampler2   ©r4   r8   ÚidentityÚouts       r6   ÚforwardzQuantizableBasicBlock.forward*   s{   € Øˆà�j‰j˜‹mˆØ�h‰h�s‹mˆØ�i‰i˜‹nˆà�j‰j˜‹oˆØ�h‰h�s‹mˆà�?‰?Ð&Ø—‘ qÓ)ˆHà�m‰m×$Ñ$ S¨(Ó3ˆàˆ
r7   Úis_qatc                 ó~   — t        | g d¢ddgg|d¬«       | j                  rt        | j                  ddg|d¬«       y y )N©r:   r;   r<   r=   r>   T©ÚinplaceÚ0Ú1©r   r?   ©r4   rD   s     r6   Ú
fuse_modelz QuantizableBasicBlock.fuse_model;   s>   € Ü�dÒ5¸ÀÐ7GÐHÈ&ÐZ^Õ_Ø�?Š?Ü˜$Ÿ/™/¨C°¨:°vÀtÖLð r7   r+   ©Ú__name__Ú
__module__Ú__qualname__r   r-   r   rC   r   ÚboolrM   Ú__classcell__©r5   s   @r6   r&   r&   %   sJ   ø„ ð=˜cð =¨Sð =°Tõ =ð˜ð  Fó ñ"M ¨$¡ð M¸4÷ Mr7   r&   c                   óT   ‡ — e Zd Zdededdfˆ fd„Zdedefd„Zd
dee   ddfd	„Z	ˆ xZ
S )ÚQuantizableBottleneckr'   r(   r)   Nc                 óÖ   •— t        ‰| �  |i |¤Ž t        j                  j	                  «       | _        t        j                  d¬«      | _        t        j                  d¬«      | _        y )NFrG   )	r,   r-   r/   r0   r1   Úskip_add_reluÚReLUÚrelu1Úrelu2r3   s      €r6   r-   zQuantizableBottleneck.__init__B   sJ   ø€ Ü‰Ñ˜$Ð) &Ò)ÜŸ\™\×9Ñ9Ó;ˆÔÜ—W‘W UÔ+ˆŒ
Ü—W‘W UÔ+ˆ�
r7   r8   c                 óŒ  — |}| j                  |«      }| j                  |«      }| j                  |«      }| j                  |«      }| j	                  |«      }| j                  |«      }| j                  |«      }| j                  |«      }| j                  �| j                  |«      }| j                  j                  ||«      }|S r+   )r:   r;   rZ   r=   r>   r[   Úconv3Úbn3r?   rX   r2   r@   s       r6   rC   zQuantizableBottleneck.forwardH   s¤   € ØˆØ�j‰j˜‹mˆØ�h‰h�s‹mˆØ�j‰j˜‹oˆØ�j‰j˜‹oˆØ�h‰h�s‹mˆØ�j‰j˜‹oˆà�j‰j˜‹oˆØ�h‰h�s‹mˆà�?‰?Ð&Ø—‘ qÓ)ˆHØ× Ñ ×)Ñ)¨#¨xÓ8ˆàˆ
r7   rD   c                 ó„   — t        | g d¢g d¢ddgg|d¬«       | j                  rt        | j                  ddg|d¬«       y y )	N)r:   r;   rZ   )r=   r>   r[   r]   r^   TrG   rI   rJ   rK   rL   s     r6   rM   z QuantizableBottleneck.fuse_modelZ   sH   € ÜØÒ,Ò.GÈ'ÐSXÐIYÐZÐ\bÐlpõ	
ð �?Š?Ü˜$Ÿ/™/¨C°¨:°vÀtÖLð r7   r+   rN   rT   s   @r6   rV   rV   A   sJ   ø„ ð,˜cð ,¨Sð ,°Tõ ,ð˜ð  Fó ñ$M ¨$¡ð M¸4÷ Mr7   rV   c                   óT   ‡ — e Zd Zdededdfˆ fd„Zdedefd„Zd
dee   ddfd	„Z	ˆ xZ
S )r   r'   r(   r)   Nc                 óØ   •— t        ‰| �  |i |¤Ž t        j                  j                  j                  «       | _        t        j                  j                  j                  «       | _        y r+   )	r,   r-   r.   ÚaoÚquantizationÚ	QuantStubÚquantÚDeQuantStubÚdequantr3   s      €r6   r-   zQuantizableResNet.__init__c   sI   ø€ Ü‰Ñ˜$Ð) &Ò)ä—X‘X×*Ñ*×4Ñ4Ó6ˆŒ
Ü—x‘x×,Ñ,×8Ñ8Ó:ˆ�r7   r8   c                 ól   — | j                  |«      }| j                  |«      }| j                  |«      }|S r+   )re   Ú_forward_implrg   )r4   r8   s     r6   rC   zQuantizableResNet.forwardi   s3   € Ø�J‰J�q‹Mˆð ×Ñ˜qÓ!ˆØ�L‰L˜‹OˆØˆr7   rD   c                 ó¸   — t        | g d¢|d¬«       | j                  «       D ]6  }t        |«      t        u st        |«      t        u sŒ&|j                  |«       Œ8 y)a  Fuse conv/bn/relu modules in resnet models

        Fuse conv+bn+relu/ Conv+relu/conv+Bn modules to prepare for quantization.
        Model is modified in place.  Note that this operation does not change numerics
        and the model after modification is in floating point
        rF   TrG   N)r   ÚmodulesÚtyperV   r&   rM   )r4   rD   Úms      r6   rM   zQuantizableResNet.fuse_modelr   sM   € ô 	�dÒ4°fÀdÕKØ—‘“ò 	%ˆAÜ�A‹wÔ/Ñ/´4¸³7Ô>SÒ3SØ—‘˜VÕ$ñ	%r7   r+   rN   rT   s   @r6   r   r   b   sG   ø„ ð;˜cð ;¨Sð ;°Tõ ;ð˜ð  Fó ñ
% ¨$¡ð 
%¸4÷ 
%r7   r   ÚblockÚlayersÚweightsÚprogressÚquantizer(   r)   c                 óX  — |�Kt        |dt        |j                  d   «      «       d|j                  v rt        |d|j                  d   «       |j                  dd«      }t	        | |fi |¤Ž}t        |«       |rt        ||«       |�"|j                  |j                  |d¬«      «       |S )NÚnum_classesÚ
categoriesÚbackendÚfbgemmT)rq   Ú
check_hash)	r   ÚlenÚmetaÚpopr   r   r   Úload_state_dictÚget_state_dict)rn   ro   rp   rq   rr   r(   rv   Úmodels           r6   Ú_resnetr      s¥   € ð ÐÜ˜f m´S¸¿¹ÀlÑ9SÓ5TÔUØ˜Ÿ™Ñ$Ü! &¨)°W·\±\À)Ñ5LÔMØ�j‰j˜ HÓ-€Gä˜e VÑ6¨vÑ6€EÜ�%ÔÙÜ�u˜gÔ&àÐØ×Ñ˜g×4Ñ4¸hÐSWÐ4ÓXÔYà€Lr7   )r   r   rw   zdhttps://github.com/pytorch/vision/tree/main/references/classification#post-training-quantized-modelsz’
        These weights were produced by doing Post Training Quantization (eager mode) on top of the unquantized
        weights listed below.
    )Úmin_sizeru   rv   ÚrecipeÚ_docsc                   óh   — e Zd Z ed eed¬«      i e¥dej                  ddddœid	d
dœ¥¬«      Z	e	Z
y)r   zJhttps://download.pytorch.org/models/quantized/resnet18_fbgemm_16fa66dd.pthéà   ©Ú	crop_sizei(^² úImageNet-1KgV-²�_Q@gœÄ °r8V@©zacc@1zacc@5g /Ý$ý?g`åÐ"Ûy&@©Ú
num_paramsÚunquantizedÚ_metricsÚ_opsÚ
_file_size©ÚurlÚ
transformsrz   N)rO   rP   rQ   r   r   r   Ú_COMMON_METAr   ÚIMAGENET1K_V1ÚIMAGENET1K_FBGEMM_V1ÚDEFAULT© r7   r6   r   r   ¤   s[   „ Ù"ØXÙÐ.¸#Ô>ð
Øð
à"Ø+×9Ñ9àØ#Ø#ñ ðð Ø ò
ôÐð" #�Gr7   r   c                   óÂ   — e Zd Z ed eed¬«      i e¥dej                  ddddœid	d
dœ¥¬«      Z	 ed eedd¬«      i e¥dej                  ddddœid	ddœ¥¬«      ZeZy)r   zJhttps://download.pytorch.org/models/quantized/resnet50_fbgemm_bf931d71.pthr„   r…   i(ø…r‡   g{®GáúR@gj¼t“4W@rˆ   gB`åÐ"[@gü©ñÒMÂ8@r‰   r�   zJhttps://download.pytorch.org/models/quantized/resnet50_fbgemm-23753f79.pthéè   ©r†   Úresize_sizeg5^ºIT@gX9´Èv¾W@g‡ÙÎ÷ó8@N)rO   rP   rQ   r   r   r   r’   r   r“   r”   ÚIMAGENET1K_V2ÚIMAGENET1K_FBGEMM_V2r•   r–   r7   r6   r   r   ¹   s±   „ Ù"ØXÙÐ.¸#Ô>ð
Øð
à"Ø+×9Ñ9àØ#Ø#ñ ðð Ø ò
ôÐñ" #ØXÙÐ.¸#È3ÔOð
Øð
à"Ø+×9Ñ9àØ#Ø#ñ ðð Ø ò
ôÐð" #�Gr7   r   c                   óÂ   — e Zd Z ed eed¬«      i e¥dej                  ddddœid	d
dœ¥¬«      Z	 ed eedd¬«      i e¥dej                  ddddœid	ddœ¥¬«      ZeZy)r   zQhttps://download.pytorch.org/models/quantized/resnext101_32x8_fbgemm_09835ccf.pthr„   r…   i(ÙJr‡   gÉv¾Ÿ¿S@g…ëQ¸žW@rˆ   gD‹lçûi0@gV-‚U@r‰   r�   zQhttps://download.pytorch.org/models/quantized/resnext101_32x8_fbgemm-ee16d00c.pthr˜   r™   gÛù~j¼¤T@gœÄ °rX@gáz®G©U@N)rO   rP   rQ   r   r   r   r’   r   r“   r”   r›   rœ   r•   r–   r7   r6   r   r   ß   s±   „ Ù"Ø_ÙÐ.¸#Ô>ð
Øð
à"Ø3×AÑAàØ#Ø#ñ ðð Ø ò
ôÐñ" #Ø_ÙÐ.¸#È3ÔOð
Øð
à"Ø3×AÑAàØ#Ø#ñ ðð Ø ò
ôÐð" #�Gr7   r   c                   ól   — e Zd Z ed eedd¬«      i e¥ddej                  ddd	d
œidddœ¥¬«      Z	e	Z
y)r    zRhttps://download.pytorch.org/models/quantized/resnext101_64x4d_fbgemm-605a1cb3.pthr„   r˜   r™   i(mùz+https://github.com/pytorch/vision/pull/5935r‡   g¶óýÔx¹T@g¾Ÿ/ÝX@rˆ   gìQ¸…ë.@gÝ$�•cT@)rŠ   r�   r‹   rŒ   r�   rŽ   r�   N)rO   rP   rQ   r   r   r   r’   r   r“   r”   r•   r–   r7   r6   r    r      s`   „ Ù"Ø`ÙÐ.¸#È3ÔOð
Øð
à"ØCØ3×AÑAàØ#Ø#ñ ðð Ø ò
ôÐð$ #�Gr7   r    Úquantized_resnet18)ÚnameÚ
pretrainedc                 óf   — | j                  dd«      rt        j                  S t        j                  S ©Nrr   F)Úgetr   r”   r   r“   ©r(   s    r6   ú<lambda>r¦     ó0   € à�z‰z˜* eÔ,ô &×:Ñ:ð ô "×/Ñ/ð r7   )rp   TF)rp   rq   rr   c                 óh   — |rt         nt        j                  | «      } t        t        g d¢| ||fi |¤ŽS )a£  ResNet-18 model from
    `Deep Residual Learning for Image Recognition <https://arxiv.org/abs/1512.03385>`_

    .. 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.ResNet18_QuantizedWeights` or :class:`~torchvision.models.ResNet18_Weights`, optional): The
            pretrained weights for the model. See
            :class:`~torchvision.models.quantization.ResNet18_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, return a quantized version of the model. Default is False.
        **kwargs: parameters passed to the ``torchvision.models.quantization.QuantizableResNet``
            base class. Please refer to the `source code
            <https://github.com/pytorch/vision/blob/main/torchvision/models/quantization/resnet.py>`_
            for more details about this class.

    .. autoclass:: torchvision.models.quantization.ResNet18_QuantizedWeights
        :members:

    .. autoclass:: torchvision.models.ResNet18_Weights
        :members:
        :noindex:
    )r   r   r   r   )r   r   Úverifyr   r&   ©rp   rq   rr   r(   s       r6   r!   r!     ó6   € ñ^ -5Õ(Ô:J×RÑRÐSZÓ[€GäÔ(ª,¸ÀÈ8Ñ^ÐW]Ñ^Ð^r7   Úquantized_resnet50c                 óf   — | j                  dd«      rt        j                  S t        j                  S r£   )r¤   r   r”   r   r“   r¥   s    r6   r¦   r¦   S  r§   r7   c                 óh   — |rt         nt        j                  | «      } t        t        g d¢| ||fi |¤ŽS )a£  ResNet-50 model from
    `Deep Residual Learning for Image Recognition <https://arxiv.org/abs/1512.03385>`_

    .. 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.ResNet50_QuantizedWeights` or :class:`~torchvision.models.ResNet50_Weights`, optional): The
            pretrained weights for the model. See
            :class:`~torchvision.models.quantization.ResNet50_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, return a quantized version of the model. Default is False.
        **kwargs: parameters passed to the ``torchvision.models.quantization.QuantizableResNet``
            base class. Please refer to the `source code
            <https://github.com/pytorch/vision/blob/main/torchvision/models/quantization/resnet.py>`_
            for more details about this class.

    .. autoclass:: torchvision.models.quantization.ResNet50_QuantizedWeights
        :members:

    .. autoclass:: torchvision.models.ResNet50_Weights
        :members:
        :noindex:
    )r   é   é   r   )r   r   r©   r   rV   rª   s       r6   r"   r"   O  r«   r7   Úquantized_resnext101_32x8dc                 óf   — | j                  dd«      rt        j                  S t        j                  S r£   )r¤   r   r”   r   r“   r¥   s    r6   r¦   r¦   ‡  ó0   € à�z‰z˜* eÔ,ô .×BÑBð ô *×7Ñ7ð r7   c                 óœ   — |rt         nt        j                  | «      } t        |dd«       t        |dd«       t	        t
        g d¢| ||fi |¤ŽS )aá  ResNeXt-101 32x8d model from
    `Aggregated Residual Transformation for Deep Neural Networks <https://arxiv.org/abs/1611.05431>`_

    .. 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.ResNeXt101_32X8D_QuantizedWeights` or :class:`~torchvision.models.ResNeXt101_32X8D_Weights`, optional): The
            pretrained weights for the model. See
            :class:`~torchvision.models.quantization.ResNet101_32X8D_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, return a quantized version of the model. Default is False.
        **kwargs: parameters passed to the ``torchvision.models.quantization.QuantizableResNet``
            base class. Please refer to the `source code
            <https://github.com/pytorch/vision/blob/main/torchvision/models/quantization/resnet.py>`_
            for more details about this class.

    .. autoclass:: torchvision.models.quantization.ResNeXt101_32X8D_QuantizedWeights
        :members:

    .. autoclass:: torchvision.models.ResNeXt101_32X8D_Weights
        :members:
        :noindex:
    Úgroupsé    Úwidth_per_groupé   ©r   r¯   é   r   )r   r   r©   r   r   rV   rª   s       r6   r#   r#   ƒ  óO   € ñ^ 5=Õ0ÔBZ×bÑbÐcjÓk€Gä˜& (¨BÔ/Ü˜&Ð"3°QÔ7ÜÔ(ª-¸À(ÈHÑ_ÐX^Ñ_Ð_r7   Úquantized_resnext101_64x4dc                 óf   — | j                  dd«      rt        j                  S t        j                  S r£   )r¤   r    r”   r   r“   r¥   s    r6   r¦   r¦   ½  r³   r7   c                 óœ   — |rt         nt        j                  | «      } t        |dd«       t        |dd«       t	        t
        g d¢| ||fi |¤ŽS )aá  ResNeXt-101 64x4d model from
    `Aggregated Residual Transformation for Deep Neural Networks <https://arxiv.org/abs/1611.05431>`_

    .. 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.ResNeXt101_64X4D_QuantizedWeights` or :class:`~torchvision.models.ResNeXt101_64X4D_Weights`, optional): The
            pretrained weights for the model. See
            :class:`~torchvision.models.quantization.ResNet101_64X4D_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, return a quantized version of the model. Default is False.
        **kwargs: parameters passed to the ``torchvision.models.quantization.QuantizableResNet``
            base class. Please refer to the `source code
            <https://github.com/pytorch/vision/blob/main/torchvision/models/quantization/resnet.py>`_
            for more details about this class.

    .. autoclass:: torchvision.models.quantization.ResNeXt101_64X4D_QuantizedWeights
        :members:

    .. autoclass:: torchvision.models.ResNeXt101_64X4D_Weights
        :members:
        :noindex:
    rµ   é@   r·   r¯   r¹   )r    r   r©   r   r   rV   rª   s       r6   r$   r$   ¹  r»   r7   )3Ú	functoolsr   Útypingr   r   r   r.   Útorch.nnr/   r   Útorchvision.models.resnetr   r	   r
   r   r   r   r   Útransforms._presetsr   Ú_apir   r   r   Ú_metar   Ú_utilsr   r   Úutilsr   r   r   Ú__all__r&   rV   r   rl   ÚlistÚintrR   r   r’   r   r   r   r    r!   r"   r#   r$   r–   r7   r6   ú<module>rÌ      sA  ðÝ ß 'Ñ 'ã Ý Ý ÷÷ ñ õ 7ß 7Ñ 7Ý (ß Cß ?Ñ ?ò
€ôM˜Jô Mô8M˜Jô MôB%˜ô %ð:Ø�Ð+Ð-BÐBÑCÑDðà�‰Iðð �kÑ"ðð ð	ð
 ðð ðð óð4 Ø&ØØtðñ	€ô# ô #ô*## ô ##ôL##¨ô ##ôL#¨ô #ñ, Ð)Ô*Ùàñ	
ðô	ð MQØØò	&_à�eÐ5Ð7GÐGÑHÑIð&_ð ð&_ð ð	&_ð
 ð&_ð ò&_ó	ó +ð&_ñR Ð)Ô*Ùàñ	
ðô	ð MQØØò	&_à�eÐ5Ð7GÐGÑHÑIð&_ð ð&_ð ð	&_ð
 ð&_ð ò&_ó	ó +ð&_ñR Ð1Ô2Ùàñ	
ðô	ð ]aØØò	(`à�eÐ=Ð?WÐWÑXÑYð(`ð ð(`ð ð	(`ð
 ð(`ð ò(`ó	ó 3ð(`ñV Ð1Ô2Ùàñ	
ðô	ð ]aØØò	(`à�eÐ=Ð?WÐWÑXÑYð(`ð ð(`ð ð	(`ð
 ð(`ð ò(`ó	ó 3ñ(`r7   