
    kh(                     X   d Z 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 ddl
mZ ddlmZ dd	lmZ dd
lmZ 	 	 	 ddededededee   f
dZddZ	 	 	 	 ddedededededee   fdZ G d dej6                        Z G d dej6                        Z G d dej6                        Zy)zV Classifier head and layer factory

Hacked together by / Copyright 2020 Ross Wightman
    )OrderedDict)partial)OptionalUnionCallableN)
functional   )SelectAdaptivePool2d)get_act_layer)get_norm_layernum_featuresnum_classes	pool_typeuse_conv	input_fmtc                 Z    | }|sd}t        |||      }| |j                         z  }||fS )NF)r   flattenr   )r
   	feat_mult)r   r   r   r   r   flatten_in_poolglobal_poolnum_pooled_featuress           R/var/www/teggl/fontify/venv/lib/python3.12/site-packages/timm/layers/classifier.py_create_poolr      sH     #lO&K
 ')>)>)@@+++    c                     |dk  rt        j                         }|S |rt        j                  | |dd      }|S t        j                  | |d      }|S )Nr   r	   T)bias)nnIdentityConv2dLinear)r   r   r   fcs       r   
_create_fcr"   %   sU    a[[]
 I	 
YY|[!$? I YY|[t<Ir   	drop_ratec                     t        | ||||      \  }}t        |||      }|t        j                  |      }	||	|fS ||fS )Nr   r   r   )r   r"   r   Dropout)
r   r   r   r   r   r#   r   r   r!   dropouts
             r   create_classifierr)   /   se     (4($K$ 

B
 **Y'GR''?r   c                   l     e Zd ZdZ	 	 	 	 ddedededededef fdZddede	e   fd	Z
dd
efdZ xZS )ClassifierHeadz;Classifier head w/ configurable global pooling and dropout.in_featuresr   r   r#   r   r   c                 :   t         t        |           || _        || _        || _        t        |||||      \  }}|| _        t        j                  |      | _
        || _        |r|rt        j                  d      | _        yt        j                         | _        y)a.  
        Args:
            in_features: The number of input features.
            num_classes:  The number of classes for the final classifier layer (output).
            pool_type: Global pooling type, pooling disabled if empty string ('').
            drop_rate: Pre-classifier dropout rate.
        r%   r	   N)superr+   __init__r,   r   r   r)   r   r   r'   dropr!   Flattenr   r   )
selfr,   r   r   r#   r   r   r   r!   	__class__s
            r   r/   zClassifierHead.__init__L   s      	nd,.& "+
R 'JJy)	(0Yrzz!}BKKMr   c                    ||| j                   j                  k7  r~t        | j                  ||| j                  | j
                        \  | _         | _        | j                  r|rt        j                  d      | _
        y t        j                         | _
        y | j                  | j                   j                         z  }t        ||| j                        | _        y )N)r   r   r   r	   r&   )r   r   r)   r,   r   r   r!   r   r1   r   r   r   r"   )r2   r   r   r   s       r   resetzClassifierHead.resetm   s     Y$2B2B2L2L%L(9  #..)%Ddg -1MMi2::a=DLR[[]DL"&"2"2T5E5E5O5O5Q"Q #DGr   
pre_logitsc                     | j                  |      }| j                  |      }|r| j                  |      S | j                  |      }| j                  |      S N)r   r0   r   r!   r2   xr6   s      r   forwardzClassifierHead.forward   sK    QIIaL<<?"GGAJ||Ar   )avg        FNCHWr8   F)__name__
__module____qualname____doc__intstrfloatboolr/   r   r5   r;   __classcell__r3   s   @r   r+   r+   I   s~    E #!"#RR R 	R
 R R RB # $T r   r+   c                        e Zd ZdZ	 	 	 	 	 ddededee   dededeee	f   deee	f   f fd	Z
ddedee   fd
ZddefdZ xZS )NormMlpClassifierHeadzA A Pool -> Norm -> Mlp Classifier Head for '2D' NCHW tensors
    r,   r   hidden_sizer   r#   
norm_layer	act_layerc           	         t         	|           || _        || _        || _        | | _        t        |      }t        |      }| j
                  rt        t        j                  d      nt        j                  }t        |      | _         ||      | _        |rt        j                  d      nt        j                          | _        |r=t        j$                  t'        d |||      fd |       fg            | _        || _        nt        j                          | _        t        j*                  |      | _        |dkD  r || j                  |      | _        yt        j                          | _        y)  
        Args:
            in_features: The number of input features.
            num_classes:  The number of classes for the final classifier layer (output).
            hidden_size: The hidden size of the MLP (pre-logits FC layer) if not None.
            pool_type: Global pooling type, pooling disabled if empty string ('').
            drop_rate: Pre-classifier dropout rate.
            norm_layer: Normalization layer type.
            act_layer: MLP activation layer type (only used if hidden_size is not None).
        r	   kernel_sizer   r!   actr   N)r.   r/   r,   rL   r   r   r   r   r   r   r   r    r
   r   normr1   r   r   
Sequentialr   r6   r'   r0   r!   )
r2   r,   r   rL   r   r#   rM   rN   linear_layerr3   s
            r   r/   zNormMlpClassifierHead.__init__   s   ( 	&&'%#J/
!),	<@MMwryya8ryy/)D{+	(1rzz!}r{{} mmK|K=>	$9 - DO !,D kkmDOJJy)	BMPQ/,t00+>WYWbWbWdr   c                 ~   |At        |      | _        |rt        j                  d      nt        j                         | _        | j                  j                         | _        | j                  rt        t        j                  d      nt        j                  }| j                  rTt        | j                  j                  t        j                        r| j                  r:t        | j                  j                  t        j                        r| j                  rt        j                          5   || j"                  | j                        }|j$                  j'                  | j                  j                  j$                  j)                  |j$                  j*                               |j,                  j'                  | j                  j                  j,                         || j                  _        d d d        |dkD  r || j.                  |      | _        y t        j                         | _        y # 1 sw Y   AxY w)NrS   r	   rQ   r   )r
   r   r   r1   r   r   is_identityr   r   r   r    rL   
isinstancer6   r!   torchno_gradr,   weightcopy_reshapeshaper   r   )r2   r   r   rW   new_fcs        r   r5   zNormMlpClassifierHead.reset   so    3iHD,52::a=2;;=DL((446<@MMwryya8ryyDOO..		:4== 2 2BII>4==]]_ 0)$*:*:D<L<LMFMM''(:(:(A(A(I(I&--J]J](^_KK%%doo&8&8&=&=>)/DOO&	0
 CNPQ/,t00+>WYWbWbWd0 0s   /CH33H<r6   c                     | j                  |      }| j                  |      }| j                  |      }| j                  |      }| j	                  |      }|r|S | j                  |      }|S r8   )r   rU   r   r6   r0   r!   r9   s      r   r;   zNormMlpClassifierHead.forward   sa    QIIaLLLOOOAIIaLHGGAJr   )Nr<   r=   layernorm2dtanhr8   r?   )r@   rA   rB   rC   rD   r   rE   rF   r   r   r/   r5   rG   r;   rH   rI   s   @r   rK   rK      s     *."!/<.4)e)e )e "#	)e
 )e )e c8m,)e S(]+)eVe e# e 	T 	r   rK   c                        e Zd ZdZ	 	 	 	 	 	 ddededee   dededeee	f   deee	f   d	ef fd
Z
ddedee   defdZd ZddefdZ xZS )ClNormMlpClassifierHeadz@ A Pool -> Norm -> Mlp Classifier Head for n-D NxxC tensors
    r,   r   rL   r   r#   rM   rN   r   c	           	      Z   t         	|           || _        || _        || _        |dv sJ || _        |dv sJ |dk(  rdnd| _        t        |      }t        |      } ||      | _	        |rJt        j                  t        dt        j                  ||      fd |       fg            | _        || _        nt        j                         | _        t        j                   |      | _        |dkD  r&t        j                  | j                  |      | _        y	t        j                         | _        y	)
rP   ) r<   maxavgmax)NHWCNLCrl   r	   )r	      r!   rT   r   N)r.   r/   r,   rL   r   r   pool_dimr   r   rU   r   rV   r   r    r6   r   r'   r0   r!   )
r2   r,   r   rL   r   r#   rM   rN   r   r3   s
            r   r/   z ClNormMlpClassifierHead.__init__   s   * 	&&'8888"O+++&%/V#J/
!),	{+	 mmKryyk:;	$9 - DO !,D kkmDOJJy)	?JQ"))D--{;TVT_T_Tar   reset_otherc                    ||| _         |r2t        j                         | _        t        j                         | _        |dkD  r&t        j
                  | j                  |      | _        y t        j                         | _        y )Nr   )r   r   r   r6   rU   r    r   r!   )r2   r   r   ro   s       r   r5   zClNormMlpClassifierHead.reset  sZ     &DN kkmDODI?JQ"))D--{;TVT_T_Tar   c                 h   | j                   r| j                   dk(  r|j                  | j                        }|S | j                   dk(  r|j                  | j                        }|S | j                   dk(  r<d|j                  | j                        |j                  | j                        z   z  }|S )Nr<   )dimri   rj   g      ?)r   meanrn   amax)r2   r:   s     r   _global_poolz$ClNormMlpClassifierHead._global_pool	  s    >>~~&FFt}}F-
 	 5(FFt}}F-  8+166dmm64qvv$--v7PPQr   r6   c                     | j                  |      }| j                  |      }| j                  |      }| j                  |      }|r|S | j	                  |      }|S r8   )ru   rU   r6   r0   r!   r9   s      r   r;   zClNormMlpClassifierHead.forward  sT    a IIaLOOAIIaLHGGAJr   )Nr<   r=   	layernormgelurk   )NFr?   )r@   rA   rB   rC   rD   r   rE   rF   r   r   r/   rG   r5   ru   r;   rH   rI   s   @r   rf   rf      s     *."!/:.4#*b*b *b "#	*b
 *b *b c8m,*b S(]+*b *bXb b# bTX bT r   rf   )r<   FNr?   )r<   Fr>   N)rC   collectionsr   	functoolsr   typingr   r   r   r[   torch.nnr   r   Fadaptive_avgmax_poolr
   
create_actr   create_normr   rD   rE   rG   r   r"   rF   r)   Moduler+   rK   rf    r   r   <module>r      s    $  , ,   $ 6 % ' #',,, , 	,
 C=,& %)  	
  E?4<RYY <~GBII GTIbii Ir   