o
    Wbf                     @   s   d dl Z d dlZd dlZd dlZd dlm  mZ ddl	m
Z
mZ d dlmZ d dlmZ d dlmZ dd Zd	d
 Zdd Zd!deej fddZd!deej fddZdd Zg dddgg dddddfddZd"ddZd"ddZd"dd ZdS )#    N   )forward_adapted_unflattenmake_backbone_default)gen_relative_position_index)
checkpoint)Optionalc                 C   s   t | |dS )Nforward_features)r   )
pretrainedx r   TC:\Users\Kristjan\AppData\Local\Programs\Python\MiDaS-master\midas\backbones\beit.pyforward_beit   s   r   c                 C   s0   |  |}| jr|ddd}| |}|S )zr
    Modification of timm.models.layers.patch_embed.py: PatchEmbed.forward to support arbitrary window sizes.
       r   )projflatten	transposenorm)selfr
   r   r   r   patch_embed_forward   s
   

r   c                 C   sd  d| j d  d }d| j d  d }d|d  d }d|d  d }| j}| j}|| d }|d|d  }	|	d||ddddd}	tj|	||fdd}
|
dddd|d d}
t|
||d d g}t	|d d	 t	|d  }|| j
 vrt|| j
|< || j
| d |d |d  d |d |d  d d}|ddd }|dS )
zm
    Modification of timm.models.beit.py: Attention._get_rel_pos_bias to support arbitrary window sizes.
    r   r   r      Nbilinear)sizemode,)window_sizerelative_position_bias_tableZnum_relative_distancereshapepermuteFinterpolatetorchcatstrrelative_position_indiceskeysr   view
contiguous	unsqueeze)r   r   Z
old_heightZ	old_widthZ
new_heightZ	new_widthZ old_relative_position_bias_tableZold_num_relative_distanceZnew_num_relative_distanceZold_sub_tableZnew_sub_tableZ new_relative_position_bias_tablekeyZrelative_position_biasr   r   r   _get_rel_pos_bias   s6   
r*   shared_rel_pos_biasc                 C   s  |j \}}}| jdurt| j| j| jfnd}tj|| jj	|d}|
||d| jdddddd}|d\}	}
}|	| j }	|	|
d	d }| jdur]tt|d
 }|| | }|dure|| }|jdd}| |}|| dd
||d}| |}| |}|S )zc
    Modification of timm.models.beit.py: Attention.forward to support arbitrary window sizes.
    N)inputweightbiasr   r   r   r   r         dim)shapeq_biasr!   r"   Zk_biasZv_biasr   linearqkvr-   r   	num_headsr   unbindscaler   r   tuplenparrayr*   softmaxZ	attn_dropr   Z	proj_drop)r   r
   
resolutionr+   BNCZqkv_biasr7   qkvattnr   r   r   r   attention_forwardA   s$   $"




rG   c              	   C   s   | j du r$|| | j| |||d }|| | | | }|S || | j | j| |||d  }|| | j| | |  }|S )z_
    Modification of timm.models.beit.py: Block.forward to support arbitrary window sizes.
    Nr+   )Zgamma_1Z	drop_pathrF   norm1Zmlpnorm2Zgamma_2)r   r
   r?   r+   r   r   r   block_forward^   s   
  rK   c                 C   s   |j dd }| |}tj| j|j d dd|fdd}| jdur(|| j }| |}| jdur6|  nd}| j	D ]}| j
rMtj sMt|||d}q;||||d}q;| |}|S )zg
    Modification of timm.models.beit.py: Beit.forward_features to support arbitrary window sizes.
    r   Nr   r   r   r2   rH   )r4   patch_embedr!   r"   Z	cls_tokenexpandZ	pos_embedZpos_droprel_pos_biasblocksZgrad_checkpointingjitis_scriptingr   r   )r   r
   r?   rN   Zblkr   r   r   beit_forward_featuresl   s   
$




rR   `           rV   )r   r/         rW   ignorec              	   C   s   t | |||||||}tt|jj|jj_tt|j|j_|jj	D ]}	|	j
}
tt|
|
_tt|
|
_i |
_tt|	|	_q#|S N)r   types
MethodTyper   modelrL   forwardrR   r   rO   rF   r*   rG   r$   rK   )r^   featuresr   hooksvit_featuresuse_readoutstart_indexZstart_index_readoutbackboneblockrF   r   r   r   _make_beit_backbone   s   
rg   c                 C   sB   t jd| d}|d u rg dn|}g d}t||ddg|d|dS )NZbeit_large_patch16_512r	      rY                  rp   ro   rp   )r`   r   ra   rb   rc   timmZcreate_modelrg   )r	   rc   ra   r^   r`   r   r   r   _make_pretrained_beitl16_512   s   rs   c                 C   s8   t jd| d}|d u rg dn|}t|g d|d|dS )NZbeit_large_patch16_384rh   ri   rm   rp   )r`   ra   rb   rc   rq   r	   rc   ra   r^   r   r   r   _make_pretrained_beitl16_384   s   ru   c                 C   s6   t jd| d}|d u rg dn|}t|g d||dS )NZbeit_base_patch16_384rh   )r   rj   rX   rY   rS   )r`   ra   rc   rq   rt   r   r   r   _make_pretrained_beitb16_384   s   rv   r[   )rZ   N)rr   r!   r\   numpyr<   Ztorch.nn.functionalnn
functionalr   utilsr   r   Ztimm.models.beitr   Ztorch.utils.checkpointr   typingr   r   r   r*   TensorrG   rK   rR   rg   rs   ru   rv   r   r   r   r   <module>   s4    $


