o
    oi
                     @   sZ   d dl mZ d dlZd dlmZ e dededededed	ed
eeef fddZdS )    )TupleN)Tensorkpts0depth0depth1T_0to1K0K1returnc                    s  |    tj fddt| jd D dd}|dk}tj| t| dddddgf gdd|d  }| |	dd	 }	|dddd
dd
f |	 |dddd
d
gf  }
|
dddddf }||
 	dd	}|ddddddf |dddddgf d  }jd	d
 \}}|dddddf dk|dddddf |d	 k  |ddddd	f dk |ddddd	f |d	 k  }| d| ddf< tjfddtjd D dd}|| | 
 dk }|| | }||fS )a  Warp kpts0 from I0 to I1 with depth, K and Rt Also check covisibility and depth consistency.

    Depth is consistent if relative error < 0.2 (hard-coded).

    Args:
        kpts0: [N, L, 2] - <x, y>,
        depth0: [N, H, W],
        depth1: [N, H, W],
        T_0to1: [N, 3, 4],
        K0: [N, 3, 3],
        K1: [N, 3, 3],

    Returns:
        calculable_mask: [N, L]
        warped_keypoints0: [N, L, 2] <x0_hat, y1_hat>

    c              	      6   g | ]} ||d d df |d d df f qS N   r    .0i)r   
kpts0_longr   W/home/ubuntu/.local/lib/python3.10/site-packages/kornia/feature/loftr/utils/geometry.py
<listcomp>2      6 zwarp_kpts.<locals>.<listcomp>r   )dimN).N   r      g-C6?c              	      r   r   r   r   )r   w_kpts0_longr   r   r   K   r   g?)roundlongtorchstackrangeshapecat	ones_likeinverse	transposeabs)r   r   r   r   r   r	   kpts0_depthnonzero_maskkpts0_h	kpts0_camw_kpts0_camw_kpts0_depth_computed	w_kpts0_hw_kpts0hwcovisible_maskw_kpts0_depthconsistent_mask
valid_maskr   )r   r   r   r   r   	warp_kpts   s,   466nr4   )typingr   r   kornia.corer   no_gradr4   r   r   r   r   <module>   s&   
