a
    dfC                     @   s  d Z ddl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 ddlmZmZmZmZmZ dd	lmZ dd
lmZ ddlmZmZ dgZd2e
jeedddZ G dd de
jZ!G dd de
jZ"G dd de"Z#G dd de
jZ$G dd de
jZ%G dd de
jZ&G dd de
jZ'G d d de
jZ(d!d" Z)d3d#d$Z*d4d&d'Z+ee+d(d)e+d(d)e+d(d)d*Z,ed5e(d+d,d-Z-ed6e(d+d.d/Z.ed7e(d+d0d1Z/dS )8zk Sequencer

Paper: `Sequencer: Deep LSTM for Image Classification` - https://arxiv.org/pdf/2205.01972.pdf

    N)partial)
accumulate)Tuple)IMAGENET_DEFAULT_MEANIMAGENET_DEFAULT_STDDEFAULT_CROP_PCT)lecun_normal_DropPathMlp
PatchEmbedClassifierHead   )build_model_with_cfg)named_apply)register_modelgenerate_default_cfgsSequencer2d        F)modulename	head_biasc                 C   sl  t | tjr|dr6tj| j tj| j| nj|r^t	| j | jd urtj| j nBtj
| j | jd urd|v rtjj| jdd ntj| j nt | tjrt	| j | jd urtj| j nt | tjtjtjfrtj| j tj| j n`t | tjtjtjfrTdt| j }|  D ]}tj|| | q8nt| drh|   d S )NheadZmlpư>)stdg      ?init_weights)
isinstancennLinear
startswithinitZzeros_weightZ	constant_biasr   Zxavier_uniform_Znormal_Conv2d	LayerNormZBatchNorm2dZ	GroupNormZones_ZRNNZGRULSTMmathsqrthidden_size
parametersZuniform_hasattrr   )r   r   r   ZflaxZstdvr     r*   ^/var/www/html/stable-diffusion-webui/venv/lib/python3.9/site-packages/timm/models/sequencer.py_init_weights   s4    





r,   c                       s8   e Zd Z fddZejeejdf dddZ  ZS )RNNIdentityc                    s   t t|   d S N)superr-   __init__)selfargskwargs	__class__r*   r+   r0   <   s    zRNNIdentity.__init__N)xreturnc                 C   s   |d fS r.   r*   r1   r6   r*   r*   r+   forward?   s    zRNNIdentity.forward)	__name__
__module____qualname__r0   torchZTensorr   r9   __classcell__r*   r*   r4   r+   r-   ;   s   r-   c                       s4   e Zd Zd	eeeeed fddZdd Z  ZS )
	RNN2dBaser   Tcat
input_sizer'   
num_layersr!   bidirectionalc                    s  t    || _|| _|r"d| n|| _|| _d| _d| _|| _d | _	|r|dkrht
d| j || _	nf|dkrt
| j|| _	nL|dkrt
| j|| _	d| _n,|dkrt
| j|| _	d| _ntd| n|dkrd| j |krtd	d| j  d
| dn|dkr8| j|krtd	| j d
| dnx|dkrn| j|krftd	| j d
| dd| _nB|dkr| j|krtd	| j d
| dd| _ntd| t | _t | _d S )N   Tr@   addZverticalFZ
horizontalzUnrecognized union: zThe output channel z% is different from the input channel .)r/   r0   rB   r'   Zoutput_sizeunionwith_verticalwith_horizontalwith_fcfcr   r   
ValueErrorr-   rnn_vrnn_hr1   rB   r'   rC   r!   rD   rH   rK   r4   r*   r+   r0   E   sL    





zRNN2dBase.__init__c           	      C   s
  |j \}}}}| jrb|dddd}|d||}| |\}}||||d}|dddd}nd }| jr|d||}| |\}}||||d}nd }|d ur|d ur| jdkrtj	||gdd}q|| }n|d ur|}n|d ur|}| j
d ur| 
|}|S )Nr   rE   r      r@   )dim)shaperI   permutereshaperN   rJ   rO   rH   r=   r@   rL   )	r1   r6   BHWCv_hr*   r*   r+   r9   ~   s0    


zRNN2dBase.forward)r   TTr@   T)r:   r;   r<   intboolr0   r9   r>   r*   r*   r4   r+   r?   C   s        9r?   c                       s,   e Zd Zdeeeeed fddZ  ZS )LSTM2dr   Tr@   rA   c              	      sX   t  ||||||| | jr6tj|||d||d| _| jrTtj|||d||d| _d S )NT)Zbatch_firstr!   rD   )r/   r0   rI   r   r$   rN   rJ   rO   rP   r4   r*   r+   r0      s&    
zLSTM2d.__init__)r   TTr@   T)r:   r;   r<   r^   r_   r0   r>   r*   r*   r4   r+   r`      s        r`   c                       sH   e Zd Zdeeeejddejddddddf fdd		Z	d
d Z
  ZS )Sequencer2dBlock      @r   Zepsr   Tr@   r   c                    sp   t    t|| }||| _|||||	|
|d| _|dkrFt|nt | _||| _	|||||d| _
d S )N)rC   rD   rH   rK   r   )	act_layerdrop)r/   r0   r^   norm1
rnn_tokensr	   r   Identity	drop_pathnorm2mlp_channels)r1   rS   r'   	mlp_ratio	rnn_layer	mlp_layer
norm_layerrd   rC   rD   rH   rK   re   ri   Zchannels_dimr4   r*   r+   r0      s    


zSequencer2dBlock.__init__c                 C   s8   ||  | | | }||  | | | }|S r.   )ri   rg   rf   rk   rj   r8   r*   r*   r+   r9      s    zSequencer2dBlock.forward)r:   r;   r<   r`   r
   r   r   r#   GELUr0   r9   r>   r*   r*   r4   r+   ra      s   ra   c                       s$   e Zd Z fddZdd Z  ZS )Shufflec                    s   t    d S r.   )r/   r0   r1   r4   r*   r+   r0      s    zShuffle.__init__c                 C   sV   | j rR|j\}}}}t|| }||d|}|d d |d d f |||d}|S )NrR   )ZtrainingrT   r=   ZrandpermrV   )r1   r6   rW   rX   rY   rZ   rr*   r*   r+   r9      s    "zShuffle.forwardr:   r;   r<   r0   r9   r>   r*   r*   r4   r+   rq      s   rq   c                       s$   e Zd Z fddZdd Z  ZS )Downsample2dc                    s"   t    tj||||d| _d S )N)Zkernel_sizeZstride)r/   r0   r   r"   down)r1   Z	input_dimZ
output_dim
patch_sizer4   r*   r+   r0      s    
zDownsample2d.__init__c                 C   s.   | dddd}| |}| dddd}|S )Nr   rQ   r   rE   )rU   rv   r8   r*   r*   r+   r9      s    
zDownsample2d.forwardrt   r*   r*   r4   r+   ru      s   ru   c                       sJ   e Zd Zdeeeeejddej	ddddddf fdd		Z
d
d Z  ZS )Sequencer2dStageFr   rc   r   Tr@   r   c                    s   t    |rt|||| _n||ks*J t | _g }t|D ]B}||||||	|
|||||||t|t	t
frx|| n|d q@tj| | _d S )N)rl   rm   rn   ro   rd   rC   rD   rH   rK   re   ri   )r/   r0   ru   
downsampler   rh   rangeappendr   listtuple
Sequentialblocks)r1   rS   Zdim_outdepthrw   r'   rl   ry   block_layerrm   rn   ro   rd   rC   rD   rH   rK   re   ri   r   Z	block_idxr4   r*   r+   r0     s.    


zSequencer2dStage.__init__c                 C   s   |  |}| |}|S r.   )ry   r   r8   r*   r*   r+   r9   1  s    

zSequencer2dStage.forward)r:   r;   r<   ra   r`   r
   r   r   r#   rp   r0   r9   r>   r*   r*   r4   r+   rx     s   	/rx   c                       s   e Zd Zddddddddd	eeeeejd
dej	ddddddddf fdd	Z
d%ddZejjd&ddZejjd'ddZejjdd Zd(ddZdd Zd)ed d!d"Zd#d$ Z  ZS )*r        rQ   avg   rQ      rQ   )   rE   rE   r        r   r   0   `   r   r   rb   rb   rb   rb   r   rc   r   Tr@   r   Fc                    s  t    |dv sJ || _|| _|d | _d| _d| _g | _td |d ||d |rX|nd ddd| _	t
|t
|  krt
|  krt
|  krt
|	ksn J tt|dd }g }|d }t|D ]~\}}|t||| || |dk|| || |	| |
||||||||||d	g7 }|| }|  jt||| d
| dg7  _qtj| | _||d | _t| j|||| jd| _| j|d d S )N) r   rR   ZNHWCr   F)img_sizerw   in_chansZ	embed_dimro   flatten
output_fmtc                 S   s   | | S r.   r*   )r6   yr*   r*   r+   <lambda>e      z&Sequencer2d.__init__.<locals>.<lambda>)r   ry   rw   r'   rl   r   rm   rn   ro   rd   rC   rD   rH   rK   re   ri   stages.)Znum_chsZ	reductionr   )	pool_type	drop_rateZ	input_fmt)nlhb)r/   r0   num_classesglobal_poolZnum_featuresZfeature_dimr   Zfeature_infor   stemlenr|   r   	enumeraterx   dictr   r~   stagesnormr   r   r   )r1   r   r   r   r   layerspatch_sizes
embed_dimshidden_sizes
mlp_ratiosr   rm   rn   ro   rd   Znum_rnn_layersrD   rH   rK   r   Zdrop_path_rater   Z	stem_normZ
reductionsr   Zprev_dimir\   r4   r*   r+   r0   8  sl    



B
&zSequencer2d.__init__c                 C   s.   |rt | j nd}ttt|d| d d S )Nr   )r   )r   )r%   logr   r   r   r,   )r1   r   r   r*   r*   r+   r     s    zSequencer2d.init_weightsc                 C   s   t d|rddgng ddS )Nz^stem)z^stages\.(\d+)Nz^norm)i ))z^stages\.(\d+)\.blocks\.(\d+)N)z^stages\.(\d+)\.downsample)r   r   )r   r   )r   )r1   Zcoarser*   r*   r+   group_matcher  s    zSequencer2d.group_matcherc                 C   s   |rJ dd S )Nz$gradient checkpointing not supportedr*   )r1   enabler*   r*   r+   set_grad_checkpointing  s    z"Sequencer2d.set_grad_checkpointingc                 C   s   | j S r.   r   rr   r*   r*   r+   get_classifier  s    zSequencer2d.get_classifierNc                 C   s   || _ | jj||d d S )N)r   )r   r   reset)r1   r   r   r*   r*   r+   reset_classifier  s    zSequencer2d.reset_classifierc                 C   s"   |  |}| |}| |}|S r.   )r   r   r   r8   r*   r*   r+   forward_features  s    


zSequencer2d.forward_features
pre_logitsc                 C   s   |r| j |ddS |  |S )NTr   r   )r1   r6   r   r*   r*   r+   forward_head  s    zSequencer2d.forward_headc                 C   s   |  |}| |}|S r.   )r   r   r8   r*   r*   r+   r9     s    

zSequencer2d.forward)F)F)T)N)F)r:   r;   r<   ra   r`   r
   r   r   r#   rp   r0   r   r=   Zjitignorer   r   r   r   r   r_   r   r9   r>   r*   r*   r4   r+   r   7  sD   T


c                 C   sr   d| v r| S d| v r| d } ddl }i }|  D ]<\}}|ddd |}|dd	|}|d
d}|||< q0|S )z$ Remap original checkpoints -> timm zstages.0.blocks.0.norm1.weightmodelr   Nzblocks.([0-9]+).([0-9]+).downc                 S   s   dt | dd  dS )Nr   r   z.downsample.down)r^   group)r6   r*   r*   r+   r     r   z&checkpoint_filter_fn.<locals>.<lambda>zblocks.([0-9]+).([0-9]+)zstages.\1.blocks.\2zhead.zhead.fc.)reitemssubreplace)Z
state_dictr   r   Zout_dictkr[   r*   r*   r+   checkpoint_filter_fn  s    
r   c                 K   s>   t td}|d|}tt| |fttd|dd|}|S )NrQ   out_indicesT)Zflatten_sequentialr   )Zpretrained_filter_fnZfeature_cfg)r}   rz   popr   r   r   r   )variant
pretrainedr3   Zdefault_out_indicesr   r   r*   r*   r+   _create_sequencer2d  s    
r   r   c                 K   s    | ddd t ddttddd|S )Nr   )rQ   r   r   ZbicubicTz	stem.projzhead.fc)urlr   rB   Z	pool_sizeZcrop_pctinterpolationZfixed_input_sizemeanr   Z
first_conv
classifier)r   r   r   )r   r3   r*   r*   r+   _cfg  s    r   ztimm/)Z	hf_hub_id)zsequencer2d_s.in1kzsequencer2d_m.in1kzsequencer2d_l.in1k)r7   c                 K   sP   t g dg dg dg dg dtdddd	}tdd
| it |fi |}|S )Nr   r   rE   r   r   r   r   r   Tr@   	r   r   r   r   r   rm   rD   rH   rK   sequencer2d_sr   )r   r   r`   r   r   r3   Z
model_argsr   r*   r*   r+   r     s    r   c                 K   sX   t f g dg dg dg dg dtdddd	|}tdd
| it |fi |}|S )N)r   rQ      rQ   r   r   r   r   Tr@   r   sequencer2d_mr   )r   r   r   r*   r*   r+   r     s    
r   c                 K   sX   t f g dg dg dg dg dtdddd	|}tdd
| it |fi |}|S )N)r   r      r   r   r   r   r   Tr@   r   sequencer2d_lr   )r   r   r   r*   r*   r+   r     s    
r   )r   F)F)r   )F)F)F)0__doc__r%   	functoolsr   	itertoolsr   typingr   r=   Ztorch.nnr   Z	timm.datar   r   r   Ztimm.layersr   r	   r
   r   r   Z_builderr   Z_manipulater   	_registryr   r   __all__Modulestrfloatr,   r-   r?   r`   ra   rq   ru   rx   r   r   r   r   Zdefault_cfgsr   r   r   r*   r*   r*   r+   <module>   sH   !^!&6 

