Ë
    ÜÓ^j¼©  ã                   ó&  — d dl mZ d dlmZ d dlZd dlZd dlmZ d dlm	Z	 ddl
mZ ddlmZ dd	lmZ dd
lmZmZ ddlmZ ddlmZmZmZmZ ddlmZ ddlmZ  ed¬«      e G d„ de«      «       «       Z G d„ dej>                  «      Z d„ Z!d@d„Z"dejF                  de$dejF                  fd„Z%	 dAdej>                  dejF                  dejF                  d ejF                  d!ejF                  dz  d"e&d#e&d$ee   fd%„Z' G d&„ d'ej>                  «      Z( G d(„ d)ej>                  «      Z) G d*„ d+ej>                  «      Z*d,ejF                  d-ejF                  d.ejF                  dejF                  fd/„Z+ G d0„ d1ej>                  «      Z, G d2„ d3ej>                  «      Z-e G d4„ d5e«      «       Z.d6ejF                  d7e&de/ejF                  ejF                  f   fd8„Z0d9ejF                  d:e$d;e$dejF                  fd<„Z1 ed=¬«       G d>„ d?e.«      «       Z2d5d?gZ3y)Bé    )ÚCallable)Ú	dataclassN)Únn©Úpad_sequenceé   )ÚACT2FN)Úcreate_bidirectional_mask)ÚFlashAttentionKwargs)ÚALL_ATTENTION_FUNCTIONSÚPreTrainedModel)ÚUnpack)ÚModelOutputÚTransformersKwargsÚauto_docstringÚcan_return_tupleé   )ÚAutoModelForKeypointDetectioné   )ÚLightGlueConfigaù  
    Base class for outputs of LightGlue keypoint matching models. Due to the nature of keypoint detection and matching,
    the number of keypoints is not fixed and can vary from image to image, which makes batching non-trivial. In the
    batch of images, the maximum number of matches is set as the dimension of the matches and matching scores. The mask
    tensor is used to indicate which values in the keypoints, matches, matching_scores and prune tensors are keypoint
    matching information.
    )Úcustom_introc                   ó^  — e Zd ZU dZdZej                  dz  ed<   dZej                  dz  ed<   dZ	ej                  dz  ed<   dZ
ej                  dz  ed<   dZej                  dz  ed<   dZej                  dz  ed<   dZeej                     dz  ed	<   dZeej                     dz  ed
<   y)ÚLightGlueKeypointMatchingOutputa¯  
    loss (`torch.FloatTensor` of shape `(1,)`, *optional*):
        Loss computed during training.
    matches (`torch.FloatTensor` of shape `(batch_size, 2, num_matches)`):
        Index of keypoint matched in the other image.
    matching_scores (`torch.FloatTensor` of shape `(batch_size, 2, num_matches)`):
        Scores of predicted matches.
    keypoints (`torch.FloatTensor` of shape `(batch_size, num_keypoints, 2)`):
        Absolute (x, y) coordinates of predicted keypoints in a given image.
    prune (`torch.IntTensor` of shape `(batch_size, num_keypoints)`):
        Pruning mask indicating which keypoints are removed and at which layer.
    mask (`torch.BoolTensor` of shape `(batch_size, num_keypoints)`):
        Mask indicating which values in matches, matching_scores, keypoints and prune are keypoint matching
        information.
    hidden_states (`Tuple[torch.FloatTensor, ...]`, *optional*):
        Tuple of `torch.FloatTensor` (one for the output of each stage) of shape `(batch_size, 2, num_channels,
        num_keypoints)` returned when `output_hidden_states=True` is passed or when
        `config.output_hidden_states=True`
    attentions (`Tuple[torch.FloatTensor, ...]`, *optional*):
        Tuple of `torch.FloatTensor` (one for each layer) of shape `(batch_size, 2, num_heads, num_keypoints,
        num_keypoints)` returned when `output_attentions=True` is passed or when
        `config.output_attentions=True`
    NÚlossÚmatchesÚmatching_scoresÚ	keypointsÚpruneÚmaskÚhidden_statesÚ
attentions)Ú__name__Ú
__module__Ú__qualname__Ú__doc__r   ÚtorchÚFloatTensorÚ__annotations__r   r   r   r   Ú	IntTensorr   r    Útupler!   © ó    ú{/var/www/ramen.bs-engineer-server.com/venv/lib/python3.12/site-packages/transformers/models/lightglue/modeling_lightglue.pyr   r   &   s¹   … ñð0 &*€Dˆ%×
Ñ
˜dÑ
"Ó)Ø(,€GˆU×Ñ Ñ%Ó,Ø04€O�U×&Ñ&¨Ñ-Ó4Ø*.€Iˆu× Ñ  4Ñ'Ó.Ø$(€Eˆ5�?‰?˜TÑ!Ó(Ø%)€Dˆ%×
Ñ
˜dÑ
"Ó)Ø59€M�5˜×*Ñ*Ñ+¨dÑ2Ó9Ø26€J��e×'Ñ'Ñ(¨4Ñ/Ô6r,   r   c            
       ó¨   ‡ — e Zd Zdefˆ fd„Z	 ddej                  dedz  deej                     eej                  ej                  f   z  fd„Z	ˆ xZ
S )	ÚLightGluePositionalEncoderÚconfigc                 ó�   •— t         ‰| �  «        t        j                  d|j                  |j
                  z  dz  d¬«      | _        y )Nr   F©Úbias)ÚsuperÚ__init__r   ÚLinearÚdescriptor_dimÚnum_attention_headsÚ	projector©Úselfr0   Ú	__class__s     €r-   r5   z#LightGluePositionalEncoder.__init__T   s:   ø€ Ü‰ÑÔÜŸ™ 1 f×&;Ñ&;¸v×?YÑ?YÑ&YÐ]^Ñ&^ÐejÔkˆ�r,   r   Úoutput_hidden_statesNÚreturnc                 óÀ   — | j                  |«      }|j                  dd¬«      }t        j                  |«      }t        j                  |«      }||f}|r||f}|S |f}|S )Nr   éÿÿÿÿ©Údim)r9   Úrepeat_interleaver&   ÚcosÚsin)r;   r   r=   Úprojected_keypointsÚ
embeddingsÚcosinesÚsinesÚoutputs           r-   Úforwardz"LightGluePositionalEncoder.forwardX   sq   € ð #Ÿn™n¨YÓ7ÐØ(×:Ñ:¸1À"Ð:ÓEˆ
Ü—)‘)˜JÓ'ˆÜ—	‘	˜*Ó%ˆØ˜uÐ%ˆ
Ù6J�*Ð1Ð2ˆØˆð R\ÐP]ˆØˆr,   ©F)r"   r#   r$   r   r5   r&   ÚTensorÚboolr*   rK   Ú__classcell__©r<   s   @r-   r/   r/   S   s]   ø„ ðl˜õ lð
 LQñ	ØŸ™ð	Ø=AÀD¹[ð	à	ˆu�|‰|Ñ	˜u U§\¡\°5·<±<Ð%?Ñ@Ñ	@÷	r,   r/   c                 ó€   — | dd d d…f   }| ddd d…f   }t        j                  | |gd¬«      j                  d«      }|S )N.r   r   r@   rA   éþÿÿÿ)r&   ÚstackÚflatten)ÚxÚx1Úx2Úrot_xs       r-   Úrotate_halfrY   d   sL   € à	
ˆ3‘�!�ˆ8‰€BØ	
ˆ3���1�ˆ9‰€BÜ�K‰K˜"˜˜b˜	 rÔ*×2Ñ2°2Ó6€EØ€Lr,   c                 ó6  — | j                   }| j                  «       } |j                  «       }|j                  |«      }|j                  |«      }| |z  t        | «      |z  z   }||z  t        |«      |z  z   }|j	                  |¬«      |j	                  |¬«      fS )a…  Applies Rotary Position Embedding to the query and key tensors.

    Args:
        q (`torch.Tensor`): The query tensor.
        k (`torch.Tensor`): The key tensor.
        cos (`torch.Tensor`): The cosine part of the rotary embedding.
        sin (`torch.Tensor`): The sine part of the rotary embedding.
        unsqueeze_dim (`int`, *optional*, defaults to 1):
            The 'unsqueeze_dim' argument specifies the dimension along which to unsqueeze cos[position_ids] and
            sin[position_ids] so that they can be properly broadcasted to the dimensions of q and k. For example, note
            that cos[position_ids] and sin[position_ids] have the shape [batch_size, seq_len, head_dim]. Then, if q and
            k have the shape [batch_size, heads, seq_len, head_dim], then setting unsqueeze_dim=1 makes
            cos[position_ids] and sin[position_ids] broadcastable to the shapes of q and k. Similarly, if q and k have
            the shape [batch_size, seq_len, heads, head_dim], then set unsqueeze_dim=2.
    Returns:
        `tuple(torch.Tensor)` comprising of the query and key tensors rotated using the Rotary Position Embedding.
    ©Údtype)r\   ÚfloatÚ	unsqueezerY   Úto)ÚqÚkrD   rE   Úunsqueeze_dimr\   Úq_embedÚk_embeds           r-   Úapply_rotary_pos_embre   l   sŽ   € ð$ �G‰G€EØ	�‰‹	€AØ	�‰‹	€AØ
�-‰-˜Ó
&€CØ
�-‰-˜Ó
&€CØ�3‰wœ; q›>¨CÑ/Ñ0€GØ�3‰wœ; q›>¨CÑ/Ñ0€GØ�:‰:˜Eˆ:Ó" G§J¡J°U JÓ$;Ð;Ð;r,   r    Ún_repr>   c                 óª   — | j                   \  }}}}|dk(  r| S | dd…dd…ddd…dd…f   j                  |||||«      } | j                  |||z  ||«      S )zÔ
    This is the equivalent of torch.repeat_interleave(x, dim=1, repeats=n_rep). The hidden states go from (batch,
    num_key_value_heads, seqlen, head_dim) to (batch, num_attention_heads, seqlen, head_dim)
    r   N)ÚshapeÚexpandÚreshape)r    rf   ÚbatchÚnum_key_value_headsÚslenÚhead_dims         r-   Ú	repeat_kvro   ˆ   so   € ð
 2?×1DÑ1DÑ.€EÐ  hØ�‚zØÐØ!¢!¢Q¨ªa²Ð"2Ñ3×:Ñ:¸5ÐBUÐW\Ð^bÐdlÓm€MØ× Ñ  Ð(;¸eÑ(CÀTÈ8ÓTÐTr,   ÚmoduleÚqueryÚkeyÚvalueÚattention_maskÚscalingÚdropoutÚkwargsc                 ó  — t        || j                  «      }t        || j                  «      }	t        j                  ||j	                  dd«      «      |z  }
|�|
|z   }
t
        j                  j                  |
dt        j                  ¬«      j                  |j                  «      }
t
        j                  j                  |
|| j                  ¬«      }
t        j                  |
|	«      }|j	                  dd«      j                  «       }||
fS )Nr   r   r@   )rB   r\   )ÚpÚtrainingr   )ro   Únum_key_value_groupsr&   ÚmatmulÚ	transposer   Ú
functionalÚsoftmaxÚfloat32r_   r\   rv   rz   Ú
contiguous)rp   rq   rr   rs   rt   ru   rv   rw   Ú
key_statesÚvalue_statesÚattn_weightsÚattn_outputs               r-   Úeager_attention_forwardr†   ”   sà   € ô ˜3 × ;Ñ ;Ó<€JÜ˜U F×$?Ñ$?Ó@€Lä—<‘<  z×';Ñ';¸A¸qÓ'AÓBÀWÑL€LØÐ!Ø# nÑ4ˆä—=‘=×(Ñ(¨¸2ÄUÇ]Á]Ð(ÓS×VÑVÐW\×WbÑWbÓc€LÜ—=‘=×(Ñ(¨¸È6Ï?É?Ð(Ó[€LÜ—,‘,˜|¨\Ó:€KØ×'Ñ'¨¨1Ó-×8Ñ8Ó:€Kà˜Ð$Ð$r,   c                   ó2  ‡ — e Zd ZdZdedefˆ fd„Z	 	 	 	 ddej                  de	ej                  ej                  f   dz  dej                  dz  d	ej                  dz  d
ej                  dz  de
e   de	ej                  ej                  dz  f   fd„Zˆ xZS )ÚLightGlueAttentionz=Multi-headed attention from 'Attention Is All You Need' paperr0   Ú	layer_idxc                 ód  •— t         ‰| �  «        || _        || _        t	        |d|j
                  |j                  z  «      | _        |j                  |j                  z  | _	        | j                  dz  | _
        |j                  | _        d| _        t        j                  |j
                  |j                  | j                  z  |j                  ¬«      | _        t        j                  |j
                  |j                  | j                  z  |j                  ¬«      | _        t        j                  |j
                  |j                  | j                  z  |j                  ¬«      | _        t        j                  |j                  | j                  z  |j
                  |j                  ¬«      | _        y )Nrn   g      à¿Tr2   )r4   r5   r0   r‰   ÚgetattrÚhidden_sizer8   rn   rl   r{   ru   Úattention_dropoutÚ	is_causalr   r6   Úattention_biasÚq_projÚk_projÚv_projÚo_proj©r;   r0   r‰   r<   s      €r-   r5   zLightGlueAttention.__init__°   sM  ø€ Ü‰ÑÔØˆŒØ"ˆŒÜ ¨
°F×4FÑ4FÈ&×JdÑJdÑ4dÓeˆŒØ$*×$>Ñ$>À&×B\ÑB\Ñ$\ˆÔ!Ø—}‘} dÑ*ˆŒØ!'×!9Ñ!9ˆÔØˆŒä—i‘iØ×Ñ × :Ñ :¸T¿]¹]Ñ JÐQW×QfÑQfô
ˆŒô —i‘iØ×Ñ × :Ñ :¸T¿]¹]Ñ JÐQW×QfÑQfô
ˆŒô —i‘iØ×Ñ × :Ñ :¸T¿]¹]Ñ JÐQW×QfÑQfô
ˆŒô —i‘iØ×&Ñ&¨¯©Ñ6¸×8JÑ8JÐQW×QfÑQfô
ˆ�r,   Nr    Úposition_embeddingsrt   Úencoder_hidden_statesÚencoder_attention_maskrw   r>   c                 óê  — |j                   d d }g |¢d‘| j                  ‘­}| j                  |«      j                  |«      j	                  dd«      }	|d u}
|
r|n|}|
r|n|}| j                  |«      j                  |«      j	                  dd«      }| j                  |«      j                  |«      j	                  dd«      }|�|\  }}t        |	|||«      \  }	}t        j                  | j                  j                  t        «      } || |	|||f| j                  sdn| j                  | j                  dœ|¤Ž\  }} |j                   g |¢d‘­Ž j#                  «       }| j%                  |«      }||fS )Nr@   r   r   ç        )rv   ru   )rh   rn   r�   Úviewr}   r‘   r’   re   r   Úget_interfacer0   Ú_attn_implementationr†   rz   r�   ru   rj   r�   r“   )r;   r    r•   rt   r–   r—   rw   Úinput_shapeÚhidden_shapeÚquery_statesÚis_cross_attentionÚcurrent_statesÚcurrent_attention_maskr‚   rƒ   rD   rE   Úattention_interfacer…   r„   s                       r-   rK   zLightGlueAttention.forwardÇ   s“  € ð $×)Ñ)¨#¨2Ð.ˆØ8˜Ð8 bÐ8¨$¯-©-Ñ8ˆà—{‘{ =Ó1×6Ñ6°|ÓD×NÑNÈqÐRSÓTˆà2¸$Ð>ÐÙ2DÑ.È-ˆÙ;MÑ!7ÐSaÐà—[‘[ Ó0×5Ñ5°lÓC×MÑMÈaÐQRÓSˆ
Ø—{‘{ >Ó2×7Ñ7¸ÓE×OÑOÐPQÐSTÓUˆàÐ*Ø*‰HˆC�Ü';¸LÈ*ÐVYÐ[^Ó'_Ñ$ˆL˜*ä(?×(MÑ(MØ�K‰K×,Ñ,Ô.Eó)
Ðñ %8ØØØØØ"ð	%
ð  $Ÿ}š}‘C°$×2HÑ2HØ—L‘Lñ	%
ð ñ	%
Ñ!ˆ�\ð *�k×)Ñ)Ð;¨;Ð;¸Ò;×FÑFÓHˆØ—k‘k +Ó.ˆØ˜LÐ(Ð(r,   )NNNN)r"   r#   r$   r%   r   Úintr5   r&   rM   r*   r   r   rK   rO   rP   s   @r-   rˆ   rˆ   ­   sÅ   ø„ ÙGð
˜ð 
¸3õ 
ð4 IMØ.2Ø59Ø6:ñ*)à—|‘|ð*)ð # 5§<¡<°·±Ð#=Ñ>ÀÑEð*)ð Ÿ™ tÑ+ð	*)ð
  %Ÿ|™|¨dÑ2ð*)ð !&§¡¨tÑ 3ð*)ð Ð-Ñ.ð*)ð 
ˆu�|‰|˜UŸ\™\¨DÑ0Ð0Ñ	1÷*)r,   rˆ   c                   ó\   ‡ — e Zd Zdefˆ fd„Zdej                  dej                  fd„Zˆ xZS )ÚLightGlueMLPr0   c                 óh  •— t         ‰| �  «        || _        t        |j                     | _        t        j                  |j                  |j                  «      | _	        t        j                  |j                  |j                  «      | _        t        j                  |j                  d¬«      | _        y )NT)Úelementwise_affine)r4   r5   r0   r	   Ú
hidden_actÚactivation_fnr   r6   Úintermediate_sizeÚfc1rŒ   Úfc2Ú	LayerNormÚ
layer_normr:   s     €r-   r5   zLightGlueMLP.__init__õ   s}   ø€ Ü‰ÑÔØˆŒÜ# F×$5Ñ$5Ñ6ˆÔÜ—9‘9˜V×5Ñ5°v×7OÑ7OÓPˆŒÜ—9‘9˜V×5Ñ5°v×7IÑ7IÓJˆŒÜŸ,™, v×'?Ñ'?ÐTXÔYˆ�r,   r    r>   c                 óŽ   — | j                  |«      }| j                  |«      }| j                  |«      }| j                  |«      }|S ©N)r¬   r¯   rª   r­   )r;   r    s     r-   rK   zLightGlueMLP.forwardý   sB   € ØŸ™ Ó/ˆØŸ™¨Ó6ˆØ×*Ñ*¨=Ó9ˆØŸ™ Ó/ˆØÐr,   ©	r"   r#   r$   r   r5   r&   rM   rK   rO   rP   s   @r-   r¦   r¦   ô   s,   ø„ ðZ˜õ Zð U§\¡\ð °e·l±l÷ r,   r¦   c                   óö   ‡ — e Zd Zdedefˆ fd„Z	 	 ddej                  dej                  dej                  dedz  d	edz  d
e	ej                  e	ej                     dz  e	ej                     dz  f   fd„Z
ˆ xZS )ÚLightGlueTransformerLayerr0   r‰   c                 ó¦   •— t         ‰| �  «        t        ||«      | _        t	        |«      | _        t        ||«      | _        t	        |«      | _        y r±   )r4   r5   rˆ   Úself_attentionr¦   Úself_mlpÚcross_attentionÚ	cross_mlpr”   s      €r-   r5   z"LightGlueTransformerLayer.__init__  sD   ø€ Ü‰ÑÔÜ0°¸ÓCˆÔÜ$ VÓ,ˆŒÜ1°&¸)ÓDˆÔÜ% fÓ-ˆ�r,   Údescriptorsr   rt   r=   NÚoutput_attentionsr>   c                 óà  — |rdnd }|rdnd }|r||fz   }|j                   \  }}	}
| j                  ||||¬«      \  }}t        j                  ||gd¬«      }| j	                  |«      }||z   }|r||f}|j                  dd|	|
«      j                  d«      j                  ||	|
«      }|�6|j                  dddd|	«      j                  d«      j                  |dd|	«      nd }| j                  ||||¬«      \  }}t        j                  ||gd¬«      }| j                  |«      }||z   }|r6||f}||j                  ||	|
«      fz   z   |j                  ||	|
«      fz   |z   }|r
||fz   |fz   }|||fS )Nr+   )r•   rt   r»   r@   rA   r   r   )r–   r—   r»   )	rh   r¶   r&   Úcatr·   rj   Úflipr¸   r¹   )r;   rº   r   rt   r=   r»   Úall_hidden_statesÚall_attentionsÚ
batch_sizeÚnum_keypointsr7   Úattention_outputÚself_attentionsÚintermediate_statesÚoutput_statesÚself_attention_descriptorsÚself_attention_hidden_statesr–   r—   Úcross_attention_outputÚcross_attentionsÚcross_intermediate_statesÚcross_output_statesÚcross_attention_hidden_statess                           r-   rK   z!LightGlueTransformerLayer.forward  s	  € ñ #7™B¸DÐÙ0™°dˆáØ 1°[°NÑ BÐà4?×4EÑ4EÑ1ˆ
�M >ð -1×,?Ñ,?ØØ )Ø)Ø/ð	 -@ó -
Ñ)Ð˜/ô $Ÿi™i¨Ð6FÐ(GÈRÔPÐØŸ™Ð&9Ó:ˆØ%0°=Ñ%@Ð"áØ,?ÀÐ+OÐ(ð '×.Ñ.¨r°1°mÀ^ÓTß‰T�!‹Wß‰W�Z °Ó?ð 	ð Ð)ð ×"Ñ" 2 q¨!¨Q°Ó>×CÑCÀAÓF×NÑNÈzÐ[\Ð^_ÐanÔoàð 	ð 48×3GÑ3GØ&Ø"7Ø#9Ø/ð	 4Hó 4
Ñ0ÐÐ 0ô %*§I¡IÐ/IÐKaÐ.bÐhjÔ$kÐ!Ø"Ÿn™nÐ-FÓGÐØ0Ð3FÑFˆáØ-FÐH[Ð,\Ð)à!Ø-×5Ñ5°jÀ-ÐQ_Ó`Ðbñcà.ñ/ð ×&Ñ& z°=À.ÓQÐSñTð 0ñ	0ð ñ Ø+¨Ð.@Ñ@ÐDTÐCVÑVˆNàÐ-¨~Ð=Ð=r,   )FF)r"   r#   r$   r   r¤   r5   r&   rM   rN   r*   rK   rO   rP   s   @r-   r´   r´     s¤   ø„ ð.˜ð .¸3õ .ð -2Ø).ñH>à—\‘\ðH>ð —<‘<ðH>ð Ÿ™ð	H>ð
 # T™kðH>ð   $™;ðH>ð 
ˆu�|‰|˜U 5§<¡<Ñ0°4Ñ7¸¸u¿|¹|Ñ9LÈtÑ9SÐSÑ	T÷H>r,   r´   Ú
similarityÚmatchability0Úmatchability1c                 óâ  — | j                   \  }}}t        j                  j                  |«      t        j                  j                  |«      j	                  dd«      z   }t        j                  j                  | d«      }t        j                  j                  | j	                  dd«      j                  «       d«      j	                  dd«      }| j                  ||dz   |dz   fd«      }	||z   |z   |	dd…d|…d|…f<   t        j                  j                  |j                  d«       «      |	dd…dd…df<   t        j                  j                  |j                  d«       «      |	dd…ddd…f<   |	S )z;create the log assignment matrix from logits and similarityr   r   r@   rR   r   N)	rh   r   r~   Ú
logsigmoidr}   Úlog_softmaxr�   Únew_fullÚsqueeze)
rÎ   rÏ   rÐ   rÁ   Únum_keypoints_0Únum_keypoints_1ÚcertaintiesÚscores0Úscores1Úscoress
             r-   Úsigmoid_log_double_softmaxrÜ   X  sS  € ð 4>×3CÑ3CÑ0€J� Ü—-‘-×*Ñ*¨=Ó9¼B¿M¹M×<TÑ<TÐUbÓ<c×<mÑ<mÐnoÐqrÓ<sÑs€KÜ�m‰m×'Ñ'¨
°AÓ6€GÜ�m‰m×'Ñ'¨
×(<Ñ(<¸RÀÓ(D×(OÑ(OÓ(QÐSTÓU×_Ñ_Ð`bÐdfÓg€GØ× Ñ  *¨oÀÑ.AÀ?ÐUVÑCVÐ!WÐYZÓ[€FØ4;¸gÑ4EÈÑ4S€FŠ1ÐˆÐÐ 0 Ð 0Ð0Ñ1ÜŸ™×1Ñ1°=×3HÑ3HÈÓ3LÐ2LÓM€FŠ1ˆcˆrˆc�2ˆ:ÑÜŸ™×1Ñ1°=×3HÑ3HÈÓ3LÐ2LÓM€FŠ1ˆb�#�2�#ˆ:ÑØ€Mr,   c                   ó¬   ‡ — e Zd Zdefˆ fd„Zdej                  dej                  dej                  fd„Zdej                  dej                  fd„Zˆ xZ	S )ÚLightGlueMatchAssignmentLayerr0   c                 óô   •— t         ‰| �  «        |j                  | _        t        j                  | j                  | j                  d¬«      | _        t        j                  | j                  dd¬«      | _        y )NTr2   r   )r4   r5   r7   r   r6   Úfinal_projectionÚmatchabilityr:   s     €r-   r5   z&LightGlueMatchAssignmentLayer.__init__h  sY   ø€ Ü‰ÑÔà$×3Ñ3ˆÔÜ "§	¡	¨$×*=Ñ*=¸t×?RÑ?RÐY]Ô ^ˆÔÜŸI™I d×&9Ñ&9¸1À4ÔHˆÕr,   rº   r   r>   c                 óæ  — |j                   \  }}}| j                  |«      }|t        j                  | j                  |j
                  ¬«      dz  z  }|j                  |dz  d||«      }|d d …df   }|d d …df   }||j                  dd«      z  }	|�—|j                  |dz  d|«      }|d d …df   j                  d«      }
|d d …df   j                  d«      j                  dd«      }|
|z  }|	j                  |dk(  t        j                  |	j                  «      j                  «      }	| j                  |«      }|j                  |dz  d|d«      }|d d …df   }|d d …df   }t        |	||«      }|S )N©Údeviceg      Ð?r   r   r   r@   rR   )rh   rà   r&   Útensorr7   rä   rj   r}   r^   Úmasked_fillÚfinfor\   Úminrá   rÜ   )r;   rº   r   rÁ   rÂ   r7   Úm_descriptorsÚm_descriptors0Úm_descriptors1rÎ   Úmask0Úmask1rá   Úmatchability_0Úmatchability_1rÛ   s                   r-   rK   z%LightGlueMatchAssignmentLayer.forwardo  s„  € Ø4?×4EÑ4EÑ1ˆ
�M >à×-Ñ-¨kÓ:ˆØ%¬¯©°T×5HÑ5HÐQ^×QeÑQeÔ(fÐjnÑ(nÑnˆØ%×-Ñ-¨j¸A©o¸qÀ-ÐQ_Ó`ˆØ&¢q¨! tÑ,ˆØ&¢q¨! tÑ,ˆØ# n×&>Ñ&>¸rÀ2Ó&FÑFˆ
ØÐØ—<‘< 
¨a¡°°MÓBˆDØš˜A˜‘J×(Ñ(¨Ó,ˆEØš˜A˜‘J×(Ñ(¨Ó,×6Ñ6°r¸2Ó>ˆEØ˜5‘=ˆDØ#×/Ñ/°¸±	¼5¿;¹;Àz×GWÑGWÓ;X×;\Ñ;\Ó]ˆJð ×(Ñ(¨Ó5ˆØ#×+Ñ+¨J¸!©O¸QÀÈqÓQˆØ%¢a¨ dÑ+ˆØ%¢a¨ dÑ+ˆô ,¨J¸ÈÓWˆØˆr,   c                 ó„   — | j                  |«      }t        j                  j                  |«      j	                  d«      }|S )z0Get matchability of descriptors as a probabilityr@   )rá   r   r~   ÚsigmoidrÕ   )r;   rº   rá   s      r-   Úget_matchabilityz.LightGlueMatchAssignmentLayer.get_matchability‰  s7   € à×(Ñ(¨Ó5ˆÜ—}‘}×,Ñ,¨\Ó:×BÑBÀ2ÓFˆØÐr,   )
r"   r#   r$   r   r5   r&   rM   rK   rò   rO   rP   s   @r-   rÞ   rÞ   g  sR   ø„ ðI˜õ Ið 5§<¡<ð °u·|±|ð ÈÏÉó ð4¨E¯L©Lð ¸U¿\¹\÷ r,   rÞ   c                   ó\   ‡ — e Zd Zdefˆ fd„Zdej                  dej                  fd„Zˆ xZS )ÚLightGlueTokenConfidenceLayerr0   c                 ól   •— t         ‰| �  «        t        j                  |j                  d«      | _        y )Nr   )r4   r5   r   r6   r7   Útokenr:   s     €r-   r5   z&LightGlueTokenConfidenceLayer.__init__‘  s&   ø€ Ü‰ÑÔä—Y‘Y˜v×4Ñ4°aÓ8ˆ�
r,   rº   r>   c                 ó    — | j                  |j                  «       «      }t        j                  j	                  |«      j                  d«      }|S )Nr@   )rö   Údetachr   r~   rñ   rÕ   )r;   rº   rö   s      r-   rK   z%LightGlueTokenConfidenceLayer.forward–  s=   € Ø—
‘
˜;×-Ñ-Ó/Ó0ˆÜ—‘×%Ñ% eÓ,×4Ñ4°RÓ8ˆØˆr,   r²   rP   s   @r-   rô   rô   �  s*   ø„ ð9˜õ 9ð
 5§<¡<ð °E·L±L÷ r,   rô   c                   ó4   — e Zd ZU dZeed<   dZdZdZdZ	dZ
dZy)	ÚLightGluePreTrainedModelz†
    An abstract class to handle weights initialization and a simple interface for downloading and loading pretrained
    models.
    r0   Ú	lightglueÚpixel_values)ÚimageFTN)r"   r#   r$   r%   r   r(   Úbase_model_prefixÚmain_input_nameÚinput_modalitiesÚsupports_gradient_checkpointingÚ_supports_flash_attnÚ_supports_sdpar+   r,   r-   rú   rú   œ  s1   … ñð
 ÓØ#ÐØ$€OØ!ÐØ&+Ð#ØÐØ�Nr,   rú   rÛ   Ú	thresholdc                 ó6  — | j                   \  }}}| dd…dd…dd…f   j                  d«      }| dd…dd…dd…f   j                  d«      }|j                  }|j                  }t        j                  |j                   d   |j
                  ¬«      d   }t        j                  |j                   d   |j
                  ¬«      d   }	||j                  d|«      k(  }
|	|j                  d|«      k(  }|j                  j                  «       }|j                  d«      }t        j                  |
||«      }t        j                  ||j                  d|«      |«      }|
||kD  z  }||j                  d|«      z  }t        j                  ||d«      }t        j                  ||d«      }t        j                  ||g«      j                  dd«      j                  |dz  d«      }t        j                  ||g«      j                  dd«      j                  |dz  d«      }||fS )z1obtain matches from a score matrix [Bx M+1 x N+1]Nr@   r   r   rã   r   )rh   ÚmaxÚindicesr&   Úarangerä   ÚgatherÚvaluesÚexpÚ
new_tensorÚwhererS   r}   rj   )rÛ   r  rÁ   Ú_Úmax0Úmax1Úmatches0Úmatches1Úindices0Úindices1Úmutual0Úmutual1ÚzeroÚmatching_scores0Úmatching_scores1Úvalid0Úvalid1r   r   s                      r-   Úget_matches_from_scoresr  ¬  sñ  € à—|‘|Ñ€J��1à’!�S�b�S˜#˜2˜#�+Ñ×"Ñ" 1Ó%€DØ’!�S�b�S˜#˜2˜#�+Ñ×"Ñ" 1Ó%€DØ�|‰|€HØ�|‰|€Hô �|‰|˜HŸN™N¨1Ñ-°h·o±oÔFÀtÑL€HÜ�|‰|˜HŸN™N¨1Ñ-°h·o±oÔFÀtÑL€HØ˜(Ÿ/™/¨!¨XÓ6Ñ6€GØ˜(Ÿ/™/¨!¨XÓ6Ñ6€Gð �;‰;�?‰?Ó€DØ�?‰?˜1Ó€DÜ—{‘{ 7¨D°$Ó7ÐÜ—{‘{ 7Ð,<×,CÑ,CÀAÀxÓ,PÐRVÓWÐØÐ(¨9Ñ4Ñ5€FØ�v—}‘} Q¨Ó1Ñ1€Fô �{‰{˜6 8¨RÓ0€HÜ�{‰{˜6 8¨RÓ0€HÜ�k‰k˜8 XÐ.Ó/×9Ñ9¸!¸QÓ?×GÑGÈ
ÐUVÉÐXZÓ[€GÜ—k‘kÐ#3Ð5EÐ"FÓG×QÑQÐRSÐUVÓW×_Ñ_Ð`jÐmnÑ`nÐprÓs€Oà�OÐ#Ð#r,   r   ÚheightÚwidthc                 óÔ   — t        j                  ||g| j                  | j                  ¬«      d   }|dz  }|j	                  d«      j
                  dz  }| |dddd…f   z
  |d   z  } | S )a©  
    Normalize keypoints locations based on image image_shape

    Args:
        keypoints (`torch.Tensor` of shape `(batch_size, num_keypoints, 2)`):
            Keypoints locations in (x, y) format.
        height (`int`):
            Image height.
        width (`int`):
            Image width.

    Returns:
        Normalized keypoints locations of shape (`torch.Tensor` of shape `(batch_size, num_keypoints, 2)`).
    ©rä   r\   Nr   r@   .).NN)r&   rå   rä   r\   r  r
  )r   r  r  ÚsizeÚshiftÚscales         r-   Únormalize_keypointsr$  Ì  sp   € ô �<‰<˜ ˜°	×0@Ñ0@È	ÏÉÔXÐY]Ñ^€DØ�1‰H€EØ�H‰H�R‹L×Ñ !Ñ#€EØ˜U 3¨ªa <Ñ0Ñ0°E¸/Ñ4JÑJ€IØÐr,   zV
    LightGlue model taking images as inputs and outputting the matching of them.
    c                   ó  ‡ — e Zd ZdZdefˆ fd„Zdedefd„Z	 d#de	j                  de	j                  d	ed
z  dee	j                  ee	j                  e	j                  f   f   fd„Zde	j                  dede	j                  de	j                  de	j                  f
d„Zd$d„Zde	j                  de	j                  dede	j                  fd„Zde	j                  de	j                  de	j                  de	j                  de	j                  de	j                  defd„Zd„ Zde	j                  de	j                  de	j                  de	j                  dee	j                  e	j                  f   f
d„Z	 	 	 d%de	j                  de	j                  dedede	j                  d
z  ded
z  d	ed
z  dee	j                  e	j                  e	j                  eef   fd„Zee	 	 	 d%d e	j.                  d!e	j0                  d
z  ded
z  d	ed
z  deez  f
d"„«       «       Zˆ xZS )&ÚLightGlueForKeypointMatchingar  
    LightGlue is a model matching keypoints in images by leveraging detections from a keypoint detector such as
    SuperPoint. It is based on the SuperGlue architecture and is designed to be lightweight and efficient.
    It consists of :
        1. Keypoint Encoder
        2. A Graph Neural Network with self and cross attention layers
        3. Matching Assignment layers

    The correspondence ids use -1 to indicate non-matching points.

    Philipp Lindenberger, Paul-Edouard Sarlin and Marc Pollefeys. LightGlue: Local Feature Matching at Light Speed.
    In ICCV 2023. https://huggingface.co/papers/2306.13643
    r0   c           	      ó  •— t         ‰| �  |«       t        j                  |j                  «      | _        |j                  j                  | _        |j                  | _        |j                  | _
        |j                  | _        |j                  | _        |j                  | _        | j                  | j                  k7  r2t        j                  | j                  | j                  d¬«      | _        nt        j"                  «       | _        t%        |«      | _        t        j(                  t+        |j                  «      D �cg c]  }t-        ||¬«      ‘Œ c}«      | _        t        j(                  t+        |j                  «      D �cg c]  }t1        |«      ‘Œ c}«      | _        t        j(                  t+        |j                  dz
  «      D �cg c]  }t5        |«      ‘Œ c}«      | _        | j9                  «        y c c}w c c}w c c}w )NTr2   )r‰   r   )r4   r5   r   Úfrom_configÚkeypoint_detector_configÚkeypoint_detectorÚdescriptor_decoder_dimÚ keypoint_detector_descriptor_dimr7   Únum_hidden_layersÚ
num_layersÚfilter_thresholdÚdepth_confidenceÚwidth_confidencer   r6   Úinput_projectionÚIdentityr/   Úpositional_encoderÚ
ModuleListÚranger´   Útransformer_layersrÞ   Úmatch_assignment_layersrô   Útoken_confidenceÚ	post_init)r;   r0   Úir  r<   s       €r-   r5   z%LightGlueForKeypointMatching.__init__ö  sŽ  ø€ Ü‰Ñ˜Ô Ü!>×!JÑ!JÈ6×KjÑKjÓ!kˆÔà06×0OÑ0O×0fÑ0fˆÔ-Ø$×3Ñ3ˆÔØ ×2Ñ2ˆŒØ &× 7Ñ 7ˆÔØ &× 7Ñ 7ˆÔØ &× 7Ñ 7ˆÔà×Ñ $×"GÑ"GÒGÜ$&§I¡I¨d×.SÑ.SÐUY×UhÑUhÐosÔ$tˆDÕ!ä$&§K¡K£MˆDÔ!ä"<¸VÓ"DˆÔä"$§-¡-ÜEJÈ6×KcÑKcÓEdÖeÀÔ& v¸Ö;Òeó#
ˆÔô (*§}¡}Ü<AÀ&×BZÑBZÓ<[Ö\°qÔ*¨6Õ2Ò\ó(
ˆÔ$ô !#§¡Ü<AÀ&×BZÑBZÐ]^ÑB^Ó<_Ö`°qÔ*¨6Õ2Ò`ó!
ˆÔð 	�‰Õùò fùò ]ùò as   Ä?G;ÆH ÇHÚlayer_indexr>   c                 ó†   — ddt        j                  d|z  | j                  z  «      z  z   }t        j                  |dd«      S )z-scaled confidence threshold for a given layergš™™™™™é?gš™™™™™¹?g      Àr   r   )Únpr  r.  Úclip)r;   r<  r  s      r-   Ú_get_confidence_thresholdz6LightGlueForKeypointMatching._get_confidence_threshold  s;   € à˜#¤§¡ t¨kÑ'9¸D¿O¹OÑ'KÓ LÑLÑLˆ	Ü�w‰w�y ! QÓ'Ð'r,   rº   r   r=   Nc                 óŽ   — |j                  «       j                  «       }| j                  |«      }| j                  ||¬«      }||fS )N©r=   )rø   r�   r2  r4  )r;   rº   r   r=   Úprojected_descriptorsÚkeypoint_encoding_outputs         r-   Ú_keypoint_processingz1LightGlueForKeypointMatching._keypoint_processing  sO   € ð "×(Ñ(Ó*×5Ñ5Ó7ˆØ $× 5Ñ 5°kÓ BÐØ#'×#:Ñ#:¸9Ð[oÐ#:Ó#pÐ Ø$Ð&>Ð>Ð>r,   Úkeypoint_confidencesr   Ú
num_pointsc                 ó|  — |j                   \  }}|| j                  dz
  k  ru|j                  |dk(  d«      }|j                  |dz  d«      }| j	                  |«      }d||k  j                  «       j                  d¬«      |z  z
  }|| j                  kD  }	|	S t        j                  |t        j                  ¬«      }	|	S )zRevaluate whether we should stop inference based on the confidence of the keypointsr   r   r   r@   g      ð?rA   r[   )rh   r.  ræ   rj   r@  r]   Úsumr0  r&   ÚonesrN   )
r;   rF  r<  r   rG  rÁ   r  r  Úratio_confidentÚearly_stopped_pairss
             r-   Ú_get_early_stopped_image_pairsz;LightGlueForKeypointMatching._get_early_stopped_image_pairs!  sÇ   € ð Ÿ
™
‰ˆ
�AØ˜Ÿ™¨1Ñ,Ò,ð $8×#CÑ#CÀDÈAÁIÈqÓ#QÐ Ø#7×#?Ñ#?À
ÈaÁÐQSÓ#TÐ Ø×6Ñ6°{ÓCˆIØ!Ð%9¸IÑ%E×$LÑ$LÓ$N×$RÑ$RÐWXÐ$RÓ$YÐ\fÑ$fÑfˆOØ"1°D×4IÑ4IÑ"IÐð
 #Ð"ô #(§*¡*¨Z¼u¿z¹zÔ"JÐØ"Ð"r,   c                 ó€   — |�
||   }||   } | j                   |   ||«      }t        || j                  «      \  }}||fS r±   )r8  r  r/  )r;   rº   r   r<  Úearly_stopsrÛ   r   r   s           r-   Ú_get_keypoint_matchingz3LightGlueForKeypointMatching._get_keypoint_matching4  sW   € ØÐ"Ø% kÑ2ˆKØ˜Ñ$ˆDØ:�×-Ñ-¨kÑ:¸;ÈÓMˆÜ#:¸6À4×CXÑCXÓ#YÑ ˆ�Ø˜Ð'Ð'r,   ÚconfidencesrÛ   c                 ó\   — |d| j                   z
  kD  }|�||| j                  |«      k  z  }|S )z#mask points which should be removedr   )r1  r@  )r;   rQ  rÛ   r<  Úkeeps        r-   Ú_get_pruning_maskz.LightGlueForKeypointMatching._get_pruning_mask<  s<   € à˜˜T×2Ñ2Ñ2Ñ3ˆØÐ"Ø�K 4×#AÑ#AÀ+Ó#NÑNÑNˆDØˆr,   r  Úprune_outputc                 ó¨  ‡— |j                   \  }}	}	| j                  |   j                  |«      }
| j                  ||
|«      Š‰j	                  |dk(  t        j                  d«      «      Šˆfd„||d   |d   ‰|fD «       \  }}}}}t        |«      D ]  }||||   fxx   dz  cc<   Œ d„ ||||fD «       \  }}}}||f}t        |dd¬«      }|||||fS )	zŽ
        For a given layer, prune keypoints based on the confidence of the keypoints and the matchability of the
        descriptors.
        r   Fc              3   ón   •K  — | ]&  }t        |‰«      D ��cg c]
  \  }}||   ‘Œ c}}–— Œ( y c c}}w ­wr±   )Úzip)Ú.0rå   Útr   Úpruned_keypoints_masks       €r-   ú	<genexpr>zJLightGlueForKeypointMatching._do_layer_keypoint_pruning.<locals>.<genexpr>W  s9   øè ø€ ò c
àô %(¨Ð0EÓ$F×G™˜˜DˆQˆt‹W×Gñc
ùÛGùs   ƒ5—/¦5r   c              3   ó6   K  — | ]  }t        |d ¬«      –— Œ y­w)T)Úbatch_firstNr   )rY  Úpruned_tensors     r-   r\  zJLightGlueForKeypointMatching._do_layer_keypoint_pruning.<locals>.<genexpr>_  s$   è ø€ ò S
àô ˜°D×9Ð9ñS
ùs   ‚Tr@   ©r^  Úpadding_value)	rh   r8  rò   rT  ræ   r&   rå   r6  r   )r;   rº   r   r   r  rU  rF  r<  rÁ   r  Údescriptors_matchabilityÚpruned_descriptorsÚpruned_keypoints_0Úpruned_keypoints_1Úpruned_maskÚpruned_indicesr;  Úpruned_keypointsr[  s                     @r-   Ú_do_layer_keypoint_pruningz7LightGlueForKeypointMatching._do_layer_keypoint_pruningC  s+  ø€ ð '×,Ñ,Ñˆ
�A�qØ#'×#?Ñ#?ÀÑ#L×#]Ñ#]Ð^iÓ#jÐ Ø $× 6Ñ 6Ð7KÐMeÐgrÓ sÐØ 5× AÑ AÀ$È!Á)ÌUÏ\É\ÐZ_ÓM`Ó aÐóc
à&¨	°!©°iÀ±lÐDYÐ[bÐcôc
Ñ_ÐÐ.Ð0BÀKÐQ_ô �zÓ"ò 	4ˆAØ˜˜N¨1Ñ-Ð-Ó.°!Ñ3Ô.ð	4ñS
à"4Ð6HÐJ\Ð^iÐ!jôS
ÑOÐÐ.Ð0BÀKð /Ð0BÐCÐÜ% nÀ$ÐVXÔYˆà!Ð#3°^À[ÐR^Ð^Ð^r,   c                 óò   ‡— t        j                  ‰«      Št        j                  ‰j                  d   «      }‰|   }‰|   Šd„ ||fD «       \  }}d„ ||fD «       \  }}ˆfd„||||fD «       \  }}}}||||fS )Nr   c              3   ó8   K  — | ]  }t        |d d¬«      –— Œ y­w)Tr@   r`  Nr   ©rY  rå   s     r-   r\  zMLightGlueForKeypointMatching._concat_early_stopped_outputs.<locals>.<genexpr>u  s$   è ø€ ò 3
àô ˜¨TÀ×DÐDñ3
ùó   ‚c              3   ó8   K  — | ]  }t        |d d¬«      –— Œ y­w)Tr   r`  Nr   rl  s     r-   r\  zMLightGlueForKeypointMatching._concat_early_stopped_outputs.<locals>.<genexpr>y  s$   è ø€ ò >
àô ˜¨TÀ×CÐCñ>
ùrm  c              3   ó(   •K  — | ]	  }|‰   –— Œ y ­wr±   r+   )rY  rå   Úearly_stops_indicess     €r-   r\  zMLightGlueForKeypointMatching._concat_early_stopped_outputs.<locals>.<genexpr>}  s!   øè ø€ ò g
àð Ð&Õ'ñg
ùs   ƒ)r&   rS   r  rh   )r;   rp  Úfinal_pruned_keypoints_indicesÚ!final_pruned_keypoints_iterationsr   r   ÚidsÚorder_indicess    `      r-   Ú_concat_early_stopped_outputsz:LightGlueForKeypointMatching._concat_early_stopped_outputsh  sº   ø€ ô $Ÿk™kÐ*=Ó>Ðä�l‰lÐ.×4Ñ4°QÑ7Ó8ˆØ+¨CÑ0ˆØ1°-Ñ@Ðñ3
à"Ð$BÐCô3
Ñ/ˆÐ/ñ>
à*Ð,MÐNô>
Ñ:ˆÐ:óg
ð ØØ.Ø1ð	ôg
Ñcˆ�Ð"@ÐBcð .Ð/PÐRYÐ[jÐjÐjr,   r   r   rÂ   c                 ó  ‡— |j                   \  Š}ˆfd„|||fD «       \  }}}|d d …df   }|d d …df   }|d d …df   }|d d …df   }	|d d …df   }
|d d …df   }t        j                  ‰dz  d|fd|j                  |j                  ¬«      }t        j
                  ‰dz  d|f|j                  |j                  ¬«      }t        ‰dz  «      D ]¶  }t        j                  ||   dk(  d||   j                  d||   j                  d¬«      «      «      ||d||   f<   t        j                  |	|   dk(  d||   j                  d|	|   j                  d¬«      «      «      ||d||   f<   |
|   ||d||   f<   ||   ||d||   f<   Œ¸ ||fS )Nc              3   óJ   •K  — | ]  }|j                  ‰d z  d d«      –— Œ y­w)r   r@   N)rj   )rY  rå   rÁ   s     €r-   r\  zJLightGlueForKeypointMatching._do_final_keypoint_pruning.<locals>.<genexpr>’  s'   øè ø€ ò -
Ø7=ˆF�N‰N˜:¨™?¨A¨r×2ñ-
ùs   ƒ #r   r   r   r@   r   )rè   )
rh   r&   Úfullrä   r\   Úzerosr6  r  r	  Úclamp)r;   r  r   r   rÂ   r  r  r  r  r  r  r  Ú_matchesÚ_matching_scoresr;  rÁ   s                  @r-   Ú_do_final_keypoint_pruningz7LightGlueForKeypointMatching._do_final_keypoint_pruningˆ  sä  ø€ ð  Ÿ™‰ˆ
�Aó-
ØBIÈ7ÐTcÐAdô-
Ñ)ˆ�˜/ð š1˜a˜4‘=ˆØš1˜a˜4‘=ˆØš1˜a˜4‘=ˆØš1˜a˜4‘=ˆØ*ª1¨a¨4Ñ0ÐØ*ª1¨a¨4Ñ0Ðô —:‘:˜z¨Q™°°=ÐAÀ2ÈgÏnÉnÐdk×dqÑdqÔrˆÜ Ÿ;™;Ø˜1‰_˜a Ð/¸¿¹Èo×NcÑNcô
Ðô �z Q‘Ó'ò 	FˆAÜ*/¯+©+Ø˜‘˜rÑ! 2 x°¡{×'9Ñ'9¸!¸XÀa¹[×=NÑ=NÐSTÐ=NÓ=UÓ'Vó+ˆH�Q˜˜8 A™;Ð&Ñ'ô +0¯+©+Ø˜‘˜rÑ! 2 x°¡{×'9Ñ'9¸!¸XÀa¹[×=NÑ=NÐSTÐ=NÓ=UÓ'Vó+ˆH�Q˜˜8 A™;Ð&Ñ'ð 3CÀ1Ñ2EÐ˜Q  8¨A¡;Ð.Ñ/Ø2BÀ1Ñ2EÐ˜Q  8¨A¡;Ð.Ò/ð	Fð Ð)Ð)Ð)r,   r  r  r»   c           
      óJ	  ‡'— |rdnd }|rdnd }	|j                   d   dk(  rT|j                   d d }
|j                  |
dt        j                  ¬«      |j	                  |
«      |j	                  |
«      ||	fS |j
                  }|j                   \  }}}}t        j                  |j                  |d«      d¬«      }|j                  |dz  |d«      }|�|j                  |dz  |«      nd }|j                  |dz  || j                  «      }t        j                  |dz  |¬«      }t        |||«      }| j                  |||¬	«      \  }}|d   }| j                  dkD  }| j                  dkD  }g }g }g }g }g }t        j                  d||¬«      j                  |dz  d«      }t        j                  |«      }t!        | j"                  «      D �]E  }|�'t%        | j&                  |d d …dd…d d …f   |d
„ ¬«      }n4t        j(                  ||j+                  «       d   f|j
                  ¬«      } | j,                  |   |||||¬«      }|\  }}}|r||z   }|r|	|z   }	|�r“|| j"                  dz
  k  r+ | j.                  |   |«      } | j1                  | |||¬«      }!n%t        j(                  |t        j2                  ¬«      }!t        j4                  |!«      �r|!j7                  d«      Š'|‰'   }"| j9                  |||‰'¬«      \  }#}$|j;                  t=        |"«      «       |j;                  t=        |#«      «       |j;                  t=        |$«      «       |r:|j;                  t=        |‰'   «      «       |j;                  t=        |‰'   «      «       ||!    }t?        ˆ'fd„||d   |d   ||fD «       «      \  }}%}&}}|%|&f}|rt?        ˆ'fd„|| fD «       «      \  }}} t        j@                  |!«      r n$|s�Œ)| jC                  ||||| |«      \  }}}}}�ŒH |r4|r2| jE                  |||||«      \  }}}}| jG                  ||||«      \  }}nE| j9                  ||| j"                  dz
  «      \  }}t        j                  |«      | j"                  z  }|j                  |d|«      }|||||	fS )Nr+   r   r   r@   r[   r   rA   rã   rB  c                  óL   — t        j                  dt         j                  ¬«      S )NTr[   )r&   rå   rN   )Úargss    r-   ú<lambda>z@LightGlueForKeypointMatching._match_image_pair.<locals>.<lambda>ì  s   € ´E·L±LÀÌUÏZÉZÔ4X€ r,   )r0   Úinputs_embedsrt   Úand_mask_functionrR   )rt   r=   r»   )rG  )rO  c              3   ó*   •K  — | ]
  }|‰    –— Œ y ­wr±   r+   ©rY  rå   rO  s     €r-   r\  zALightGlueForKeypointMatching._match_image_pair.<locals>.<genexpr>  s"   øè ø€ ò Và"ð  ˜|Õ,ñVùó   ƒc              3   ó*   •K  — | ]
  }|‰    –— Œ y ­wr±   r+   r…  s     €r-   r\  zALightGlueForKeypointMatching._match_image_pair.<locals>.<genexpr>#  s"   øè ø€ ò là &ð # K <Õ0ñlùr†  )$rh   rÔ   r&   r¤   Ú	new_zerosrä   rI  rj   r,  r  r$  rE  r0  r1  ri   Ú	ones_liker6  r.  r
   r0   rJ  r!  r7  r9  rM  rN   ÚanyrC   rP  ÚextendÚlistr*   Úallri  ru  r}  )(r;   r   rº   r  r  r   r»   r=   r¿   rÀ   rh   rä   rÁ   r  Úinitial_num_keypointsÚnum_points_per_pairÚimage_indicesrD  Údo_early_stopÚdo_keypoint_pruningrp  r   r   rq  rr  Úpruned_keypoints_indicesÚpruned_keypoints_iterationsr<  Úextended_attention_maskÚlayer_outputr    Ú	attentionrF  rL  Úearly_stopped_image_indicesÚearly_stopped_matchesÚearly_stopped_matching_scoresÚkeypoints_0Ú
keypoint_1rO  s(                                          @r-   Ú_match_image_pairz.LightGlueForKeypointMatching._match_image_pair­  s|  ø€ ñ #7™B¸DÐÙ0™°dˆà�?‰?˜1Ñ Ò"Ø—O‘O C RÐ(ˆEà×"Ñ" 5¨"´E·I±IÐ"Ó>Ø×#Ñ# EÓ*Ø×#Ñ# EÓ*Ø!Øðð ð ×!Ñ!ˆØ2;·/±/Ñ/ˆ
�AÐ,¨aÜ#Ÿi™i¨¯©°ZÀÓ(DÈ!ÔLÐà×%Ñ% j°1¡nÐ6KÈQÓOˆ	ØFJÐFVˆt�|‰|˜J¨™NÐ,AÔBÐ\`ˆØ!×)Ñ)¨*°q©.Ð:OÐQU×QvÑQvÓwˆÜŸ™ Z°!¡^¸FÔCˆä'¨	°6¸5ÓAˆ	à04×0IÑ0IØ˜Ð9Mð 1Jó 1
Ñ-ˆÐ-ð -¨QÑ/ˆ	ð ×-Ñ-°Ñ1ˆð #×3Ñ3°aÑ7Ðà ÐØˆØˆØ)+Ð&Ø,.Ð)ä#(§<¡<°Ð3HÐQWÔ#X×#_Ñ#_Ð`jÐmnÑ`nÐprÓ#sÐ Ü&+§o¡oÐ6NÓ&OÐ#ä  §¡Ó1ó X	ˆKØÐÜ*CØŸ;™;Ø"-ªa°°1°²a¨iÑ"8Ø#'á&Xô+Ñ'ô +0¯*©*°jÀ+×BRÑBRÓBTÐUWÑBXÐ5YÐbk×brÑbrÔ*sÐ'à?˜4×2Ñ2°;Ñ?ØØØ6Ø%9Ø"3ôˆLð 5AÑ1ˆK˜¨	Ù#Ø$5¸Ñ$EÐ!Ù Ø!/°)Ñ!;�âØ §¡°1Ñ!4Ò4à+M¨4×+@Ñ+@ÀÑ+MÈkÓ+ZÐ(ð +/×*MÑ*MØ,¨k¸4ÐL_ð +Nó +Ñ'ô
 +0¯*©*°ZÄuÇzÁzÔ*RÐ'ä—9‘9Ð0Õ1ð #6×"GÑ"GÈÓ"J�KØ2?ÀÑ2LÐ/ØKO×KfÑKfØ# T¨;ÀKð Lgó LÑHÐ)Ð+Hð (×.Ñ.¬tÐ4OÓ/PÔQØ—N‘N¤4Ð(=Ó#>Ô?Ø#×*Ñ*¬4Ð0MÓ+NÔOÙ*Ø6×=Ñ=¼dÐC[Ð\gÑChÓ>iÔjØ9×@Ñ@ÄÐFaÐbmÑFnÓAoÔpð +>Ð?RÐ>RÑ*SÐ'ÜPUó Và'2°I¸a±LÀ)ÈAÁ,ÐPTÐVcÐ&dôVó QÑM�K ¨j¸$Àð "-¨jÐ 9�IÙ*Üfkó lð !9Ø ;Ø 4ð+ôló gÑcÐ0Ð2MÐOcô —9‘9Ð0Ô1Ùã"ð ×3Ñ3Ø#Ø!ØØ0Ø3Ø,Ø#óñ d�˜YÐ(@À$ÒHcð]X	ñt Ñ0ð ×2Ñ2Ø'Ø2Ø5ØØ#óñ hÐ*Ð,MÈwÐXgð (,×'FÑ'FØ.ØØØ%ó	(Ñ$ˆG‘_ð (,×'BÑ'BÀ;ÐPTÐVZ×VeÑVeÐhiÑViÓ'jÑ$ˆG�_Ü05·±ÀÓ0PÐSW×SbÑSbÑ0bÐ-à,M×,UÑ,UØ˜Ð0ó-
Ð)ð
 ØØ-ØØð
ð 	
r,   rü   Úlabelsc           
      ó0  — d }|�t        d«      ‚|�|n| j                  j                  }|�|n| j                  j                  }|j                  dk7  s|j                  d«      dk7  rt        d«      ‚|j                  \  }}}	}
}|j                  |dz  |	|
|«      }| j                  |«      }|d d \  }}}}|j                  |ddd«      j                  |«      }|j                  |dd| j                  «      j                  |«      }|j                  |dd«      }|j                  «       }|d d …d d …d d …df   |z  |d d …d d …d d …df<   |d d …d d …d d …df   |
z  |d d …d d …d d …df<   | j                  |||
||||¬	«      \  }}}}}t        ||||||||¬
«      S )Nz9LightGlue is not trainable, no labels should be provided.é   r   r   zOInput must be a 5D tensor of shape (batch_size, 2, num_channels, height, width)é   r@   r   )r   r»   r=   )r   r   r   r   r   r   r    r!   )Ú
ValueErrorr0   r»   r=   Úndimr!  rh   rj   r*  r_   r,  Úcloner�  r   )r;   rü   rž  r»   r=   rw   r   rÁ   r  Úchannelsr  r  Úkeypoint_detectionsr   rº   r   Úabsolute_keypointsr   r   r   r    r!   s                         r-   rK   z$LightGlueForKeypointMatching.forward`  så  € ð ˆØÐÜÐXÓYÐYà1BÐ1NÑ-ÐTX×T_ÑT_×TqÑTqÐà$8Ð$DÑ È$Ï+É+×JjÑJjð 	ð ×Ñ Ò! \×%6Ñ%6°qÓ%9¸QÒ%>ÜÐnÓoÐoà1=×1CÑ1CÑ.ˆ
�A�x ¨Ø#×+Ñ+¨J¸©N¸HÀfÈeÓTˆØ"×4Ñ4°\ÓBÐà*=¸b¸qÐ*AÑ'ˆ	�1�k 4Ø×%Ñ% j°!°R¸Ó;×>Ñ>¸|ÓLˆ	Ø!×)Ñ)¨*°a¸¸T×=bÑ=bÓc×fÑfÐgsÓtˆØ�|‰|˜J¨¨2Ó.ˆà&Ÿ_™_Ó.ÐØ);ºAºqÂ!ÀQ¸JÑ)GÈ%Ñ)OÐš1ša¢ A˜:Ñ&Ø);ºAºqÂ!ÀQ¸JÑ)GÈ&Ñ)PÐš1ša¢ A˜:Ñ&àEI×E[ÑE[ØØØØØØ/Ø!5ð F\ó F
ÑBˆ� %¨¸
ô /ØØØ+ØØØØ'Ø!ô	
ð 		
r,   rL   r±   )NNN)r"   r#   r$   r%   r   r5   r¤   r]   r@  r&   rM   rN   r*   rE  rM  rP  rT  ri  ru  r}  r�  r   r   r'   Ú
LongTensorr   rK   rO   rP   s   @r-   r&  r&  â  sÒ  ø„ ñð˜õ ð<(°Sð (¸Uó (ð glñ?Ø Ÿ<™<ð?Ø49·L±Lð?ØX\Ð_cÑXcð?à	ˆu�|‰|˜U 5§<¡<°·±Ð#=Ñ>Ð>Ñ	?ó?ð#Ø$)§L¡Lð#Ø?Bð#ØJOÏ,É,ð#Ødi×dpÑdpð#à	�‰ó#ó&(ð¨U¯\©\ð À5Ç<Á<ð Ð^að Ðfk×frÑfró ð#_à—\‘\ð#_ð —<‘<ð#_ð �l‰lð	#_ð
 —‘ð#_ð —l‘lð#_ð $Ÿl™lð#_ð ó#_òJkð@#*à—‘ð#*ð —‘ð#*ð Ÿ™ð	#*ð
 —|‘|ð#*ð 
ˆu�|‰|˜UŸ\™\Ð)Ñ	*ó#*ðV %)Ø)-Ø,0ñq
à—<‘<ðq
ð —\‘\ðq
ð ð	q
ð
 ðq
ð �l‰l˜TÑ!ðq
ð   $™;ðq
ð # T™kðq
ð 
ˆu�|‰|˜UŸ\™\¨5¯<©<¸ÀÐEÑ	Fóq
ðf Øð +/Ø)-Ø,0ñ4
à×'Ñ'ð4
ð × Ñ  4Ñ'ð4
ð   $™;ð	4
ð
 # T™kð4
ð 
Ð0Ñ	0ò4
ó ó ô4
r,   r&  )r   )r™   )4Úcollections.abcr   Údataclassesr   Únumpyr>  r&   r   Útorch.nn.utils.rnnr   Úactivationsr	   Úmasking_utilsr
   Úmodeling_flash_attention_utilsr   Úmodeling_utilsr   r   Úprocessing_utilsr   Úutilsr   r   r   r   Úauto.modeling_autor   Úconfiguration_lightgluer   r   ÚModuler/   rY   re   rM   r¤   ro   r]   r†   rˆ   r¦   r´   rÜ   rÞ   rô   rú   r*   r  r$  r&  Ú__all__r+   r,   r-   ú<module>r·     sT  ðõ( %Ý !ã Û Ý Ý +å !Ý 6Ý Bß FÝ &ß VÓ VÝ >Ý 4ñ ðôð ô 7 kó  7ó óð 7ôF §¡ô ò"ó<ð8	U˜UŸ\™\ð 	U°#ð 	U¸%¿,¹,ó 	Uð& ñ%Ø�I‰Ið%à�<‰<ð%ð 
�‰ð%ð �<‰<ð	%ð
 —L‘L 4Ñ'ð%ð ð%ð ð%ð Ð'Ñ(ó%ô2D)˜Ÿ™ô D)ôN�2—9‘9ô ô"P> §	¡	ô P>ðfØ—‘ðØ-2¯\©\ðØJOÏ,É,ðà
‡\�\óô& B§I¡Iô &ôR	 B§I¡Iô 	ð ô˜ó ó ðð$ E§L¡Lð $¸Uð $ÀuÈUÏ\É\Ð[`×[gÑ[gÐMgÑGhó $ð@ 5§<¡<ð ¸ð ÀSð ÈUÏ\É\ó ñ, ðôô
o
Ð#;ó o
óð
o
ðd &Ð'EÐ
F�r,   