
    3j/              
       p   S SK r S SKrS SKJr  S SKJr  S SKJrJrJ	r	J
r
JrJrJrJr  S SKrS SKJs  Jr  S SKJr  S SKJr  S SKJrJr   S SKJr  \(       d  \" \S	5      (       a  S
rOSrS r\" \S5      (       a<  \" \R>                  S5      (       a$  \R>                  RA                  \RB                  SS9O,\RD                  R>                  RA                  \RB                  S9r#\#S\RH                  S\RH                  S\RH                  4S j5       r%S\RH                  S\&S\\RH                  \RH                  4   4S jr'S\RH                  S\RH                  4S jr(S\RH                  S\RH                  S\RH                  4S jr) " S S\RT                  5      r+ " S S \RT                  5      r, " S! S"\RT                  5      r- " S# S$\RT                  5      r. " S% S&\RT                  5      r/ " S' S(\RT                  5      r0S)\RH                  S*\RH                  S+\RH                  S\RH                  4S, jr1 " S- S.\RT                  5      r2S/\RH                  S0\3S\\RH                  \RH                  \RH                  \RH                  4   4S1 jr4 " S2 S3\RT                  5      r5g! \ a    Sr GNcf = f)4    N)Path)SimpleNamespace)AnyCallableClassVarDictListOptionalSequenceTuple)nn)KORNIA_CHECK)laf_to_three_points	scale_laf)FlashCrossAttentionscaled_dot_product_attentionTFc                 ,    [        [        X5      U5      $ )z'Clamp a value to lie within [min, max].)minmax)xmin_max_s      R/home/wildlama/miniconda3/lib/python3.13/site-packages/kornia/feature/lightglue.py
math_clampr   *   s    s1|T""    amp
custom_fwdcuda)cast_inputsdevice_type)r   kptssizereturnc                 \   [        U[        R                  5      (       a  [        R                  " U5      S   nUR	                  5       R                  U 5      S-  nUR                  S5      R                  R	                  5       R                  U 5      S-  nXSS2S4   -
  USS2SS4   -  n U $ )z$Normalize torch.Tensor of keypoints.N      )
isinstancetorchSizetensorfloattor   values)r!   r"   shiftscales       r   normalize_keypointsr0   6   s     $

##||D!$'JJLOOD!A%EHHQK$$&))$/!3ED>!U1dD=%99DKr   r   lengthc                    XR                   S   ::  a,  U [        R                  " U SSS24   [        R                  S94$ [        R                  " / U R                   SS QXR                   S   -
  PU R                   S   P7U R
                  U R                  S.6n[        R                  " X/SS9n[        R                  " / UR                   SS QSP7[        R                  U R
                  S	.6nS
USSU R                   S   2SS24'   X44$ )z#Pad torch.Tensor to desired length..Nr&   )dtypedevicer4   dim)r4   r7   T)	shaper(   	ones_likeboolonesr7   r4   catzeros)r   r1   
pad_tensorymasks        r   pad_to_lengthrC   A   s    %//!C!G*EJJ???mQWWSb\m6GGBK+?mmUVU]U]efelelmJ		1/r*A;;KKaKuzz!((KD"&DmmQ	7Nr   c                     U R                  SS5      n U R                  SS9u  p[        R                  " U* U4SS9R	                  SS9$ )zApply half rotation.r5   )r5   r%   r8   r3   	start_dim)	unflattenunbindr(   stackflatten)r   x1x2s      r   rotate_halfrM   L   sI    	B AXX"XFB;;Ryb)11B1??r   freqstc                 4    XS   -  [        U5      U S   -  -   $ )zApply rotary embedding.r   r&   )rM   )rN   rO   s     r   apply_cached_rotary_embrQ   S   s     aL[^eAh677r   c                      ^  \ rS rSrSrSS\S\S\\   S\SS4
U 4S	 jjjrS
\	R                  S\	R                  4S jrSrU =r$ )"LearnableFourierPositionalEncodingX   a  Implement learnable Fourier features for positional encoding.

This module encodes spatial coordinates into high-dimensional embeddings
using a learnable projection and periodic functions.

Args:
    M: The number of frequencies to use.
    dim: The dimension of the output embedding.
    F_dim: The dimension of the Fourier features. Default: None.
    gamma: The scaling factor for the initialization. Default: 1.0.
NMr9   F_dimgammar#   c                 
  > [         TU ]  5         Ub  UOUnX@l        [        R                  " XS-  SS9U l        [        R                  R                  U R
                  R                  R                  SU R                  S-  S9  g )Nr%   Fbiasr   r3   )meanstd)
super__init__rW   r   LinearWrinitnormal_weightdata)selfrU   r9   rV   rW   	__class__s        r   r^   +LearnableFourierPositionalEncoding.__init__e   sa    *
))Az6
++!RHr   r   c                     U R                  U5      n[        R                  " U5      [        R                  " U5      pC[        R                  " X4/S5      R                  S5      nUR                  SSS9$ )zEncode position vector.r   r%   r5   r8   )r`   r(   cossinrI   	unsqueezerepeat_interleave)re   r   	projectedcosinessinesembs         r   forward*LearnableFourierPositionalEncoding.forwardl   s\    GGAJ	9-uyy/Ckk7*A.88<$$QB$//r   )r`   rW   )N      ?)__name__
__module____qualname____firstlineno____doc__intr
   r+   r^   r(   Tensorrr   __static_attributes____classcell__rf   s   @r   rS   rS   X   sa    
I# IC I IU I]a I I0 0%,, 0 0r   rS   c                      ^  \ rS rSrSrS\SS4U 4S jjrS\R                  S\R                  S\	\R                  \R                  4   4S	 jr
S
rU =r$ )TokenConfidencet   zxPredict the confidence score for each token in the sequence.

Args:
    dim: The dimension of the input feature tokens.
r9   r#   Nc                    > [         TU ]  5         [        R                  " [        R                  " US5      [        R
                  " 5       5      U l        g )Nr&   )r]   r^   r   
Sequentialr_   Sigmoidtokenre   r9   rf   s     r   r^   TokenConfidence.__init__{   s1    ]]299S!#4bjjlC
r   desc0desc1c                    U R                   S   R                  R                  nUR                  nU R                  UR                  5       R	                  U5      5      R                  S5      R	                  U5      U R                  UR                  5       R	                  U5      5      R                  S5      R	                  U5      4$ )zGet confidence tokens.r   r5   )r   rc   r4   detachr,   squeeze)re   r   r   r4   
orig_dtypes        r   rr   TokenConfidence.forward   s    

1$$**[[
JJu||~((/088<??
KJJu||~((/088<??
K
 	
r   )r   )ru   rv   rw   rx   ry   rz   r^   r(   r{   r   rr   r|   r}   r~   s   @r   r   r   t   sZ    DC DD D
U\\ 
%,, 
5W\WcWcIcCd 
 
r   r   c                      ^  \ rS rSrSrS\SS4U 4S jjr SS\R                  S\R                  S	\R                  S
\	\R                     S\R                  4
S jjr
SrU =r$ )	Attention   zImplement the optimized multi-head attention mechanism for LightGlue.

Args:
    allow_flash: Whether to enable FlashAttention for increased performance.
allow_flashr#   Nc                 z  > [         TU ]  5         U(       a   [        (       d  [        R                  " SSS9  U=(       a    [        U l        [        [        S5      U l        U(       a  [        (       a  [        5       U l
        U R                  (       a*  [        R                  R                  R                  U5        g g )NzcFlashAttention is not available. For optimal speed, consider installing torch >= 2.0 or flash-attn.r%   
stacklevelr   )r]   r^   FLASH_AVAILABLEwarningswarnenable_flashhasattrFhas_sdpr   flash_r(   backendsr   enable_flash_sdp)re   r   rf   s     r   r^   Attention.__init__   s|    MMu (;Oq"@A..-/DK<<NN00= r   qkvrB   c                 V   U R                   (       Ga7  UR                  R                  S:X  Ga  U R                  (       as  XU4 Vs/ s H   oUR	                  5       R                  5       PM"     nn[        R                  " USU06R                  UR                  5      nUc  U$ UR                  5       $ [        US L 5        S XU4 5       u  pnU R                  UR	                  5       [        R                  " X#/S5      R	                  5       5      nUR                  SS5      R                  UR                  5      R!                  5       $ U R                  (       aL  XU4 Vs/ s H  oUR                  5       PM     nn[        R                  " USU06nUc  U$ UR                  5       $ UR"                  S   S-  n[        R$                  " S	X5      U-  n	Ub  U	R'                  U) [)        S
5      * 5        [        R*                  " U	S5      n
[        R$                  " SX5      $ s  snf s  snf )Nr   	attn_maskc              3   `   #    U  H$  oR                  S S5      R                  5       v   M&     g7f)r3   ri   N)	transpose
contiguous).0r   s     r   	<genexpr>$Attention.forward.<locals>.<genexpr>   s%     OY;;r2.99;;Ys   ,.r%   r3   ri   r5         z...id,...jd->...ijinfz...ij,...jd->...id)r   r7   typer   halfr   r   r   r,   r4   
nan_to_numr   r   r(   rI   r   cloner:   einsummasked_fillr+   softmax)re   r   r   r   rB   r   argsmssimattns              r   rr   Attention.forward   s    &!8||89ayAy!++-yA22DIDILLQWWU Lq<alln<TT\*OaAYOaKK%++qfa*@*E*E*GH{{2r*--agg6<<>>\\-.1I6IqLLNID6..EEA18!,,.8t#A,,3Q:Q>Ce}599S"%D<< 4d>>% B 7s   'H!!H&)r   r   r   N)ru   rv   rw   rx   ry   r<   r^   r(   r{   r
   rr   r|   r}   r~   s   @r   r   r      sp    >D >T > ae??"',,?38<<?GOPUP\P\G]?	? ?r   r   c                      ^  \ rS rSrSrSS\S\S\S\SS4
U 4S	 jjjr SS
\R                  S\R                  S\
\R                     S\R                  4S jjrSrU =r$ )	SelfBlock   a:  Implement a self-attention block to process features within a single image.

Args:
    embed_dim: The dimension of the feature embeddings.
    num_heads: The number of attention heads.
    flash: Whether to use FlashAttention. Default: False.
    bias: Whether to include bias in the linear layers. Default: True.
	embed_dim	num_headsflashrZ   r#   Nc           	        > [         TU ]  5         Xl        X l        [	        U R                  U-  S:H  S5        U R                  U-  U l        [        R                  " USU-  US9U l        [        U5      U l
        [        R                  " XUS9U l        [        R                  " [        R                  " SU-  SU-  5      [        R                  " SU-  SS9[        R                  " 5       [        R                  " SU-  U5      5      U l        g )Nr   z0Embed dimension should be dividable by num_heads   rY   r%   Telementwise_affine)r]   r^   r   r   r   head_dimr   r_   Wqkvr   
inner_attnout_projr   	LayerNormGELUffn)re   r   r   r   rZ   rf   s        r   r^   SelfBlock.__init__   s    ""T^^i/146hi)3IIiYTB	#E*		)TB==IIa)mQ]3LLY4@GGIIIa)mY/	
r   r   encodingrB   c                    U R                  U5      nUR                  SU R                  SS45      R                  SS5      nUS   US   US   pvn[	        X%5      n[	        X&5      nU R                  XVXsS9nU R                  UR                  SS5      R                  S	S
95      n	XR                  [        R                  " X/S5      5      -   $ )Nr5   r   r&   r%   .r   .r&   ).r%   )rB   r3   rE   )r   rG   r   r   rQ   r   r   rJ   r   r(   r>   )
re   r   r   rB   qkvr   r   r   contextmessages
             r   rr   SelfBlock.forward   s     iilmmBQ 78BB1aHf+s6{CKa#H0#H0//!/5-- 1 1!Q 7 ? ?" ? MN88EIIqlB7888r   )r   r   r   r   r   r   r   FTr   )ru   rv   rw   rx   ry   rz   r<   r^   r(   r{   r
   rr   r|   r}   r~   s   @r   r   r      s    
# 
# 
d 
RV 
bf 
 
( (,	9<<9 ,,9 u||$	9
 
9 9r   r   c                   P  ^  \ rS rSrSrSS\S\S\S\SS4
U 4S	 jjjrS
\S\	R                  S\	R                  S\\	R                  \	R                  4   4S jr SS\	R                  S\	R                  S\\	R                     S\\	R                  \	R                  4   4S jjrSrU =r$ )
CrossBlock   a<  Implement a cross-attention block to exchange information between two images.

Args:
    embed_dim: The dimension of the feature embeddings.
    num_heads: The number of attention heads.
    flash: Whether to use FlashAttention. Default: False.
    bias: Whether to include bias in the linear layers. Default: True.
r   r   r   rZ   r#   Nc           	      6  > [         TU ]  5         X l        X-  nUS-  U l        XR-  n[        R
                  " XUS9U l        [        R
                  " XUS9U l        [        R
                  " XaUS9U l        [        R                  " [        R
                  " SU-  SU-  5      [        R                  " SU-  SS9[        R                  " 5       [        R
                  " SU-  U5      5      U l        U(       a  [        (       a  [        S5      U l        g S U l        g )Nr   rY   r%   Tr   )r]   r^   headsr/   r   r_   to_qkto_vto_outr   r   r   r   r   r   r   )re   r   r   r   rZ   dim_head	inner_dimrf   s          r   r^   CrossBlock.__init__   s    
)t^
(	YYy$?
IIi>	ii	4@==IIa)mQ]3LLY4@GGIIIa)mY/	
 __"4DJDJr   funcx0rK   c                 "    U" U5      U" U5      4$ r    )re   r   r   rK   s       r   map_CrossBlock.map_  s    Bxb!!r   rB   c           	      |  ^  T R                  T R                  X5      u  pET R                  T R                  X5      u  pgU 4S jXEXg4 5       u  pEpgT R                  bU  UR                  R
                  S:X  a;  T R                  XEXs5      nT R                  XTXcb  UR                  SS5      OS 5      n	GOUT R                  S-  -  UT R                  S-  -  pT[        R                  " SXE5      n
Ub  U
R                  U) [        S5      * 5      n
[        R                  " U
SS9n[        R                  " U
R                  SS5      R                  5       SS9n[        R                  " S	X5      n[        R                  " S
UR                  SS5      U5      n	Ub  UR                  5       U	R                  5       pT R                  S X5      u  pT R                  T R                   X5      u  pUT R#                  [        R$                  " X/S5      5      -   nUT R#                  [        R$                  " X)/S5      5      -   nX4$ )Nc              3   ~   >#    U  H2  oR                  S TR                  S 45      R                  SS5      v   M4     g7f)r5   r&   r%   N)rG   r   r   )r   rO   re   s     r   r   %CrossBlock.forward.<locals>.<genexpr>	  s6     jWiRSKKTZZ,<=GG1MMWis   :=r   r5   r3   g      ?zbhid, bhjd -> bhijr   r8   zbhij, bhjd -> bhidzbhji, bhjd -> bhidc                 @    U R                  SS5      R                  SS9$ )Nr&   r%   r3   rE   )r   rJ   )rO   s    r   <lambda>$CrossBlock.forward.<locals>.<lambda>  s    Q[[A%6%>%>%>%Lr   )r   r   r   r   r7   r   r   r/   r(   r   r   r+   r   r   r   r   r   r   r>   )re   r   rK   rB   qk0qk1v0v1m0m1r   attn01attn10s   `            r   rr   CrossBlock.forward  s    99TZZ0499b-jX[bdWij"::!cjjoo&?Cb/BCbDT$..R*@Z^_BTZZ_,cDJJO.C,,3S>CooteeEl];YYs+FYYs}}R4??ArJF2F?B2F4D4DR4LbQB"--/BLbU4;;/$((599bXr233$((599bXr233vr   )r   r   r   r/   r   r   r   r   r   )ru   rv   rw   rx   ry   rz   r<   r^   r   r(   r{   r   r   r
   rr   r|   r}   r~   s   @r   r   r      s    # # d RV bf  (" "u|| " "%PUP\P\^c^j^jPjJk " RV,,$)LL8@8N	u||U\\)	* r   r   c                     ^  \ rS rSrSrU 4S jr  SS\R                  S\R                  S\R                  S\R                  S\\R                     S	\\R                     S
\R                  4S jjr	S\R                  S\R                  S\R                  S\R                  S\R                  S	\R                  S
\R                  4S jr
SrU =r$ )TransformerLayeri  zImplement a complete Transformer layer for feature matching.

This layer typically alternates between self-attention and cross-attention
to update local feature descriptors.
c                 b   > [         TU ]  5         [        U0 UD6U l        [	        U0 UD6U l        g r   )r]   r^   r   	self_attnr   
cross_attn)re   r   kwargsrf   s      r   r^   TransformerLayer.__init__&  s0    "D3F3$d5f5r   r   r   	encoding0	encoding1mask0mask1r#   c                     Ub  Ub  U R                  XX4XV5      $ U R                  X5      nU R                  X$5      nU R                  X5      $ r   )masked_forwardr   r   )re   r   r   r   r   r   r  s          r   rr   TransformerLayer.forward+  sO     !2&&uY5XXNN54ENN54E??500r   c                     XVR                  SS5      -  nXUR                  SS5      -  nXfR                  SS5      -  nU R                  XU5      nU R                  X$U5      nU R                  XU5      $ )Nr5   r3   )r   r   r   )re   r   r   r   r   r   r  rB   s           r   r  TransformerLayer.masked_forward<  sn     r2..B//B//u7u7uT22r   )r   r   NN)ru   rv   rw   rx   ry   r^   r(   r{   r
   rr   r  r|   r}   r~   s   @r   r   r     s    6 )-(,1||1 ||1 <<	1
 <<1 %1 %1 
1"3||3 ||3 <<	3
 <<3 ||3 ||3 
3 3r   r   r   z0z1c                 p   U R                   u  p4n[        R                  " U5      [        R                  " U5      R                  SS5      -   n[        R                  " U S5      n[        R                  " U R                  SS5      R                  5       S5      R                  SS5      nU R                  X4S-   US-   4S5      n	Xx-   U-   U	SS2SU2SU24'   [        R                  " UR                  S5      * 5      U	SS2SS2S4'   [        R                  " UR                  S5      * 5      U	SS2SSS24'   U	$ )z<Create the log assignment matrix from logits and similarity.r&   r%   r5   r3   r   N)r:   r   
logsigmoidr   log_softmaxr   new_fullr   )
r   r  r	  br   ncertaintiesscores0scores1scoress
             r   sigmoid_log_double_softmaxr  M  s
   iiGA!,,r"Q\\"%5%?%?1%EEKmmC#GmmCMM"b1<<>BLLRQSTG\\1!eQU+Q/F)K7F1bqb"1"9rzz"~o6F1crc2:rzz"~o6F1b#2#:Mr   c                      ^  \ rS rSrSrS\SS4U 4S jjrS\R                  S\R                  S\	\R                  \R                  4   4S	 jr
S
\R                  S\R                  4S jrSrU =r$ )MatchAssignmentiZ  zAssign matches between two sets of local features using a dual-softmax approach.

Args:
    dim: The dimension of the feature descriptors.
r9   r#   Nc                    > [         TU ]  5         Xl        [        R                  " USSS9U l        [        R                  " XSS9U l        g )Nr&   TrY   )r]   r^   r9   r   r_   matchability
final_projr   s     r   r^   MatchAssignment.__init__a  s:    IIc148))C48r   r   r   c                    U R                  U5      U R                  U5      pCUR                  u    pVX6S-  -  XFS-  -  pC[        R                  " SX45      nU R	                  U5      nU R	                  U5      n	[        XxU	5      n
X4$ )z)Build assignment matrix from descriptors.g      ?zbmd,bnd->bmn)r  r:   r(   r   r  r  )re   r   r   mdesc0mdesc1_dr   r  r	  r  s              r   rr   MatchAssignment.forwardg  s    /1G,,1T')6tG+;ll>6:u%u%+CR8{r   descc                 j    [         R                  " U R                  U5      5      R                  S5      $ )Nr5   )r(   sigmoidr  r   )re   r!  s     r   get_matchability MatchAssignment.get_matchabilityr  s'    }}T..t45==bAAr   )r9   r  r  )ru   rv   rw   rx   ry   rz   r^   r(   r{   r   rr   r$  r|   r}   r~   s   @r   r  r  Z  sv    9C 9D 9	U\\ 	%,, 	5W\WcWcIcCd 	BU\\ Bell B Br   r  r  thc                    U SS2SS2SS24   R                  S5      U SS2SS2SS24   R                  S5      p2UR                  UR                  pT[        R                  " UR                  S   UR
                  S9S   n[        R                  " UR                  S   UR
                  S9S   nXeR                  SU5      :H  nXtR                  SU5      :H  n	UR                  R                  5       n
U
R                  S5      n[        R                  " XU5      n[        R                  " XR                  SU5      U5      nXU:  -  nXR                  SU5      -  n[        R                  " XS5      n[        R                  " XS5      nXEX4$ )z;Obtain matches from a log assignment matrix [Bx M+1 x N+1].Nr5   r%   r&   r7   r   )r   indicesr(   aranger:   r7   gatherr-   exp
new_tensorwhere)r  r&  max0max1r   r   indices0indices1mutual0mutual1max0_expzeromscores0mscores1valid0valid1s                   r   filter_matchesr;  v  sQ   3B3$((+VAssCRCK-@-D-DQ-G$\\4<<||BHHQK		:4@H||BHHQK		:4@H))Ar**G))Ar**G{{ Hq!D{{7d3H{{7OOAr$:DAH2&F}}Q++F	V	$B	V	$B8%%r   c                     ^  \ rS rSr% SrSSSSSSSSS	SS
SSSS.r\\\\	4      \
S'   SSSSS.r\\\\	4      \
S'   SS/r\\\      \
S'   Sr\\   \
S'   Sr\\   \
S'   SSS.SSS.SSS.S S!S.S"S!S.S#S!S.S$S%S&S'S(SS
SS).S*S!S	S+.S,S!SSS	S-S..S,S!SSS	S-S..S/S!SSS	S0.S1.r\\\\	4      \
S2'   SGS2\S3S4U 4S4 jjjr SHS5\S6\\   S3S4S7 jjrS8\S3\4S9 jrS8\S3\4S: jrS;\S3\4S< jrS=\R6                  S>\R6                  S;\S3\R6                  4S? jrS@\R6                  SA\R6                  S;\SB\S3\R6                  4
SC jrSD\R<                  S3\4SE jrSFr U =r!$ )I	LightGluei  ak  Implement the LightGlue matcher for sparse local features.

LightGlue is a deep network that matches local features across image pairs
using a series of transformer layers and an adaptive pruning mechanism.

Args:
    features: The type of local features to match (e.g., 'superpoint', 'disk').
    conf: A configuration dictionary to override default parameters.
	lightglue   Frt   	      Tgffffff?gGz?皙?N)name	input_dimdescriptor_dimadd_scale_oriadd_laf
scale_coefn_layersr   r   mpdepth_confidencewidth_confidencefilter_thresholdweightsdefault_confr5         )cpumpsr   r   pruning_keypoint_thresholdsimage0image1required_data_keysz
v0.1_arxivversionzFhttps://github.com/cvg/LightGlue/releases/download/{}/{}_lightglue.pthurlsuperpoint_lightglue)rN  rD  dedodeb_lightgluededodeg_lightgluedisk_lightglue   aliked_lightglueraco_aliked_lightgluexfeat_lighterglue@   `      r&   )rN  rD  rE  rI  r   rK  rL  rM  sift_lightglue)rN  rD  rF  
doghardnetgUUUUUU?)rN  rD  rL  rK  rF  rH  keynet_affnet_hardnet_lightglue)rN  rD  rL  rK  rG  )
superpointdedodebdedodegdiskalikedzraco-alikedxfeatsiftdog_affnet_hardnetrf  keynet_affnet_hardnetfeaturesr#   c                 N
  > [         TU ]  5         [        S'0 0 U R                  EUED6=U l        nUbb  [        U[        U R                  R                  5       5      ;   S5        U R                  U   R                  5        H  u  pE[        X4U5        M     [        U R                  R                  =(       a    U R                  R                  (       + 5        UR                  UR                  :w  a0  [        R                   " UR                  UR                  SS9U l        O[        R$                  " 5       U l        UR                  UR&                  -  n[)        SSUR                  -  -   SUR                  -  -   UU5      U l        UR&                  UR,                  UR                  pn[        R.                  " [1        U5       V
s/ s H  n
[3        XUR4                  5      PM     sn
5      U l        [        R.                  " [1        U5       V
s/ s H  n
[9        U	5      PM     sn
5      U l        [        R.                  " [1        US-
  5       V
s/ s H  n
[=        U	5      PM     sn
5      U l        U RA                  S[B        RD                  " [1        U R                  R,                  5       Vs/ s H  oRG                  U5      PM     sn5      5        S nUb  URH                   SU RJ                   S	3RM                  S
S5      nUS:X  a  SnUS;   a  SnSnOWUS;   a  SnSnOLUS;   a  SnSnOAUS:X  a  SnSnO6U RN                  RQ                  U RJ                  URM                  SS5      5      n[B        RR                  RU                  XS9nOaURH                  bT  [W        [X        5      RZ                  nUSU R                  RH                   S	3-  n[B        R\                  " [_        U5      SS9nU(       a  SnUR                  5        VVs0 s H,  u  pEURa                  U5      (       a  U[c        U5      S  OUU_M.     nnn[1        U R                  R,                  5       H}  nSU 3S U S!34nUR                  5        VVs0 s H  u  pEURL                  " U6 U_M     nnnS"U 3S U S#34nUR                  5        VVs0 s H  u  pEURL                  " U6 U_M     nnnM     U Re                  US$S%9  [g        S&5        S U l4        g s  sn
f s  sn
f s  sn
f s  snf s  snnf s  snnf s  snnf )(NzFeatures keys are wrongTrY   r%   rA  r&   confidence_thresholdsr  z.pth.-ro  rf  )rp  z"keynet_affnet_hardnet_lightlue.pthzKhttp://cmp.felk.cvut.cz/~mishkdmy/models/keynet_affnet_hardnet_lightlue.pth)ri  zdedodeb_lightglue.pthz>http://cmp.felk.cvut.cz/~mishkdmy/models/dedodeb_lightglue.pth)rj  zdedodeg_lightglue.pthz>http://cmp.felk.cvut.cz/~mishkdmy/models/dedodeg_lightglue.pthrm  zxfeat-lighterglue.ptzThttps://github.com/verlab/accelerated_features/raw/main/weights/xfeat-lighterglue.pt)	file_namezweights/rR  )map_locationzmatcher.z
self_attn.ztransformers.z
.self_attnzcross_attn.z.cross_attnF)strictzLoaded LightGlue modelr   )5r]   r^   r   rO  confr   listrq  keysitemssetattrrF  rG  rD  rE  r   r_   
input_projIdentityr   rS   posencrI  
ModuleListranger   r   transformersr  log_assignmentr   token_confidenceregister_bufferr(   r{   confidence_thresholdrN  rX  replacerY  formathubload_state_dict_from_urlr   __file__parentloadstr
startswithlenload_state_dictprintstatic_lengths)re   rq  conf_ry  r   r   r   hr  r  r  i
state_dictfnamerY  pathprefixpatternrf   s                     r   r^   LightGlue.__init__  sn   *L-K0A0A-KU-KLL	DT$--*<*<*>%??AZ[h/557# 8$))11Gdii6G6GHI>>T000 ii8K8KRVWDO kkmDO&&$..88D&&&&T\\)99
 ..$--1D1DaMMW\]^W_*`W_RS+;A$**+MW_*`a mmq,RA_Q-?,RS "5QRUVQV<.X<aq/A<.X Y#LLdiiFXFX@YZ@Y133A6@YZ[	
 
||nAdll^48@@cJE//'44<c[(/V[(/VW$.lhhoodllH4D4DS#4NO;;C;QJ\\%>((DHTYY%6%6$7t<<DCIEBJFYcYiYiYklYkQUQRall6.B.B!CKM*1LYkJl499--.&qc*mA3j,IIAKAQAQASTASaii114AS
T's+}QC{-KKAKAQAQASTASaii114AS
T
	 /
   E :&'"Y +a,R.X [: m UTs*    TTT-T3T>T;T!moder  c                 "   U R                   R                  S:w  a  [        R                  " SSS9  [	        [
        S5      (       a`  [	        [
        R                  S5      (       aA  [
        R                  R                  5       (       a  [
        R                  R                  5         [        U R                   R                  5       HB  n[
        R                  " U R                  U   R                  USS9U R                  U   l        MD     X l        g )	Nr5   z9Point pruning is partially disabled for compiled forward.r%   r   	_inductorcudagraph_mark_step_beginT)r  	fullgraph)ry  rL  r   r   r   r(   r  r   is_availabler  r  rI  compiler  r  r  )re   r  r  r  s       r   r  LightGlue.compile7  s     99%%+MMK E;'')DEE

''))OO557tyy))*A27--!!!$33$$3Da / +
 -r   rd   c                     [         R                  " U R                  R                  SS9   U R	                  U5      sSSS5        $ ! , (       d  f       g= f)a  Match keypoints and descriptors between two images.

Input (dict):
    image0: dict
        keypoints: [B x M x 2]
        descriptors: [B x M x D]
        image: [B x C x H x W] or image_size: [B x 2]
    image1: dict
        keypoints: [B x N x 2]
        descriptors: [B x N x D]
        image: [B x C x H x W] or image_size: [B x 2]
Output (dict):
    log_assignment: [B x M+1 x N+1]
    matches0: [B x M]
    matching_scores0: [B x M]
    matches1: [B x N]
    matching_scores1: [B x N]
    matches: List[[Si x 2]], scores: List[[Si]]
r   )enabledr    N)r(   autocastry  rJ  _forward)re   rd   s     r   rr   LightGlue.forwardM  s3    ( ^^DIILLfE==& FEEs   A
Ac                    U R                    H  n[        X!;   SU S35        M     US   US   pCUS   US   peUR                  u  pxn	UR                  u  pzn	UR                  nUR	                  S5      UR	                  S5      pUb  UOUS   R                  SS  S S S	2   nUb  UOUS   R                  SS  S S S	2   n[        X\5      R                  5       n[        Xm5      R                  5       n[        [        R                  " US	:  5      R                  5       =(       a'    [        R                  " US
:*  5      R                  5       S5        [        [        R                  " US	:  5      R                  5       =(       a'    [        R                  " US
:*  5      R                  5       S5        U R                  R                  (       a  [        R                  " U/S Vs/ s H  oU   R                  S	5      PM     sn-   S	5      nU R                  R                  S:w  a  US   U R                  R                  -  US'   [        R                  " U/S Vs/ s H  oU   R                  S	5      PM     sn-   S	5      nU R                  R                  S:w  a  US   U R                  R                  -  US'   GO|U R                  R                  (       Ga`  [!        US   U R                  R                  5      n[!        US   U R                  R                  5      n[#        U5      n[#        U5      n[        R                  " U[        US   U5      R                  5       R%                  UR&                  5      [        US   U5      R                  5       R%                  UR&                  5      /S	5      n[        R                  " U[        US   U5      R                  5       R%                  UR&                  5      [        US   U5      R                  5       R%                  UR&                  5      /S	5      nUS   R)                  5       R+                  5       nUS   R)                  5       R+                  5       nUR                  S
   S:X  d  UR                  S
   S:X  GaZ  [        R,                  " Xx4S	U[        R.                  S9n[        R,                  " Xz4S	U[        R.                  S9n[        R0                  " Xx4US9n[        R0                  " Xz4US9n[        R2                  " US
S
4US9UUUUS[5        U5       V	s/ s H'  n	[        R2                  " SU[        R.                  S9PM)     sn	[5        U5       V	s/ s H  n	[        R2                  " SUS9PM     sn	[        R6                  " U5      U R                  R8                  -  [        R6                  " U5      U R                  R8                  -  S.
$ [        UR                  S	   U R                  R:                  :H  S5        [        UR                  S	   U R                  R:                  :H  S5        [        R<                  " 5       (       a   UR?                  5       nUR?                  5       nSu  nn[A        X5      nU RB                  =(       a    U[A        U RB                  5      :*  nU(       ag  [E        U RB                   Vs/ s H  oU:  d  M
  UPM     sn5      n[G        UU5      u  nn[G        UU5      u  nn[G        UU5      u  pY[G        UU5      u  piU RI                  U5      nU RI                  U5      nU RK                  U5      nU RK                  U5      nU R                  RL                  S:  nU R                  RN                  S:  =(       a    U(       + nU RQ                  U5      n U(       a\  [        RR                  " SXS9S    n![        RR                  " SXS9S    n"[        R6                  " U!5      n#[        R6                  " U"5      n$Su  n%n&[5        U R                  R8                  5       GH  n'U RT                  U'   " UUUUUUS9u  nnU'U R                  R8                  S
-
  :X  a  M>  U(       aK  U RV                  U'   " UU5      u  n%n&U RY                  U%SS U2S S 24   U&SS U
2S S 24   U'X-   5      (       a    GOsU(       a  UR                  S   U :  a  U RZ                  U'   R]                  U5      n(U R_                  U%U(U'5      n)[        R`                  " U)5      S
   n*W!Rc                  S
U*5      n!URc                  S
U*5      nURc                  SU*5      nW#S S 2U!4==   S
-  ss'   U(       a  UR                  S   U :  a  U RZ                  U'   R]                  U5      n+U R_                  U&U+U'5      n,[        R`                  " U,5      S
   n-W"Rc                  S
U-5      n"URc                  S
U-5      nURc                  SU-5      nW$S S 2U"4==   S
-  ss'   USS U2S S 24   USS U
2S S 24   nnGM     U RZ                  W'   " UU5      u  n.n	[e        U.U R                  Rf                  5      u  n/n0n1n2/ / n4n3[5        U5       H  nU/U   S	:  n5[        R`                  " U55      S   n6U/U   U5   n7U(       a  W!UU64   n6W"UU74   n7U3Ri                  [        Rj                  " U6U7/S	5      5        U4Ri                  U1U   U5   5        M     U(       Ga4  [        R,                  " Xx4S	U/R                  U/R&                  S9n8[        R,                  " Xz4S	U0R                  U0R&                  S9n9[        R`                  " U/S	:H  S	W"Rm                  S
U/Ro                  SS95      5      U8S S 2W!4'   [        R`                  " U0S	:H  S	U!Rm                  S
U0Ro                  SS95      5      U9S S 2U"4'   [        R0                  " Xx4U1R                  S9n:[        R0                  " Xz4U2R                  S9n;U1U:S S 2U!4'   U2U;S S 2U"4'   U8U9U:U;4u  n/n0n1n2OZ[        R6                  " U15      U R                  R8                  -  n#[        R6                  " U25      U R                  R8                  -  n$U.U/U0U1U2U'S
-   U3U4W#W$S.
n<U<$ s  snf s  snf s  sn	f s  sn	f s  snf )NzMissing key z in datarU  rV  	keypoints
image_sizeimager3   r5   r&    )scalesorisrt   ).r3   lafsr   r   descriptorsr   r6   r(  )r   r%   )r   )
r  matches0matches1matching_scores0matching_scores1stopmatchesr  prune0prune1z7Descriptor dimension does not match input dim in configr  )r   r  .)r   )8rW  r   r:   r7   getr0   r   r(   allitemry  rF  r>   rl   rH  rG  r   r   r,   r4   r   r   fulllongr?   emptyr  r;   rI  rD  is_autocast_enabledr   r   r  r   rC   r~  r  rK  rL  pruning_min_kptsr*  r  r  check_if_stopr  r$  get_pruning_maskr.  index_selectr;  rM  appendrI   r+  clamp)=re   rd   keydata0data1kpts0kpts1r  r   r  r  r7   size0size1r   laf0laf1r   r   empty_m0empty_m1empty_s0empty_s1r   r  c
do_compileknr   r   do_early_stopdo_point_pruning
pruning_thind0ind1r  r  token0token1r  r  
prunemask0keep0r  
prunemask1keep1r  r   r   r7  r8  r  mscoresvalidm_indices_0m_indices_1m0_m1_	mscores0_	mscores1_preds=                                                                r   r  LightGlue._forwardd  s   **CSE&BC +H~tH~u[)5+=u++a++ayy.		,0Gu*g0D0DRS0I$B$0O*g0D0DRS0I$B$0O#E1779#E1779UYYu{+002Suyy!7L7Q7Q7SUWXUYYu{+002Suyy!7L7Q7Q7SUWX99""IIugI[(\I[Aq););B)?I[(\\^`aEyy##s*!&w$))2F2F!FgIIugI[(\I[Aq););B)?I[(\\^`aEyy##s*!&w$))2F2F!FgYYU6]DII,@,@ADU6]DII,@,@AD&t,D&t,DII'Ve<BBDGGT'Ve<BBDGGT
 E II'Ve<BBDGGT'Ve<BBDGGT
 E m$++-88:m$++-88: ;;q>Q%++a.A"5zz1&"V5::NHzz1&"V5::NH{{A6&9H{{A6&9H #(++q!Qi"G$$$,$,Z_`aZbcZbUVEKKvUZZPZbcEJ1XNX5;;tF;XN//(3dii6H6HH//(3dii6H6HH  	U[[_		(;(;;=vwU[[_		(;(;;=vw$$&&JJLEJJLE!uI((JQ#d6I6I2J-J
!4!4?!4AQa!4?@B(3LE5(3LE5$UB/HE$UB/HE&&KK&	KK&	 		22Q699559L*n**62
<<14T:D<<14T:D__T*F__T*F#tyy))*A,,Q/uiZ_glmLE5DII&&**!%!6!6q!9%!G%%fS"1"aZ&8&bqb!:LaQRQVWWEKKOj$@--a0AA%H!2267AF
J/2((E2**1e4%222u=	q$w1$EKKOj$@--a0AA%H!2267AF
J/2((E2**1e4%222u=	q$w1$ bqb!,eC!QJ.?5E55 +8 ''*5%8	%3FDII<V<V%W"B(rqAqEBJE++e,Q/KQ%,K"1k>2"1k>2NN5;;['A2FGNN8A;u-.  **aVR		JC**aVR		JC ;;rRxT[[BHHQRHO5TUC4L ;;rRxT[[BHHQRHO5TUC4LQF8??CIQF8??CI!)Iag!)Iag),c9i)G&BHh__X.1C1CCF__X.1C1CCF % ( (E
 u )] )]T dN  @s$   s
s
<.s9s$	s$1s$layer_indexc                     SS[         R                  " SU-  U R                  R                  -  5      -  -   n[	        [        US5      S5      $ )zScaled confidence threshold.g?rB  g      r   r&   )mathr,  ry  rI  r   r   )re   r  	thresholds      r   r  LightGlue.confidence_threshold  sB    #);dii>P>P)P QQQ	3y!$a((r   confidencesr  c                 l    USU R                   R                  -
  :  nUb  XAU R                  U   :*  -  nU$ )z$Mask points which should be removed.r&   )ry  rL  rs  )re   r  r  r  keeps        r   r  LightGlue.get_pruning_mask  s>    TYY7778"4#=#=k#JJJDr   confidences0confidences1
num_pointsc                     [         R                  " X/S5      nU R                  U   nSXV:  R                  5       R	                  5       U-  -
  nXpR
                  R                  :  $ )zEvaluate stopping condition.r5   rt   )r(   r>   rs  r+   sumry  rK  )re   r  r  r  r  r  r  ratio_confidents           r   r  LightGlue.check_if_stop  s^     ii <bA..{;	!8 ? ? A E E G* TT!;!;;;r   r7   c                     U R                   R                  (       a*  [        (       a  UR                  S:X  a  U R                  S   $ U R                  UR                     $ )Nr   r   )ry  r   r   r   rT  )re   r7   s     r   r  LightGlue.pruning_min_kpts*  sB    99??6;;&3H33G<<33FKK@@r   )ry  r~  r  r  r  r  r  )rh  )zreduce-overhead)r?  i   i   rP  i   rQ  )"ru   rv   rw   rx   ry   rO  r   r   r  r   __annotations__rT  rW  r	   rX  rY  rq  r^   r   rz   r  dictrr   r  r+   r  r(   r{   r  r  r7   r  r|   r}   r~   s   @r   r=  r=    s      .L(4S>* ( 	=$sCx.!9  08.Bc+B)GXc])aC#a .

 +

 +

 (

 *

 /

 +  " $ #	
 (!
 $ " "!#
 $ " "!#
 9 " ""
q?*HhtCH~& ?BB# B# B# B#J No--=Ec]-	-,'D 'T '.kT kd kZ) ) )
ELL %,, ]` ejeqeq <ll< ll< 	<
 < 
<Au|| A A Ar   r=  )6r  r   pathlibr   typesr   typingr   r   r   r   r	   r
   r   r   r(   torch.nn.functionalr   
functionalr   kornia.core.checkr   kornia.feature.lafr   r   flash_attn.modules.mhar   ModuleNotFoundErrorr   r   r   r   r   float32r   AMP_CUSTOM_FWD_F32r{   r0   rz   rC   rM   rQ   ModulerS   r   r   r   r   r   r  r  r+   r;  r=  r   r   r   <module>r     sv  $    ! Q Q Q     * =: '!%CDDOO# ueL!A!A 
IIU]]G		"	"u}}	"	=  ell %,, 5<<  U\\ 3 5u||9S3T @5<< @ELL @85<< 8ELL 8U\\ 8
0 08
bii 
*-?		 -?`'9		 '9T9 9x+3ryy +3\
ELL 
ell 
 
Y^YeYe 
Bbii B8&5<< &U &uU\\5<<Y^YeYeglgsgs=s7t &&eA		 eAQ  s   J) )J54J5