o
    oi                  	   @   s,  d dl Z d dlmZ d dlZd dlmZ dedefddZd,d	ed
ededefddZdededefddZ	dedefddZ
d,dededefddZdedefddZdedefddZdedefddZdd ded!edeeef fd"d#Zd$ed%ed&ejdefd'd(Zd)ed%ed&ejdefd*d+ZdS )-    N)Tuple)Tensorrangesreturnc                 C   sH   t |  }| jd }t j|| jdd|d}||| dk  S )zReturn 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)r   maxcntnumunicomplete_ranges r   O/home/ubuntu/.local/lib/python3.10/site-packages/kornia/feature/adalam/utils.pyarange_sequence   s   
r   Fd1d2is_normalizedc                 C   s`   |rdd|  |    S | d ddd}|d ddd}|| d|  |    }|S )zDistance between two tensors.          @   r   )tsumview)r   r   r   x_normy_normdistmatr   r   r   dist_matrix(   s   r"   o1o2c                 C   s4   ||  }||dk   d7  < ||dk  d8  < |S )z+Orientation difference between two tensors.iLih     r   )r#   r$   diffr   r   r   orientation_diff4   s   r'   piecewise_idxerc                 C   s   | j }tj| dd\}}tt| }|jd }tj||f|d }tj	||d
d|d}d|||
dk < || S )zoCount repeated indices.

    Example:
    [0, 0, 0, 3, 3, 3, 3, 1, 1, 2] -> [0, 1, 2, 0, 1, 2, 3, 0, 1, 0]
    T)return_countsr   sizer   r   r   )r   r	   unique_consecutiveintr
   r   r   zerosboolr   r   r   )r(   dvunicountsr   r   tmpr   r   r   r   piecewise_arange<   s   
r4   m
check_detsc                 C   s   | d }| d }| d }| d }t | }|| ||  }|r(d|t |dk < ||d< ||d< | |d< | |d< ||dd S )z)Returns inverse of batch of 2x2 matrices..r   r   .r   r   .r   r   .r   r   g|=r   )r	   
empty_likeabsr   )r5   r6   abcdminvdetr   r   r   batch_2x2_invO   s   


rC   c                 C   s   t t| ddS )z#Returns Q of batch of 2x2 matrices.T)r6   )rC   batch_2x2_invQr5   r   r   r   batch_2x2_Q`      rF   c                 C   s   | |  dd S )z+Returns inverse Q of batch of 2x2 matrices.r   )	transposerE   r   r   r   rD   e   rG   rD   c                 C   s0   | d }| d }| d }| d }|| ||  S )z-Returns determinant of batch of 2x2 matrices.r7   r8   r9   r:   r   )r5   r=   r>   r?   r@   r   r   r   batch_2x2_detj   s
   rJ           )epsrL   c                C   s<  | d }| d }| d }| d }|| ||  }|| ||  }|| ||  }d||  }	d||  }
t |
|}|	| }|	| }|dkrS|j|d}|j|d}n|jdd}|jdd}t j||gd	d
}dt d| ||  }t |}t |}t j||gd	d
}t j| |gd	d
}t j||gd	d
}||fS )z>Returns Eigenvalues and Eigenvectors of batch of 2x2 matrices.r7   r8   r9   r:         ?r   )minrK   r   dimr   )r	   hypotclampstackatan2cossin)r5   rL   ambmcmdmr=   r>   r@   trhr&   sqrtdisce1e2	eigenvalsthetar?   sev1ev2	eigenvecsr   r   r   batch_2x2_ellipses   s2   

re   krdimsr0   c                 C   s   t td|  d d }t | ||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 )zReturns first k couples.

    Exhaustive search over the first n samples:
     * n(n+1)/2 = n2/2 + n/2 couples
    Max n for which we can exhaustively sample with k couples:
    * n2/2 + n/2 = k
    * n = sqrt(1/4 + 2k)-1/2 = (sqrt(8k+1)-1)/2
    r   g      ?rM   r   )dtyper   r   rO   )r-   mathsqrtr	   catr   longtensorrS   repeat_interleaver   	remainderr   )rf   rg   r0   max_exhaustive_searchresidual_searchrepeatsidx_sequencer   r   r   draw_first_k_couples   s   	rt   itersc                 C   s6   t j| d|jd f|d}||d   }| }|S )z"Randomly sample indices of tensor.r   r   r*   g:0yE>)r	   randr   floatrl   )ru   rg   r0   randsscaled_randsrand_samples_relr   r   r   random_samples_indices   s   r{   )F)ri   typingr   r	   kornia.corer   r   r/   r"   r'   r4   rC   rF   rD   rJ   rw   re   r-   r   rt   r{   r   r   r   r   <module>   s   $	% 