o
    oil                      @   sJ  d dl mZmZmZmZ d dlZd dlmZ ddlm	Z	m
Z
mZmZmZ dededeeef fd	d
Z	d%dededeeedf deeeedf f fddZdededededejdedeeeeeef fddZdededededededejdeeef fddZ	d&dededed eeef d!ed"edeeeeef fd#d$ZdS )'    )AnyDictTupleUnionN)Tensor   )arange_sequencebatch_2x2_ellipsebatch_2x2_invdraw_first_k_couplespiecewise_arange	residualsransidxreturnc                 C   s~   t | d }t |}t |}|d d||  ||   }t j|dd}t j| jd | j	d}| |d|f |fS )zSort residuals.g|=r   gGz?dimdevice)
torchlogminmax	unsqueezefloatargsortarangeshaper   )r   r   logres	minlogres	maxlogressorting_scoresorting_idxesiters_range r$   P/home/ubuntu/.local/lib/python3.10/site-packages/kornia/feature/adalam/ransac.pystable_sort_residuals   s   

"r&   
scores_matend_group_idx	group_idxc                 C   s   t j| dd}|dd|f }t jt j|jd df|j| jd|ddddf gdd}|| }|durC||dd|f  }||fS |dfS )z$Calculate cumulative sum over group.r   r   Nr   )sizedtyper   r   )r   cumsumcatzerosr   r+   r   )r'   r(   r)   cumulative_scoresending_cumusumsshifted_ending_cumusumsgrouped_sumsgrouped_cumsumsr$   r$   r%   group_sum_and_cumsum*   s   r4   rdims
idxoffsetsdvmin_confidencec                 C   s|  |j d }| j d }t| |\}}	|d }
|
dk}tj|ddd }tj|
  dddd\}}}|| }d| |d}d	||< t|||\}}t	|t
sStd
| |j|dd  }|
| |k|B }d	|| < t||\}}tj| dd\}}t|}tj||d|}|	|||| | f }|
||| d f }||tj||df  | }||||| | fS )z&Select inliers from confidence scores.r      g:0yE>r   r   T)r   return_countsreturn_inverseg      ?g        z.Expected the `weights_cumsums` to be a Tensor!r   )r   r&   r   r,   unique_consecutivehalfr   repeatr4   
isinstancer   	TypeErrorrepeat_interleaver   longr   r   )r   r   r5   r6   r7   r8   
numransacsnumiters
sorted_resr"   sorted_res_sqrtoo_perfect_fitsend_rans_indexing_inv_indicesres_dup_countsduplicates_per_sampleinlier_weightsbalanced_rdimsweights_cumsumsprogressive_inl_ratesgood_inl_maskinlier_counts_matrix
inl_counts	inl_itersrelative_inl_idxesinl_ransidxinl_sampleidxhighest_accepted_sqr_residualsexpected_extra_inlr$   r$   r%   !confidence_based_inlier_selection?   s6   



rZ   xsamplesysamplesinlier_countsrV   rW   rC   c                 C   st   t t| }| j}tj||df||d}	tj||df||d}
| | |	|t|f< || |
|t|f< |	|
fS )zSample from padded inliers.r9   )r*   r   r+   )intr   r   itemr+   r.   r   )r[   r\   r]   rV   rW   rC   r7   
maxinliersr+   padded_inlier_xpadded_inlier_yr$   r$   r%   sample_padded_inliersk   s   
rc      Tconfigitersrefitc                 C   sj  |d }|d }|d }|j d }	tj|	|d|}
tjtjdg|dtj|dd ddgdd}t|||}|| }tj| | d	d
d}tj|| d	d
d}tt	|dd| dd}|st
|\}}|d d	|d
  k |d |d
 kB }tjd
|d||< |dd|
f | d d}tj|| dd}t||
||||d\}}}}}t|dkrd}|s|||tj|j d |df ||fS t| |||||	|\}}|dd| t	|dd| dd }t
|\}}|d d	|d
  k |d |d
 kB }tjd
||jd||< ||
 | d d}tj|| dd}t|d|
||||d\}}}}}||||fS )zRun ransac.detected_scale_rate_thresholdr8   r   r   r   Nr   r   r   r9   )dim0dim1T)
check_dets).r   ).r   )r7   r8   F)r   r+   )r   r   r   rA   r-   tensorr,   r   	transposer
   r	   eyer   squeezenormrZ   lenrc   r+   )r[   r\   r5   re   rf   rg   DET_THRMIN_CONFIDENCEr7   rC   r   r6   rand_samples_relrand_samples_abs	sampled_x	sampled_yaffinities_fit	eigenvals
_eigenvecsbad_onesy_predr   rV   rW   rS   rT   inl_confidencera   rb   refit_affinityr$   r$   r%   ransac   s`   
0
$ 	
$r   )N)rd   T)typingr   r   r   r   r   kornia.corer   utilsr   r	   r
   r   r   r&   slicer4   r   rZ   r^   rc   strboolr   r$   r$   r$   r%   <module>   s~   

,


