
    NgN<                        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c 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!dS ))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 )SeparableConv2d c                     t          t          |                                            t          ||||||          | _        t          ||d|          | _        d S )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/html/ai-engine/env/lib/python3.11/site-packages/timm/models/pnasnet.pyr   zSeparableConv2d.__init__   sr    ot$$--/// -+7;!@ !@ !@ !.1g!G !G !G    c                 Z    |                      |          }|                     |          }|S N)r   r   r   xs     r    forwardzSeparableConv2d.forward    s-    !!!$$!!!$$r!   r   __name__
__module____qualname__r   r&   __classcell__r   s   @r    r   r      sR        G G G G G G      r!   r   c                   &     e Zd Zd fd	Zd Z xZS )BranchSeparablesr	   Fr   c                    t          t          |                                            |r|n|}t          j                    | _        t          |||||          | _        t          j        |d          | _	        t          j                    | _
        t          |||d|          | _        t          j        |d          | _        d S )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00*3D,,WYY
*+fgW W WEBBBWYY
*\;q'S S S|???r!   c                    |                      |          }|                     |          }|                     |          }|                     |          }|                     |          }|                     |          }|S r#   )r7   r8   r:   r;   r<   r=   r$   s     r    r&   zBranchSeparables.forward4   sm    JJqMMQMM!JJqMMQMM!r!   )r	   Fr   r(   r-   s   @r    r/   r/   &   sR        
@ 
@ 
@ 
@ 
@ 
@      r!   r/   c                   &     e Zd Zd fd	Zd Z xZS )	ActConvBnr	   r   c                     t          t          |                                            t          j                    | _        t          |||||          | _        t          j        |d          | _	        d S )Nr   r   r   r2   r3   )
r   rB   r   r5   r6   actr   convr9   bnr   s         r    r   zActConvBn.__init__@   sk    i'')))799!;vW^` ` `	.5999r!   c                     |                      |          }|                     |          }|                     |          }|S r#   )rE   rF   rG   r$   s     r    r&   zActConvBn.forwardG   s4    HHQKKIIaLLGGAJJr!   )r	   r   r(   r-   s   @r    rB   rB   >   sL        : : : : : :      r!   rB   c                   &     e Zd Zd fd	Zd Z xZS )FactorizedReductionr   c                 :   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
          | _        d S )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__P   s   !4((11333799mKQqEJJJK];0AqZabbbc1
 % %   mKBL001QqEJJJK];0AqZabbbc1
 % %  
  ^LeDDDr!   c                     |                      |          }|                     |          }|                     |          }|                     t	          j        ||gd                    }|S Nr	   )rE   rS   rU   rV   torchcat)r   r%   x_path1x_path2outs        r    r&   zFactorizedReduction.forward^   sX    HHQKK++a..++a..  GW+=q!A!ABB
r!   r'   r(   r-   s   @r    rJ   rJ   N   sR        E E E E E E      r!   rJ   c                       e Zd Zd ZdS )CellBasec                 $   |                      |          }|                     |          }||z   }|                     |          }|                     |          }||z   }|                     |          }	|                     |          }
|	|
z   }|                     |          }|                     |          }||z   }|                     |          }| 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_forwardh   s6   !226::"44V<<*-@@!227;;"44W==*-@@!227;;"44W==*-@@!22=AA"44W==*-@@!226::!-"&"8"8"A"A")*-@@	=-Wdeghiir!   N)r)   r*   r+   r}    r!   r    r_   r_   f   s#            r!   r_   c                   &     e Zd Zd fd	Zd Z xZS )	CellStem0r   c                    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|          | _        d S )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__   s   i'')))!,1V^___ 01Q$X`!b !b !b!#{ua8LLLM];!U]^^^_2>,E:::;<
 0 0 " " !1=a8!U !U !U!.ua8!T!T!T 0=a8!U !U !U!1=a8"U "U "U !1=a!K !K !K!.ua8!T!T!T 0-QqDZb!d !d !d!*=a8"U "U "Ur!   c                 \    |                      |          }|                     ||          }|S r#   )r   r}   r   rk   rl   r|   s       r    r&   zCellStem0.forward   s-    --''!!&'22r!   r'   r(   r-   s   @r    r   r      sR        U U U U U U<      r!   r   c                   ,     e Zd Z	 	 	 d fd	Zd Z xZS )Cellr   Fc                    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||          | _        d S d | _        d S )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(  	g!4[,X`!a!a!aD!*;RS]e!f!f!fD!,1V^___ 0,Afh!X !X !X!.uaPX!Y!Y!Y 0=aPX!Z !Z !Z!.uaPX!Y!Y!Y 0=aPX!Z !Z !Z!1=aPX"Z "Z "Z !1[\ ] ] ]!.uaPX!Y!Y!Y 0,Afh!X !X !X 	*%.}!FT\&^ &^ &^D""" &*D"""r!   c                     |                      |          }|                     |          }|                     ||          }|S r#   )r   r   r}   r   s       r    r&   zCell.forward   s@    ##F++--((!!&'22r!   )r   FFr(   r-   s   @r    r   r      sX         "'1* 1* 1* 1* 1* 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     r               avgr   c                    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          j                    | _        t;          ddd          t;          ddd          t;          ddd          t;          dd d!          t;          ddd"          g| _        t?          | j        | j        ||#          \  | _         | _!        | _"        d S )$Ni  r   `   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__   sa    	mT""++---&488D1""""!ba1r~53GGGSXZ Z Z %"BYac c c  3c\d"&T; ; ; #Cs]e"&( ( ( #DPS^fh h h3TQT_gi i i3TQT_gi i i 3TQT_g   3TQT_g"&( ( ( 3TQT_gi i i3TQT_gi i i 3TQT_g   3TQT_g"&( ( ( 3TQT_gi i i3TQT_gi i i799q:::2LMMM3HIII4IJJJE:::
 >Ot/;R[>] >] >]:$.$*:*:*:r!   Fc                 $    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JJJr!   Tc                     |r
J d            d S )Nz$gradient checkpointing not supportedr~   )r   enables     r    set_grad_checkpointingz$PNASNet5Large.set_grad_checkpointing.  s    AAAAAAAAr!   returnc                     | j         S r#   )r   )r   s    r    get_classifierzPNASNet5Large.get_classifier2  s    r!   r   r   c                 f    || _         t          | j        | j         |          \  | _        | _        d S )N)r   )r   r   r   r   r   )r   r   r   s      r    reset_classifierzPNASNet5Large.reset_classifier6  s?    &->t/;.H .H .H*$***r!   c                    |                      |          }|                     |          }|                     ||          }|                     ||          }|                     ||          }|                     ||          }|                     ||          }|                     ||          }	|                     ||	          }
| 	                    |	|
          }| 
                    |
|          }|                     ||          }|                     ||          }|                     ||          }|                     ||          }|                     |          }|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;  s3   ;;q>>##H--##Hh77;;x22;;x22;;x22;;x22;;x22;;x22;;x22;;x22;;x22;;x22LL844	LL955	HHYr!   
pre_logitsc                     |                      |          }|                     |          }|r|n|                     |          S r#   )r   r   r   )r   r%   r   s      r    forward_headzPNASNet5Large.forward_headN  sC    QNN17qqD$4$4Q$7$77r!   c                 Z    |                      |          }|                     |          }|S r#   )r   r   r$   s     r    r&   zPNASNet5Large.forwardS  s-    !!!$$a  r!   )r   r   r   r   r   r   F)T)r   )r)   r*   r+   r   rY   jitignorer   r   r5   Moduler   intstrr   r   boolr   r&   r,   r-   s   @r    r   r      sM        A] A] A] A] A] A]F YK K K K YB B B B Y 	        H HC Hc H H H H
  &8 8$ 8 8 8 8
      r!   Fc                 L    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   Y  sC      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                 :    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  s  s4     222622L?JGG,GGGr!   r   )"__doc__collectionsr   	functoolsr   rY   torch.nnr5   torch.nn.functional
functionalF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 T T T T T T T T T T * * * * * * < < < < < < < <
    bi        ry   0    	        ")   0    ry   <# # # # # # # #L9 9 9 9 98 9 9 9xp p p p pBI p p pf    %$#"## &    H H H H H H H Hr!   