o
    oi                     @  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 ddl	m
Z
 e dddZe dddZdddZe dddZdddZdS )    )annotations)AnyN)Tensor)create_meshgrid   )	warp_kptsgrid_ptr   maskreturnc                 C  s>   |j \}}}|||| dddd}d| |  < | S )z5For megadepth dataset, zero-padding exists in images.r      r   )shapereshape	unsqueezerepeatbool)r   r	   nhw r   Z/home/ubuntu/.local/lib/python3.10/site-packages/kornia/feature/loftr/utils/supervision.pymask_pts_at_padded_regions   s    r   datadict[str, Any]configNonec           !        s4  | d j }| d j\}}}}| d j\}}}}|d d d d| v r/| d dddf  n}	d| v rA| d dddf  n}
fd	d
||||fD \}}}}t||d|d|| d||| d}|	| }t||d|d|| d||| d}|
| }d| v rt|| d }t|| d }t|| d | d | d | d | d \}}t|| d | d | d | d | d \}}||
 }||	 }|ddddddf   }|d |d |  }|ddddddf   }|d |d |   d&dd}d|||||< d ||||< t	j
 fdd t|D dd!}|t	j|| |d"d |dk}d|dddf< t	j||| || |d"}t	|dk\}}|||f } d|||| f< | d#|i t|dkrt	jdg|d"}t	jdg|d"}t	jdg|d"} | ||| d$ | ||d% dS )'a  Perform coarse supervision.

    Update:
        data (dict): {
            "conf_matrix_gt": [N, hw0, hw1],
            'spv_b_ids': [M]
            'spv_i_ids': [M]
            'spv_j_ids': [M]
            'spv_w_pt0_i': [N, hw0, 2], in original image resolution
            'spv_pt1_i': [N, hw1, 2], in original image resolution
        }

    Note:
        - for scannet dataset, there're 3 kinds of resolution {i, c, f}
        - for megadepth dataset, there're 4 kinds of resolution {i, i_resize, c, f}

    image0image1LOFTR
RESOLUTIONr   scale0Nscale1c                 3  s    | ]}|  V  qd S )Nr   ).0x)scaler   r   	<genexpr>D   s    zspvs_coarse.<locals>.<genexpr>Fr   r   mask0mask1depth0depth1T_0to1K0K1T_1to0.r   .r   ptr   r   r   r
   c                 S  s0   | d dk | d |k | d dk  | d |k S )Nr.   r   r/   r   )r0   r   r   r   r   r   out_bound_maska   s   0z#spvs_coarse.<locals>.out_bound_maskc                   s   g | ]
\}} | | qS r   r   )r"   _b_i)nearest_index0r   r   
<listcomp>g   s    zspvs_coarse.<locals>.<listcomp>)dim)deviceconf_matrix_gt)	spv_b_ids	spv_i_ids	spv_j_ids)spv_w_pt0_i	spv_pt1_i)r0   r   r   r   r   r   r
   r   )r7   r   r   r   expandr   r   roundlongtorchstack	enumeratearanger   zeroswhereupdatelentensor)!r   r   r7   N_H0W0H1W1r    r!   h0w0h1w1
grid_pt0_c
grid_pt0_i
grid_pt1_c
grid_pt1_iw_pt0_iw_pt1_iw_pt0_cw_pt1_cw_pt0_c_roundnearest_index1w_pt1_c_roundr1   	loop_backcorrect_0to1r8   b_idsi_idsj_idsr   )r4   r$   r   spvs_coarse*   sN   
$$"****""
 "rd   c                 C  sP   t t| d dkrtd| d d }| dv r!t| | dS td| )zCompute coarse supervision.dataset_namer   z'Do not support mixed datasets training!r   scannet	megadepthzUnknown data source: N)rH   set
ValueErrorlowerrd   r   r   data_sourcer   r   r   compute_supervision_coarse   s   rn   c           
      C  s   | d | d }}|d d d }|d d d }| d | d	 | d
 }}}d| v r3|| d |  n|}|||f |||f  | | }	|  d|	i dS )z[Perform fine supervision.

    Update:
    data (dict):{
        "expec_f_gt": [M, 2]}
    r<   r=   r   r   r   FINE_WINDOW_SIZEr   ra   rb   rc   r    r!   
expec_f_gtN)rG   )
r   r   rX   pt1_ir$   radiusra   rb   rc   rp   r   r   r   	spvs_fine   s   
 rs   c                 C  s*   | d d }|  dv rt| | dS t)zCompute fine supervision.re   r   rf   N)rk   rs   NotImplementedErrorrl   r   r   r   compute_supervision_fine   s   ru   )r   r   r	   r   r
   r   )r   r   r   r   r
   r   )
__future__r   typingr   rA   kornia.corer   kornia.utilsr   geometryr   no_gradr   rd   rn   rs   ru   r   r   r   r   <module>   s   

U