§
    ‚Štj�§  ã                   ól  — 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 ddlmZmZ ddlmZ ddlmZmZmZmZ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' ddl(m)Z) ddl*m+Z+m,Z, ddl-m.Z. ddl/m0Z0m1Z1 ddl2m3Z3  ej4        e5¦  «        Z6 ed¬¦  «        e G d„ de¦  «        ¦   «         ¦   «         Z7 ed¬¦  «        e G d„ d e¦  «        ¦   «         ¦   «         Z8 G d!„ d"e1¦  «        Z9 G d#„ d$e0¦  «        Z: e d%¬&¦  «         G d'„ d(e.¦  «        ¦   «         Z; G d)„ d*e	j<        ¦  «        Z=e G d+„ d,e+¦  «        ¦   «         Z> G d-„ d.e'¦  «        Z? G d/„ d0e	j<        ¦  «        Z@d1ejA        d2ejA        d3ejA        d4ejA        fd5„ZB G d6„ d7e	j<        ¦  «        ZC G d8„ d9e	j<        ¦  «        ZDe G d:„ d;e¦  «        ¦   «         ZEd<ejA        d=eFd4eGejA        ejA        f         fd>„ZHd?ejA        d@eIdAeId4ejA        fdB„ZJ edC¬¦  «         G dD„ dEeE¦  «        ¦   «         ZKg dF¢ZLdS )Gé    )Ú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                   óö   ‡ — e Zd ZU dZdZdeiZdZee	z  dz  e
d<   dZee
d<   dZee
d<   d	Zee
d
<   dZedz  e
d<   dZee
d<   dZee
d<   dZee
d<   dZee
d<   dZee
d<   dZeez  e
d<   dZee
d<   ˆ fd„Zd„ Zˆ xZS )ÚLightGlueConfigaG  
    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é   Údescriptor_dimé	   Únum_hidden_layersé   Únum_attention_headsÚnum_key_value_headsgffffffî?Údepth_confidenceg®Gáz®ï?Úwidth_confidenceçš™™™™™¹?Úfilter_thresholdg{®Gáz”?Úinitializer_rangeÚgeluÚ
hidden_actç        Úattention_dropoutTÚattention_biasc                 ó¬  •— | j         €| j        | _         t          | j        t          ¦  «        rO| j                             dd¦  «        | j        d<   t          | j        d                  di | j        ¤ddi¤Ž| _        n"| j        €t          d         d¬¦  «        | _        | j        dz  | _        | j        | _	         t          ¦   «         j        di |¤Ž d S )NÚ
model_typeÚ
superpointÚattn_implementationÚeager)r<   r   © )r.   r-   Ú
isinstancer'   ÚdictÚgetr   r)   Úintermediate_sizeÚhidden_sizeÚsuperÚ__post_init__)ÚselfÚkwargsÚ	__class__s     €úm/var/www/html/CA-Chatbot/venv/lib/python3.11/site-packages/transformers/models/lightglue/modular_lightglue.pyrE   zLightGlueConfig.__post_init__Z   sø   ø€ ØÔ#Ð+Ø'+Ô'?ˆDÔ$õ �dÔ3µTÑ:Ô:ð 	fØ:>Ô:W×:[Ò:[Ð\hÐjvÑ:wÔ:wˆDÔ)¨,Ñ7Ý,:¸4Ô;XÐYeÔ;fÔ,gð -ð -ØÔ/ð-ð -ØELð-ð -ð -ˆDÔ)Ð)ð Ô*Ð2Ý,:¸<Ô,HÐ]dÐ,eÑ,eÔ,eˆDÔ)à!%Ô!4°qÑ!8ˆÔØÔ.ˆÔØ�‰ŒÔÐ'Ð' Ð'Ð'Ð'Ð'Ð'ó    c                 óJ   — | j         | j        z  dk    rt          d¦  «        ‚dS )zOPart of `@strict`-powered validation. Validates the architecture of the config.r   z1descriptor_dim % num_heads is different from zeroN)r)   r-   Ú
ValueError)rF   s    rI   Úvalidate_architecturez%LightGlueConfig.validate_architecturel   s/   € àÔ Ô!9Ñ9¸QÒ>Ð>ÝÐPÑQÔQÐQð ?Ð>rJ   )Ú__name__Ú
__module__Ú__qualname__Ú__doc__r:   r   Úsub_configsr'   r@   r"   Ú__annotations__r)   Úintr+   r-   r.   r/   Úfloatr0   r2   r3   r5   Ústrr7   r8   ÚboolrE   rM   Ú__classcell__©rH   s   @rI   r%   r%   ,   sG  ø€ € € € € € ðð ð6 €JØ-¨zÐ:€Kà?CÐ˜dÐ%5Ñ5¸Ñ<ÐCÐCÑCØ€N�CÐÐÑØÐ�sÐÐÑØ Ð˜Ð Ð Ñ Ø&*Ð˜˜t™Ð*Ð*Ñ*Ø"Ð�eÐ"Ð"Ñ"Ø"Ð�eÐ"Ð"Ñ"Ø!Ð�eÐ!Ð!Ñ!Ø#Ð�uÐ#Ð#Ñ#Ø€J�ÐÐÑØ%(Ð�u˜s‘{Ð(Ð(Ñ(Ø€N�DÐÐÑð(ð (ð (ð (ð (ð$Rð Rð Rð Rð Rð Rð RrJ   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                   ó  — 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)rN   rO   rP   rQ   r]   ÚtorchÚFloatTensorrS   r^   r_   r`   ra   Ú	IntTensorrb   rc   Útuplerd   r>   rJ   rI   r\   r\   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Ð6rJ   r\   c                   ó   — e Zd ZdS )ÚLightGlueImageProcessorKwargsN)rN   rO   rP   r>   rJ   rI   rj   rj   Ÿ   s   € € € € € Ø€DrJ   rj   c                   ól   ‡ — e Zd Z	 ddddeee         z  dedeeee	j
        f                  fˆ fd„Zˆ xZS )	ÚLightGlueImageProcessorr6   Úoutputsr\   Útarget_sizesÚ	thresholdÚreturnc                 óJ   •— t          ¦   «                              |||¦  «        S ©N©rD   Úpost_process_keypoint_matching©rF   rm   rn   ro   rH   s       €rI   rt   z6LightGlueImageProcessor.post_process_keypoint_matching¤   s!   ø€ õ ‰wŒw×5Ò5°g¸|ÈYÑWÔWÐWrJ   ©r6   )rN   rO   rP   r   Úlistrh   rU   r@   rV   re   ÚTensorrt   rX   rY   s   @rI   rl   rl   £   s–   ø€ € € € € ð
 ð	Xð Xà2ðXð ! 4¨¤;Ñ.ðXð ð	Xð
 
ˆd�3˜œÐ$Ô%Ô	&ðXð Xð Xð Xð Xð Xð Xð Xð Xð XrJ   rl   ©re   ©Úbackendsc                   ó†   ‡ — e Zd Z ed¬¦  «        	 ddddeee         z  dedeee	d	f                  fˆ fd
„¦   «         Z
ˆ xZS )ÚLightGlueImageProcessorPilry   rz   r6   rm   r\   rn   ro   rp   ztorch.Tensorc                 óJ   •— t          ¦   «                              |||¦  «        S rr   rs   ru   s       €rI   rt   z9LightGlueImageProcessorPil.post_process_keypoint_matching¯   s!   ø€ õ ‰wŒw×5Ò5°g¸|ÈYÑWÔWÐWrJ   rv   )rN   rO   rP   r   r   rw   rh   rU   r@   rV   rt   rX   rY   s   @rI   r}   r}   ­   s¬   ø€ € € € € à€X�zÐ"Ñ"Ô"ð
 ð	Xð Xà2ðXð ! 4¨¤;Ñ.ðXð ð	Xð
 
ˆd�3˜Ð&Ô'Ô	(ðXð Xð Xð Xð Xñ #Ô"ðXð Xð Xð Xð XrJ   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)rD   Ú__init__r   ÚLinearr)   r-   Ú	projector©rF   r�   rH   s     €rI   r…   z#LightGluePositionalEncoder.__init__º   sG   ø€ Ý‰Œ×ÒÑÔÐÝœ 1 fÔ&;¸vÔ?YÑ&YÐ]^Ñ&^ÐejÐkÑkÔkˆŒˆˆrJ   Fr`   Úoutput_hidden_statesNrp   c                 óÈ   — |                       |¦  «        }|                     dd¬¦  «        }t          j        |¦  «        }t          j        |¦  «        }||f}|r||fn|f}|S )Nr   éÿÿÿÿ©Údim)r‡   Úrepeat_interleavere   ÚcosÚsin)rF   r`   r‰   Úprojected_keypointsÚ
embeddingsÚcosinesÚsinesÚoutputs           rI   Úforwardz"LightGluePositionalEncoder.forward¾   st   € ð #Ÿnšn¨YÑ7Ô7ÐØ(×:Ò:¸1À"Ð:ÑEÔEˆ
Ý”)˜JÑ'Ô'ˆÝ”	˜*Ñ%Ô%ˆØ˜uÐ%ˆ
Ø6JÐ]�*Ð1Ð2Ð2ÐQ[ÐP]ˆØˆrJ   ©F)rN   rO   rP   r%   r…   re   rx   rW   rh   r–   rX   rY   s   @rI   r€   r€   ¹   s£   ø€ € € € € ðl˜ð lð lð lð lð lð lð
 LQð	ð 	Øœð	Ø=AÀD¹[ð	à	ˆuŒ|Ô	˜u U¤\°5´<Ð%?Ô@Ñ	@ð	ð 	ð 	ð 	ð 	ð 	ð 	ð 	rJ   r€   c                   óð   ‡ — e 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 )ÚLightGlueAttentionr�   Ú	layer_idxc                 óL   •— t          ¦   «                              ¦   «          | `d S rr   )rD   r…   Ú
rotary_emb©rF   r�   rš   rH   s      €rI   r…   zLightGlueAttention.__init__Ì   s"   ø€ Ý‰Œ×ÒÑÔÐØˆOˆOˆOrJ   Nrc   Úposition_embeddingsÚattention_maskÚencoder_hidden_statesÚencoder_attention_maskrG   rp   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   r6   )ÚdropoutÚscaling)ÚshapeÚhead_dimÚq_projÚviewÚ	transposeÚk_projÚv_projr   r   Úget_interfacer�   Ú_attn_implementationr   Útrainingr7   r¥   ÚreshapeÚ
contiguousÚo_proj)rF   rc   rž   rŸ   r    r¡   rG   Ú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                       rI   r–   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Ð(Ð(rJ   )NNNN)rN   rO   rP   r%   rT   r…   re   rx   rh   r   r   r–   rX   rY   s   @rI   r™   r™   Ê   sû   ø€ € € € € ð˜ð ¸3ð ð ð ð ð ð ð IMØ.2Ø59Ø6:ð*)ð *)à”|ð*)ð # 5¤<°´Ð#=Ô>ÀÑEð*)ð œ tÑ+ð	*)ð
  %œ|¨dÑ2ð*)ð !&¤¨tÑ 3ð*)ð Ð-Ô.ð*)ð 
ˆuŒ|˜Uœ\¨DÑ0Ð0Ô	1ð*)ð *)ð *)ð *)ð *)ð *)ð *)ð *)rJ   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 )ÚLightGlueMLPr�   c                 óÒ   •— t          ¦   «                              |¦  «         t          j        |j        |j        ¦  «        | _        t          j        |j        d¬¦  «        | _        d S )NT)Úelementwise_affine)rD   r…   r   r†   rB   Úfc1Ú	LayerNormÚ
layer_normrˆ   s     €rI   r…   zLightGlueMLP.__init__þ   sR   ø€ Ý‰Œ×Ò˜Ñ Ô Ð Ý”9˜VÔ5°vÔ7OÑPÔPˆŒÝœ, vÔ'?ÐTXÐYÑYÔYˆŒˆˆrJ   rc   rp   c                 ó®   — |                       |¦  «        }|                      |¦  «        }|                      |¦  «        }|                      |¦  «        }|S rr   )rÂ   rÄ   Úactivation_fnÚfc2)rF   rc   s     rI   r–   zLightGlueMLP.forward  sN   € ØŸš Ñ/Ô/ˆØŸš¨Ñ6Ô6ˆØ×*Ò*¨=Ñ9Ô9ˆØŸš Ñ/Ô/ˆØÐrJ   ©	rN   rO   rP   r%   r…   re   rx   r–   rX   rY   s   @rI   r¿   r¿   ý   sq   ø€ € € € € ðZ˜ð Zð Zð Zð Zð Zð Zð
 U¤\ð °e´lð ð ð ð ð ð ð ð rJ   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 )ÚLightGlueTransformerLayerr�   rš   c                 óì   •— t          ¦   «                              ¦   «          t          ||¦  «        | _        t	          |¦  «        | _        t          ||¦  «        | _        t	          |¦  «        | _        d S rr   )rD   r…   r™   Úself_attentionr¿   Úself_mlpÚcross_attentionÚ	cross_mlpr�   s      €rI   r…   z"LightGlueTransformerLayer.__init__  s_   ø€ Ý‰Œ×ÒÑÔÐÝ0°¸ÑCÔCˆÔÝ$ VÑ,Ô,ˆŒÝ1°&¸)ÑDÔDˆÔÝ% fÑ-Ô-ˆŒˆˆrJ   FÚdescriptorsr`   rŸ   r‰   NÚoutput_attentionsrp   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ž   rŸ   rÑ   r‹   rŒ   r   r£   )r    r¡   rÑ   )	r¦   rÌ   re   ÚcatrÍ   r°   ÚfliprÎ   rÏ   )rF   rÐ   r`   rŸ   r‰   rÑ   Úall_hidden_statesÚall_attentionsÚ
batch_sizeÚnum_keypointsr)   Ú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                           rI   r–   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àÐ-¨~Ð=Ð=rJ   )FF)rN   rO   rP   r%   rT   r…   re   rx   rW   rh   r–   rX   rY   s   @rI   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>rJ   rÊ   Ú
similarityÚmatchability0Úmatchability1rp   c                 ó  — | 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‹   éþÿÿÿr   N)	r¦   r   Ú
functionalÚ
logsigmoidrª   Úlog_softmaxr±   Únew_fullÚsqueeze)
rä   rå   ræ   r×   Únum_keypoints_0Únum_keypoints_1ÚcertaintiesÚscores0Úscores1Úscoress
             rI   Úsigmoid_log_double_softmaxrô   ^  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�#ˆ:ÑØ€MrJ   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 )ÚLightGlueMatchAssignmentLayerr�   c                 óî   •— t          ¦   «                              ¦   «          |j        | _        t          j        | j        | j        d¬¦  «        | _        t          j        | j        dd¬¦  «        | _        d S )NTrƒ   r£   )rD   r…   r)   r   r†   Úfinal_projectionÚmatchabilityrˆ   s     €rI   r…   z&LightGlueMatchAssignmentLayer.__init__n  sf   ø€ Ý‰Œ×ÒÑÔÐà$Ô3ˆÔÝ "¤	¨$Ô*=¸tÔ?RÐY]Ð ^Ñ ^Ô ^ˆÔÝœI dÔ&9¸1À4ÐHÑHÔHˆÔÐÐrJ   rÐ   rb   rp   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‹   rè   )r¦   rø   re   Útensorr)   rü   r°   rª   Ú	unsqueezeÚmasked_fillÚfinfoÚdtypeÚminrù   rô   )rF   rÐ   rb   r×   rØ   r)   Úm_descriptorsÚm_descriptors0Úm_descriptors1rä   Úmask0Úmask1rù   Úmatchability_0Úmatchability_1ró   s                   rI   r–   z%LightGlueMatchAssignmentLayer.forwardu  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ˆØˆrJ   c                 ó”   — |                       |¦  «        }t          j                             |¦  «                             d¦  «        }|S )z0Get matchability of descriptors as a probabilityr‹   )rù   r   ré   Úsigmoidrí   )rF   rÐ   rù   s      rI   Úget_matchabilityz.LightGlueMatchAssignmentLayer.get_matchability�  s>   € à×(Ò(¨Ñ5Ô5ˆÝ”}×,Ò,¨\Ñ:Ô:×BÒBÀ2ÑFÔFˆØÐrJ   )
rN   rO   rP   r%   r…   re   rx   r–   r  rX   rY   s   @rI   rö   rö   m  s    ø€ € € € € ðI˜ð Ið Ið Ið Ið Ið Ið 5¤<ð °u´|ð ÈÌð ð ð ð ð4¨E¬Lð ¸U¼\ð ð ð ð ð ð ð ð rJ   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 )ÚLightGlueTokenConfidenceLayerr�   c                 ó†   •— t          ¦   «                              ¦   «          t          j        |j        d¦  «        | _        d S )Nr£   )rD   r…   r   r†   r)   Útokenrˆ   s     €rI   r…   z&LightGlueTokenConfidenceLayer.__init__—  s3   ø€ Ý‰Œ×ÒÑÔÐå”Y˜vÔ4°aÑ8Ô8ˆŒ
ˆ
ˆ
rJ   rÐ   rp   c                 ó¸   — |                       |                     ¦   «         ¦  «        }t          j                             |¦  «                             d¦  «        }|S )Nr‹   )r  Údetachr   ré   r  rí   )rF   rÐ   r  s      rI   r–   z%LightGlueTokenConfidenceLayer.forwardœ  sG   € Ø—
’
˜;×-Ò-Ñ/Ô/Ñ0Ô0ˆÝ”×%Ò% eÑ,Ô,×4Ò4°RÑ8Ô8ˆØˆrJ   rÈ   rY   s   @rI   r  r  –  sj   ø€ € € € € ð9˜ð 9ð 9ð 9ð 9ð 9ð 9ð
 5¤<ð °E´Lð ð ð ð ð ð ð ð rJ   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.
    r�   r&   Úpixel_values)ÚimageFTN)rN   rO   rP   rQ   r%   rS   Úbase_model_prefixÚmain_input_nameÚinput_modalitiesÚsupports_gradient_checkpointingÚ_supports_flash_attnÚ_supports_sdpar>   rJ   rI   r  r  ¢  sJ   € € € € € € ðð ð
 ÐÐÑØ#ÐØ$€OØ!ÐØ&+Ð#ØÐØ€N€N€NrJ   r  ró   ro   c                 ó`  — | 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   )r¦   ÚmaxÚindicesre   Úarangerü   ÚgatherÚvaluesÚexpÚ
new_tensorÚwhereÚstackrª   r°   )ró   ro   r×   Ú_Úmax0Úmax1Úmatches0Úmatches1Úindices0Úindices1Úmutual0Úmutual1ÚzeroÚmatching_scores0Úmatching_scores1Úvalid0Úvalid1r^   r_   s                      rI   Úget_matches_from_scoresr5  ²  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Ð#Ð#rJ   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)re   rý   rü   r  r  r"  )r`   r6  r7  ÚsizeÚshiftÚscales         rI   Ú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ØÐrJ   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
    r�   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 )NTrƒ   c                 ó2   •— g | ]}t          ‰|¬ ¦  «        ‘ŒS ))rš   )rÊ   )Ú.0Úir�   s     €rI   ú
<listcomp>z9LightGlueForKeypointMatching.__init__.<locals>.<listcomp>  s'   ø€ ÐeÐeÐeÀÕ& v¸Ð;Ñ;Ô;ÐeÐeÐerJ   c                 ó.   •— g | ]}t          ‰¦  «        ‘ŒS r>   )rö   ©rB  r'  r�   s     €rI   rD  z9LightGlueForKeypointMatching.__init__.<locals>.<listcomp>  s"   ø€ Ð\Ð\Ð\°qÕ*¨6Ñ2Ô2Ð\Ð\Ð\rJ   c                 ó.   •— g | ]}t          ‰¦  «        ‘ŒS r>   )r  rF  s     €rI   rD  z9LightGlueForKeypointMatching.__init__.<locals>.<listcomp>  s"   ø€ Ð`Ð`Ð`°qÕ*¨6Ñ2Ô2Ð`Ð`Ð`rJ   r£   )rD   r…   r   Úfrom_configr'   Úkeypoint_detectorÚdescriptor_decoder_dimÚ keypoint_detector_descriptor_dimr)   r+   Ú
num_layersr2   r/   r0   r   r†   Úinput_projectionÚIdentityr€   Úpositional_encoderÚ
ModuleListÚrangeÚtransformer_layersÚmatch_assignment_layersÚtoken_confidenceÚ	post_initrˆ   s    `€rI   r…   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^Ñ<_Ô<_Ð`Ñ`Ô`ñ!
ô !
ˆÔð 	�ŠÑÔÐÐÐrJ   Úlayer_indexrp   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š™™™™™é?r1   g      Àr   r£   )Únpr#  rL  Úclip)rF   rV  ro   s      rI   Ú_get_confidence_thresholdz6LightGlueForKeypointMatching._get_confidence_threshold  s;   € à˜#¥¤ t¨kÑ'9¸D¼OÑ'KÑ LÔ LÑLÑLˆ	ÝŒw�y ! QÑ'Ô'Ð'rJ   FrÐ   r`   r‰   Nc                 ó®   — |                      ¦   «                              ¦   «         }|                      |¦  «        }|                      ||¬¦  «        }||fS )N©r‰   )r  r±   rM  rO  )rF   rÐ   r`   r‰   Úprojected_descriptorsÚkeypoint_encoding_outputs         rI   Ú_keypoint_processingz1LightGlueForKeypointMatching._keypoint_processing  s[   € ð "×(Ò(Ñ*Ô*×5Ò5Ñ7Ô7ˆØ $× 5Ò 5°kÑ BÔ BÐØ#'×#:Ò#:¸9Ð[oÐ#:Ñ#pÔ#pÐ Ø$Ð&>Ð>Ð>rJ   Úkeypoint_confidencesrb   Ú
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      ð?rŒ   ©r  )r¦   rL  rÿ   r°   rZ  rU   Úsumr/   re   ÚonesrW   )
rF   r`  rV  rb   ra  r×   r'  ro   Úratio_confidentÚearly_stopped_pairss
             rI   Ú_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ÐØ"Ð"rJ   c                 óŒ   — |�||         }||         } | j         |         ||¦  «        }t          || j        ¦  «        \  }}||fS rr   )rS  r5  r2   )rF   rÐ   rb   rV  Úearly_stopsró   r^   r_   s           rI   Ú_get_keypoint_matchingz3LightGlueForKeypointMatching._get_keypoint_matching:  sW   € ØÐ"Ø% kÔ2ˆKØ˜Ô$ˆDØ:�Ô-¨kÔ:¸;ÈÑMÔMˆÝ#:¸6À4ÔCXÑ#YÔ#YÑ ˆ�Ø˜Ð'Ð'rJ   Úconfidencesró   c                 ó^   — |d| j         z
  k    }|�|||                      |¦  «        k    z  }|S )z#mask points which should be removedr£   )r0   rZ  )rF   rl  ró   rV  Úkeeps        rI   Ú_get_pruning_maskz.LightGlueForKeypointMatching._get_pruning_maskB  s<   € à˜˜TÔ2Ñ2Ò3ˆØÐ"Ø�K 4×#AÒ#AÀ+Ñ#NÔ#NÒNÑNˆDØˆrJ   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>   )rB  Útrb   s      rI   rD  zULightGlueForKeypointMatching._do_layer_keypoint_pruning.<locals>.<genexpr>.<listcomp>^  s    € ÐGÐGÐG™˜˜DˆQˆtŒWÐGÐGÐGrJ   N)Úzip)rB  rý   Úpruned_keypoints_masks     €rI   ú	<genexpr>zJLightGlueForKeypointMatching._do_layer_keypoint_pruning.<locals>.<genexpr>]  sY   øè è € ð c
ð c
àð HÐG¥C¨Ð0EÑ$FÔ$FÐGÑGÔGðc
ð c
ð c
ð c
ð c
ð c
rJ   r£   c              3   ó8   K  — | ]}t          |d ¬¦  «        V — ŒdS )T)Úbatch_firstNr   )rB  Úpruned_tensors     rI   rw  zJLightGlueForKeypointMatching._do_layer_keypoint_pruning.<locals>.<genexpr>e  sK   è è € ð S
ð S
àõ ˜°DÐ9Ñ9Ô9ðS
ð S
ð S
ð S
ð S
ð S
rJ   Tr‹   ©ry  Úpadding_value)	r¦   rS  r  ro  rÿ   re   rý   rQ  r   )rF   rÐ   r`   rb   r  rp  r`  rV  r×   r'  Údescriptors_matchabilityÚpruned_descriptorsÚpruned_keypoints_0Úpruned_keypoints_1Úpruned_maskÚpruned_indicesrC  Úpruned_keypointsrv  s                     @rI   Ú_do_layer_keypoint_pruningz7LightGlueForKeypointMatching._do_layer_keypoint_pruningI  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^Ð^Ð^rJ   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‹   r{  Nr   ©rB  rý   s     rI   rw  zMLightGlueForKeypointMatching._concat_early_stopped_outputs.<locals>.<genexpr>{  sE   è è € ð 3
ð 3
àõ ˜¨TÀÐDÑDÔDð3
ð 3
ð 3
ð 3
ð 3
ð 3
rJ   c              3   ó:   K  — | ]}t          |d d¬¦  «        V — ŒdS )Tr   r{  Nr   r‡  s     rI   rw  zMLightGlueForKeypointMatching._concat_early_stopped_outputs.<locals>.<genexpr>  sE   è è € ð >
ð >
àõ ˜¨TÀÐCÑCÔCð>
ð >
ð >
ð >
ð >
ð >
rJ   c              3   ó(   •K  — | ]}|‰         V — Œd S rr   r>   )rB  rý   Úearly_stops_indicess     €rI   rw  zMLightGlueForKeypointMatching._concat_early_stopped_outputs.<locals>.<genexpr>ƒ  sE   øè è € ð g
ð g
àð Ð&Ô'ðg
ð g
ð g
ð g
ð g
ð g
rJ   )re   r&  r   r¦   )rF   rŠ  Úfinal_pruned_keypoints_indicesÚ!final_pruned_keypoints_iterationsr^   r_   ÚidsÚorder_indicess    `      rI   Ú_concat_early_stopped_outputsz:LightGlueForKeypointMatching._concat_early_stopped_outputsn  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ÐjrJ   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)r°   )rB  rý   r×   s     €rI   rw  zJLightGlueForKeypointMatching._do_final_keypoint_pruning.<locals>.<genexpr>˜  sH   øè è € ð -
ð -
Ø7=ˆF�NŠN˜:¨™?¨A¨rÑ2Ô2ð-
ð -
ð -
ð -
ð -
ð -
rJ   r   r£   r   r‹   r9  )r  )
r¦   re   Úfullrü   r  ÚzerosrQ  r%  r!  Úclamp)rF   r  r^   r_   rØ   r'  r,  r-  r*  r+  r1  r2  Ú_matchesÚ_matching_scoresrC  r×   s                  @rI   Ú_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¤;Ð.Ñ/Ð/ØÐ)Ð)Ð)rJ   r6  r7  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‹   rc  r£   rŒ   rû   r\  c                  óB   — t          j        dt           j        ¬¦  «        S )NTrc  )re   rý   rW   )Úargss    rI   ú<lambda>z@LightGlueForKeypointMatching._match_image_pair.<locals>.<lambda>ò  s   € µE´LÀÍUÌZÐ4XÑ4XÔ4X€ rJ   )r�   Úinputs_embedsrŸ   Úand_mask_functionrè   )rŸ   r‰   rÑ   )ra  )rj  c              3   ó*   •K  — | ]}|‰          V — Œd S rr   r>   ©rB  rý   rj  s     €rI   rw  zALightGlueForKeypointMatching._match_image_pair.<locals>.<genexpr>#  sF   øè è € ð Vð Và"ð  ˜|Ô,ðVð Vð Vð Vð Vð VrJ   c              3   ó*   •K  — | ]}|‰          V — Œd S rr   r>   rŸ  s     €rI   rw  zALightGlueForKeypointMatching._match_image_pair.<locals>.<genexpr>)  sF   øè è € ð lð là &ð # K <Ô0ðlð lð lð lð lð lrJ   )$r¦   rì   re   rT   Ú	new_zerosrü   rd  r°   rK  r   r=  r_  r/   r0   ÚexpandÚ	ones_likerQ  rL  r   r�   re  r:  rR  rT  rh  rW   ÚanyrŽ   rk  Úextendrw   rh   Úallr„  r�  r—  )(rF   r`   rÐ   r6  r7  rb   rÑ   r‰   rÕ   rÖ   r¦   rü   r×   r'  Úinitial_num_keypointsÚnum_points_per_pairÚimage_indicesr^  Údo_early_stopÚdo_keypoint_pruningrŠ  r^   r_   r‹  rŒ  Úpruned_keypoints_indicesÚpruned_keypoints_iterationsrV  Úextended_attention_maskÚlayer_outputrc   Ú	attentionr`  rg  Úearly_stopped_image_indicesÚearly_stopped_matchesÚearly_stopped_matching_scoresÚkeypoints_0Ú
keypoint_1rj  s(                                          @rI   Ú_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ñ-
ô -
Ð)ð
 ØØ-ØØð
ð 	
rJ   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   )rb   rÑ   r‰   )r]   r^   r_   r`   ra   rb   rc   rd   )rL   r�   rÑ   r‰   Úndimr:  r¦   r°   rI  ÚtorK  Úcloner¶  r\   )rF   r  r·  rÑ   r‰   rG   r]   r×   r'  Úchannelsr6  r7  Úkeypoint_detectionsr`   rÐ   rb   Úabsolute_keypointsr^   r_   ra   rc   rd   s                         rI   r–   z$LightGlueForKeypointMatching.forwardf  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ˆ� %¨¸
õ /ØØØ+ØØØØ'Ø!ð	
ñ 	
ô 	
ð 		
rJ   r—   rr   )NNN)rN   rO   rP   rQ   r%   r…   rT   rU   rZ  re   rx   rW   rh   r_  rh  rk  ro  r„  r�  r—  r¶  r   r   rf   Ú
LongTensorr\   r–   rX   rY   s   @rI   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
rJ   r?  )r  r?  r%   rl   r}   )MÚcollections.abcr   Údataclassesr   ÚnumpyrX  re   Ú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_loggerrN   Úloggerr%   r\   rj   rl   r}   ÚModuler€   r™   r¿   rÊ   rx   rô   rö   r  r  rU   rh   r5  rT   r=  r?  Ú__all__r>   rJ   rI   ú<module>rÙ     s®  ðð %Ð $Ð $Ð $Ð $Ð $Ø !Ð !Ð !Ð !Ð !Ð !à Ð Ð Ð Ø €€€Ø .Ð .Ð .Ð .Ð .Ð .Ø Ð Ð Ð Ð Ð Ø +Ð +Ð +Ð +Ð +Ð +à 3Ð 3Ð 3Ð 3Ð 3Ð 3Ø 6Ð 6Ð 6Ð 6Ð 6Ð 6Ø BÐ BÐ BÐ BÐ BÐ BØ FÐ FÐ FÐ FÐ FÐ FÐ FÐ FØ &Ð &Ð &Ð &Ð &Ð &Ø WÐ WÐ WÐ WÐ WÐ WÐ WÐ WÐ WÐ WÐ WÐ WÐ WÐ WØ 1Ð 1Ð 1Ð 1Ð 1Ð 1Ø *Ð *Ð *Ð *Ð *Ð *Ø -Ð -Ð -Ð -Ð -Ð -Ð -Ð -Ø >Ð >Ð >Ð >Ð >Ð >Ø (Ð (Ð (Ð (Ð (Ð (Ø 9Ð 9Ð 9Ð 9Ð 9Ð 9Ø JÐ JÐ JÐ JÐ JÐ JÐ JÐ JØ QÐ QÐ QÐ QÐ QÐ QØ iÐ iÐ iÐ iÐ iÐ iÐ iÐ iØ )Ð )Ð )Ð )Ð )Ð )ð 
ˆÔ	˜HÑ	%Ô	%€ð €Ð9Ð:Ñ:Ô:ØðARð ARð ARð ARð ARÐ&ñ ARô ARñ „ñ ;Ô:ðARðH €ððñ ô ð ð 7ð  7ð  7ð  7ð  7 kñ  7ô  7ñ „ñô ð 7ðF	ð 	ð 	ð 	ð 	Ð$Añ 	ô 	ð 	ðXð Xð Xð Xð XÐ5ñ Xô Xð Xð 
€�:ÐÑÔðXð Xð Xð Xð XÐ!;ñ Xô Xñ ÔðXðð ð ð ð  ¤ñ ô ð ð" ð/)ð /)ð /)ð /)ð /)˜ñ /)ô /)ñ Ôð/)ðdð ð ð ð �7ñ ô ð ð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ð ð €€€rJ   