
    kh.<                        d Z ddlmZ ddlmZ ddlZddlmZ ddlm	Z	m
Z
mZmZ ddlmZ ddlmZmZ d	gZ G d
 dej&                        Z G d dej&                        Z G d dej&                        Z G d dej&                        Z G d dej&                        Z G d de      Z G d de      Z G d d	ej&                        Zd'dZ eddddddd d d!d"d#d$
i      Zed'd%efd&       Zy)(z
 pnasnet5large implementation grabbed from Cadene's pretrained models
 Additional credit to https://github.com/creafz

 https://github.com/Cadene/pretrained-models.pytorch/blob/master/pretrainedmodels/models/pnasnet.py

    )OrderedDict)partialN)ConvNormActcreate_conv2dcreate_pool2dcreate_classifier   )build_model_with_cfg)register_modelgenerate_default_cfgsPNASNet5Largec                   &     e Zd Zd fd	Zd Z xZS )SeparableConv2dc                 ~    t         t        |           t        ||||||      | _        t        ||d|      | _        y )N)kernel_sizestridepaddinggroupsr	   r   r   )superr   __init__r   depthwise_conv2dpointwise_conv2dselfin_channelsout_channelsr   r   r   	__class__s         O/var/www/teggl/fontify/venv/lib/python3.12/site-packages/timm/models/pnasnet.pyr   zSeparableConv2d.__init__   sE    ot-/ -+7;!@ !.1g!G    c                 J    | j                  |      }| j                  |      }|S N)r   r   r   xs     r   forwardzSeparableConv2d.forward   s'    !!!$!!!$r     __name__
__module____qualname__r   r%   __classcell__r   s   @r   r   r      s    Gr    r   c                   &     e Zd Zd fd	Zd Z xZS )BranchSeparablesc                 ^   t         t        |           |r|n|}t        j                         | _        t        |||||      | _        t        j                  |d      | _	        t        j                         | _
        t        |||d|      | _        t        j                  |d      | _        y )Nr   r   MbP?epsr	   )r   r/   r   nnReLUact_1r   separable_1BatchNorm2dbn_sep_1act_2separable_2bn_sep_2)	r   r   r   r   r   	stem_cellr   middle_channelsr   s	           r   r   zBranchSeparables.__init__'   s    .0*3,WWY
*+fgWEBWWY
*\;q'S|?r    c                     | j                  |      }| j                  |      }| j                  |      }| j                  |      }| j	                  |      }| j                  |      }|S r"   )r7   r8   r:   r;   r<   r=   r#   s     r   r%   zBranchSeparables.forward3   s]    JJqMQMM!JJqMQMM!r    )r	   Fr'   r(   r-   s   @r   r/   r/   %   s    
@r    r/   c                   &     e Zd Zd fd	Zd Z xZS )	ActConvBnc                     t         t        |           t        j                         | _        t        |||||      | _        t        j                  |d      | _	        y )Nr   r   r   r2   r3   )
r   rB   r   r5   r6   actr   convr9   bnr   s         r   r   zActConvBn.__init__?   sH    i')779!;vW^`	..59r    c                 l    | j                  |      }| j                  |      }| j                  |      }|S r"   )rE   rF   rG   r#   s     r   r%   zActConvBn.forwardF   s.    HHQKIIaLGGAJr    )r	   r'   r(   r-   s   @r   rB   rB   =   s    :r    rB   c                   &     e Zd Zd fd	Zd Z xZS )FactorizedReductionc                    t         t        |           t        j                         | _        t        j                  t        dt        j                  ddd      fdt        ||dz  d|      fg            | _
        t        j                  t        dt        j                  d	      fdt        j                  ddd      fdt        ||dz  d|      fg            | _        t        j                  |d
      | _        y )Navgpoolr	      F)r   count_include_padrF   r   pad)r	   rP   r	   r2   r3   )r   rJ   r   r5   r6   rE   
Sequentialr   	AvgPool2dr   path_1	ZeroPad2dpath_2r9   final_path_bn)r   r   r   r   r   s       r   r   zFactorizedReduction.__init__O   s    !413779mmKQqEJK];0AqZabc1
 %  mmKBLL01QqEJK];0AqZabc1
 % 
  ^^LeDr    c                     | j                  |      }| j                  |      }| j                  |      }| j                  t	        j
                  ||gd            }|S Nr	   )rE   rS   rU   rV   torchcat)r   r$   x_path1x_path2outs        r   r%   zFactorizedReduction.forward]   sN    HHQK++a.++a.  GW+=q!AB
r    r&   r(   r-   s   @r   rJ   rJ   M   s    Er    rJ   c                       e Zd Zd Zy)CellBasec                    | j                  |      }| j                  |      }||z   }| j                  |      }| j                  |      }||z   }| j	                  |      }	| j                  |      }
|	|
z   }| j                  |      }| j                  |      }||z   }| j                  |      }| j                  | j                  |      }n|}||z   }t        j                  |||||gd      }|S rX   )comb_iter_0_leftcomb_iter_0_rightcomb_iter_1_leftcomb_iter_1_rightcomb_iter_2_leftcomb_iter_2_rightcomb_iter_3_leftcomb_iter_3_rightcomb_iter_4_leftcomb_iter_4_rightrY   rZ   )r   x_leftx_rightx_comb_iter_0_leftx_comb_iter_0_rightx_comb_iter_0x_comb_iter_1_leftx_comb_iter_1_rightx_comb_iter_1x_comb_iter_2_leftx_comb_iter_2_rightx_comb_iter_2x_comb_iter_3_leftx_comb_iter_3_rightx_comb_iter_3x_comb_iter_4_leftx_comb_iter_4_rightx_comb_iter_4x_outs                      r   cell_forwardzCellBase.cell_forwardg   s   !226:"44V<*-@@!227;"44W=*-@@!227;"44W=*-@@!22=A"44W=*-@@!226:!!-"&"8"8"A")*-@@		=-Wdeghir    N)r)   r*   r+   r}    r    r   r_   r_   e   s    r    r_   c                   &     e Zd Zd fd	Zd Z xZS )	CellStem0c                    t         t        |           t        ||d|      | _        t        ||ddd|      | _        t        j                  t        dt        dd	d|
      fdt        ||d|      fdt        j                  |d      fg            | _        t        ||dd|      | _        t        dd	d|
      | _        t        ||dd|      | _        t        ||d	d|      | _        t        ||d	|      | _        t        dd	d|
      | _        t        ||d	dd|      | _        t        ||dd|      | _        y )Nr	   r      rM   T)r   r   r>   r   max_poolmax   r1   rF   rG   r2   r3      rD   )r   r   r   rB   conv_1x1r/   ra   r5   rQ   r   r   r   r9   rb   rc   rd   re   rf   rg   rh   ri   rj   )r   in_chs_leftout_chs_leftin_chs_rightout_chs_rightpad_typer   s         r   r   zCellStem0.__init__   sW   i')!,1V^_ 01Q$X`!b!#{ua8LM];!U]^_2>>,E:;<
 0 " !1=a8!U!.ua8!T 0=a8!U!1=a8"U !1=a!K!.ua8!T 0-QqDZb!d!*=a8"Ur    c                 L    | j                  |      }| j                  ||      }|S r"   )r   r}   r   rk   rl   r|   s       r   r%   zCellStem0.forward   s'    --'!!&'2r    r&   r(   r-   s   @r   r   r      s    U<r    r   c                   ,     e Zd Z	 	 	 d fd	Zd Z xZS )Cellc                 n   t         t        |           |rdnd}|| _        |rt	        |||      | _        nt        ||d|      | _        t        ||d|      | _        t        ||d||      | _	        t        dd||	      | _        t        ||d
||      | _        t        dd||	      | _        t        ||d||      | _        t        ||d||      | _        t        ||d      | _        t        dd||	      | _        t        ||d||      | _        |rt        ||d||      | _        y d | _        y )NrM   r	   )r   r   r   rD   r   r   r1   r   )r   )r   r   r   match_prev_layer_dimensionsrJ   conv_prev_1x1rB   r   r/   ra   r   rb   rc   rd   re   rf   rg   rh   ri   rj   )
r   r   r   r   r   r   is_reductionmatch_prev_layer_dimsr   r   s
            r   r   zCell.__init__   s\    	dD"$
 #
 ,A( !4[,X`!aD!*;RS]e!fD!,1V^_ 0,Afh!X!.uaPX!Y 0=aPX!Z!.uaPX!Y 0=aPX!Z!1=aPX"Z !1[\ ]!.uaPX!Y 0,Afh!X%.}!FT\&^D" &*D"r    c                 n    | j                  |      }| j                  |      }| j                  ||      }|S r"   )r   r   r}   r   s       r   r%   zCell.forward   s7    ##F+--(!!&'2r    )r'   FFr(   r-   s   @r   r   r      s     "'1*fr    r   c                       e Zd Z	 	 	 	 	 	 d fd	Zej
                  j                  dd       Zej
                  j                  dd       Zej
                  j                  de	j                  fd       ZddedefdZd	 Zdd
efdZd Z xZS )r   c                 L   t         t        |           || _        dx| _        | _        |dk(  sJ t        |ddddt        t        j                  dd	      d
      | _
        t        dddd|      | _        t        dddd|dd      | _        t        dddd|d      | _        t        dddd|      | _        t        dddd|      | _        t        dddd|      | _        t        dddd|d      | _        t        dddd|d      | _        t        dddd|      | _        t        dddd|      | _        t        dddd|d      | _        t        dddd|d      | _        t        dddd|      | _        t        dddd|      | _        t        j6                         | _        t;        ddd      t;        ddd      t;        ddd      t;        dd d!      t;        ddd"      g| _        t?        | j                  | j                  ||#      \  | _         | _!        | _"        y )$Ni      `   r   rM   r   r2   g?)r4   momentumF)r   r   r   
norm_layer	apply_act6   )r   r   r   r   r   l   i  T)r   r   r   r   r   r   r      i  )r   r   r   r   r   r   i8  i  )r   r   r   r   r   r   ip  i`  conv_0)num_chs	reductionmodule   zcell_stem_1.conv_1x1.act   zcell_4.conv_1x1.act   zcell_8.conv_1x1.actrE   )	pool_type	drop_rate)#r   r   r   num_classesnum_featureshead_hidden_sizer   r   r5   r9   r   r   cell_stem_0r   cell_stem_1cell_0cell_1cell_2cell_3cell_4cell_5cell_6cell_7cell_8cell_9cell_10cell_11r6   rE   dictfeature_infor   global_pool	head_droplast_linear)r   r   in_chansoutput_strider   r   r   r   s          r   r   zPNASNet5Large.__init__   sy    	mT+-&488D1"""!ba1r~~53GSXZ %"BYac  3c\d"&T; #Cs]e"&( #DPS^fh3TQT_gi3TQT_gi 3TQT_g 3TQT_g"&( 3TQT_gi3TQT_gi 3TQT_g 3TQT_g"&( 3TQT_gi3TQT_gi779q:2LM3HI4IJE:
 >Ot//;R[>]:$.$*:r    c                     t        dd      S )Nz^conv_0|cell_stem_[01]z^cell_(\d+))stemblocks)r   )r   coarses     r   group_matcherzPNASNet5Large.group_matcher)  s    2>JJr    c                     |rJ d       y )Nz$gradient checkpointing not supportedr~   )r   enables     r   set_grad_checkpointingz$PNASNet5Large.set_grad_checkpointing-  s    AAAz6r    returnc                     | j                   S r"   )r   )r   s    r   get_classifierzPNASNet5Large.get_classifier1  s    r    r   r   c                 p    || _         t        | j                  | j                   |      \  | _        | _        y )N)r   )r   r   r   r   r   )r   r   r   s      r   reset_classifierzPNASNet5Large.reset_classifier5  s3    &->t//;.H*$*r    c                 @   | j                  |      }| j                  |      }| j                  ||      }| j                  ||      }| j	                  ||      }| j                  ||      }| j                  ||      }| j                  ||      }	| j                  ||	      }
| j                  |	|
      }| j                  |
|      }| j                  ||      }| j                  ||      }| j                  ||      }| j                  ||      }| j                  |      }|S r"   )r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   rE   )r   r$   x_conv_0x_stem_0x_stem_1x_cell_0x_cell_1x_cell_2x_cell_3x_cell_4x_cell_5x_cell_6x_cell_7x_cell_8x_cell_9	x_cell_10	x_cell_11s                    r   forward_featureszPNASNet5Large.forward_features:  s   ;;q>##H-##Hh7;;x2;;x2;;x2;;x2;;x2;;x2;;x2;;x2;;x2;;x2LL84	LL95	HHYr    
pre_logitsc                 p    | j                  |      }| j                  |      }|r|S | j                  |      S r"   )r   r   r   )r   r$   r   s      r   forward_headzPNASNet5Large.forward_headM  s8    QNN1q7D$4$4Q$77r    c                 J    | j                  |      }| j                  |      }|S r"   )r   r   r#   s     r   r%   zPNASNet5Large.forwardR  s'    !!!$a r    )  r   r   g        avgr'   F)T)r   )r)   r*   r+   r   rY   jitignorer   r   r5   Moduler   intstrr   r   boolr   r%   r,   r-   s   @r   r   r      s     A]F YYK K YYB B YY 		    HC Hc H
&8$ 8
r    c                 @    t        t        | |fdt        dd      i|S )Nfeature_cfghookT)feature_cls
no_rewrite)r
   r   r   )variant
pretrainedkwargss      r   _create_pnasnetr   X  s3     V=	
  r    zpnasnet5large.tf_in1kztimm/)r   K  r   )   r   gx&?bicubic)      ?r   r   r   zconv_0.convr   )
	hf_hub_id
input_size	pool_sizecrop_pctinterpolationmeanstdr   
first_conv
classifierr   c                 6    t        dddi|}t        d| fi |S )zPNASNet-5 model architecture from the
    `"Progressive Neural Architecture Search"
    <https://arxiv.org/abs/1712.00559>`_ paper.
    r   samepnasnet5larger~   )r   r   )r   r   model_kwargss      r   r  r  r  s(     2262L?JG,GGr    r   )__doc__collectionsr   	functoolsr   rY   torch.nnr5   timm.layersr   r   r   r   _builderr
   	_registryr   r   __all__r   r   r/   rB   rJ   r_   r   r   r   r   default_cfgsr  r~   r    r   <module>r     s   $    T T * <
bii  ryy 0		  ")) 0ryy <# #L98 9xpBII pf %#"##&   H H Hr    