a
    þdR  ã                   @   s|   d dl Z d dlZdd„ Zddd„Zdd„ Zd	d
„ Zddd„Zdd„ Zdd„ Zdd„ Z	dd„ Z
eeejdœdd„Zdd„ ZdS )é    Nc                 C   sH   t  | ¡ ¡ }| jd }t j|| jd d¡ |d¡}|||  d¡k  S )z…
    returns a sequence of the ranges specified by the argument.
    Example:
    [2, 5, 1, 2] -> [0, 1, 0, 1, 2, 3, 4, 0, 0, 1]
    r   ©Údeviceéÿÿÿÿ)ÚtorchÚmaxÚitemÚshapeÚaranger   Ú	unsqueezeÚexpand)ÚrangesÚmaxcntÚnumuniZcomplete_ranges© r   úd/var/www/html/stable-diffusion-webui/venv/lib/python3.9/site-packages/kornia/feature/adalam/utils.pyÚarange_sequence   s    
r   Fc                 C   s`   |rdd|  |  ¡   S | d  d¡ dd¡}|d  d¡ dd¡}|| d|  |  ¡   }|S )Né   g       @é   r   )ÚtÚsumÚview)Úd1Zd2Úis_normalizedZx_normZy_normZdistmatr   r   r   Údist_matrix   s    r   c                 C   s4   ||  }||dk   d7  < ||dk  d8  < |S )NiLÿÿÿih  é´   r   )Zo1Zo2Údiffr   r   r   Úorientation_diff   s    r   c                 C   s|   | j }tj| dd\}}t |¡ ¡ }|jd }tj||f|d ¡ }tj||d 	d¡ 
|d¡}d||| 	d¡k < || S )zr
    count repeated indices
    Example:
    [0, 0, 0, 3, 3, 3, 3, 1, 1, 2] -> [0, 1, 2, 0, 1, 2, 3, 0, 1, 0]
    T)Zreturn_countsr   ©Úsizer   r   r   )r   r   Zunique_consecutiver   r   r   ÚzerosÚboolr	   r
   r   )Zpiecewise_idxerÚdvÚuniÚcountsr   r   Útmpr   r   r   r   Úpiecewise_arange%   s    
r%   c                 C   sˆ   | d }| d }| d }| d }t  | ¡}|| ||  }|rPd|t  |¡dk < ||d< ||d< | |d< | |d< || d¡ d¡ S )N©.r   r   ©.r   r   ©.r   r   ©.r   r   g»½×Ùß|Û=r   )r   Z
empty_likeÚabsr
   )ÚmÚ
check_detsÚaÚbÚcÚdZminvZdetr   r   r   Úbatch_2x2_inv7   s    


r1   c                 C   s   t t| ƒddS )NT)r,   )r1   Úbatch_2x2_invQ©r+   r   r   r   Úbatch_2x2_QG   s    r4   c                 C   s   | |   dd¡ S )Nr   éþÿÿÿ)Z	transposer3   r   r   r   r2   K   s    r2   c                 C   s0   | d }| d }| d }| d }|| ||  S )Nr&   r'   r(   r)   r   )r+   r-   r.   r/   r0   r   r   r   Úbatch_2x2_detO   s
    r6   c                 C   sú   | d }| d }| d }| d }|d |d  }|| ||  }|d |d  }|| d }t  || d d |d  ¡}	t j||	 ||	 gddjdd	}
|
| d¡ }d
|t  |¡d
k < t j| d¡| t  |¡gdd}|t j|ddd }|
|fS )Nr&   r'   r(   r)   r   r   ©Údimr   )Úmingíµ ÷Æ°>r5   T)r8   Zkeepdim)r   ÚsqrtÚstackÚclampr
   r*   Z	ones_likeZnorm)r+   ÚamZbmÚcmÚdmr-   r.   r0   ZtrhZsqrtdiscZ	eigenvalsZdensZ	eigenvecsr   r   r   Úbatch_2x2_ellipseW   s    ""r@   )ÚkÚrdimsr!   c                 C   sŒ   t t d|  d ¡d ƒ}| ||d  d  }t tj|tj|dd tj|gtj|dg¡}tj| 	|¡t
|ƒgdd}t | d¡|¡S )Nr   g      Ð?g      à?r   )Zdtyper   r   r7   )ÚintÚmathr:   r   Úcatr	   ÚlongZtensorr;   Zrepeat_interleaver   Ú	remainderr
   )rA   rB   r!   Zmax_exhaustive_searchZresidual_searchZrepeatsZidx_sequencer   r   r   Údraw_first_k_coupleso   s    þÿrH   c                 C   s6   t j| d|jd f|d}||d  ¡  }| ¡ }|S )Nr   r   r   g:Œ0âŽyE>)r   Zrandr   ÚfloatrF   )ZitersrB   r!   ZrandsZscaled_randsZrand_samples_relr   r   r   Úrandom_samples_indices   s    rJ   )F)F)rD   r   r   r   r   r%   r1   r4   r2   r6   r@   rC   r   rH   rJ   r   r   r   r   Ú<module>   s   

