
    ^jC                        d Z ddlm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%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)partial)TypeN)ConvNormActcreate_conv2dcreate_pool2dcreate_classifier   )build_model_with_cfg)register_modelgenerate_default_cfgsPNASNet5Largec                   B     e Zd Z	 	 	 ddededededef
 fdZd Z xZS )	SeparableConv2din_channelsout_channelskernel_sizestridepaddingc                     ||d}t         	|           t        ||f||||d|| _        t        ||fd|d|| _        y )Ndevicedtype)r   r   r   groupsr
   r   r   )super__init__r   depthwise_conv2dpointwise_conv2d
selfr   r   r   r   r   r   r   dd	__class__s
            ^/var/www/ramen.bs-engineer-server.com/venv/lib/python3.12/site-packages/timm/models/pnasnet.pyr   zSeparableConv2d.__init__   sv     / -!
 $!
 !
 !.!
 	!

 !
    c                 J    | j                  |      }| j                  |      }|S N)r   r   r!   xs     r$   forwardzSeparableConv2d.forward5   s'    !!!$!!!$r%    NN__name__
__module____qualname__intstrr   r*   __classcell__r#   s   @r$   r   r      sH     

 
 	

 
 
:r%   r   c                   J     e Zd Z	 	 	 	 	 d	dedededededef fdZd Z xZS )
BranchSeparablesr   r   r   r   	stem_cellr   c	                 h   ||d}	t         |           |r|n|}
t        j                         | _        t        ||
|f||d|	| _        t        j                  |
fddi|	| _        t        j                         | _	        t        |
||fd|d|	| _
        t        j                  |fddi|	| _        y )Nr   r   r   epsMbP?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   r7   r   r   r   r"   middle_channelsr#   s              r$   r   zBranchSeparables.__init__=   s     /*3,WWY
*
 
 
 HEHRHWWY
*
 
 
 |EE"Er%   c                     | j                  |      }| j                  |      }| j                  |      }| j                  |      }| j	                  |      }| j                  |      }|S r'   )r>   r?   rA   rB   rC   rD   r(   s     r$   r*   zBranchSeparables.forward`   s]    JJqMQMM!JJqMQMM!r%   )r
   Fr,   NN)	r.   r/   r0   r1   boolr2   r   r*   r3   r4   s   @r$   r6   r6   ;   s`     #!F!F !F 	!F
 !F !F !FFr%   r6   c                   D     e Zd Z	 	 	 	 ddededededef
 fdZd Z xZS )		ActConvBnr   r   r   r   r   c                     ||d}t         	|           t        j                         | _        t        ||f|||d|| _        t        j                  |fddi|| _        y )Nr   r   r   r   r:   r;   )	r   r   r<   r=   actr   convr@   bnr    s
            r$   r   zActConvBn.__init__l   so     /779!
 $
 
	 ..?5?B?r%   c                 l    | j                  |      }| j                  |      }| j                  |      }|S r'   )rL   rM   rN   r(   s     r$   r*   zActConvBn.forward   s.    HHQKIIaLGGAJr%   )r
   r,   NNr-   r4   s   @r$   rI   rI   j   sQ     @@ @ 	@
 @ @.r%   rI   c                   :     e Zd Z	 	 	 ddededef fdZd Z xZS )FactorizedReductionr   r   r   c                    ||d}t         |           t        j                         | _        t        j
                  t        dt        j                  ddd      fdt        ||dz  fd|d|fg            | _	        t        j
                  t        d	t        j                  d
      fdt        j                  ddd      fdt        ||dz  fd|d|fg            | _        t        j                  |fddi|| _        y )Nr   avgpoolr
      F)r   count_include_padrM   r   pad)r
   rW   r
   r:   r;   )r   r   r<   r=   rL   
Sequentialr   	AvgPool2dr   path_1	ZeroPad2dpath_2r@   final_path_bn)r!   r   r   r   r   r   r"   r#   s          r$   r   zFactorizedReduction.__init__   s     /779mmKQqEJK];0AhqZaheghi1
 %  mmKBLL01QqEJK];0AhqZaheghi1
 % 
  ^^LJeJrJr%   c                     | j                  |      }| j                  |      }| j                  |      }| j                  t	        j
                  ||gd            }|S Nr
   )rL   rZ   r\   r]   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-   r4   s   @r$   rQ   rQ      s8     KK K 	K,r%   rQ   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 r_   )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_rightr`   ra   )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_forward   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/   r0   r    r%   r$   rf   rf      s    r%   rf   c                   B     e Zd Z	 	 	 ddededededef
 fdZd Z xZS )		CellStem0in_chs_leftout_chs_leftin_chs_rightout_chs_rightpad_typec                    ||d}t         	|           t        ||fd|d|| _        t	        ||fddd|d|| _        t        j                  t        dt        d	d
d|      fdt        ||fd|d|fdt        j                  |fddi|fg            | _        t	        ||fdd|d|| _        t        d	d
d|      | _        t	        ||fdd|d|| _        t	        ||fd
d|d|| _        t	        ||fd
|d|| _        t        d	d
d|      | _        t	        ||fd
dd|d|| _        t        ||fdd|d|| _        y )Nr   r
   r      rT   T)r   r   r7   r   max_poolmax   r9   rM   rN   r:   r;      rK   )r   r   rI   conv_1x1r6   rh   r<   rX   r   r   r   r@   ri   rj   rk   rl   rm   rn   ro   rp   rq   )
r!   r   r   r   r   r   r   r   r"   r#   s
            r$   r   zCellStem0.__init__   s    /!,e1V^ebde 0!h34Q$X`!hdf!h!#{ua8LM];d!U]dacde2>>,@E@R@A<
 0 " !1=![678![WY![!.ua8!T 0=![678![WY![!1="[678"[WY"[ !1=!Q67!QMO!Q!.ua8!T 0-!j56qDZb!jfh!j!*="[678"[WY"[r%   c                 L    | j                  |      }| j                  ||      }|S r'   )r   r   r!   rr   rs   r   s       r$   r*   zCellStem0.forward   s'    --'!!&'2r%   r+   r-   r4   s   @r$   r   r      sO     &[&[ &[ 	&[
 &[ &[Pr%   r   c                   N     e Zd Z	 	 	 	 	 d
dededededededef fdZd	 Z xZS )Cellr   r   r   r   r   is_reductionmatch_prev_layer_dimsc
                    ||	d}
t         |           |rdnd}|| _        |rt        ||fd|i|
| _        nt        ||fd|d|
| _        t        ||fd|d|
| _        t        ||fd||d|
| _        t        dd	||
      | _
        t        ||fd||d|
| _        t        dd	||
      | _        t        ||fd||d|
| _        t        ||fd	||d|
| _        t        ||fdd	i|
| _        t        dd	||
      | _        t        ||fd	||d|
| _        |rt        ||fd||d|
| _        y d | _        y )Nr   rT   r
   r   r   r   rK   r   r   r9   r   r   )r   r   match_prev_layer_dimensionsrQ   conv_prev_1x1rI   r   r6   rh   r   ri   rj   rk   rl   rm   rn   ro   rp   rq   )r!   r   r   r   r   r   r   r   r   r   r"   r   r#   s               r$   r   zCell.__init__   s    / #
 ,A( !4[,!gX`!gdf!gD!*;!lRS]e!lik!lD!,e1V^ebde 0,!^45fh!^Z\!^!.uaPX!Y 0=!`67PX!`\^!`!.uaPX!Y 0=!`67PX!`\^!`!1="`67PX"`\^"` !1 c[\ c`b c!.uaPX!Y 0,!^45fh!^Z\!^%.}&d:;FT\&d`b&d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,   FFNN)	r.   r/   r0   r1   r2   rG   r   r*   r3   r4   s   @r$   r   r      sc     !&*/3*3* 3* 	3*
 3* 3* 3* $(3*jr%   r   c                   <    e Zd Z	 	 	 	 	 	 	 	 ddedededededef 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   num_classesin_chansoutput_stride	drop_rateglobal_poolr   c	                 |   t         
|           ||d}	|| _        || _        dx| _        | _        |dk(  sJ t        |dfdddt        t        j                  dd	
      dd|	| _
        t        d%dddd|d|	| _        t        d%dddd|ddd|	| _        t        d%dddd|dd|	| _        t        d%dddd|d|	| _        t        d%dddd|d|	| _        t        d%dddd|d|	| _        t        d%dddd|dd|	| _        t        d%dddd|dd|	| _        t        d%dddd|d|	| _        t        d%dddd|d|	| _        t        d%dddd|dd|	| _        t        d%dddd|dd|	| _        t        d%dddd|d|	| _        t        d%d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                  f||d$|	\  | _         | _!        | _"        y )&Nr   i      `   r   rT   r   r;   g?)r:   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.actrL   )	pool_typer   r   )#r   r   r   r   num_featureshead_hidden_sizer   r   r<   r@   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_11r=   rL   dictfeature_infor	   r   	head_droplast_linear)r!   r   r   r   r   r   r   r   r   r"   r#   s             r$   r   zPNASNet5Large.__init__7  sq    	/& 488D1"""!b`&'1r~~53GSX`\^` % i"BYaiegi   A3c\d"&TA=?A  .#Cs]e"&.*,.  n#DPS^fnjln o3TQT_gokmo o3TQT_gokmo  %3TQT_g%!#%  .3TQT_g"&.*,.  o3TQT_gokmo o3TQT_gokmo  %3TQT_g%!#%  .3TQT_g"&.*,.  o3TQT_gokmo o3TQT_gokmo779q:2LM3HI4IJE:
 >Ot//>c;FR[>c_a>c:$.$*: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_classifier  s    r%   c                 |    ||d}|| _         t        | j                  | j                   fd|i|\  | _        | _        y )Nr   r   )r   r	   r   r   r   )r!   r   r   r   r   r"   s         r$   reset_classifierzPNASNet5Large.reset_classifier  sM    /&->t//.N;F.NJL.N*$*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   rL   )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_head  s8    QNN1q7D$4$4Q$77r%   c                 J    | j                  |      }| j                  |      }|S r'   )r   r   r(   s     r$   r*   zPNASNet5Large.forward  s'    !!!$a r%   )  r   r   g        avgr,   NNF)T)r   NN)r.   r/   r0   r1   floatr2   r   r`   jitignorer   r   r<   Moduler   r   r   rG   r   r*   r3   r4   s   @r$   r   r   6  s      $!#!$EcEc Ec 	Ec
 Ec Ec EcN YYK K YYB B YY 		    NC Nc N&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     s3     V=	
  r%   zpnasnet5large.tf_in1kztimm/)r   K  r   )   r   gx&?bicubic)      ?r   r   r   zconv_0.convr   z
apache-2.0)	hf_hub_id
input_size	pool_sizecrop_pctinterpolationmeanstdr   
first_conv
classifierlicenser   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    s(     2262L?JG,GGr%   r   )!__doc__collectionsr   	functoolsr   typingr   r`   torch.nnr<   timm.layersr   r   r   r	   _builderr   	_registryr   r   __all__r   r   r6   rI   rQ   rf   r   r   r   r   default_cfgsr  r   r%   r$   <module>r     s   $     T T * <
"bii "J,ryy ,^		 @")) @ryy <- -`;8 ;|uBII up %#"##& " H H Hr%   