
    3j               	       @   S SK r S SKJr  S SKrS\R                  S\R                  4S jrSS\R                  S\R                  S\S\R                  4S	 jjrS
\R                  S\R                  S\R                  4S jrS\R                  S\R                  4S jr	SS\R                  S\S\R                  4S jjr
S\R                  S\R                  4S jrS\R                  S\R                  4S jrS\R                  S\R                  4S jrSS.S\R                  S\S\\R                  \R                  4   4S jjrS\S\R                  S\R"                  S\R                  4S jrS\S\R                  S\R"                  S\R                  4S jrg)     N)Tuplerangesreturnc                    [         R                  " U 5      R                  5       nU R                  S   n[         R                  " XR
                  S9R                  S5      R                  US5      nX3U R                  S5      :     $ )zuReturn 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_rangess       U/home/wildlama/miniconda3/lib/python3.13/site-packages/kornia/feature/adalam/utils.pyarange_sequencer      sm     YYv##%F\\!_Fll6--@JJ1MTTU[]_`OV-=-=b-AABB    d1d2is_normalizedc                    U(       a  SSU -  UR                  5       -  -
  $ U S-  R                  S5      R                  SS5      nUS-  R                  S5      R                  SS5      nX4-   SU -  UR                  5       -  -
  nU$ )zDistance between two tensors.          @   r	   )tsumview)r   r   r   x_normy_normdistmats         r   dist_matrixr$   &   s{    38bddf$$$!e[[^  Q'F!e[[^  B'Fob2446 11GNr   o1o2c                 J    X-
  nX"S:  ==   S-  ss'   X"S:  ==   S-  ss'   U$ )z+Orientation difference between two tensors.iLih      )r%   r&   diffs      r   orientation_diffr+   2   s2    7DKr   piecewise_idxerc                    U R                   n[        R                  " U SS9u  p#[        [        R                  " U5      R                  5       5      nUR                  S   n[        R                  " XT4US9R                  5       n[        R                  " XAS9R                  S5      R                  US5      nSXgUR                  S5      :  '   Xv   $ )zcCount 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   s           r   piecewise_aranger9   :   s     
		B **?$OKC6"'')*FYYq\F
++F+B
7
<
<
>C\\&,66q9@@LF)-C!!"%%&;r   m
check_detsc                    U S   nU S   nU S   nU S   n[         R                  " U 5      nX%-  X4-  -
  nU(       a  SU[         R                  " U5      S:  '   XVS'   X&S'   U* US'   U* US'   XgR                  S5      R                  S5      -  $ )z(Return inverse of batch of 2x2 matrices..r   r   .r   r   .r   r   .r   r   g|=r	   )r
   
empty_likeabsr   )r:   r;   abcdminvdets           r   batch_2x2_invrI   M   s    	)A	)A	)A	)AAD
%!%-C&+EIIcNU"#OObDObDO--#--b111r   c                 (    [        [        U 5      SS9$ )z"Return Q of batch of 2x2 matrices.T)r;   )rI   batch_2x2_invQr:   s    r   batch_2x2_QrM   ^   s    *t<<r   c                 *    X R                  SS5      -  $ )z*Return inverse Q of batch of 2x2 matrices.r	   )	transposerL   s    r   rK   rK   c   s    {{2r"""r   c                 <    U S   nU S   nU S   nU S   nX-  X#-  -
  $ )z,Return determinant of batch of 2x2 matrices.r=   r>   r?   r@   r)   )r:   rC   rD   rE   rF   s        r   batch_2x2_detrR   h   s4    	)A	)A	)A	)A515=r           )epsrT   c                   U S   nU S   nU S   nU S   nX"-  X3-  -   nX$-  X5-  -   nXD-  XU-  -   nSXh-   -  n	SXh-
  -  n
[         R                  " X5      nX-   nX-
  nUS:  a  UR                  US9nUR                  US9nOUR                  SS9nUR                  SS9n[         R                  " X/S	S
9nS[         R                  " SU-  Xh-
  5      -  n[         R
                  " U5      n[         R                  " U5      n[         R                  " UU/S	S
9n[         R                  " U* U/S	S
9n[         R                  " UU/S	S
9nUU4$ )z=Return Eigenvalues and Eigenvectors of batch of 2x2 matrices.r=   r>   r?   r@         ?r   )minrS   r	   dimr   )r
   hypotclampstackatan2cossin)r:   rT   ambmcmdmrC   rD   rF   trhr*   sqrtdisce1e2	eigenvalsthetarE   sev1ev2	eigenvecss                        r   batch_2x2_ellipsern   q   s]   	
9B	
9B	
9B	
9B
"'A
"'A
"'A
-C!%=D {{4#H	B	B
QwXX#XXX#XXX#XXX#XRH"-I%++cAgqu--E		%A		%A
++q!f"
%C
++r1g2
&CS#JB/Iir   krdimsr5   c           	         [        [        R                  " SU -  S-   5      S-
  5      n[        XUS-   -  S-  -
  5      n[        R                  " [        R
                  " U[        R                  US9S-   [        R                  " U/[        R                  US9/5      n[        R                  " UR                  U5      [        U5      /SS9n[        R                  " UR                  S5      U5      $ )zReturn 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      ?rV   r   )dtyper   r	   rX   )r2   mathsqrtr
   catr   longtensorr\   repeat_interleaver   	remainderr   )ro   rp   r5   max_exhaustive_searchresidual_searchrepeatsidx_sequences          r   draw_first_k_couplesr~      s      		!a%$, 7# =>!7Lq7PQTUUUVOiiLL.ejjLqPLL/*%**RH	
G ;; 9 9' BOT[D\]cefL??<11"5u==r   itersc                     [         R                  " U SUR                  S   4US9nX1S-
  R                  5       -  nUR	                  5       nU$ )z(Randomly sample indices of torch.Tensor.r   r   r/   g:0yE>)r
   randr   floatrv   )r   rp   r5   randsscaled_randsrand_samples_rels         r   random_samples_indicesr      sK    JJUAu{{1~6rBEDL//11L#((*r   )F)rs   typingr   r
   Tensorr   r4   r$   r+   r9   rI   rM   rK   rR   r   rn   r2   r   r~   r   r)   r   r   <module>r      s  $   CELL CU\\ C	ELL 	ell 	4 	TYT`T` 	 5<< ELL ell u|| &2U\\ 2t 2 2"=5<< =ELL =
#ell #u|| #
U\\ ell  8; "  " u " uU\\SXS_S_E_?` " J>C > >%,, >5<< >,# ell  QVQ]Q] r   