
    Yh;                        d dl mZ d dlmZ d dlmZmZmZ d dlZd dlm	Z	m
Z
 d dlmZ ddl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 ddlmZmZ g dZ  G d de	j!                  Z" G d de	j#                  Z$ G d d          Z% G d de	j#                  Z&de'e%         de(dee         de)dede&fdZ*d e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             ed,e,j0        f-          dd.d/dee,         de)dede&fd0                        Z1 e             ed,e-j0        f-          dd.d/dee-         de)dede&fd1                        Z2 e             ed,e.j0        f-          dd.d/dee.         de)dede&fd2                        Z3 e             ed,e/j0        f-          dd.d/dee/         de)dede&fd3                        Z4dS )4    )Sequence)partial)AnyCallableOptionalN)nnTensor)
functional   )Conv2dNormActivationPermute)StochasticDepth)ImageClassification)_log_api_usage_once   )register_modelWeightsWeightsEnum)_IMAGENET_CATEGORIES)_ovewrite_named_paramhandle_legacy_interface)	ConvNeXtConvNeXt_Tiny_WeightsConvNeXt_Small_WeightsConvNeXt_Base_WeightsConvNeXt_Large_Weightsconvnext_tinyconvnext_smallconvnext_baseconvnext_largec                       e Zd ZdedefdZdS )LayerNorm2dxreturnc                     |                     dddd          }t          j        || j        | j        | j        | j                  }|                     dddd          }|S )Nr   r      r   )permuteF
layer_normnormalized_shapeweightbiasepsselfr#   s     m/var/www/tools.fuzzalab.pt/emblema-extractor/venv/lib/python3.11/site-packages/torchvision/models/convnext.pyforwardzLayerNorm2d.forward    sU    IIaAq!!LD14;	48TTIIaAq!!    N)__name__
__module____qualname__r	   r1    r2   r0   r"   r"      s6         F      r2   r"   c            
       j     e Zd Z	 d
dededeedej        f                  ddf fdZde	de	fd	Z
 xZS )CNBlockNlayer_scalestochastic_depth_prob
norm_layer.r$   c                 J   t                                                       |t          t          j        d          }t          j        t          j        ||dd|d          t          g d           ||          t          j        |d|z  d	          t          j	                    t          j        d|z  |d	          t          g d
                    | _
        t          j        t          j        |dd          |z            | _        t          |d          | _        d S )Nư>r-      r&   T)kernel_sizepaddinggroupsr,   )r   r   r&   r      )in_featuresout_featuresr,   )r   r&   r   r   r   row)super__init__r   r   	LayerNorm
SequentialConv2dr   LinearGELUblock	Parametertorchonesr9   r   stochastic_depth)r/   dimr9   r:   r;   	__class__s        r0   rH   zCNBlock.__init__(   s    	 4888J]Ic3Aq4PPPLLL!!JsOOI#AG$GGGGIII!c'$GGGLLL!!
 

 <
31(=(=(KLL /0Eu M Mr2   inputc                 t    | j         |                     |          z  }|                     |          }||z  }|S N)r9   rN   rR   )r/   rU   results      r0   r1   zCNBlock.forward?   s<    !DJJu$5$55&&v..%r2   rW   )r3   r4   r5   floatr   r   r   ModulerH   r	   r1   __classcell__rT   s   @r0   r8   r8   '   s         :>N N N  %	N
 Xc29n56N 
N N N N N N.V         r2   r8   c                   >    e Zd Zdedee         deddfdZdefdZdS )CNBlockConfiginput_channelsout_channels
num_layersr$   Nc                 0    || _         || _        || _        d S rW   )r_   r`   ra   )r/   r_   r`   ra   s       r0   rH   zCNBlockConfig.__init__H   s     -($r2   c                 l    | j         j        dz   }|dz  }|dz  }|dz  }|dz  } |j        di | j        S )N(zinput_channels={input_channels}z, out_channels={out_channels}z, num_layers={num_layers})r6   )rT   r3   format__dict__)r/   ss     r0   __repr__zCNBlockConfig.__repr__R   sU    N#c)	..	,,	((	Sqx(($-(((r2   )r3   r4   r5   intr   rH   strri   r6   r2   r0   r^   r^   F   sm        %% sm% 	%
 
% % % %)# ) ) ) ) ) )r2   r^   c                        e Zd Z	 	 	 	 	 ddee         dededed	eed
e	j
        f                  deed
e	j
        f                  deddf fdZdedefdZdedefdZ xZS )r           r=     Nblock_settingr:   r9   num_classesrN   .r;   kwargsr$   c                    t                                                       t          |            |st          d          t	          |t
                    rt          d |D                       st          d          |t          }|t          t          d          }g }|d         j        }	|                    t          d|	ddd|d d	
                     t          d |D                       }
d}|D ]}g }t          |j                  D ]7}||z  |
dz
  z  }|                     ||j        ||                     |dz  }8|                    t#          j        |            |j        V|                    t#          j         ||j                  t#          j        |j        |j        dd                               t#          j        | | _        t#          j        d          | _        |d         }|j        |j        n|j        }t#          j         ||          t#          j        d          t#          j        ||                    | _        |                                 D ]y}t	          |t"          j        t"          j        f          rQt"          j                            |j        d           |j        $t"          j                             |j                   zd S )Nz%The block_setting should not be emptyc                 8    g | ]}t          |t                    S r6   )
isinstancer^   ).0rh   s     r0   
<listcomp>z%ConvNeXt.__init__.<locals>.<listcomp>k   s#    >s>s>s`az!]?[?[>s>s>sr2   z/The block_setting should be List[CNBlockConfig]r=   r>   r   r&   rC   T)r@   striderA   r;   activation_layerr,   c              3   $   K   | ]}|j         V  d S rW   )ra   )ru   cnfs     r0   	<genexpr>z$ConvNeXt.__init__.<locals>.<genexpr>   s$       I IC I I I I I Ir2   g      ?r   r   )r@   rw   g{Gz?)std)!rG   rH   r   
ValueErrorrt   r   all	TypeErrorr8   r   r"   r_   appendr   sumrangera   r   rJ   r`   rK   featuresAdaptiveAvgPool2davgpoolFlattenrL   
classifiermodulesinittrunc_normal_r+   r,   zeros_)r/   ro   r:   r9   rp   rN   r;   rq   layersfirstconv_output_channelstotal_stage_blocksstage_block_idrz   stage_sd_prob	lastblocklastconv_output_channelsmrT   s                      r0   rH   zConvNeXt.__init__\   s    	D!!! 	ODEEE]H55 	O#>s>ser>s>s>s:t:t 	OMNNN=E $777J"$ %2!$4$C! )%!%	 	 		
 	
 	
 ! I I= I I III  	 	C%'E3>** $ $/.@DVY\D\]UU3#5{GLLMMM!#MM"-/000+M"
3#566	#"4c6FTU^_```    v.+A..!"%	&/&<&HI""iNf 	! -J/00"*Q--KcepAqAq
 
  	+ 	+A!bi344 +%%ahD%9996%GNN16***		+ 	+r2   r#   c                     |                      |          }|                     |          }|                     |          }|S rW   )r   r   r   r.   s     r0   _forward_implzConvNeXt._forward_impl   s8    MM!LLOOOOAr2   c                 ,    |                      |          S rW   )r   r.   s     r0   r1   zConvNeXt.forward   s    !!!$$$r2   )rm   r=   rn   NN)r3   r4   r5   listr^   rY   rj   r   r   r   rZ   r   rH   r	   r   r1   r[   r\   s   @r0   r   r   [   s        (+!489=L+ L+M*L+  %L+ 	L+
 L+ bi01L+ Xc29n56L+ L+ 
L+ L+ L+ L+ L+ L+\v &    % %F % % % % % % % %r2   r   ro   r:   weightsprogressrq   r$   c                     |)t          |dt          |j        d                              t          | fd|i|}|*|                    |                    |d                     |S )Nrp   
categoriesr:   T)r   
check_hash)r   lenmetar   load_state_dictget_state_dict)ro   r:   r   r   rq   models         r0   	_convnextr      sz     fmSl9S5T5TUUU]ZZ:OZSYZZEg44hSW4XXYYYLr2   )    r   zNhttps://github.com/pytorch/vision/tree/main/references/classification#convnexta  
        These weights improve upon the results of the original paper by using a modified version of TorchVision's
        `new training recipe
        <https://pytorch.org/blog/how-to-train-state-of-the-art-models-using-torchvision-latest-primitives/>`_.
    )min_sizer   recipe_docsc            
       b    e Zd Z ed eedd          i eddddd	id
dd          ZeZdS )r   z>https://download.pytorch.org/models/convnext_tiny-983f1562.pth      	crop_sizeresize_sizeiH<ImageNet-1KgzGT@gMbX	X@zacc@1zacc@5gm@gV-G[@
num_params_metrics_ops
_file_sizeurl
transformsr   N	r3   r4   r5   r   r   r   _COMMON_METAIMAGENET1K_V1DEFAULTr6   r2   r0   r   r      s        GL7.#3OOO

"##    !
 
 
  M  GGGr2   r   c            
       b    e Zd Z ed eedd          i eddddd	id
dd          ZeZdS )r   z?https://download.pytorch.org/models/convnext_small-0c510722.pthr      r   iHZr   gClT@g)X@r   g|?5^!@g"~g@r   r   Nr   r6   r2   r0   r   r      s        GM7.#3OOO

"##    !
 
 
  M  GGGr2   r   c            
       b    e Zd Z ed eedd          i eddddd	id
dd          ZeZdS )r   z>https://download.pytorch.org/models/convnext_base-6075fbad.pthr      r   ihGr   gU@gHz7X@r   g(\µ.@g/$!u@r   r   Nr   r6   r2   r0   r   r      s        GL7.#3OOO

"##    !
 
 
  M  GGGr2   r   c            
       b    e Zd Z ed eedd          i eddddd	id
dd          ZeZdS )r   z?https://download.pytorch.org/models/convnext_large-ea097f82.pthr   r   r   ir   g"~U@gX9v>X@r   g|?5.A@gK@r   r   Nr   r6   r2   r0   r   r     s        GM7.#3OOO

###    !
 
 
  M  GGGr2   r   
pretrained)r   T)r   r   c                    t                               |           } t          ddd          t          ddd          t          ddd          t          ddd          g}|                    dd	          }t	          ||| |fi |S )
a  ConvNeXt Tiny model architecture from the
    `A ConvNet for the 2020s <https://arxiv.org/abs/2201.03545>`_ paper.

    Args:
        weights (:class:`~torchvision.models.convnext.ConvNeXt_Tiny_Weights`, optional): The pretrained
            weights to use. See :class:`~torchvision.models.convnext.ConvNeXt_Tiny_Weights`
            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.
        **kwargs: parameters passed to the ``torchvision.models.convnext.ConvNext``
            base class. Please refer to the `source code
            <https://github.com/pytorch/vision/blob/main/torchvision/models/convnext.py>`_
            for more details about this class.

    .. autoclass:: torchvision.models.ConvNeXt_Tiny_Weights
        :members:
    `      r&        	   Nr:   g?)r   verifyr^   popr   r   r   rq   ro   r:   s        r0   r   r   "  s    & $**733G 	b#q!!c3""c3""c4##	M #JJ'>DD]$97HWWPVWWWr2   c                    t                               |           } t          ddd          t          ddd          t          ddd          t          ddd          g}|                    dd	          }t	          ||| |fi |S )
a  ConvNeXt Small model architecture from the
    `A ConvNet for the 2020s <https://arxiv.org/abs/2201.03545>`_ paper.

    Args:
        weights (:class:`~torchvision.models.convnext.ConvNeXt_Small_Weights`, optional): The pretrained
            weights to use. See :class:`~torchvision.models.convnext.ConvNeXt_Small_Weights`
            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.
        **kwargs: parameters passed to the ``torchvision.models.convnext.ConvNext``
            base class. Please refer to the `source code
            <https://github.com/pytorch/vision/blob/main/torchvision/models/convnext.py>`_
            for more details about this class.

    .. autoclass:: torchvision.models.ConvNeXt_Small_Weights
        :members:
    r   r   r&   r   r      Nr:   g?)r   r   r^   r   r   r   s        r0   r   r   A  s    * %++G44G 	b#q!!c3""c3##c4##	M #JJ'>DD]$97HWWPVWWWr2   c                    t                               |           } t          ddd          t          ddd          t          ddd          t          ddd          g}|                    dd	          }t	          ||| |fi |S )
a  ConvNeXt Base model architecture from the
    `A ConvNet for the 2020s <https://arxiv.org/abs/2201.03545>`_ paper.

    Args:
        weights (:class:`~torchvision.models.convnext.ConvNeXt_Base_Weights`, optional): The pretrained
            weights to use. See :class:`~torchvision.models.convnext.ConvNeXt_Base_Weights`
            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.
        **kwargs: parameters passed to the ``torchvision.models.convnext.ConvNext``
            base class. Please refer to the `source code
            <https://github.com/pytorch/vision/blob/main/torchvision/models/convnext.py>`_
            for more details about this class.

    .. autoclass:: torchvision.models.ConvNeXt_Base_Weights
        :members:
          r&   i   i   r   Nr:         ?)r   r   r^   r   r   r   s        r0   r   r   b  s    & $**733G 	c3""c3""c4$$dD!$$	M #JJ'>DD]$97HWWPVWWWr2   c                    t                               |           } t          ddd          t          ddd          t          ddd          t          ddd          g}|                    dd	          }t	          ||| |fi |S )
a  ConvNeXt Large model architecture from the
    `A ConvNet for the 2020s <https://arxiv.org/abs/2201.03545>`_ paper.

    Args:
        weights (:class:`~torchvision.models.convnext.ConvNeXt_Large_Weights`, optional): The pretrained
            weights to use. See :class:`~torchvision.models.convnext.ConvNeXt_Large_Weights`
            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.
        **kwargs: parameters passed to the ``torchvision.models.convnext.ConvNext``
            base class. Please refer to the `source code
            <https://github.com/pytorch/vision/blob/main/torchvision/models/convnext.py>`_
            for more details about this class.

    .. autoclass:: torchvision.models.ConvNeXt_Large_Weights
        :members:
    r   r   r&   r   i   r   Nr:   r   )r   r   r^   r   r   r   s        r0   r    r      s    * %++G44G 	c3""c3""c4$$dD!$$	M #JJ'>DD]$97HWWPVWWWr2   )5collections.abcr   	functoolsr   typingr   r   r   rP   r   r	   torch.nnr
   r(   ops.miscr   r   ops.stochastic_depthr   transforms._presetsr   utilsr   _apir   r   r   _metar   _utilsr   r   __all__rI   r"   rZ   r8   r^   r   r   rY   boolr   r   r   r   r   r   r   r   r   r   r    r6   r2   r0   <module>r      s(   $ $ $ $ $ $       * * * * * * * * * *          $ $ $ $ $ $ 4 4 4 4 4 4 4 4 2 2 2 2 2 2 5 5 5 5 5 5 ' ' ' ' ' ' 6 6 6 6 6 6 6 6 6 6 ' ' ' ' ' ' B B B B B B B B
 
 
    ",       bi   >) ) ) ) ) ) ) )*V% V% V% V% V%ry V% V% V%r&  k" 	
     & &^		 	    K   (    [   (    K   (    [   ( ,0E0S!TUUU@DW[ X X Xh'<= XPT Xgj Xow X X X VU X: ,0F0T!UVVV37$X X X/0XCGXZ]XX X X WV X> ,0E0S!TUUU@DW[ X X Xh'<= XPT Xgj Xow X X X VU X: ,0F0T!UVVV37$X X X/0XCGXZ]XX X X WV X X Xr2   