a
    d                     @   sT   d dl Z ddlmZmZmZmZmZ dd ZdddZdd	 Z	d
d Z
dddZdS )    N   )arange_sequencebatch_2x2_ellipsebatch_2x2_invdraw_first_k_couplespiecewise_arangec                 C   s~   t | d }t |}t |}|d d||  ||   }t j|dd}t j| jd | j	d}| |d|f |fS )Ng|=r   gGz?dimdevice)
torchlogminmax	unsqueezefloatZargsortarangeshaper   )	residualsransidxZlogresZ	minlogresZ	maxlogresZsorting_scoresorting_idxesZiters_range r   e/var/www/html/stable-diffusion-webui/venv/lib/python3.9/site-packages/kornia/feature/adalam/ransac.pystable_sort_residuals   s    

"r   c                 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r||d d |f  }||fS |d fS )Nr   r	   r   )sizedtyper   r   )r   cumsumcatzerosr   r   r   )Z
scores_matZend_group_idxZ	group_idxZcumulative_scoresZending_cumusumsZshifted_ending_cumusumsZgrouped_sumsZgrouped_cumsumsr   r   r   group_sum_and_cumsum   s    r    c                 C   sj  |j d }| j d }t| |\}}	|d }
|
dk}tj|ddd }tj|
  dddd\}}}|| }d| |d}d	||< t|||\}}| |j	|dd  }|
| |k|B }d	|| < t||\}}tj
| dd\}}t|}tj||d
	|}|	|	||| | f }|
||| d f }||tj||d
f  | }||||| | fS )Nr      g:0yE>r	   r   T)r
   Zreturn_countsZreturn_inverseg      ?g        r   )r   r   r   r   Zunique_consecutiveZhalfr   repeatr    repeat_interleaver   longr   r   )r   r   rdims
idxoffsetsdvmin_confidence
numransacsZnumitersZ
sorted_resr   Zsorted_res_sqrZtoo_perfect_fitsZend_rans_indexing_Zinv_indicesZres_dup_countsZduplicates_per_sampleZinlier_weightsZbalanced_rdimsZweights_cumsumsZprogressive_inl_ratesZgood_inl_maskZinlier_counts_matrix
inl_counts	inl_itersZrelative_inl_idxesinl_ransidxinl_sampleidxZhighest_accepted_sqr_residualsZexpected_extra_inlr   r   r   !confidence_based_inlier_selection&   s2    


r/   c                 C   sp   t | }| j}t j||df||d}	t j||df||d}
| | |	|t|f< || |
|t|f< |	|
fS )Nr!   )r   r   r   )r   r   itemr   r   r   )xsamplesysamplesZinlier_countsr-   r.   r)   r'   Z
maxinliersr   padded_inlier_xpadded_inlier_yr   r   r   sample_padded_inliersL   s    r5      Tc                 C   sp  |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}|st
|\}}|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rfd}|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 )NZdetected_scale_rate_thresholdr(   r   r   r   r   r	   r   r!   )Zdim0Zdim1T)Z
check_dets).r   ).r   )r'   r(   F)r   r   )r   r   r   r#   r   Ztensorr   r   Z	transposer   r   Zeyer   ZsqueezeZnormr/   lenr5   r   )r1   r2   r%   configZitersZrefitZDET_THRZMIN_CONFIDENCEr'   r)   r   r&   Zrand_samples_relZrand_samples_absZ	sampled_xZ	sampled_yZaffinities_fitZ	eigenvalsZ	eigenvecsZbad_onesZy_predr   r-   r.   r+   r,   Zinl_confidencer3   r4   Zrefit_affinityr   r   r   ransacX   s`    
0
$ 	
$r:   )N)r6   T)r   utilsr   r   r   r   r   r   r    r/   r5   r:   r   r   r   r   <module>   s   
&