+
    œ°³jc§  ã                   óx  € ^ 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 ^R
IHtHt ^RIHt ^RIHtHtHtHtHt ^RIHt ^RIH t  ^RI!H"t"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/H0t0H1t1 ^RI2H3t3 ]Ph                  ! ]54      t6]! RR7      ] ! R R]4      4       4       t7]! RR7      ] ! R R]4      4       4       t8 ! R R ]14      t9 ! R! R"]04      t:] ! R=R#7       ! R$ R%].4      4       t; ! R& R']	Px                  4      t=] ! R( R)]+4      4       t> ! R* R+]'4      t? ! R, R-]	Px                  4      t@R. R/ ltA ! R0 R1]	Px                  4      tB ! R2 R3]	Px                  4      tC] ! R4 R5]4      4       tDR6 R7 ltER8 R9 ltF]! R:R7       ! R; R<]D4      4       tG. R>OtHR# )?é    )ÚCallable)Ú	dataclassN)Ústrict)Únn©Úpad_sequence)ÚPreTrainedConfig)Úcreate_bidirectional_mask)ÚFlashAttentionKwargs)ÚALL_ATTENTION_FUNCTIONSÚPreTrainedModel)ÚUnpack)ÚModelOutputÚ
TensorTypeÚauto_docstringÚcan_return_tupleÚlogging)Úno_inherit_decorator)Úrequires)ÚCONFIG_MAPPINGÚ
AutoConfig)ÚAutoModelForKeypointDetection)ÚCLIPMLP)Úapply_rotary_pos_emb)ÚLlamaAttentionÚeager_attention_forward)ÚSuperGlueImageProcessorPil)ÚSuperGlueImageProcessorÚSuperGlueImageProcessorKwargs)ÚSuperPointConfigzETH-CVG/lightglue_superpoint)Ú
checkpointc                   ó„   a a€ ] tR t^,t oRtRtR]/tRtRt	^	t
^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3R ltRtVtV ;t# )ÚLightGlueConfigaó  
keypoint_detector_config (`Union[AutoConfig, dict]`,  *optional*, defaults to `SuperPointConfig`):
    The config object or dictionary of the keypoint detector.
descriptor_dim (`int`, *optional*, defaults to 256):
    The dimension of the descriptors.
depth_confidence (`float`, *optional*, defaults to 0.95):
    The confidence threshold used to perform early stopping
width_confidence (`float`, *optional*, defaults to 0.99):
    The confidence threshold used to prune points
filter_threshold (`float`, *optional*, defaults to 0.1):
    The confidence threshold used to filter matches

Examples:
    ```python
    >>> from transformers import LightGlueConfig, LightGlueForKeypointMatching

    >>> # Initializing a LightGlue style configuration
    >>> configuration = LightGlueConfig()

    >>> # Initializing a model from the LightGlue style configuration
    >>> model = LightGlueForKeypointMatching(configuration)

    >>> # Accessing the model configuration
    >>> configuration = model.config
    ```
Ú	lightglueÚkeypoint_detector_configNé   gffffffî?g®Gáz®ï?çš™™™™™¹?g{®Gáz”?Úgeluç        Tc                ó  <€ V P                   f   V P                  V n         \        V P                  \        4      '       db   V P                  P                  RR4      V P                  R&   \        V P                  R,          ,          ! R/ V P                  BRR/B V n        M'V P                  f   \        R,          ! RR7      V n        V P                  ^,          V n        V P                  V n	        \        SV `,  ! R/ VB  R # )NÚ
model_typeÚ
superpointÚattn_implementationÚeager)r-   © )Únum_key_value_headsÚnum_attention_headsÚ
isinstancer%   ÚdictÚgetr   Údescriptor_dimÚintermediate_sizeÚhidden_sizeÚsuperÚ__post_init__)ÚselfÚkwargsÚ	__class__s   &,€Úp/home/luca/screen-checking/.venv/lib/python3.14/site-packages/transformers/models/lightglue/modular_lightglue.pyr9   ÚLightGlueConfig.__post_init__Z   sÝ   ø€ Ø×#Ñ#Ò+Ø'+×'?Ñ'?ˆDÔ$ô �d×3Ñ3´T×:Ò:Ø:>×:WÑ:W×:[Ñ:[Ð\hÐjvÓ:wˆD×)Ñ)¨,Ñ7Ü,:¸4×;XÑ;XÐYeÕ;fÖ,gñ -Ø×/Ñ/ñ-ØELò-ˆDÕ)ð ×*Ñ*Ò2Ü,:¸<Ö,HÐ]dÔ,eˆDÔ)à!%×!4Ñ!4°qÕ!8ˆÔØ×.Ñ.ˆÔÜ‰ÒÑ' Ô'ó    c                ó`   € V P                   V P                  ,          ^ 8w  d   \        R4      hR# )zOPart of `@strict`-powered validation. Validates the architecture of the config.z1descriptor_dim % num_heads is different from zeroN)r5   r1   Ú
ValueError)r:   s   &r=   Úvalidate_architectureÚ%LightGlueConfig.validate_architecturel   s,   € à×Ñ ×!9Ñ!9Õ9¸QÔ>ÜÐPÓQÐQñ ?r?   c                óæ   <€ V ^8„  d   Qh/ S[ S[,          R,          ;R&   S[;R&   S[;R&   S[;R&   S[R,          ;R&   S[;R&   S[;R&   S[;R	&   S[;R
&   S[;R&   S[S[,          ;R&   S[;R&   # )é   Nr%   r5   Únum_hidden_layersr1   r0   Údepth_confidenceÚwidth_confidenceÚfilter_thresholdÚinitializer_rangeÚ
hidden_actÚattention_dropoutÚattention_bias)r3   r    ÚintÚfloatÚstrÚbool)ÚformatÚ__classdict__s   "€r=   Ú__annotate__ÚLightGlueConfig.__annotate__,   sÌ   ø‡ ‚ ñB #Ñ%5Õ5¸Õ<ÑCñC ñD ÑñE ñF ÑñG ñH Ñ ñI ñJ ˜t�Ñ*ñK ñL Ñ"ñM ñN Ñ"ñO ñP Ñ!ñQ ñR Ñ#ñS ñT ÑñU ñV ™s•{Ñ(ñW ñX ÑòY r?   )r7   r6   r%   r0   )Ú__name__Ú
__module__Ú__qualname__Ú__firstlineno__Ú__doc__r+   r   Úsub_configsr%   r5   rF   r1   r0   rG   rH   rI   rJ   rK   rL   rM   r9   rB   Ú__annotate_func__Ú__static_attributes__Ú__classdictcell__Ú__classcell__©r<   rS   s   @@r=   r#   r#   ,   ss   ù‡ € ñð6 €JØ-¨zÐ:€Kà?CÐØ€NØÐØ ÐØ&*ÐØ"ÐØ"ÐØ!ÐØ#ÐØ€JØ%(ÐØ€Nõ(ò$R÷A … r?   r#   aù  
    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^rt 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	&   # )
rE   NÚlossÚmatchesÚmatching_scoresÚ	keypointsÚpruneÚmaskÚhidden_statesÚ
attentions)ÚtorchÚFloatTensorÚ	IntTensorÚtuple)rR   rS   s   "€r=   rT   Ú,LightGlueKeypointMatchingOutput.__annotate__r   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 r?   r/   )rV   rW   rX   rY   rZ   re   rf   rg   rh   ri   rj   rk   rl   r\   r]   r^   ©rS   s   @r=   rc   rc   r   s<   ø‡ € ñð0 &*€DØ(,€GØ04€OØ*.€IØ$(€EØ%)€DØ59€MØ26€J÷U ƒ r?   rc   c                   ó   € ] tR t^ŸtRtR# )ÚLightGlueImageProcessorKwargsr/   N)rV   rW   rX   rY   r]   r/   r?   r=   rt   rt   Ÿ   s   † Ûr?   rt   c                   óB   a a€ ] tR t^£t oRV3R lV 3R llltRtVtV ;t# )ÚLightGlueImageProcessorc                óŠ   <€ V ^8„  d   QhRRRS[ S[S[,          ,          RS[RS[S[S[S[P                  3,          ,          /# )rE   Úoutputsrc   Útarget_sizesÚ	thresholdÚreturn)r   Úlistrp   rO   r3   rP   rm   ÚTensor)rR   rS   s   "€r=   rT   Ú$LightGlueImageProcessor.__annotate__¤   sU   ø€ ÷ Xñ Xà2ðXñ !¡4©¥;Õ.ðXñ ð	Xñ
 
‰d‘3™Ÿ™Ð$Õ%Õ	&ñXr?   c                ó$   <€ \         SV `  WV4      # ©N©r8   Úpost_process_keypoint_matching©r:   rx   ry   rz   r<   s   &&&&€r=   r‚   Ú6LightGlueImageProcessor.post_process_keypoint_matching¤   s   ø€ ô ‰wÑ5°gÈYÓWÐWr?   r/   ©r)   )rV   rW   rX   rY   r‚   r]   r^   r_   r`   s   @@r=   rv   rv   £   s   ù‡ € ÷X÷ Xõ Xr?   rv   ©Úbackendsc                   óZ   a a€ ] tR t^­t o]! RR7      RV3R lV 3R lll4       tRtVtV ;t# )ÚLightGlueImageProcessorPilr†   c                ót   <€ V ^8„  d   QhRRRS[ S[S[,          ,          RS[RS[S[S[R3,          ,          /# )rE   rx   rc   ry   rz   r{   ztorch.Tensor)r   r|   rp   rO   r3   rP   )rR   rS   s   "€r=   rT   Ú'LightGlueImageProcessorPil.__annotate__°   sQ   ø€ ÷ Xñ Xà2ðXñ !¡4©¥;Õ.ðXñ ð	Xñ
 
‰d‘3˜Ð&Õ'Õ	(ñXr?   c                ó$   <€ \         SV `  WV4      # r€   r�   rƒ   s   &&&&€r=   r‚   Ú9LightGlueImageProcessorPil.post_process_keypoint_matching¯   s   ø€ ô ‰wÑ5°gÈYÓWÐWr?   r/   ©rm   r…   )	rV   rW   rX   rY   r   r‚   r]   r^   r_   r`   s   @@r=   r‰   r‰   ­   s*   ù‡ € á�zÔ"÷Xô Xó #÷Xð Xr?   r‰   c                   óT   a a€ ] tR t^¹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# )ÚLightGluePositionalEncoderc                ó    <€ V ^8„  d   QhRS[ /# ©rE   Úconfig©r#   )rR   rS   s   "€r=   rT   Ú'LightGluePositionalEncoder.__annotate__º   s   ø€ ÷ lñ l™ñ lr?   c                ó¤   <€ \         SV `  4        \        P                  ! ^VP                  VP
                  ,          ^,          RR7      V n        R# )rE   F©ÚbiasN)r8   Ú__init__r   ÚLinearr5   r1   Ú	projector©r:   r“   r<   s   &&€r=   r™   Ú#LightGluePositionalEncoder.__init__º   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,          ,          /# )rE   rh   Úoutput_hidden_statesNr{   ©rm   r}   rQ   rp   )rR   rS   s   "€r=   rT   r•   ¾   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# )rE   ©Údiméÿÿÿÿ)r›   Úrepeat_interleaverm   ÚcosÚsin)r:   rh   rŸ   Úprojected_keypointsÚ
embeddingsÚcosinesÚsinesÚoutputs   &&&     r=   ÚforwardÚ"LightGluePositionalEncoder.forward¾   sl   € ð #Ÿn™n¨YÓ7ÐØ(×:Ñ:¸1À"Ð:ÓEˆ
Ü—)’)˜JÓ'ˆÜ—	’	˜*Ó%ˆØÐ%ˆ
ß6J�*Ð2ˆØˆð R\ÐP]ˆØˆr?   )r›   ©F©	rV   rW   rX   rY   r™   r­   r]   r^   r_   r`   s   @@r=   r�   r�   ¹   s    ù‡ € ÷ló l÷	÷ 	ò 	r?   r�   c                   óT   a a€ ] tR t^Ê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# )ÚLightGlueAttentionc                ó&   <€ V ^8„  d   QhRS[ RS[/# ©rE   r“   Ú	layer_idx©r#   rN   )rR   rS   s   "€r=   rT   ÚLightGlueAttention.__annotate__Ì   s   ø€ ÷ ñ ™ð ¹3ñ r?   c                ó(   <€ \         SV `  4        V =R # r€   )r8   r™   Ú
rotary_emb©r:   r“   rµ   r<   s   &&&€r=   r™   ÚLightGlueAttention.__init__Ì   s   ø€ Ü‰ÑÔØŠOr?   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,          /# )	rE   rk   Úposition_embeddingsNÚattention_maskÚencoder_hidden_statesÚencoder_attention_maskr;   r{   )rm   r}   rp   r   r   )rR   rS   s   "€r=   rT   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# )NÚdropoutr)   Úscalingr¤   )ÚshapeÚhead_dimÚq_projÚviewÚ	transposeÚk_projÚv_projr   r   Úget_interfacer“   Ú_attn_implementationr   ÚtrainingrL   rÃ   ÚreshapeÚ
contiguousÚo_proj)r:   rk   r½   r¾   r¿   rÀ   r;   Úinput_shapeÚhidden_shapeÚquery_statesÚis_cross_attentionÚcurrent_statesÚcurrent_attention_maskÚ
key_statesÚvalue_statesr¦   r§   Úattention_interfaceÚattn_outputÚattn_weightss   &&&&&&,             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/   )NNNNr°   r`   s   @@r=   r²   r²   Ê   s   ù‡ € ÷ó ÷*)÷ *)ò *)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[ /# r’   r”   )rR   rS   s   "€r=   rT   ÚLightGlueMLP.__annotate__þ   s   ø€ ÷ Zñ Z™ñ Zr?   c                óÔ   <€ \         SV `  V4       \        P                  ! VP                  VP                  4      V n        \        P                  ! VP                  R R7      V n        R# )T)Úelementwise_affineN)r8   r™   r   rš   r6   Úfc1Ú	LayerNormÚ
layer_normrœ   s   &&€r=   r™   ÚLightGlueMLP.__init__þ   sG   ø€ Ü‰Ñ˜Ô Ü—9’9˜V×5Ñ5°v×7OÑ7OÓPˆŒÜŸ,š, v×'?Ñ'?ÐTXÔYˆŽr?   c                óN   <€ V ^8„  d   QhRS[ P                  RS[ P                  /# )rE   rk   r{   ©rm   r}   )rR   rS   s   "€r=   rT   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# r€   )rã   rå   Úactivation_fnÚfc2)r:   rk   s   &&r=   r­   ÚLightGlueMLP.forward  sB   € ØŸ™ Ó/ˆØŸ™¨Ó6ˆØ×*Ñ*¨=Ó9ˆØŸ™ Ó/ˆØÐ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¶   )rR   rS   s   "€r=   rT   Ú&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€   )r8   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,          /# )rE   Údescriptorsrh   r¾   rŸ   NÚoutput_attentionsr{   r    )rR   rS   s   "€r=   rT   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ù   r¢   )r¿   rÀ   rù   r/   r¤   )	rÄ   rò   rm   Úcatró   rÎ   Úfliprô   rõ   )r:   rø   rh   r¾   rŸ   rù   Úall_hidden_statesÚall_attentionsÚ
batch_sizeÚnum_keypointsr5   Ú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                  /# )rE   Ú
similarityÚmatchability0Úmatchability1r{   rè   )rR   s   "r=   rT   rT   ^  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 similarityºNNNNr¤   éþÿÿÿ)	rÄ   r   Ú
functionalÚ
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  ^  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	# )	ÚLightGlueMatchAssignmentLayerim  c                ó    <€ V ^8„  d   QhRS[ /# r’   r”   )rR   rS   s   "€r=   rT   Ú*LightGlueMatchAssignmentLayer.__annotate__n  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)r8   r™   r5   r   rš   Úfinal_projectionÚmatchabilityrœ   s   &&€r=   r™   Ú&LightGlueMatchAssignmentLayer.__init__n  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                  /# )rE   rø   rj   r{   rè   )rR   rS   s   "€r=   rT   r#  u  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  é   r¤   r  )rÄ   r%  rm   Úfullr5   r+  rÎ   rÈ   Ú	unsqueezeÚmasked_fillÚfinfoÚdtypeÚminr&  r  )r:   rø   rj   rÿ   r   r5   Úm_descriptorsÚm_descriptors0Úm_descriptors1r  Úmask0Úmask1r&  Úmatchability_0Úmatchability_1r  s   &&&             r=   r­   Ú%LightGlueMatchAssignmentLayer.forwardu  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                  /# ©rE   rø   r{   rè   )rR   rS   s   "€r=   rT   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 probabilityr¤   )r&  r   r  Úsigmoidr  )r:   rø   r&  s   && r=   Úget_matchabilityÚ.LightGlueMatchAssignmentLayer.get_matchability�  s7   € à×(Ñ(¨Ó5ˆÜ—}‘}×,Ñ,¨\Ó:×BÑBÀ2ÓFˆØÐr?   )r5   r%  r&  )
rV   rW   rX   rY   r™   r­   rA  r]   r^   r_   r`   s   @@r=   r!  r!  m  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[ /# r’   r”   )rR   rS   s   "€r=   rT   Ú*LightGlueTokenConfidenceLayer.__annotate__—  s   ø€ ÷ 9ñ 9™ñ 9r?   c                óp   <€ \         SV `  4        \        P                  ! VP                  ^4      V n        R# )r.  N)r8   r™   r   rš   r5   Útokenrœ   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è   )rR   rS   s   "€r=   rT   rF  œ  s#   ø€ ÷ ñ ¡5§<¡<ð ±E·L±Lñ r?   c                ó    € V P                  VP                  4       4      p\        P                  P	                  V4      P                  R4      pV# )r.  r¤   )rH  Údetachr   r  r@  r  )r:   rø   rH  s   && r=   r­   Ú%LightGlueTokenConfidenceLayer.forwardœ  s=   € Ø—
‘
˜;×-Ñ-Ó/Ó0ˆÜ—‘×%Ñ% eÓ,×4Ñ4°RÓ8ˆØˆr?   )rH  r°   r`   s   @@r=   rD  rD  –  s   ù‡ € ÷9ó 9÷
÷ ð r?   rD  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.
r$   Úpixel_valuesFTc                ó&   <€ V ^8„  d   Qh/ S[ ;R&   # r’   r”   )rR   rS   s   "€r=   rT   Ú%LightGluePreTrainedModel.__annotate__¢  s   ø‡ ‚ ñ Ñò r?   r/   N)Úimage)rV   rW   rX   rY   rZ   Úbase_model_prefixÚmain_input_nameÚinput_modalitiesÚsupports_gradient_checkpointingÚ_supports_flash_attnÚ_supports_sdpar\   r]   r^   rr   s   @r=   rO  rO  ¢  s5   ø‡ € ñð $ÐØ$€OØ!ÐØ&+Ð#ØÐØ€N÷ ƒ r?   rO  c                óš   € V ^8„  d   QhR\         P                  R\        R\        \         P                  \         P                  3,          /# )rE   r  rz   r{   )rm   r}   rO   rp   )rR   s   "r=   rT   rT   ²  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*  r¤   )rÄ   ÚmaxÚindicesrm   Úaranger+  ÚgatherÚvaluesÚexpÚ
new_tensorÚwhereÚstackrÈ   rÎ   )r  rz   rÿ   Ú_Úmax0Úmax1Úmatches0Úmatches1Úindices0Úindices1Úmutual0Úmutual1ÚzeroÚmatching_scores0Úmatching_scores1Úvalid0Úvalid1rf   rg   s   &&                 r=   Úget_matches_from_scoresrs  ²  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                  /# )rE   rh   ÚheightÚwidthr{   ©rm   r}   rN   )rR   s   "r=   rT   rT   Ò  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+  r3  Nr¤   ).Nr  ).NN)rm   Útensorr+  r3  r\  r`  )rh   ru  rv  Ú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[ /# r’   r”   )rR   rS   s   "€r=   rT   Ú)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)r8   r™   r   Úfrom_configr%   Úkeypoint_detectorÚdescriptor_decoder_dimÚ keypoint_detector_descriptor_dimr5   rF   Ú
num_layersrI   rG   rH   r   rš   Úinput_projectionÚIdentityr�   Úpositional_encoderÚ
ModuleListÚrangerî   Útransformer_layersr!  Úmatch_assignment_layersrD  Útoken_confidenceÚ	post_init)r:   r“   Úire  r<   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[/# )rE   Úlayer_indexr{   )rN   rO   )rR   rS   s   "€r=   rT   r‚    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š™™™™™é?r'   g      À)Únpra  rˆ  Úclip)r:   r•  rz   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,          /# )rE   rø   rh   rŸ   Nr{   r    )rR   rS   s   "€r=   rT   r‚    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# )©rŸ   )rL  rÏ   r‰  r‹  )r:   rø   rh   rŸ   Ú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                  /# )rE   Úkeypoint_confidencesr•  rj   Ú
num_pointsr{   rw  )rR   rS   s   "€r=   rT   r‚  '  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      ð?r¢   ©r3  r¤   )rÄ   rˆ  r1  rÎ   r™  rO   ÚsumrG   rm   ÚonesrQ   )
r:   r£  r•  rj   r¤  rÿ   re  rz   Ú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€   )r�  rs  rI   )r:   rø   rj   r•  Úearly_stopsr  rf   rg   s   &&&&&   r=   Ú_get_keypoint_matchingÚ3LightGlueForKeypointMatching._get_keypoint_matching:  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                  /# )rE   Úconfidencesr  r•  r{   rw  )rR   rS   s   "€r=   rT   r‚  B  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)rH   r™  )r:   r²  r  r•  Úkeeps   &&&& r=   Ú_get_pruning_maskÚ.LightGlueForKeypointMatching._get_pruning_maskB  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[/# )rE   rø   rh   rj   r]  Úprune_outputr£  r•  rw  )rR   rS   s   "€r=   rT   r‚  I  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)Ú.0rz  Útrj   Úpruned_keypoints_masks   &   €r=   Ú	<genexpr>ÚJLightGlueForKeypointMatching._do_layer_keypoint_pruning.<locals>.<genexpr>]  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À  e  s"   é € ð S
á!j�ô ˜°D×9Ñ9Û!jùs   ‚T©rÂ  Úpadding_valuer¤   )	rÄ   r�  rA  rµ  r1  rm   rz  r�  r   )r:   rø   rh   rj   r]  r¸  r£  r•  rÿ   re  Údescriptors_matchabilityÚpruned_descriptorsÚpruned_keypoints_0Úpruned_keypoints_1Úpruned_maskÚpruned_indicesr’  Úpruned_keypointsr¾  s   &&&&&&&&          @r=   Ú_do_layer_keypoint_pruningÚ7LightGlueForKeypointMatching._do_layer_keypoint_pruningI  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Ä  Nr¤   r   ©r¼  rz  s   & r=   r¿  ÚMLightGlueForKeypointMatching._concat_early_stopped_outputs.<locals>.<genexpr>{  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Ò    s#   é € ð >
áN�ô ˜¨TÀ×CÑCÛNùrÓ  c              3   ó6   <"  € T F  pVS,          x € K  	  R # 5ir€   r/   )r¼  rz  Úearly_stops_indicess   & €r=   r¿  rÒ  ƒ  s&   øé € ð g
ñ�ð Ð&×'Ò'óùs   ƒ)rm   rd  r^  rÄ   )r:   rÖ  Úfinal_pruned_keypoints_indicesÚ!final_pruned_keypoints_iterationsrf   rg   ÚidsÚorder_indicess   &f&&&&  r=   Ú_concat_early_stopped_outputsÚ:LightGlueForKeypointMatching._concat_early_stopped_outputsn  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,          /# )rE   r]  rf   rg   r   r{   )rm   r}   rp   )rR   rS   s   "€r=   rT   r‚  Ž  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)rE   Nr¤   )rÎ   )r¼  rz  rÿ   s   & €r=   r¿  ÚJLightGlueForKeypointMatching._do_final_keypoint_pruning.<locals>.<genexpr>˜  s'   øé € ð -
ÙAd°v�N‰N˜:¨�?¨A¨r×2Ð2ÓAdùs   ƒ&)ry  )r4  r,  r-  r¤   )
rÄ   rm   r/  r+  r3  Úzerosr�  rc  r_  Úclamp)r:   r]  rf   rg   r   re  rj  rk  rh  ri  ro  rp  Ú_matchesÚ_matching_scoresr’  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,          /# )
rE   rh   rø   ru  rv  rj   Nrù   rŸ   r{   )rm   r}   rN   rQ   rp   )rR   rS   s   "€r=   rT   r‚  ³  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# )Nr¦  r¢   r*  r�  F)r“   Úinputs_embedsr¾   Úallow_is_bidirectional_skip)r¾   rŸ   rù   )r¤  )r®  c              3   ó8   <"  € T F  pVS( ,          x € K  	  R # 5ir€   r/   ©r¼  rz  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/   r¤   )r  :r   r.  Nr  r  )$rÄ   r  rm   rN   Ú	new_zerosr+  r§  rÎ   r‡  r^  r~  r   rG   rH   ÚexpandÚ	ones_liker�  rˆ  r
   r“   r¨  r{  rŽ  r�  r«  rQ   Úanyr¥   r¯  Úextendr|   rp   ÚallrÍ  rÛ  rå  )(r:   rh   rø   ru  rv  rj   rù   rŸ   rý   rþ   rÄ   r+  rÿ   re  Úinitial_num_keypointsÚnum_points_per_pairÚimage_indicesrŸ  Údo_early_stopÚdo_keypoint_pruningrÖ  rf   rg   r×  rØ  Úpruned_keypoints_indicesÚpruned_keypoints_iterationsr•  Úextended_attention_maskÚlayer_outputrk   Ú	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[,          /# )rE   rP  ÚlabelsNrù   rŸ   r{   )rm   rn   Ú
LongTensorrQ   rp   rc   )rR   rS   s   "€r=   rT   r‚  h  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)rj   rù   rŸ   )re   rf   rg   rh   ri   rj   rk   rl   r¤   )r  r  r  r   )r  r  r  r.  )rA   r“   rù   rŸ   Úndimr{  rÄ   rÎ   r…  Útor‡  Úcloner  rc   )r:   rP  r  rù   rŸ   r;   re   rÿ   re  Úchannelsru  rv  Úkeypoint_detectionsrh   rø   rj   Úabsolute_keypointsrf   rg   ri   rk   rl   s   &&&&&,                r=   r­   Ú$LightGlueForKeypointMatching.forwardf  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?   )rG   r5   rI   r‰  r…  r‡  r�  rˆ  r‹  r�  rŽ  rH   r¯   r€   )NNN)rV   rW   rX   rY   rZ   r™   r™  r   r«  r¯  rµ  rÍ  rÛ  rå  r  r   r   r­   r]   r^   r_   r`   s   @@r=   r€  r€  è  s“   ù‡ € ñ÷ó ÷<(ð (÷
?ò ?÷#ð #ô&(÷ð ÷#_ð #_òJk÷@#*ð #*÷Jq
ò q
ðf Ø÷4
ñ 4
ó ó ÷4
ð 4
r?   r€  rŽ   )rO  r€  r#   rv   r‰   )IÚcollections.abcr   Údataclassesr   Únumpyr—  rm   Úhuggingface_hub.dataclassesr   r   Útorch.nn.utils.rnnr   Úconfiguration_utilsr	   Úmasking_utilsr
   Úmodeling_flash_attention_utilsr   Úmodeling_utilsr   r   Úprocessing_utilsr   Úutilsr   r   r   r   r   Úutils.genericr   Úutils.import_utilsr   Úautor   r   Úauto.modeling_autor   Úclip.modeling_clipr   Úcohere.modeling_coherer   Úllama.modeling_llamar   r   Ú(superglue.image_processing_pil_supergluer   Ú$superglue.image_processing_supergluer   r   r,   r    Ú
get_loggerrV   Úloggerr#   rc   rt   rv   r‰   ÚModuler�   r²   rÞ   rî   r  r!  rD  rO  rs  r~  r€  Ú__all__r/   r?   r=   Ú<module>r+     sÊ  ðõ %Ý !ã Û Ý .Ý Ý +å 3Ý 6Ý Bß FÝ &ß WÕ WÝ 1Ý *ß -Ý >Ý (Ý 9ß JÝ Qß iÝ )ð 
×	Ò	˜HÓ	%€ñ Ð9Ô:ØôARÐ&ó ARó ó ;ðARñH ðôð ô 7 kó  7ó óð 7ôF	Ð$Aô 	ôXÐ5ô Xñ 
�:ÔôXÐ!;ó Xó ðXô §¡ô ð" ô/)˜ó /)ó ð/)ôd�7ô ôP> §	¡	ô P>õfô& B§I¡Iô &ôR	 B§I¡Iô 	ð ô˜ó ó ðõ$õ@ñ, ðôô
o
Ð#;ó o
óð
o
òd‚r?   