o
    oi0                     @  s   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
mZmZmZmZmZ d dlmZ G dd dejZdddZdddZdddZdddZG dd dejZdddZdddZdddZdddZdS )     )annotations)AnyN)nn)		ConvLayerDSConvEfficientViTBlockFusedMBConvIdentityLayerMBConvOpSequentialResBlockResidualBlock)build_kwargs_from_configc                      sF   e Zd Z					d"d# fddZe	d$d%ddZd&d d!Z  ZS )'EfficientViTBackbone          bn2dhswish
width_list	list[int]
depth_listin_channelsintdimexpand_ratiofloatnormstract_funcreturnNonec                   s  t    g | _t||d d||dg}t|d D ]}	| j|d |d dd||d}
|t|
t  q|d }t	|| _
| j| g }t|dd |dd D ]@\}}g }t|D ](}|dkrednd}| j||||||d}
t|
|dkr{t nd }
||
 |}q]|t	| | j| qSt|dd  |dd  D ]<\}}g }| j||d|||dd}
|t|
d  |}t|D ]}	|t|||||d	 q|t	| | j| qt|| _d S )
Nr      r   out_channelsstrider   r      )r   r$   r%   r   r   r   r   T)r   r$   r%   r   r   r   
fewer_normr   r   r   r   r   )super__init__r   r   rangebuild_local_blockappendr   r	   r   
input_stemzipr   r   
ModuleListstages)selfr   r   r   r   r   r   r   r.   _blockr1   wdstageir%   	__class__ `/home/ubuntu/.local/lib/python3.10/site-packages/kornia/contrib/models/efficient_vit/backbone.pyr*   +   sr   


"
"	
zEfficientViTBackbone.__init__Fr$   r%   r'   bool	nn.Modulec              
   C  sn   |dkrt | |||rdnd|rd |fn||d fd}|S t| ||||r%dnd|r-d d |fn|||d fd}|S )Nr&   TFFr   r$   r%   use_biasr   r   TTFr   r$   r%   r   rA   r   r   )r   r
   )r   r$   r%   r   r   r   r'   r4   r;   r;   r<   r,   v   s(   


	z&EfficientViTBackbone.build_local_blockxtorch.Tensordict[str, torch.Tensor]c                 C  sR   d|i}|  | |d< }t| jdD ]\}}|| |d| < }q||d< |S )Ninputstage0r&   r7   stage_final)r.   	enumerater1   r2   rD   output_dictstage_idr7   r;   r;   r<   forward   s   zEfficientViTBackbone.forward)r   r   r   r   r   )r   r   r   r   r   r   r   r   r   r   r   r   r   r   r    r!   F)r   r   r$   r   r%   r   r   r   r   r   r   r   r'   r=   r    r>   rD   rE   r    rF   __name__
__module____qualname__r*   staticmethodr,   rN   __classcell__r;   r;   r9   r<   r   *   s    Kr   kwargsdict[str, Any]r    c                  K  (   t dg dg dddt| t }|S )zCreate EfficientViT B0.)      r   @      )r&   r"   r"   r"   r"   r[   r   r   r   Nr;   r   r   rW   backboner;   r;   r<   efficientvit_backbone_b0      rb   c                  K  rY   )zCreate EfficientViT B1.)r[   r   r\   r]      )r&   r"   r   r   r   r[   r^   Nr;   r_   r`   r;   r;   r<   efficientvit_backbone_b1   rc   re   c                  K  rY   )zCreate EfficientViT B2.)   0   `      i  )r&   r   r   r      r   r^   Nr;   r_   r`   r;   r;   r<   efficientvit_backbone_b2   rc   rk   c                  K  rY   )zCreate EfficientViT B3.r   r\   r]   rd      )r&   r   rj   rj   	   r   r^   Nr;   r_   r`   r;   r;   r<   efficientvit_backbone_b3   rc   ro   c                      sD   e Zd Z				d"d# fddZe	d$d%ddZd&d d!Z  ZS )'EfficientViTLargeBackboner   r   r   gelur   r   r   r   r   qkv_dimr   r   r   r    r!   c                   s  t    g | _g }t||d d||dg}t|d D ]}	| jd|d |d dd||d}
|t|
t  q|d }|t	| | j| t
t|dd |dd ddD ]N\}\}}g }t|d D ]2}|dkrpdnd}| j|||||dkr~dnd|||dkd	}
t|
|dkrt nd }
||
 |}qh|t	| | j| qZt
t|dd  |dd  ddD ]?\}\}}g }| j|||dd
||dd	}
|t|
d  |}t|D ]}	|t||d||d q|t	| | j| qt|| _d S )Nr   r"   r#   r&   )rM   r   r$   r%   r   r   r   r   )startr[   )rM   r   r$   r%   r   r   r   r'   rf   Trj   r(   )r)   r*   r   r   r+   r,   r-   r   r	   r   rJ   r/   r   r   r0   r1   )r2   r   r   r   rr   r   r   r1   rH   r3   r4   rM   r5   r6   r7   r8   r%   r9   r;   r<   r*      sz   
		.

.

z"EfficientViTLargeBackbone.__init__FrM   r$   r%   r   r   r'   r=   r>   c           	   
   C  s   |dkrt ||||rdnd|rd |fn||d fd}|S | dkr9t|||||r)dnd|r0d |fn||d fd}|S t|||||rBdnd|rJd d |fn|||d fd}|S )Nr&   r?   Fr@   r"   rC   rB   )r   r   r
   )	rM   r   r$   r%   r   r   r   r'   r4   r;   r;   r<   r,     s>   


	z+EfficientViTLargeBackbone.build_local_blockrD   rE   rF   c                 C  s>   d|i}t | jD ]\}}|| |d| < }q	||d< |S )NrG   r7   rI   )rJ   r1   rK   r;   r;   r<   rN   B  s
   z!EfficientViTLargeBackbone.forward)r   r   r   rq   )r   r   r   r   r   r   rr   r   r   r   r   r   r    r!   rO   )rM   r   r   r   r$   r   r%   r   r   r   r   r   r   r   r'   r=   r    r>   rP   rQ   r;   r;   r9   r<   rp      s    M	)rp   c                  K  &   t dg dg ddt| t }|S )zCreate EfficientViT L0.rl   )r&   r&   r&   r   r   r   r   Nr;   rp   r   r`   r;   r;   r<   efficientvit_backbone_l0J     rw   c                  K  rt   )zCreate EfficientViT L.rl   )r&   r&   r&   rj   rj   ru   Nr;   rv   r`   r;   r;   r<   efficientvit_backbone_l1T  rx   ry   c                  K  rt   )zCreate EfficientViT L2.rl   r&   r"   r"   rZ   rZ   ru   Nr;   rv   r`   r;   r;   r<   efficientvit_backbone_l2^  rx   r{   c                  K  rt   )zCreate EfficientViT L3.)r\   r]   rd   rm   i   rz   ru   Nr;   rv   r`   r;   r;   r<   efficientvit_backbone_l3h  rx   r|   )rW   rX   r    r   )rW   rX   r    rp   )
__future__r   typingr   torchr   *kornia.contrib.models.efficient_vit.nn.opsr   r   r   r   r	   r
   r   r   r   )kornia.contrib.models.efficient_vit.utilsr   Moduler   rb   re   rk   ro   rp   rw   ry   r{   r|   r;   r;   r;   r<   <module>   s"   ,
t


 





