+
    œ°³jž©  ã                   ó�  € ^ RI Ht ^ RIHt ^ RIt^ RIt^ RIHt ^ RIH	t	 ^RI
Ht ^RIHt ^RIHt ^R	IHtHt ^R
IHt ^RIHtHtHtHt ^RIHt ^RIHt ]! RR7      ] ! R R]4      4       4       t ! R R]P>                  4      t R t!R/R lt"R R lt#R0R R llt$ ! R R]P>                  4      t% ! R R]P>                  4      t& ! R R]P>                  4      t'R  R! lt( ! R" R#]P>                  4      t) ! R$ R%]P>                  4      t*] ! R& R']4      4       t+R( R) lt,R* R+ lt-]! R,R7       ! R- R.]+4      4       t.R'R..t/R# )1é    )Ú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                   óP   a € ] tR t^&t o RtRtRtRtRtRt	Rt
RtRtV 3R ltRtV tR# )ÚLightGlueKeypointMatchingOutputaW  
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`
Nc                óª  <€ V ^8„  d   Qh/ S[ P                  R,          ;R&   S[ P                  R,          ;R&   S[ P                  R,          ;R&   S[ P                  R,          ;R&   S[ P                  R,          ;R&   S[ P                  R,          ;R&   S[S[ P                  ,          R,          ;R&   S[S[ P                  ,          R,          ;R	&   # )
é   NÚlossÚmatchesÚmatching_scoresÚ	keypointsÚpruneÚmaskÚhidden_statesÚ
attentions)ÚtorchÚFloatTensorÚ	IntTensorÚtuple)ÚformatÚ__classdict__s   "€Úq/home/luca/screen-checking/.venv/lib/python3.14/site-packages/transformers/models/lightglue/modeling_lightglue.pyÚ__annotate__Ú,LightGlueKeypointMatchingOutput.__annotate__&   sÝ   ø‡ ‚ ñF ×
Ñ
˜dÕ
"Ñ)ñG ñH ×Ñ Õ%Ñ,ñI ñJ ×&Ñ&¨Õ-Ñ4ñK ñL × Ñ  4Õ'Ñ.ñM ñN �?‰?˜TÕ!Ñ(ñO ñP ×
Ñ
˜dÕ
"Ñ)ñQ ñR ™×*Ñ*Õ+¨dÕ2Ñ9ñS ñT ‘e×'Ñ'Õ(¨4Õ/Ñ6òU ó    © )Ú__name__Ú
__module__Ú__qualname__Ú__firstlineno__Ú__doc__r   r   r   r   r   r   r    r!   Ú__annotate_func__Ú__static_attributes__Ú__classdictcell__©r'   s   @r(   r   r   &   s<   ø‡ € ñð0 &*€DØ(,€GØ04€OØ*.€IØ$(€EØ%)€DØ59€MØ26€J÷U ƒ r+   r   c                   óT   a a€ ] tR t^St oV3R lV 3R lltRV3R lR lltRtVtV ;t# )ÚLightGluePositionalEncoderc                ó    <€ V ^8„  d   QhRS[ /# ©r   Úconfigr   )r&   r'   s   "€r(   r)   Ú'LightGluePositionalEncoder.__annotate__T   s   ø€ ÷ lñ l™ñ lr+   c                ó¤   <€ \         SV `  4        \        P                  ! ^VP                  VP
                  ,          ^,          RR7      V n        R# )r   F©ÚbiasN)ÚsuperÚ__init__r   ÚLinearÚdescriptor_dimÚnum_attention_headsÚ	projector©Úselfr:   Ú	__class__s   &&€r(   r@   Ú#LightGluePositionalEncoder.__init__T   s:   ø€ Ü‰ÑÔÜŸš 1 f×&;Ñ&;¸v×?YÑ?YÕ&YÐ]^Õ&^ÐejÔkˆŽr+   c          	      óÀ   <€ V ^8„  d   QhRS[ P                  RS[R,          RS[S[ P                  ,          S[S[ P                  S[ P                  3,          ,          /# )r   r   Úoutput_hidden_statesNÚreturn©r"   ÚTensorÚboolr%   )r&   r'   s   "€r(   r)   r;   X   sM   ø€ ÷ 	ñ 	ÙŸ™ð	Ù=AÀD½[ð	á	‰u�|‰|Õ	™u¡U§\¡\±5·<±<Ð%?Õ@Õ	@ñ	r+   c                óÌ   € V P                  V4      pVP                  ^RR7      p\        P                  ! V4      p\        P                  ! V4      pWV3pV'       d   WC3pV# V3pV# )r   ©Údiméÿÿÿÿ)rD   Úrepeat_interleaver"   ÚcosÚsin)rF   r   rJ   Úprojected_keypointsÚ
embeddingsÚcosinesÚsinesÚoutputs   &&&     r(   ÚforwardÚ"LightGluePositionalEncoder.forwardX   sl   € ð #Ÿn™n¨YÓ7ÐØ(×:Ñ:¸1À"Ð:ÓEˆ
Ü—)’)˜JÓ'ˆÜ—	’	˜*Ó%ˆØÐ%ˆ
ß6J�*Ð2ˆØˆð R\ÐP]ˆØˆr+   )rD   ©F©	r-   r.   r/   r0   r@   r[   r3   r4   Ú__classcell__©rG   r'   s   @@r(   r7   r7   S   s    ù‡ € ÷ló l÷	÷ 	ò 	r+   r7   c                 ó~   € V R,          pV R,          p\         P                  ! V) V.RR7      P                  R4      pV# ).rP   ).:NNr   ).:é   Nr   rR   éþÿÿÿ)r"   ÚstackÚflatten)ÚxÚx1Úx2Úrot_xs   &   r(   Úrotate_halfrj   d   s:   € à	
ˆ8�€BØ	
ˆ9�€BÜ�KŠK˜"˜˜b˜	 rÔ*×2Ñ2°2Ó6€EØ€Lr+   c                ób  € V P                   pV P                  4       p VP                  4       pVP                  V4      pVP                  V4      pW,          \        V 4      V,          ,           pW,          \        V4      V,          ,           pVP	                  VR7      VP	                  VR7      3# )aI  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)rm   ÚfloatÚ	unsqueezerj   Úto)ÚqÚkrT   rU   Úunsqueeze_dimrm   Úq_embedÚk_embeds   &&&&&   r(   Úapply_rotary_pos_embrv   l   sŠ   € ð$ �G‰G€EØ	�‰‹	€AØ	�‰‹	€AØ
�-‰-˜Ó
&€CØ
�-‰-˜Ó
&€CØ�wœ; q›>¨CÕ/Õ0€GØ�wœ; q›>¨CÕ/Õ0€GØ�:‰:˜Eˆ:Ó" G§J¡J°U JÓ$;Ð;Ð;r+   c                ód   € V ^8„  d   QhR\         P                  R\        R\         P                  /# )r   r    Ún_reprK   ©r"   rM   Úint)r&   s   "r(   r)   r)   ˆ   s.   € ÷ 	Uñ 	UœUŸ\™\ð 	U´#ð 	U¼%¿,¹,ñ 	Ur+   c                ó˜   € V P                   w  r#rEV^8X  d   V # V R,          P                  W#WV4      p V P                  W#V,          WE4      # )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)
)ºNNNr|   Nr|   r|   )ÚshapeÚexpandÚreshape)r    rx   ÚbatchÚnum_key_value_headsÚslenÚhead_dims   &&    r(   Ú	repeat_kvr„   ˆ   sU   € ð
 2?×1DÑ1DÑ.€E Ø�„zØÐØ!Ð"2Õ3×:Ñ:¸5ÐW\ÐdlÓm€MØ× Ñ  ¸eÕ(CÀTÓTÐTr+   c                ó   € V ^8„  d   QhR\         P                  R\        P                  R\        P                  R\        P                  R\        P                  R,          R\        R\        R	\
        \        ,          /# )
r   ÚmoduleÚqueryÚkeyÚvalueÚattention_maskNÚscalingÚdropoutÚkwargs)r   ÚModuler"   rM   rn   r   r   )r&   s   "r(   r)   r)   ”   sw   € ÷ %ñ %Ü�I‰Ið%ä�<‰<ð%ô 
�‰ð%ô �<‰<ð	%ô
 —L‘L 4Õ'ð%ô ð%ô ð%ô Ô'Õ(ñ%r+   c                 ó"  € \        W P                  4      p\        W0P                  4      p	\        P                  ! WP	                  ^^4      4      V,          p
Ve	   W¤,           p
\
        P                  P                  V
R\        P                  R7      P                  VP                  4      p
\
        P                  P                  W¦V P                  R7      p
\        P                  ! W©4      pVP	                  ^^4      P                  4       pWº3# )r   )rQ   rm   )ÚpÚtrainingrR   )r„   Únum_key_value_groupsr"   ÚmatmulÚ	transposer   Ú
functionalÚsoftmaxÚfloat32rp   rm   rŒ   r‘   Ú
contiguous)r†   r‡   rˆ   r‰   rŠ   r‹   rŒ   r�   Ú
key_statesÚvalue_statesÚattn_weightsÚattn_outputs   &&&&&&&,    r(   Úeager_attention_forwardr�   ”   sÒ   € ô ˜3× ;Ñ ;Ó<€JÜ˜U×$?Ñ$?Ó@€Lä—<’< ×';Ñ';¸A¸qÓ'AÓBÀWÕL€LØÒ!Ø#Õ4ˆä—=‘=×(Ñ(¨¸2ÄUÇ]Á]Ð(ÓS×VÑVÐW\×WbÑWbÓc€LÜ—=‘=×(Ñ(¨È6Ï?É?Ð(Ó[€LÜ—,’,˜|Ó:€KØ×'Ñ'¨¨1Ó-×8Ñ8Ó:€KàÐ$Ð$r+   c                   óX   a a€ ] tR t^­t oRtV3R lV 3R lltRV3R lR lltRtVtV ;t	# )ÚLightGlueAttentionz=Multi-headed attention from 'Attention Is All You Need' paperc                ó&   <€ V ^8„  d   QhRS[ RS[/# ©r   r:   Ú	layer_idx©r   rz   )r&   r'   s   "€r(   r)   ÚLightGlueAttention.__annotate__°   s   ø€ ÷ 
ñ 
™ð 
¹3ñ 
r+   c                ó¢  <€ \         SV `  4        Wn        W n        \	        VR VP
                  VP                  ,          4      V n        VP                  VP                  ,          V n	        V P                  R,          V n
        VP                  V n        RV n        \        P                  ! VP
                  VP                  V P                  ,          VP                  R7      V n        \        P                  ! VP
                  VP                  V P                  ,          VP                  R7      V n        \        P                  ! VP
                  VP                  V P                  ,          VP                  R7      V n        \        P                  ! VP                  V P                  ,          VP
                  VP                  R7      V n        R# )rƒ   Tr=   Ng      à¿)r?   r@   r:   r¢   ÚgetattrÚhidden_sizerC   rƒ   r�   r’   r‹   Úattention_dropoutÚ	is_causalr   rA   Úattention_biasÚq_projÚk_projÚv_projÚo_proj©rF   r:   r¢   rG   s   &&&€r(   r@   ÚLightGlueAttention.__init__°   sI  ø€ Ü‰ÑÔØŒØ"ŒÜ ¨
°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+   c                óf  <€ V ^8„  d   QhRS[ P                  RS[S[ P                  S[ P                  3,          R,          RS[ P                  R,          RS[ P                  R,          RS[ P                  R,          RS[S[,          RS[S[ P                  S[ P                  R,          3,          /# )	r   r    Úposition_embeddingsNrŠ   Úencoder_hidden_statesÚencoder_attention_maskr�   rK   )r"   rM   r%   r   r
   )r&   r'   s   "€r(   r)   r¤   Ç   s¤   ø€ ÷ *)ñ *)á—|‘|ð*)ñ #¡5§<¡<±·±Ð#=Õ>ÀÕEð*)ñ Ÿ™ tÕ+ð	*)ñ
  %Ÿ|™|¨dÕ2ð*)ñ !&§¡¨tÕ 3ð*)ñ Ñ-Õ.ð*)ñ 
‰u�|‰|™UŸ\™\¨DÕ0Ð0Õ	1ñ*)r+   c                ó  € VP                   R R p. VORNV P                  N5pV P                  V4      P                  V4      P	                  ^^4      p	VR Jp
V
'       d   TMTpV
'       d   TMTpV P                  V4      P                  V4      P	                  ^^4      pV P                  V4      P                  V4      P	                  ^^4      pVe   Vw  pp\        W�VV4      w  r�\        P                  ! V P                  P                  \        4      pT! V V	VVV3RV P                  '       g   RMV P                  RV P                  /VB w  ppVP                   ! . VORN5!  P#                  4       pV P%                  V4      pVV3# )NrŒ   ç        r‹   rR   )r}   rƒ   r«   Úviewr”   r¬   r­   rv   r   Úget_interfacer:   Ú_attn_implementationr�   r‘   r¨   r‹   r   r˜   r®   )rF   r    r²   rŠ   r³   r´   r�   Úinput_shapeÚhidden_shapeÚquery_statesÚis_cross_attentionÚcurrent_statesÚcurrent_attention_maskr™   rš   rT   rU   Úattention_interfacerœ   r›   s   &&&&&&,             r(   r[   Ú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ð	%
ð ñ	%
Ñ!ˆ�\ð "×)Ò)Ð;¨;Ð;¸Ó;×FÑFÓHˆØ—k‘k +Ó.ˆØ˜LÐ(Ð(r+   )r¨   r:   rƒ   r©   r¬   r¢   r’   r®   r«   r‹   r­   )NNNN)
r-   r.   r/   r0   r1   r@   r[   r3   r4   r_   r`   s   @@r(   rŸ   rŸ   ­   s!   ù‡ € ÙG÷
ó 
÷.*)÷ *)ò *)r+   rŸ   c                   óP   a a€ ] tR t^ôt oV3R lV 3R lltV3R lR ltRtVtV ;t# )ÚLightGlueMLPc                ó    <€ V ^8„  d   QhRS[ /# r9   r   )r&   r'   s   "€r(   r)   ÚLightGlueMLP.__annotate__õ   s   ø€ ÷ Zñ Z™ñ Zr+   c                óv  <€ \         SV `  4        Wn        \        VP                  ,          V n        \        P                  ! VP                  VP                  4      V n	        \        P                  ! VP                  VP                  4      V n        \        P                  ! VP                  R R7      V n        R# )T)Úelementwise_affineN)r?   r@   r:   r   Ú
hidden_actÚactivation_fnr   rA   Úintermediate_sizeÚfc1r§   Úfc2Ú	LayerNormÚ
layer_normrE   s   &&€r(   r@   Ú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+   c                óN   <€ V ^8„  d   QhRS[ P                  RS[ P                  /# )r   r    rK   ©r"   rM   )r&   r'   s   "€r(   r)   rÅ   ý   s#   ø€ ÷ ñ ¡U§\¡\ð ±e·l±lñ r+   c                óŽ   € V P                  V4      pV P                  V4      pV P                  V4      pV P                  V4      pV# ©N)rË   rÎ   rÉ   rÌ   )rF   r    s   &&r(   r[   ÚLightGlueMLP.forwardý   sB   € ØŸ™ Ó/ˆØŸ™¨Ó6ˆØ×*Ñ*¨=Ó9ˆØŸ™ Ó/ˆØÐr+   )rÉ   r:   rË   rÌ   rÎ   r^   r`   s   @@r(   rÃ   rÃ   ô   s    ù‡ € ÷Zó Z÷÷ ð r+   rÃ   c                   óT   a a€ ] tR tRt oV3R lV 3R lltRV3R lR lltRtVtV ;t# )ÚLightGlueTransformerLayeri  c                ó&   <€ V ^8„  d   QhRS[ RS[/# r¡   r£   )r&   r'   s   "€r(   r)   Ú&LightGlueTransformerLayer.__annotate__  s   ø€ ÷ .ñ .™ð .¹3ñ .r+   c                ó¤   <€ \         SV `  4        \        W4      V n        \	        V4      V n        \        W4      V n        \	        V4      V n        R # rÓ   )r?   r@   rŸ   Úself_attentionrÃ   Úself_mlpÚcross_attentionÚ	cross_mlpr¯   s   &&&€r(   r@   Ú"LightGlueTransformerLayer.__init__  s@   ø€ Ü‰ÑÔÜ0°ÓCˆÔÜ$ VÓ,ˆŒÜ1°&ÓDˆÔÜ% fÓ-ˆŽr+   c                ó(  <€ V ^8„  d   QhRS[ P                  RS[ P                  RS[ P                  RS[R,          RS[R,          RS[S[ P                  S[S[ P                  ,          R,          S[S[ P                  ,          R,          3,          /# )r   Údescriptorsr   rŠ   rJ   NÚoutput_attentionsrK   rL   )r&   r'   s   "€r(   r)   rØ     s�   ø€ ÷ H>ñ H>á—\‘\ðH>ñ —<‘<ðH>ñ Ÿ™ð	H>ñ
 # T�kðH>ñ   $�;ðH>ñ 
‰u�|‰|™U¡5§<¡<Õ0°4Õ7¹¹u¿|¹|Õ9LÈtÕ9SÐSÕ	TñH>r+   c                ó`  € V'       d   RMR pV'       d   RMR pV'       d
   Wa3,           pVP                   w  r‰p
V P                  VVVVR7      w  r¼\        P                  ! W.RR7      pV P	                  V4      pW,           pV'       d   WÞ3pVP                  R^Wš4      P                  ^4      P                  W‰V
4      pVe7   VP                  R^^^V	4      P                  ^4      P                  V^^V	4      MR pV P                  VVVVR7      w  pp\        P                  ! VV.RR7      pV P                  V4      pVV,           pV'       dE   VV3pVVP                  W‰V
4      3,           X,           VP                  W‰V
4      3,           V,           pV'       d   W|3,           V3,           pWV3# )N)r²   rŠ   rá   rP   )r³   r´   rá   r,   rR   )	r}   rÚ   r"   ÚcatrÛ   r   ÚfliprÜ   rÝ   )rF   rà   r   rŠ   rJ   rá   Úall_hidden_statesÚall_attentionsÚ
batch_sizeÚnum_keypointsrB   Ú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(   r[   Ú!LightGlueTransformerLayer.forward  sï  € ÷ #7™B¸DÐß0™°dˆçØ 1°NÕ BÐà4?×4EÑ4EÑ1ˆ
 >ð -1×,?Ñ,?ØØ )Ø)Ø/ð	 -@ó -
Ñ)Ðô $Ÿiši¨Ð(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+   )rÜ   rÝ   rÚ   rÛ   )FFr^   r`   s   @@r(   rÖ   rÖ     s!   ù‡ € ÷.ó .÷H>÷ H>ò H>r+   rÖ   c                ó˜   € V ^8„  d   QhR\         P                  R\         P                  R\         P                  R\         P                  /# )r   Ú
similarityÚmatchability0Úmatchability1rK   rÑ   )r&   s   "r(   r)   r)   X  s<   € ÷ ñ Ü—‘ðÜ-2¯\©\ðÜJOÏ,É,ðä
‡\�\ñr+   c                óø  € V P                   w  r4p\        P                  P                  V4      \        P                  P                  V4      P	                  ^^4      ,           p\        P                  P                  V ^4      p\        P                  P                  V P	                  RR4      P                  4       ^4      P	                  RR4      pV P                  W4^,           V^,           3^ 4      p	Wx,           V,           V	RRV1RV13&   \        P                  P                  VP                  R4      ) 4      V	RRR1R3&   \        P                  P                  VP                  R4      ) 4      V	RRRR13&   V	# )z;create the log assignment matrix from logits and similarityr|   NrR   rc   )	r}   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  sM  € ð 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Ø× Ñ  *ÀÕ.AÀ?ÐUVÕCVÐ!WÐYZÓ[€FØ4;Õ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                   ób   a a€ ] tR tRt oV3R lV 3R lltV3R lR ltV3R lR ltRtVtV ;t	# )	ÚLightGlueMatchAssignmentLayerig  c                ó    <€ V ^8„  d   QhRS[ /# r9   r   )r&   r'   s   "€r(   r)   Ú*LightGlueMatchAssignmentLayer.__annotate__h  s   ø€ ÷ Iñ I™ñ Ir+   c                óú   <€ \         SV `  4        VP                  V n        \        P                  ! V P                  V P                  R R7      V n        \        P                  ! V P                  ^R R7      V n        R# )Tr=   N)r?   r@   rB   r   rA   Úfinal_projectionÚmatchabilityrE   s   &&€r(   r@   Ú&LightGlueMatchAssignmentLayer.__init__h  sY   ø€ Ü‰ÑÔà$×3Ñ3ˆÔÜ "§	¢	¨$×*=Ñ*=¸t×?RÑ?RÐY]Ô ^ˆÔÜŸIšI d×&9Ñ&9¸1À4ÔHˆÖr+   c                óh   <€ V ^8„  d   QhRS[ P                  RS[ P                  RS[ P                  /# )r   rà   r   rK   rÑ   )r&   r'   s   "€r(   r)   r  o  s.   ø€ ÷ ñ ¡5§<¡<ð ±u·|±|ð ÉÏÉñ r+   c                ó  € VP                   w  r4pV P                  V4      pV\        P                  ! RV P                  VP
                  R 7      R,          ,          pVP                  V^,          ^WE4      pVR,          pVR,          pWxP                  RR4      ,          p	Ve    VP                  V^,          ^V4      pVR,          P                  R4      p
VR,          P                  R4      P                  RR4      pW«,          pV	P                  V^ 8H  \        P                  ! V	P                  4      P                  4      p	V P                  V4      pVP                  V^,          ^V^4      pVR,          pVR,          p\        W�V4      pV# )©Údeviceg      Ð?r,   ©r|   r   ©r|   rb   rR   rc   )r}   r
  r"   ÚfullrB   r  r   r”   ro   Úmasked_fillÚfinform   Úminr  r  )rF   rà   r   rç   rè   rB   Úm_descriptorsÚm_descriptors0Úm_descriptors1rö   Úmask0Úmask1r  Úmatchability_0Úmatchability_1r  s   &&&             r(   r[   Ú%LightGlueMatchAssignmentLayer.forwardo  sc  € Ø4?×4EÑ4EÑ1ˆ
 >à×-Ñ-¨kÓ:ˆØ%¬¯
ª
°2°t×7JÑ7JÐS`×SgÑSgÔ(hÐlpÕ(pÕpˆØ%×-Ñ-¨j¸A­o¸qÀ-Ó`ˆØ& tÕ,ˆØ& tÕ,ˆØ#×&>Ñ&>¸rÀ2Ó&FÕFˆ
ØÒØ—<‘< 
¨a¥°°MÓBˆDØ˜•J×(Ñ(¨Ó,ˆEØ˜•J×(Ñ(¨Ó,×6Ñ6°r¸2Ó>ˆEØ•=ˆDØ#×/Ñ/°¸±	¼5¿;º;Àz×GWÑGWÓ;X×;\Ñ;\Ó]ˆJð ×(Ñ(¨Ó5ˆØ#×+Ñ+¨J¸!­O¸QÀÈqÓQˆØ% dÕ+ˆØ% dÕ+ˆô ,¨JÈÓWˆØˆr+   c                óN   <€ V ^8„  d   QhRS[ P                  RS[ P                  /# ©r   rà   rK   rÑ   )r&   r'   s   "€r(   r)   r  ‰  s#   ø€ ÷ ñ ©E¯L©Lð ¹U¿\¹\ñ r+   c                ó„   € V P                  V4      p\        P                  P                  V4      P	                  R4      pV# )z0Get matchability of descriptors as a probabilityrR   )r  r   r•   Úsigmoidrý   )rF   rà   r  s   && r(   Úget_matchabilityÚ.LightGlueMatchAssignmentLayer.get_matchability‰  s7   € à×(Ñ(¨Ó5ˆÜ—}‘}×,Ñ,¨\Ó:×BÑBÀ2ÓFˆØÐr+   )rB   r
  r  )
r-   r.   r/   r0   r@   r[   r#  r3   r4   r_   r`   s   @@r(   r  r  g  s*   ù‡ € ÷Ió I÷ð ÷4÷ ð r+   r  c                   óP   a a€ ] tR tRt oV3R lV 3R lltV3R lR ltRtVtV ;t# )ÚLightGlueTokenConfidenceLayeri�  c                ó    <€ V ^8„  d   QhRS[ /# r9   r   )r&   r'   s   "€r(   r)   Ú*LightGlueTokenConfidenceLayer.__annotate__‘  s   ø€ ÷ 9ñ 9™ñ 9r+   c                óp   <€ \         SV `  4        \        P                  ! VP                  ^4      V n        R# )rb   N)r?   r@   r   rA   rB   ÚtokenrE   s   &&€r(   r@   Ú&LightGlueTokenConfidenceLayer.__init__‘  s&   ø€ Ü‰ÑÔä—Y’Y˜v×4Ñ4°aÓ8ˆŽ
r+   c                óN   <€ V ^8„  d   QhRS[ P                  RS[ P                  /# r   rÑ   )r&   r'   s   "€r(   r)   r(  –  s#   ø€ ÷ ñ ¡5§<¡<ð ±E·L±Lñ r+   c                ó    € V P                  VP                  4       4      p\        P                  P	                  V4      P                  R4      pV# )rb   rR   )r*  Údetachr   r•   r"  rý   )rF   rà   r*  s   && r(   r[   Ú%LightGlueTokenConfidenceLayer.forward–  s=   € Ø—
‘
˜;×-Ñ-Ó/Ó0ˆÜ—‘×%Ñ% eÓ,×4Ñ4°RÓ8ˆØˆr+   )r*  r^   r`   s   @@r(   r&  r&  �  s   ù‡ € ÷9ó 9÷
÷ ð r+   r&  c                   óH   a € ] tR tRt o RtRtRtR
tRtRt	Rt
V 3R ltRtV tR	# )ÚLightGluePreTrainedModeliœ  zz
An abstract class to handle weights initialization and a simple interface for downloading and loading pretrained
models.
Ú	lightglueÚpixel_valuesFTc                ó&   <€ V ^8„  d   Qh/ S[ ;R&   # r9   r   )r&   r'   s   "€r(   r)   Ú%LightGluePreTrainedModel.__annotate__œ  s   ø‡ ‚ ñ Ñò r+   r,   N)Úimage)r-   r.   r/   r0   r1   Úbase_model_prefixÚmain_input_nameÚinput_modalitiesÚsupports_gradient_checkpointingÚ_supports_flash_attnÚ_supports_sdpar2   r3   r4   r5   s   @r(   r1  r1  œ  s5   ø‡ € ñð $ÐØ$€OØ!ÐØ&+Ð#ØÐØ€N÷ ƒ r+   r1  c                óš   € V ^8„  d   QhR\         P                  R\        R\        \         P                  \         P                  3,          /# )r   r  Ú	thresholdrK   )r"   rM   rn   r%   )r&   s   "r(   r)   r)   ¬  s:   € ÷ $ñ $¤E§L¡Lð $¼Uð $ÄuÌUÏ\É\Ô[`×[gÑ[gÐMgÕGhñ $r+   c                ó|  € V P                   w  p pV RRR1RR13,          P                  ^4      pV RRR1RR13,          P                  ^4      pVP                  pVP                  p\        P                  ! VP                   ^,          VP
                  R7      R,          p\        P                  ! VP                   ^,          VP
                  R7      R,          p	W‡P                  ^V4      8H  p
W–P                  ^V4      8H  pVP                  P                  4       pVP                  ^ 4      p\        P                  ! W¤V4      p\        P                  ! W½P                  ^V4      V4      pW­V8„  ,          pW¿P                  ^V4      ,          p\        P                  ! WöR4      p\        P                  ! VVR4      p\        P                  ! Wg.4      P                  ^ ^4      P                  V^,          R4      p\        P                  ! WÞ.4      P                  ^ ^4      P                  V^,          R4      pVV3# )z1obtain matches from a score matrix [Bx M+1 x N+1]r|   Nr  rR   )r}   ÚmaxÚindicesr"   Úaranger  ÚgatherÚvaluesÚexpÚ
new_tensorÚwhererd   r”   r   )r  r>  rç   Ú_Úmax0Úmax1Úmatches0Úmatches1Úindices0Úindices1Úmutual0Úmutual1ÚzeroÚmatching_scores0Úmatching_scores1Úvalid0Úvalid1r   r   s   &&                 r(   Úget_matches_from_scoresrV  ¬  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°$Ó7ÐÜ—{’{ 7×,CÑ,CÀAÀxÓ,PÐRVÓWÐØ¨9Ñ4Õ5€FØ—}‘} Q¨Ó1Õ1€Fô �{Š{˜6¨RÓ0€HÜ�{Š{˜6 8¨RÓ0€HÜ�kŠk˜8Ð.Ó/×9Ñ9¸!¸QÓ?×GÑGÈ
ÐUVÍÐXZÓ[€GÜ—k’kÐ#3Ð"FÓG×QÑQÐRSÐUVÓW×_Ñ_Ð`jÐmnÕ`nÐprÓs€Oà�OÐ#Ð#r+   c                óp   € V ^8„  d   QhR\         P                  R\        R\        R\         P                  /# )r   r   ÚheightÚwidthrK   ry   )r&   s   "r(   r)   r)   Ì  s0   € ÷ ñ ¤5§<¡<ð ¼ð ÄSð ÌUÏ\É\ñ r+   c                ó   € \         P                  ! W!.V P                  V P                  R7      R,          pV^,          pVP	                  R4      P
                  ^,          pWR,          ,
          VR,          ,          p V # )aw  
Normalize keypoints locations based on 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  rm   NrR   ).Nr|   ).NN)r"   Útensorr  rm   r@  rD  )r   rX  rY  ÚsizeÚshiftÚscales   &&&   r(   Únormalize_keypointsr`  Ì  sf   € ô �<Š<˜˜°	×0@Ñ0@È	ÏÉÔXÐY]Õ^€DØ�1�H€EØ�H‰H�R‹L×Ñ !Õ#€EØ <Õ0Õ0°E¸/Õ4JÕJ€IØÐr+   zV
    LightGlue model taking images as inputs and outputting the matching of them.
    c                   ó  a a€ ] tR tRt oRtV3R lV 3R lltV3R lR ltRV3R lR lltV3R	 lR
 ltRR lt	V3R lR lt
V3R lR ltR tV3R lR ltRV3R lR llt]]RV3R lR ll4       4       tRtVtV ;t# )ÚLightGlueForKeypointMatchingiâ  aJ  
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
c                ó    <€ V ^8„  d   QhRS[ /# r9   r   )r&   r'   s   "€r(   r)   Ú)LightGlueForKeypointMatching.__annotate__ö  s   ø€ ÷ ñ ™ñ r+   c           
     ó8  <€ \         SV `  V4       \        P                  ! VP                  4      V n        VP                  P                  V n        VP                  V n        VP                  V n
        VP                  V n        VP                  V n        VP                  V n        V P                  V P                  8w  d4   \        P                  ! V P                  V P                  R R7      V n        M\        P"                  ! 4       V n        \%        V4      V n        \        P(                  ! \+        VP                  4       Uu. uF  p\-        WR7      NK  	  up4      V n        \        P(                  ! \+        VP                  4       Uu. uF  p\1        V4      NK  	  up4      V n        \        P(                  ! \+        VP                  ^,
          4       Uu. uF  p\5        V4      NK  	  up4      V n        V P9                  4        R# u upi u upi u upi )Tr=   )r¢   N)r?   r@   r   Úfrom_configÚkeypoint_detector_configÚkeypoint_detectorÚdescriptor_decoder_dimÚ keypoint_detector_descriptor_dimrB   Únum_hidden_layersÚ
num_layersÚfilter_thresholdÚdepth_confidenceÚwidth_confidencer   rA   Úinput_projectionÚIdentityr7   Úpositional_encoderÚ
ModuleListÚrangerÖ   Útransformer_layersr  Úmatch_assignment_layersr&  Útoken_confidenceÚ	post_init)rF   r:   ÚirH  rG   s   &&  €r(   r@   Ú%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ÑEdÀÔ& v×;ÑEdÑeó#
ˆÔô (*§}¢}Ü<AÀ&×BZÑBZÔ<[Ó\Ñ<[°qÔ*¨6Ö2Ñ<[Ñ\ó(
ˆÔ$ô !#§¢Ü<AÀ&×BZÑBZÐ]^ÕB^Ô<_Ó`Ñ<_°qÔ*¨6Ö2Ñ<_Ñ`ó!
ˆÔð 	�‰Öùò fùò ]ùò as   ÅHÆHÇHc                ó&   <€ V ^8„  d   QhRS[ RS[/# )r   Úlayer_indexrK   )rz   rn   )r&   r'   s   "€r(   r)   rd    s   ø€ ÷ (ñ (±Sð (¹Uñ (r+   c                óª   € RR\         P                  ! RV,          V P                  ,          4      ,          ,           p\         P                  ! V^ ^4      # )z-scaled confidence threshold for a given layergš™™™™™é?gš™™™™™¹?g      À)ÚnprE  rl  Úclip)rF   r|  r>  s   && r(   Ú_get_confidence_thresholdÚ6LightGlueForKeypointMatching._get_confidence_threshold  s;   € à˜#¤§¢ t¨kÕ'9¸D¿O¹OÕ'KÓ LÕLÕLˆ	Ü�wŠw�y ! QÓ'Ð'r+   c                óÐ   <€ V ^8„  d   QhRS[ P                  RS[ P                  RS[R,          RS[S[ P                  S[S[ P                  S[ P                  3,          3,          /# )r   rà   r   rJ   NrK   rL   )r&   r'   s   "€r(   r)   rd    s[   ø€ ÷ ?ñ ?Ù Ÿ<™<ð?Ù49·L±Lð?ÙX\Ð_cÕXcð?á	‰u�|‰|™U¡5§<¡<±·±Ð#=Õ>Ð>Õ	?ñ?r+   c                óŠ   € VP                  4       P                  4       pV P                  V4      pV P                  W#R 7      pWE3# )©rJ   )r.  r˜   rp  rr  )rF   rà   r   rJ   Úprojected_descriptorsÚkeypoint_encoding_outputs   &&&&  r(   Ú_keypoint_processingÚ1LightGlueForKeypointMatching._keypoint_processing  sI   € ð "×(Ñ(Ó*×5Ñ5Ó7ˆØ $× 5Ñ 5°kÓ BÐØ#'×#:Ñ#:¸9Ð#:Ó#pÐ Ø$Ð>Ð>r+   c          
      óˆ   <€ V ^8„  d   QhRS[ P                  RS[RS[ P                  RS[ P                  RS[ P                  /# )r   Úkeypoint_confidencesr|  r   Ú
num_pointsrK   ry   )r&   r'   s   "€r(   r)   rd  !  sG   ø€ ÷ #ñ #Ù$)§L¡Lð#Ù?Bð#ÙJOÏ,É,ð#Ùdi×dpÑdpð#á	�‰ñ#r+   c                óš  € VP                   w  rVW P                  ^,
          8  d€   VP                  V^ 8H  ^4      pVP                  V^,          R4      pV P	                  V4      pRW8  P                  4       P                  ^R7      V,          ,
          pW€P                  8„  p	V	# \        P                  ! V\        P                  R7      p	V	# )zRevaluate whether we should stop inference based on the confidence of the keypointsg      ð?rP   rl   rR   )r}   rl  r  r   r€  rn   Úsumrn  r"   ÚonesrN   )
rF   rŠ  r|  r   r‹  rç   rH  r>  Úratio_confidentÚearly_stopped_pairss
   &&&&&     r(   Ú_get_early_stopped_image_pairsÚ;LightGlueForKeypointMatching._get_early_stopped_image_pairs!  s¿   € ð Ÿ
™
‰ˆ
ØŸ™¨1Õ,Ô,ð $8×#CÑ#CÀDÈAÁIÈqÓ#QÐ Ø#7×#?Ñ#?À
ÈaÅÐQSÓ#TÐ Ø×6Ñ6°{ÓCˆIØ!Ð%9Ñ%E×$LÑ$LÓ$N×$RÑ$RÐWXÐ$RÓ$YÐ\fÕ$fÕfˆOØ"1×4IÑ4IÑ"IÐð
 #Ð"ô #(§*¢*¨Z¼u¿z¹zÔ"JÐØ"Ð"r+   c                ó�   € Ve   W,          pW$,          pV P                   V,          ! W4      p\        WPP                  4      w  rgWg3# rÓ   )rv  rV  rm  )rF   rà   r   r|  Úearly_stopsr  r   r   s   &&&&&   r(   Ú_get_keypoint_matchingÚ3LightGlueForKeypointMatching._get_keypoint_matching4  sI   € ØÒ"Ø%Õ2ˆKØÕ$ˆDØ×-Ñ-¨kÖ:¸;ÓMˆÜ#:¸6×CXÑCXÓ#YÑ ˆØÐ'Ð'r+   c                ón   <€ V ^8„  d   QhRS[ P                  RS[ P                  RS[RS[ P                  /# )r   Úconfidencesr  r|  rK   ry   )r&   r'   s   "€r(   r)   rd  <  s9   ø€ ÷ ñ ©U¯\©\ð Á5Ç<Á<ð Ñ^að Ñfk×frÑfrñ r+   c                ón   € V^V P                   ,
          8„  pVe   WAV P                  V4      8*  ,          pV# )z#mask points which should be removed)ro  r€  )rF   r˜  r  r|  Úkeeps   &&&& r(   Ú_get_pruning_maskÚ.LightGlueForKeypointMatching._get_pruning_mask<  s:   € à˜˜T×2Ñ2Õ2Ñ3ˆØÒ"Ø 4×#AÑ#AÀ+Ó#NÑNÕNˆDØˆr+   c                ó¼   <€ V ^8„  d   QhRS[ P                  RS[ P                  RS[ P                  RS[ P                  RS[ P                  RS[ P                  RS[/# )r   rà   r   r   rA  Úprune_outputrŠ  r|  ry   )r&   r'   s   "€r(   r)   rd  C  sr   ø€ ÷ #_ñ #_á—\‘\ð#_ñ —<‘<ð#_ñ �l‰lð	#_ñ
 —‘ð#_ñ —l‘lð#_ñ $Ÿl™lð#_ñ ñ#_r+   c                óÌ  a€ VP                   w  p p	V P                  V,          P                  V4      p
V P                  WjV4      oSP	                  V^ 8H  \
        P                  ! R4      4      oV3R lW^ ,          V^,          SV3 4       w  r¼rÞp\        V4       F!  pVVVV,          3;;,          ^,          uu&   K#  	  R W¼WÞ3 4       w  r¼rÞWÍ3p\        VRRR7      pVVWþV3# )zv
For a given layer, prune keypoints based on the confidence of the keypoints and the matchability of the
descriptors.
Fc              3   ó|   <"  € T F+  p\        VS4       UUu. uF  w  r#W#,          NK  	  uppx € K-  	  R # u uppi 5irÓ   )Úzip)Ú.0r\  Útr   Úpruned_keypoints_masks   &   €r(   Ú	<genexpr>ÚJLightGlueForKeypointMatching._do_layer_keypoint_pruning.<locals>.<genexpr>W  s>   øé € ð c
ác�ô %(¨Ð0EÔ$FÔGÑ$F™˜ˆQ�WˆWÑ$F×GÛcùó Hùs   ƒ<—6ª<c              3   ó<   "  € T F  p\        VR R7      x € K  	  R# 5i)T)Úbatch_firstNr   )r¢  Úpruned_tensors   & r(   r¥  r¦  _  s"   é € ð S
á!j�ô ˜°D×9Ñ9Û!jùs   ‚T©r¨  Úpadding_valuerR   )	r}   rv  r#  r›  r  r"   r\  rt  r   )rF   rà   r   r   rA  rž  rŠ  r|  rç   rH  Údescriptors_matchabilityÚpruned_descriptorsÚpruned_keypoints_0Úpruned_keypoints_1Úpruned_maskÚpruned_indicesry  Úpruned_keypointsr¤  s   &&&&&&&&          @r(   Ú_do_layer_keypoint_pruningÚ7LightGlueForKeypointMatching._do_layer_keypoint_pruningC  s  ø€ ð '×,Ñ,Ñˆ
�A�qØ#'×#?Ñ#?ÀÕ#L×#]Ñ#]Ð^iÓ#jÐ Ø $× 6Ñ 6Ð7KÐgrÓ sÐØ 5× AÑ AÀ$È!Á)ÌUÏ\Ê\ÐZ_ÓM`Ó aÐôc
à&°!­°iÀµlÐDYÐ[bÑcóc
Ñ_ÐÐ0BÐQ_ô �zÖ"ˆAØ˜˜N¨1Õ-Ð-×.°!Õ3Õ.ñ #ñS
à"4ÐJ\Ñ!jóS
ÑOÐÐ0Bð /ÐCÐÜ% nÀ$ÐVXÔYˆà!Ð#3°^ÐR^Ð^Ð^r+   c                ó   a€ \         P                  ! S4      o\         P                  ! SP                  ^ ,          4      pSV,          pSV,          oR WB3 4       w  rBR WS3 4       w  rSV3R lVVVV3 4       w  rEr#W#WE3# )r   c              3   ó>   "  € T F  p\        VR RR7      x € K  	  R# 5i)Trª  NrR   r   ©r¢  r\  s   & r(   r¥  ÚMLightGlueForKeypointMatching._concat_early_stopped_outputs.<locals>.<genexpr>u  s#   é € ð 3
áC�ô ˜¨TÀ×DÑDÛCùó   ‚c              3   ó>   "  € T F  p\        VR ^ R7      x € K  	  R# 5i)Trª  Nr   r·  s   & r(   r¥  r¸  y  s#   é € ð >
áN�ô ˜¨TÀ×CÑCÛNùr¹  c              3   ó6   <"  € T F  pVS,          x € K  	  R # 5irÓ   r,   )r¢  r\  Úearly_stops_indicess   & €r(   r¥  r¸  }  s&   øé € ð g
ñ�ð Ð&×'Ò'óùs   ƒ)r"   rd   rB  r}   )rF   r¼  Úfinal_pruned_keypoints_indicesÚ!final_pruned_keypoints_iterationsr   r   ÚidsÚorder_indicess   &f&&&&  r(   Ú_concat_early_stopped_outputsÚ:LightGlueForKeypointMatching._concat_early_stopped_outputsh  s£   ø€ ô $ŸkškÐ*=Ó>Ðä�lŠlÐ.×4Ñ4°QÕ7Ó8ˆØ+¨CÕ0ˆØ1°-Õ@Ðñ3
à"ÑCó3
Ñ/ˆñ>
à*ÑNó>
Ñ:ˆôg
ð ØØ.Ø1ñ	óg
ÑcˆÐ"@ð .ÐRYÐjÐjr+   c                óÆ   <€ V ^8„  d   QhRS[ P                  RS[ P                  RS[ P                  RS[ P                  RS[S[ P                  S[ P                  3,          /# )r   rA  r   r   rè   rK   )r"   rM   r%   )r&   r'   s   "€r(   r)   rd  ˆ  s_   ø€ ÷ #*ñ #*á—‘ð#*ñ —‘ð#*ñ Ÿ™ð	#*ñ
 —|‘|ð#*ñ 
‰u�|‰|™UŸ\™\Ð)Õ	*ñ#*r+   c                ór  a€ VP                   w  opV3R  lWV3 4       w  rpVR,          pVR,          pVR,          pVR,          p	VR,          p
VR,          p\        P                  ! S^,          ^V3RVP                  VP                  R7      p\        P
                  ! S^,          ^V3VP                  VP                  R7      p\        S^,          4       FÙ  p\        P                  ! WŽ,          R8H  RW~,          P                  ^ WŽ,          P                  ^ R7      4      4      WÎ^ Wn,          3&   \        P                  ! Wž,          R8H  RWn,          P                  ^ Wž,          P                  ^ R7      4      4      WÎ^W~,          3&   W®,          WÞ^ Wn,          3&   W¾,          WÞ^W~,          3&   KÛ  	  WÍ3# )c              3   óV   <"  € T F  qP                  S^,          ^R4      x € K   	  R# 5i)r   NrR   )r   )r¢  r\  rç   s   & €r(   r¥  ÚJLightGlueForKeypointMatching._do_final_keypoint_pruning.<locals>.<genexpr>’  s'   øé € ð -
ÙAd°v�N‰N˜:¨�?¨A¨r×2Ð2ÓAdùs   ƒ&)r[  )r  r  r  rR   )
r}   r"   r  r  rm   Úzerosrt  rG  rC  Úclamp)rF   rA  r   r   rè   rH  rM  rN  rK  rL  rR  rS  Ú_matchesÚ_matching_scoresry  rç   s   &&&&&          @r(   Ú_do_final_keypoint_pruningÚ7LightGlueForKeypointMatching._do_final_keypoint_pruningˆ  sž  ø€ ð  Ÿ™‰ˆ
�Aô-
ØBIÐTcÑAdó-
Ñ)ˆ˜/ð ˜4•=ˆØ˜4•=ˆØ˜4•=ˆØ˜4•=ˆØ*¨4Õ0ÐØ*¨4Õ0Ðô —:’:˜z¨Q�°°=ÐAÀ2ÈgÏnÉnÐdk×dqÑdqÔrˆÜ Ÿ;š;Ø˜1�_˜a Ð/¸¿¹Èo×NcÑNcô
Ðô �z Q•Ö'ˆAÜ*/¯+ª+Ø•˜rÑ! 2 x¥{×'9Ñ'9¸!¸X½[×=NÑ=NÐSTÐ=NÓ=UÓ'Vó+ˆH˜˜8�;Ð&Ñ'ô +0¯+ª+Ø•˜rÑ! 2 x¥{×'9Ñ'9¸!¸X½[×=NÑ=NÐSTÐ=NÓ=UÓ'Vó+ˆH˜˜8�;Ð&Ñ'ð 3CÕ2EÐ  8¥;Ð.Ñ/Ø2BÕ2EÐ  8¥;Ð.Ó/ñ (ð Ð)Ð)r+   c                ó  <€ V ^8„  d   QhRS[ P                  RS[ P                  RS[RS[RS[ P                  R,          RS[R,          RS[R,          R	S[S[ P                  S[ P                  S[ P                  S[S[3,          /# )
r   r   rà   rX  rY  r   Nrá   rJ   rK   )r"   rM   rz   rN   r%   )r&   r'   s   "€r(   r)   rd  ­  sš   ø€ ÷ q
ñ q
á—<‘<ðq
ñ —\‘\ðq
ñ ð	q
ñ
 ðq
ñ �l‰l˜TÕ!ðq
ñ   $�;ðq
ñ # T�kðq
ñ 
‰u�|‰|™UŸ\™\©5¯<©<¹ÁÐEÕ	Fñq
r+   c           
     ó(  a'€ V'       d   RMR pV'       d   RMR p	VP                   ^,          ^ 8X  dU   VP                   R R p
VP                  V
R\        P                  R7      VP	                  V
4      VP	                  V
4      VV	3# VP
                  pVP                   w  rÍrí\        P                  ! VP                  VR4      ^R7      pVP                  V^,          V^4      pVe   VP                  V^,          V4      MR pVP                  V^,          WàP                  4      p\        P                  ! V^,          VR7      p\        WV4      pV P                  W!VR7      w  ppV^ ,          pV P                  ^ 8„  pV P                  ^ 8„  p. p. p. p. p. p\        P                  ! ^ WëR7      P                  V^,          R4      p\        P                  ! V4      p\!        V P"                  4       EFõ  pVe"   \%        V P&                  VR,          VRR7      pM8\        P(                  ! WÂP+                  4       R,          3VP
                  R7      pV P,                  V,          ! VVVVVR7      pVw  pppV'       d
   VV,           pV'       d
   V	V,           p	V'       Ed   VV P"                  ^,
          8  d/   V P.                  V,          ! V4      p V P1                  V VW_R7      p!M&\        P(                  ! V\        P2                  R7      p!\        P4                  ! V!4      '       Edx   V!P7                  ^4      o'VS',          p"V P9                  W%VS'R	7      w  p#p$VP;                  \=        V"4      4       VP;                  \=        V#4      4       VP;                  \=        V$4      4       V'       dC   VP;                  \=        VS',          4      4       VP;                  \=        VS',          4      4       VV!( ,          p\>        ;QJ d)    . V'3R
 lW!^ ,          V^,          VV3 4       F  NK  	  5M"! V'3R
 lW!^ ,          V^,          VV3 4       4      w  pp%p&ppV%V&3pV'       d=   \>        ;QJ d    . V'3R lVVX 3 4       F  NK  	  5M! V'3R lVVX 3 4       4      w  ppp \        P@                  ! V!4      '       d    M,V'       g   EKÙ  V PC                  VVVVVX V4      w  r!pppEKø  	  V'       d;   V'       d3   V PE                  VVVVV4      w  ppppV PG                  VVVV4      w  ppMMV P9                  W%V P"                  ^,
          4      w  pp\        P                  ! V4      V P"                  ,          pVP                  V^V4      pVVVVV	3# )Nrl   rP   r  r„  F)r:   Úinputs_embedsrŠ   Úallow_is_bidirectional_skip)rŠ   rJ   rá   )r‹  )r”  c              3   ó8   <"  € T F  pVS( ,          x € K  	  R # 5irÓ   r,   ©r¢  r\  r”  s   & €r(   r¥  ÚALightGlueForKeypointMatching._match_image_pair.<locals>.<genexpr>  s#   øé € ð Vá&d˜Fð  ˜|×,Ò,Û&dùó   ƒc              3   ó8   <"  € T F  pVS( ,          x € K  	  R # 5irÓ   r,   rÒ  s   & €r(   r¥  rÓ  #  s'   øé € ð lñ+ ð # K <×0Ò0ó+ùrÔ  r,   rR   )r|   :r   rb   Nr|   rc   )$r}   rü   r"   rz   Ú	new_zerosr  r�  r   rj  rB  r`  r‡  rn  ro  r~   Ú	ones_likert  rl  r	   r:   rŽ  r]  ru  rw  r‘  rN   ÚanyrS   r•  ÚextendÚlistr%   Úallr³  rÁ  rË  )(rF   r   rà   rX  rY  r   rá   rJ   rå   ræ   r}   r  rç   rH  Úinitial_num_keypointsÚnum_points_per_pairÚimage_indicesr†  Údo_early_stopÚdo_keypoint_pruningr¼  r   r   r½  r¾  Úpruned_keypoints_indicesÚpruned_keypoints_iterationsr|  Úextended_attention_maskÚlayer_outputr    Ú	attentionrŠ  r�  Úearly_stopped_image_indicesÚearly_stopped_matchesÚearly_stopped_matching_scoresÚkeypoints_0Ú
keypoint_1r”  s(   &&&&&&&&                               @r(   Ú_match_image_pairÚ.LightGlueForKeypointMatching._match_image_pair­  s¦  ø€ ÷ #7™B¸DÐß0™°dˆà�?‰?˜1Õ Ô"Ø—O‘O C RÐ(ˆEà×"Ñ" 5¨"´E·I±IÐ"Ó>Ø×#Ñ# EÓ*Ø×#Ñ# EÓ*Ø!Øðð ð ×!Ñ!ˆØ2;·/±/Ñ/ˆ
Ð,Ü#Ÿiši¨¯©°ZÀÓ(DÈ!ÔLÐà×%Ñ% j°1¥nÐ6KÈQÓOˆ	ØFJÒFVˆt�|‰|˜J¨�NÐ,AÔBÐ\`ˆØ!×)Ñ)¨*°q­.Ð:O×QvÑQvÓwˆÜŸš Z°!¥^¸FÔCˆä'¨	¸5ÓAˆ	à04×0IÑ0IØÐ9Mð 1Jó 1
Ñ-ˆÐ-ð -¨QÕ/ˆ	ð ×-Ñ-°Ñ1ˆð #×3Ñ3°aÑ7Ðà ÐØˆØˆØ)+Ð&Ø,.Ð)ä#(§<¢<°Ð3HÔ#X×#_Ñ#_Ð`jÐmnÕ`nÐprÓ#sÐ Ü&+§o¢oÐ6NÓ&OÐ#ä  §¡×1ˆKØÒÜ*CØŸ;™;Ø"-¨iÕ"8Ø#'à05ô+Ñ'ô +0¯*ª*°j×BRÑBRÓBTÐUWÕBXÐ5YÐbk×brÑbrÔ*sÐ'à×2Ñ2°;Ö?ØØØ6Ø%9Ø"3ôˆLð 5AÑ1ˆK˜¨	ß#Ø$5¸Õ$EÐ!ß Ø!/°)Õ!;�çˆ}Ø §¡°1Õ!4Ô4à+/×+@Ñ+@ÀÖ+MÈkÓ+ZÐ(ð +/×*MÑ*MØ,¨k¸4ð +Nó +Ñ'ô
 +0¯*ª*°ZÄuÇzÁzÔ*RÐ'ä—9’9Ð0×1Ó1ð #6×"GÑ"GÈÓ"J�KØ2?ÀÕ2LÐ/ØKO×KfÑKfØ#¨;À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ÔPUô Và'2¸aµLÀ)ÈAÅ,ÐPTÐVcÑ&dóV×PUÑPUô Và'2¸aµLÀ)ÈAÅ,ÐPTÐVcÑ&dóVó QÑM�K ¨j¸$Àð "-¨jÐ 9�Iß*ßfkÔfkô lð !9Ø ;Ø 4ñ+ól×fkÑfkô lð !9Ø ;Ø 4ñ+óló gÑcÐ0Ð2MÐOcô —9’9Ð0×1Ò1Ùç"Ò"ð ×3Ñ3Ø#Ø!ØØ0Ø3Ø,Ø#óñ d�Ð(@À$ÓHcñ] 2÷t ×0ð ×2Ñ2Ø'Ø2Ø5ØØ#óñ hÐ*Ð,MÈwÐXgð (,×'FÑ'FØ.ØØØ%ó	(Ñ$ˆG‘_ð (,×'BÑ'BÀ;ÐVZ×VeÑVeÐhiÕViÓ'jÑ$ˆG�_Ü05·²ÀÓ0PÐSW×SbÑSbÕ0bÐ-à,M×,UÑ,UØ˜Ð0ó-
Ð)ð
 ØØ-ØØð
ð 	
r+   c                óš   <€ V ^8„  d   QhRS[ P                  RS[ P                  R,          RS[R,          RS[R,          RS[S[,          /# )r   r3  ÚlabelsNrá   rJ   rK   )r"   r#   Ú
LongTensorrN   r%   r   )r&   r'   s   "€r(   r)   rd  b  s\   ø€ ÷ 4
ñ 4
á×'Ñ'ð4
ñ × Ñ  4Õ'ð4
ñ   $�;ð	4
ñ
 # T�kð4
ñ 
Ñ0Õ	0ñ4
r+   c                ó  € R pVe   \        R4      hVe   TMV P                  P                  pVe   TMV P                  P                  pVP                  ^8w  g   VP                  ^4      ^8w  d   \        R4      hVP                  w  rxršpVP                  V^,          WšV4      pV P                  V4      pVR,          w  rØrïVP                  V^R^4      P                  V4      pVP                  V^RV P                  4      P                  V4      pVP                  V^R4      pVP                  4       pVR,          V,          VR&   VR,          V
,          VR&   V P                  VVV
VVVVR7      w  ppppp\        VVVVVVVVR7      # )	Nz9LightGlue is not trainable, no labels should be provided.zOInput must be a 5D tensor of shape (batch_size, 2, num_channels, height, width):Né   N)r   rá   rJ   )r   r   r   r   r   r   r    r!   rR   )r|   r|   r|   r   )r|   r|   r|   rb   )Ú
ValueErrorr:   rá   rJ   Úndimr]  r}   r   rh  rp   rj  Úclonerë  r   )rF   r3  rî  rá   rJ   r�   r   rç   rH  ÚchannelsrX  rY  Úkeypoint_detectionsr   rà   r   Úabsolute_keypointsr   r   r   r    r!   s   &&&&&,                r(   r[   Ú$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Ñ.ˆ
�x¨Ø#×+Ñ+¨J¸­N¸HÈeÓTˆØ"×4Ñ4°\ÓBÐà*=¸bÕ*AÑ'ˆ	�kØ×%Ñ% j°!°R¸Ó;×>Ñ>¸|ÓLˆ	Ø!×)Ñ)¨*°a¸¸T×=bÑ=bÓc×fÑfÐgsÓtˆØ�|‰|˜J¨¨2Ó.ˆà&Ÿ_™_Ó.ÐØ);¸JÕ)GÈ%Õ)OÐ˜:Ñ&Ø);¸JÕ)GÈ&Õ)PÐ˜:Ñ&àEI×E[ÑE[ØØØØØØ/Ø!5ð F\ó F
ÑBˆ� %¨¸
ô /ØØØ+ØØØØ'Ø!ô	
ð 		
r+   )rn  rB   rm  rp  rh  rj  rv  rl  rr  rw  ru  ro  r]   rÓ   )NNN)r-   r.   r/   r0   r1   r@   r€  r‡  r‘  r•  r›  r³  rÁ  rË  rë  r   r   r[   r3   r4   r_   r`   s   @@r(   rb  rb  â  s“   ù‡ € ñ÷ó ÷<(ð (÷
?ò ?÷#ð #ô&(÷ð ÷#_ð #_òJk÷@#*ð #*÷Jq
ò q
ðf Ø÷4
ñ 4
ó ó ÷4
ð 4
r+   rb  )rb   )r¶   )0Ú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   rŽ   r7   rj   rv   r„   r�   rŸ   rÃ   rÖ   r  r  r&  r1  rV  r`  rb  Ú__all__r,   r+   r(   Ú<module>r     sB  ðõ( %Ý !ã Û Ý Ý +å !Ý 6Ý Bß FÝ &ß VÓ VÝ >Ý 4ñ ðôð ô 7 kó  7ó óð 7ôF §¡ô ò"ô<õ8	U÷%ô2D)˜Ÿ™ô D)ôN�2—9‘9ô ô"P> §	¡	ô P>õfô& B§I¡Iô &ôR	 B§I¡Iô 	ð ô˜ó ó ðõ$õ@ñ, ðôô
o
Ð#;ó o
óð
o
ðd &Ð'EÐ
F‚r+   