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

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

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

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

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

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