o
    oiD                     @  sd   d dl mZ d dlZd dlmZ d dlZd dlmZmZ d dl	m
Z
 d dlmZ G dd deZdS )	    )annotationsN)Any)ModuleTensor)dsnt)create_meshgridc                      s>   e Zd ZdZd fddZdddZe dddZ  Z	S )FineMatchingzFineMatching with s2d paradigm.returnNonec                   s   t    d S )N)super__init__)self	__class__ \/home/ubuntu/.local/lib/python3.10/site-packages/kornia/feature/loftr/utils/fine_matching.pyr   !   s   zFineMatching.__init__feat_f0r   feat_f1datadict[str, Any]c              	   C  s  |j \}}}tt|}|d d |d d  }|||||f\| _| _| _| _| _|dkrM| j	r5t
d|tjdd|j|jd|d |d d	 d
S |d
d
|d d
d
f }	td|	|}
d|d  }tj||
 ddd||}t|d
 dd }t||d|j|jdddd}tj|d |d|d dd|d  }tttj|ddd}|dt||dgdi | || d
S )a]  Run forward.

        Args:
            feat_f0 (torch.Tensor): [M, WW, C]
            feat_f1 (torch.Tensor): [M, WW, C]
            data (dict)
        Update:
            data (dict):{
                'expec_f' (torch.Tensor): [M, 3],
                'mkpts0_f' (torch.Tensor): [M, 2],
                'mkpts1_f' (torch.Tensor): [M, 2]}

        hw0_ir   hw0_fz+M >0, when training, see coarse_matching.py   )devicedtypemkpts0_cmkpts1_c)expec_fmkpts0_fmkpts1_fN   z
mc,mrc->mrg      ?g      ?   )dimT)normalized_coordinatesr   r   g|=)minr   )shapeintmathsqrtMWWWCscaletraining
ValueErrorupdatetorchemptyr   r   einsumsoftmaxviewr   spatial_expectation2dr   reshapesumclampcat	unsqueezeget_fine_match)r   r   r   r   r*   r,   r-   r+   r.   feat_f0_picked
sim_matrixsoftmax_tempheatmapcoords_normalizedgrid_normalizedvarstdr   r   r   forward$   s8   "
( zFineMatching.forwardcoords_normedc           	      C  s   | j | j| j| jf\}}}}|d }d|v r ||d |d   n|}|d ||d  | d t|d   }|||d d S )	Nr   scale0scale1b_idsr   r    mconf)r   r   )r+   r,   r-   r.   lenr1   )	r   rG   r   r+   _r.   r   rI   r   r   r   r   r=   Z   s
    (zFineMatching.get_fine_match)r	   r
   )r   r   r   r   r   r   r	   r
   )rG   r   r   r   r	   r
   )
__name__
__module____qualname____doc__r   rF   r2   no_gradr=   __classcell__r   r   r   r   r      s    
6r   )
__future__r   r(   typingr   r2   kornia.corer   r   kornia.geometry.subpixr   kornia.utils.gridr   r   r   r   r   r   <module>   s   