Ë
    ÜÓ^j�§  ã                   óT  — 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jh                  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	jx                  «      Z=e G d+„ d,e+«      «       Z> G d-„ d.e'«      Z? G d/„ d0e	jx                  «      Z@d1ej‚                  d2ej‚                  d3ej‚                  d4ej‚                  fd5„ZB G d6„ d7e	jx                  «      ZC G d8„ d9e	jx                  «      ZDe G d:„ d;e«      «       ZEd<ej‚                  d=eFd4eGej‚                  ej‚                  f   fd>„ZHd?ej‚                  d@eIdAeId4ej‚                  fdB„ZJ edC¬«       G dD„ dEeE«      «       ZKg dF¢ZLy)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        «      rX| j                  j                  dd«      | j                  d<   t        | j                  d      di | j                  ¤ddi¤Ž| _        n | j                  €t        d   d¬«      | _        | j                  dz  | _        | j                  | _	        t        ‰| �,  di |¤Ž y )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     €úz/var/www/ramen.bs-engineer-server.com/venv/lib/python3.12/site-packages/transformers/models/lightglue/modular_lightglue.pyrE   zLightGlueConfig.__post_init__Z   sÚ   ø€ Ø×#Ñ#Ð+Ø'+×'?Ñ'?ˆDÔ$ô �d×3Ñ3´TÔ:Ø:>×:WÑ:W×:[Ñ:[Ð\hÐjvÓ:wˆD×)Ñ)¨,Ñ7Ü,:¸4×;XÑ;XÐYeÑ;fÑ,gñ -Ø×/Ñ/ñ-ØELò-ˆDÕ)ð ×*Ñ*Ð2Ü,:¸<Ñ,HÐ]dÔ,eˆDÔ)à!%×!4Ñ!4°qÑ!8ˆÔØ×.Ñ.ˆÔÜ‰ÑÑ' Ó'ó    c                 óR   — | j                   | j                  z  dk7  rt        d«      ‚y)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Ñ9¸QÒ>ÜÐPÓ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%   ,   s¸   ø… ñð6 €JØ-¨zÐ:€Kà?CÐ˜dÐ%5Ñ5¸Ñ<ÓCØ€N�CÓØÐ�sÓØ Ð˜Ó Ø&*Ð˜˜t™Ó*Ø"Ð�eÓ"Ø"Ð�eÓ"Ø!Ð�eÓ!Ø#Ð�uÓ#Ø€J�ÓØ%(Ð�u˜s‘{Ó(Ø€N�DÓô(ö$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
<   y)ÚLightGlueKeypointMatchingOutputa¯  
    loss (`torch.FloatTensor` of shape `(1,)`, *optional*):
        Loss computed during training.
    matches (`torch.FloatTensor` of shape `(batch_size, 2, num_matches)`):
        Index of keypoint matched in the other image.
    matching_scores (`torch.FloatTensor` of shape `(batch_size, 2, num_matches)`):
        Scores of predicted matches.
    keypoints (`torch.FloatTensor` of shape `(batch_size, num_keypoints, 2)`):
        Absolute (x, y) coordinates of predicted keypoints in a given image.
    prune (`torch.IntTensor` of shape `(batch_size, num_keypoints)`):
        Pruning mask indicating which keypoints are removed and at which layer.
    mask (`torch.BoolTensor` of shape `(batch_size, num_keypoints)`):
        Mask indicating which values in matches, matching_scores, keypoints and prune are keypoint matching
        information.
    hidden_states (`Tuple[torch.FloatTensor, ...]`, *optional*):
        Tuple of `torch.FloatTensor` (one for the output of each stage) of shape `(batch_size, 2, num_channels,
        num_keypoints)` returned when `output_hidden_states=True` is passed or when
        `config.output_hidden_states=True`
    attentions (`Tuple[torch.FloatTensor, ...]`, *optional*):
        Tuple of `torch.FloatTensor` (one for each layer) of shape `(batch_size, 2, num_heads, num_keypoints,
        num_keypoints)` returned when `output_attentions=True` is passed or when
        `config.output_attentions=True`
    NÚlossÚmatchesÚmatching_scoresÚ	keypointsÚpruneÚmaskÚhidden_statesÚ
attentions)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Ø*.€Iˆu× Ñ  4Ñ'Ó.Ø$(€Eˆ5�?‰?˜TÑ!Ó(Ø%)€Dˆ%×
Ñ
˜dÑ
"Ó)Ø59€M�5˜×*Ñ*Ñ+¨dÑ2Ó9Ø26€J��e×'Ñ'Ñ(¨4Ñ/Ô6rJ   r\   c                   ó   — e Zd Zy)ÚLightGlueImageProcessorKwargsN)rN   rO   rP   r>   rJ   rI   rj   rj   Ÿ   s   „ ØrJ   rj   c                   ód   ‡ — 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 )ÚLightGlueImageProcessorÚoutputsr\   Útarget_sizesÚ	thresholdÚreturnc                 ó&   •— t         ‰| �  |||«      S ©N©rD   Úpost_process_keypoint_matching©rF   rm   rn   ro   rH   s       €rI   rt   z6LightGlueImageProcessor.post_process_keypoint_matching¤   s   ø€ ô ‰wÑ5°g¸|ÈYÓWÐWrJ   ©r6   )rN   rO   rP   r   Úlistrh   rU   r@   rV   re   ÚTensorrt   rX   rY   s   @rI   rl   rl   £   sZ   ø„ ð
 ñ	Xà2ðXð ! 4¨¡;Ñ.ðXð ð	Xð
 
ˆd�3˜Ÿ™Ð$Ñ%Ñ	&÷Xñ XrJ   rl   ©re   ©Úbackendsc                   óh   ‡ — 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   rm   r\   rn   ro   rp   ztorch.Tensorc                 ó&   •— t         ‰| �  |||«      S rr   rs   ru   s       €rI   rt   z9LightGlueImageProcessorPil.post_process_keypoint_matching¯   s   ø€ ô ‰wÑ5°g¸|ÈYÓWÐWrJ   rv   )rN   rO   rP   r   r   rw   rh   rU   r@   rV   rt   rX   rY   s   @rI   r}   r}   ­   sc   ø„ á�zÔ"ð
 ñ	Xà2ðXð ! 4¨¡;Ñ.ðXð ð	Xð
 
ˆd�3˜Ð&Ñ'Ñ	(ô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¬«      | _        y )Nr   F©Úbias)rD   Ú__init__r   ÚLinearr)   r-   Ú	projector©rF   r�   rH   s     €rI   r…   z#LightGluePositionalEncoder.__init__º   s:   ø€ Ü‰ÑÔÜŸ™ 1 f×&;Ñ&;¸v×?YÑ?YÑ&YÐ]^Ñ&^ÐejÔkˆ�rJ   r`   Úoutput_hidden_statesNrp   c                 óÀ   — | j                  |«      }|j                  dd¬«      }t        j                  |«      }t        j                  |«      }||f}|r||f}|S |f}|S )Nr   éÿÿÿÿ©Údim)r‡   Úrepeat_interleavere   ÚcosÚsin)rF   r`   r‰   Úprojected_keypointsÚ
embeddingsÚcosinesÚsinesÚoutputs           rI   Úforwardz"LightGluePositionalEncoder.forward¾   sq   € ð #Ÿn™n¨YÓ7ÐØ(×:Ñ:¸1À"Ð:ÓEˆ
Ü—)‘)˜JÓ'ˆÜ—	‘	˜*Ó%ˆØ˜uÐ%ˆ
Ù6J�*Ð1Ð2ˆØˆð R\ÐP]ˆØˆrJ   ©F)rN   rO   rP   r%   r…   re   rx   rW   rh   r–   rX   rY   s   @rI   r€   r€   ¹   s]   ø„ ð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                 ó&   •— t         ‰| �  «        | `y rr   )rD   r…   Ú
rotary_emb©rF   r�   rš   rH   s      €rI   r…   zLightGlueAttention.__init__Ì   s   ø€ Ü‰ÑÔØ‰OrJ   Nrc   Úposition_embeddingsÚattention_maskÚencoder_hidden_statesÚencoder_attention_maskrG   rp   c                 óê  — |j                   d d }g |¢d‘| j                  ‘­}| j                  |«      j                  |«      j	                  dd«      }	|d u}
|
r|n|}|
r|n|}| j                  |«      j                  |«      j	                  dd«      }| j                  |«      j                  |«      j	                  dd«      }|�|\  }}t        |	|||«      \  }	}t        j                  | j                  j                  t        «      } || |	|||f| j                  sdn| j                  | j                  dœ|¤Ž\  }} |j                   g |¢d‘­Ž j#                  «       }| j%                  |«      }||fS )Nr‹   é   r   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ˆà—{‘{ =Ó1×6Ñ6°|ÓD×NÑNÈqÐRSÓTˆà2¸$Ð>ÐÙ2DÑ.È-ˆÙ;MÑ!7ÐSaÐà—[‘[ Ó0×5Ñ5°lÓC×MÑMÈaÐQRÓSˆ
Ø—{‘{ >Ó2×7Ñ7¸ÓE×OÑOÐPQÐSTÓUˆàÐ*Ø*‰HˆC�Ü';¸LÈ*ÐVYÐ[^Ó'_Ñ$ˆL˜*ä(?×(MÑ(MØ�K‰K×,Ñ,Ô.Eó)
Ðñ %8ØØØØØ"ð	%
ð  $Ÿ}š}‘C°$×2HÑ2HØ—L‘Lñ	%
ð ñ	%
Ñ!ˆ�\ð *�k×)Ñ)Ð;¨;Ð;¸Ò;×FÑFÓHˆØ—k‘k +Ó.ˆØ˜LÐ(Ð(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                   ó\   ‡ — 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¬«      | _        y )NT)Úelementwise_affine)rD   r…   r   r†   rB   Úfc1Ú	LayerNormÚ
layer_normrˆ   s     €rI   r…   zLightGlueMLP.__init__þ   sG   ø€ Ü‰Ñ˜Ô Ü—9‘9˜V×5Ñ5°v×7OÑ7OÓPˆŒÜŸ,™, v×'?Ñ'?ÐTXÔYˆ�rJ   rc   rp   c                 óŽ   — | j                  |«      }| j                  |«      }| j                  |«      }| j                  |«      }|S rr   )rÂ   rÄ   Úactivation_fnÚfc2)rF   rc   s     rI   r–   zLightGlueMLP.forward  sB   € ØŸ™ Ó/ˆØŸ™¨Ó6ˆØ×*Ñ*¨=Ó9ˆØŸ™ Ó/ˆØÐrJ   ©	rN   rO   rP   r%   r…   re   rx   r–   rX   rY   s   @rI   r¿   r¿   ý   s,   ø„ ðZ˜õ Zð
 U§\¡\ð °e·l±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	        |«      | _        y rr   )rD   r…   r™   Úself_attentionr¿   Úself_mlpÚcross_attentionÚ	cross_mlpr�   s      €rI   r…   z"LightGlueTransformerLayer.__init__  sD   ø€ Ü‰ÑÔÜ0°¸ÓCˆÔÜ$ VÓ,ˆŒÜ1°&¸)ÓDˆÔÜ% fÓ-ˆ�rJ   Údescriptorsr`   rŸ   r‰   NÚoutput_attentionsrp   c                 óà  — |rdnd }|rdnd }|r||fz   }|j                   \  }}	}
| j                  ||||¬«      \  }}t        j                  ||gd¬«      }| j	                  |«      }||z   }|r||f}|j                  dd|	|
«      j                  d«      j                  ||	|
«      }|�6|j                  dddd|	«      j                  d«      j                  |dd|	«      nd }| j                  ||||¬«      \  }}t        j                  ||gd¬«      }| j                  |«      }||z   }|r6||f}||j                  ||	|
«      fz   z   |j                  ||	|
«      fz   |z   }|r
||fz   |fz   }|||fS )Nr>   )rž   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  s	  € ñ #7™B¸DÐÙ0™°dˆáØ 1°[°NÑ BÐà4?×4EÑ4EÑ1ˆ
�M >ð -1×,?Ñ,?ØØ )Ø)Ø/ð	 -@ó -
Ñ)Ð˜/ô $Ÿi™i¨Ð6FÐ(GÈRÔPÐØŸ™Ð&9Ó:ˆØ%0°=Ñ%@Ð"áØ,?ÀÐ+OÐ(ð '×.Ñ.¨r°1°mÀ^ÓTß‰T�!‹Wß‰W�Z °Ó?ð 	ð Ð)ð ×"Ñ" 2 q¨!¨Q°Ó>×CÑCÀAÓF×NÑNÈzÐ[\Ð^_ÐanÔoàð 	ð 48×3GÑ3GØ&Ø"7Ø#9Ø/ð	 4Hó 4
Ñ0ÐÐ 0ô %*§I¡IÐ/IÐKaÐ.bÐhjÔ$kÐ!Ø"Ÿn™nÐ-FÓGÐØ0Ð3FÑFˆáØ-FÐH[Ð,\Ð)à!Ø-×5Ñ5°jÀ-ÐQ_Ó`Ðbñcà.ñ/ð ×&Ñ& z°=À.ÓQÐSñTð 0ñ	0ð ñ Ø+¨Ð.@Ñ@ÐDTÐCVÑVˆNàÐ-¨~Ð=Ð=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>ð
 # T™kðH>ð   $™;ðH>ð 
ˆu�|‰|˜U 5§<¡<Ñ0°4Ñ7¸¸u¿|¹|Ñ9LÈtÑ9SÐSÑ	T÷H>rJ   rÊ   Ú
similarityÚmatchability0Úmatchability1rp   c                 óâ  — | j                   \  }}}t        j                  j                  |«      t        j                  j                  |«      j	                  dd«      z   }t        j                  j                  | d«      }t        j                  j                  | j	                  dd«      j                  «       d«      j	                  dd«      }| j                  ||dz   |dz   fd«      }	||z   |z   |	dd…d|…d|…f<   t        j                  j                  |j                  d«       «      |	dd…dd…df<   t        j                  j                  |j                  d«       «      |	dd…ddd…f<   |	S )z;create the log assignment matrix from logits and similarityr£   r   r‹   éþÿÿÿ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ô   ^  sS  € ð 4>×3CÑ3CÑ0€J� Ü—-‘-×*Ñ*¨=Ó9¼B¿M¹M×<TÑ<TÐUbÓ<c×<mÑ<mÐnoÐqrÓ<sÑs€KÜ�m‰m×'Ñ'¨
°AÓ6€GÜ�m‰m×'Ñ'¨
×(<Ñ(<¸RÀÓ(D×(OÑ(OÓ(QÐSTÓU×_Ñ_Ð`bÐdfÓg€GØ× Ñ  *¨oÀÑ.AÀ?ÐUVÑCVÐ!WÐYZÓ[€FØ4;¸gÑ4EÈÑ4S€FŠ1ÐˆÐÐ 0 Ð 0Ð0Ñ1ÜŸ™×1Ñ1°=×3HÑ3HÈÓ3LÐ2LÓM€FŠ1ˆcˆrˆc�2ˆ:ÑÜŸ™×1Ñ1°=×3HÑ3HÈÓ3LÐ2LÓM€FŠ1ˆb�#�2�#ˆ:ÑØ€MrJ   c                   ó¬   ‡ — e Zd Zdefˆ fd„Zdej                  dej                  dej                  fd„Zdej                  dej                  fd„Zˆ xZ	S )ÚLightGlueMatchAssignmentLayerr�   c                 óô   •— t         ‰| �  «        |j                  | _        t        j                  | j                  | j                  d¬«      | _        t        j                  | j                  dd¬«      | _        y )NTrƒ   r£   )rD   r…   r)   r   r†   Úfinal_projectionÚmatchabilityrˆ   s     €rI   r…   z&LightGlueMatchAssignmentLayer.__init__n  sY   ø€ Ü‰ÑÔà$×3Ñ3ˆÔÜ "§	¡	¨$×*=Ñ*=¸t×?RÑ?RÐY]Ô ^ˆÔÜŸI™I d×&9Ñ&9¸1À4ÔHˆÕrJ   rÐ   rb   rp   c                 óæ  — |j                   \  }}}| j                  |«      }|t        j                  | j                  |j
                  ¬«      dz  z  }|j                  |dz  d||«      }|d d …df   }|d d …df   }||j                  dd«      z  }	|�—|j                  |dz  d|«      }|d d …df   j                  d«      }
|d d …df   j                  d«      j                  dd«      }|
|z  }|	j                  |dk(  t        j                  |	j                  «      j                  «      }	| j                  |«      }|j                  |dz  d|d«      }|d d …df   }|d d …df   }t        |	||«      }|S )N©Údeviceg      Ð?r   r   r£   r‹   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Ñ4EÑ1ˆ
�M >à×-Ñ-¨kÓ:ˆØ%¬¯©°T×5HÑ5HÐQ^×QeÑQeÔ(fÐjnÑ(nÑnˆØ%×-Ñ-¨j¸A©o¸qÀ-ÐQ_Ó`ˆØ&¢q¨! tÑ,ˆØ&¢q¨! tÑ,ˆØ# n×&>Ñ&>¸rÀ2Ó&FÑFˆ
ØÐØ—<‘< 
¨a¡°°MÓBˆDØš˜A˜‘J×(Ñ(¨Ó,ˆEØš˜A˜‘J×(Ñ(¨Ó,×6Ñ6°r¸2Ó>ˆEØ˜5‘=ˆDØ#×/Ñ/°¸±	¼5¿;¹;Àz×GWÑGWÓ;X×;\Ñ;\Ó]ˆJð ×(Ñ(¨Ó5ˆØ#×+Ñ+¨J¸!©O¸QÀÈqÓQˆØ%¢a¨ dÑ+ˆØ%¢a¨ dÑ+ˆô ,¨J¸ÈÓWˆØˆrJ   c                 ó„   — | j                  |«      }t        j                  j                  |«      j	                  d«      }|S )z0Get matchability of descriptors as a probabilityr‹   )rù   r   ré   Úsigmoidrí   )rF   rÐ   rù   s      rI   Úget_matchabilityz.LightGlueMatchAssignmentLayer.get_matchability�  s7   € à×(Ñ(¨Ó5ˆÜ—}‘}×,Ñ,¨\Ó:×BÑBÀ2ÓFˆØÐrJ   )
rN   rO   rP   r%   r…   re   rx   r–   r  rX   rY   s   @rI   rö   rö   m  sR   ø„ ðI˜õ Ið 5§<¡<ð °u·|±|ð ÈÏÉó ð4¨E¯L©Lð ¸U¿\¹\÷ rJ   rö   c                   ó\   ‡ — e Zd Zdefˆ fd„Zdej                  dej                  fd„Zˆ xZS )ÚLightGlueTokenConfidenceLayerr�   c                 ól   •— t         ‰| �  «        t        j                  |j                  d«      | _        y )Nr£   )rD   r…   r   r†   r)   Útokenrˆ   s     €rI   r…   z&LightGlueTokenConfidenceLayer.__init__—  s&   ø€ Ü‰ÑÔä—Y‘Y˜v×4Ñ4°aÓ8ˆ�
rJ   rÐ   rp   c                 ó    — | j                  |j                  «       «      }t        j                  j	                  |«      j                  d«      }|S )Nr‹   )r  Údetachr   ré   r  rí   )rF   rÐ   r  s      rI   r–   z%LightGlueTokenConfidenceLayer.forwardœ  s=   € Ø—
‘
˜;×-Ñ-Ó/Ó0ˆÜ—‘×%Ñ% eÓ,×4Ñ4°RÓ8ˆØˆrJ   rÈ   rY   s   @rI   r  r  –  s*   ø„ ð9˜õ 9ð
 5§<¡<ð °E·L±L÷ rJ   r  c                   ó4   — e Zd ZU dZeed<   dZdZdZdZ	dZ
dZy)	ÚLightGluePreTrainedModelz†
    An abstract class to handle weights initialization and a simple interface for downloading and loading pretrained
    models.
    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  ¢  s1   … ñð
 ÓØ#ÐØ$€OØ!ÐØ&+Ð#ØÐØ�NrJ   r  ró   ro   c                 ó6  — | j                   \  }}}| dd…dd…dd…f   j                  d«      }| dd…dd…dd…f   j                  d«      }|j                  }|j                  }t        j                  |j                   d   |j
                  ¬«      d   }t        j                  |j                   d   |j
                  ¬«      d   }	||j                  d|«      k(  }
|	|j                  d|«      k(  }|j                  j                  «       }|j                  d«      }t        j                  |
||«      }t        j                  ||j                  d|«      |«      }|
||kD  z  }||j                  d|«      z  }t        j                  ||d«      }t        j                  ||d«      }t        j                  ||g«      j                  dd«      j                  |dz  d«      }t        j                  ||g«      j                  dd«      j                  |dz  d«      }||fS )z1obtain matches from a score matrix [Bx M+1 x N+1]Nr‹   r   r£   rû   r   )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™N¨1Ñ-°h·o±oÔFÀtÑL€HÜ�|‰|˜HŸN™N¨1Ñ-°h·o±oÔFÀtÑL€HØ˜(Ÿ/™/¨!¨XÓ6Ñ6€GØ˜(Ÿ/™/¨!¨XÓ6Ñ6€Gð �;‰;�?‰?Ó€DØ�?‰?˜1Ó€DÜ—{‘{ 7¨D°$Ó7ÐÜ—{‘{ 7Ð,<×,CÑ,CÀAÀxÓ,PÐRVÓWÐØÐ(¨9Ñ4Ñ5€FØ�v—}‘} Q¨Ó1Ñ1€Fô �{‰{˜6 8¨RÓ0€HÜ�{‰{˜6 8¨RÓ0€HÜ�k‰k˜8 XÐ.Ó/×9Ñ9¸!¸QÓ?×GÑGÈ
ÐUVÉÐXZÓ[€GÜ—k‘kÐ#3Ð5EÐ"FÓG×QÑQÐRSÐUVÓW×_Ñ_Ð`jÐmnÑ`nÐprÓs€Oà�OÐ#Ð#rJ   r`   ÚheightÚwidthc                 óÔ   — t        j                  ||g| j                  | j                  ¬«      d   }|dz  }|j	                  d«      j
                  dz  }| |dddd…f   z
  |d   z  } | S )a©  
    Normalize keypoints locations based on image image_shape

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

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

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

    Philipp Lindenberger, Paul-Edouard Sarlin and Marc Pollefeys. LightGlue: Local Feature Matching at Light Speed.
    In ICCV 2023. https://huggingface.co/papers/2306.13643
    r�   c           	      ó  •— t         ‰| �  |«       t        j                  |j                  «      | _        |j                  j                  | _        |j                  | _        |j                  | _
        |j                  | _        |j                  | _        |j                  | _        | j                  | j                  k7  r2t        j                  | j                  | j                  d¬«      | _        nt        j"                  «       | _        t%        |«      | _        t        j(                  t+        |j                  «      D �cg c]  }t-        ||¬«      ‘Œ c}«      | _        t        j(                  t+        |j                  «      D �cg c]  }t1        |«      ‘Œ c}«      | _        t        j(                  t+        |j                  dz
  «      D �cg c]  }t5        |«      ‘Œ c}«      | _        | j9                  «        y c c}w c c}w c c}w )NTrƒ   )rš   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ÚrangerÊ   Útransformer_layersrö   Úmatch_assignment_layersr  Útoken_confidenceÚ	post_init)rF   r�   Úir'  rH   s       €rI   r…   z%LightGlueForKeypointMatching.__init__ü  sŽ  ø€ Ü‰Ñ˜Ô Ü!>×!JÑ!JÈ6×KjÑKjÓ!kˆÔà06×0OÑ0O×0fÑ0fˆÔ-Ø$×3Ñ3ˆÔØ ×2Ñ2ˆŒØ &× 7Ñ 7ˆÔØ &× 7Ñ 7ˆÔØ &× 7Ñ 7ˆÔà×Ñ $×"GÑ"GÒGÜ$&§I¡I¨d×.SÑ.SÐUY×UhÑUhÐosÔ$tˆDÕ!ä$&§K¡K£MˆDÔ!ä"<¸VÓ"DˆÔä"$§-¡-ÜEJÈ6×KcÑKcÓEdÖeÀÔ& v¸Ö;Òeó#
ˆÔô (*§}¡}Ü<AÀ&×BZÑBZÓ<[Ö\°qÔ*¨6Õ2Ò\ó(
ˆÔ$ô !#§¡Ü<AÀ&×BZÑBZÐ]^ÑB^Ó<_Ö`°qÔ*¨6Õ2Ò`ó!
ˆÔð 	�‰Õùò fùò ]ùò as   Ä?G;ÆH ÇHÚlayer_indexrp   c                 ó†   — 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#  rE  Úclip)rF   rP  ro   s      rI   Ú_get_confidence_thresholdz6LightGlueForKeypointMatching._get_confidence_threshold  s;   € à˜#¤§¡ t¨kÑ'9¸D¿O¹OÑ'KÓ LÑLÑLˆ	Ü�w‰w�y ! QÓ'Ð'rJ   rÐ   r`   r‰   Nc                 óŽ   — |j                  «       j                  «       }| j                  |«      }| j                  ||¬«      }||fS )N©r‰   )r  r±   rF  rH  )rF   rÐ   r`   r‰   Úprojected_descriptorsÚkeypoint_encoding_outputs         rI   Ú_keypoint_processingz1LightGlueForKeypointMatching._keypoint_processing  sO   € ð "×(Ñ(Ó*×5Ñ5Ó7ˆØ $× 5Ñ 5°kÓ BÐØ#'×#:Ñ#:¸9Ð[oÐ#:Ó#pÐ Ø$Ð&>Ð>Ð>rJ   Úkeypoint_confidencesrb   Ú
num_pointsc                 ó|  — |j                   \  }}|| j                  dz
  k  ru|j                  |dk(  d«      }|j                  |dz  d«      }| j	                  |«      }d||k  j                  «       j                  d¬«      |z  z
  }|| j                  kD  }	|	S t        j                  |t        j                  ¬«      }	|	S )zRevaluate whether we should stop inference based on the confidence of the keypointsr£   r   r   r‹   g      ð?rŒ   ©r  )r¦   rE  rÿ   r°   rT  rU   Úsumr/   re   ÚonesrW   )
rF   rZ  rP  rb   r[  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Ð Ø#7×#?Ñ#?À
ÈaÁÐQSÓ#TÐ Ø×6Ñ6°{ÓCˆIØ!Ð%9¸IÑ%E×$LÑ$LÓ$N×$RÑ$RÐWXÐ$RÓ$YÐ\fÑ$fÑfˆOØ"1°D×4IÑ4IÑ"IÐð
 #Ð"ô #(§*¡*¨Z¼u¿z¹zÔ"JÐØ"Ð"rJ   c                 ó€   — |�
||   }||   } | j                   |   ||«      }t        || j                  «      \  }}||fS rr   )rL  r5  r2   )rF   rÐ   rb   rP  Úearly_stopsró   r^   r_   s           rI   Ú_get_keypoint_matchingz3LightGlueForKeypointMatching._get_keypoint_matching:  sW   € ØÐ"Ø% kÑ2ˆKØ˜Ñ$ˆDØ:�×-Ñ-¨kÑ:¸;ÈÓMˆÜ#:¸6À4×CXÑCXÓ#YÑ ˆ�Ø˜Ð'Ð'rJ   Úconfidencesró   c                 ó\   — |d| j                   z
  kD  }|�||| j                  |«      k  z  }|S )z#mask points which should be removedr£   )r0   rT  )rF   rf  ró   rP  Úkeeps        rI   Ú_get_pruning_maskz.LightGlueForKeypointMatching._get_pruning_maskB  s<   € à˜˜T×2Ñ2Ñ2Ñ3ˆØÐ"Ø�K 4×#AÑ#AÀ+Ó#NÑNÑNˆDØˆrJ   r  Úprune_outputc                 ó¨  ‡— |j                   \  }}	}	| j                  |   j                  |«      }
| j                  ||
|«      Š‰j	                  |dk(  t        j                  d«      «      Šˆfd„||d   |d   ‰|fD «       \  }}}}}t        |«      D ]  }||||   fxx   dz  cc<   Œ d„ ||||fD «       \  }}}}||f}t        |dd¬«      }|||||fS )	zŽ
        For a given layer, prune keypoints based on the confidence of the keypoints and the matchability of the
        descriptors.
        r   Fc              3   ón   •K  — | ]&  }t        |‰«      D ��cg c]
  \  }}||   ‘Œ c}}–— Œ( y c c}}w ­wrr   )Úzip)Ú.0rý   Útrb   Úpruned_keypoints_masks       €rI   ú	<genexpr>zJLightGlueForKeypointMatching._do_layer_keypoint_pruning.<locals>.<genexpr>]  s9   øè ø€ ò c
àô %(¨Ð0EÓ$F×G™˜˜DˆQˆt‹W×Gñc
ùÛGùs   ƒ5—/¦5r£   c              3   ó6   K  — | ]  }t        |d ¬«      –— Œ y­w)T)Úbatch_firstNr   )rn  Úpruned_tensors     rI   rq  zJLightGlueForKeypointMatching._do_layer_keypoint_pruning.<locals>.<genexpr>e  s$   è ø€ ò S
àô ˜°D×9Ð9ñS
ùs   ‚Tr‹   ©rs  Úpadding_value)	r¦   rL  r  ri  rÿ   re   rý   rJ  r   )rF   rÐ   r`   rb   r  rj  rZ  rP  r×   r'  Údescriptors_matchabilityÚpruned_descriptorsÚpruned_keypoints_0Úpruned_keypoints_1Úpruned_maskÚpruned_indicesrO  Úpruned_keypointsrp  s                     @rI   Ú_do_layer_keypoint_pruningz7LightGlueForKeypointMatching._do_layer_keypoint_pruningI  s+  ø€ ð '×,Ñ,Ñˆ
�A�qØ#'×#?Ñ#?ÀÑ#L×#]Ñ#]Ð^iÓ#jÐ Ø $× 6Ñ 6Ð7KÐMeÐgrÓ sÐØ 5× AÑ AÀ$È!Á)ÌUÏ\É\ÐZ_ÓM`Ó aÐóc
à&¨	°!©°iÀ±lÐDYÐ[bÐcôc
Ñ_ÐÐ.Ð0BÀKÐQ_ô �zÓ"ò 	4ˆAØ˜˜N¨1Ñ-Ð-Ó.°!Ñ3Ô.ð	4ñS
à"4Ð6HÐJ\Ð^iÐ!jôS
ÑOÐÐ.Ð0BÀKð /Ð0BÐCÐÜ% nÀ$ÐVXÔYˆà!Ð#3°^À[ÐR^Ð^Ð^rJ   c                 óò   ‡— t        j                  ‰«      Št        j                  ‰j                  d   «      }‰|   }‰|   Šd„ ||fD «       \  }}d„ ||fD «       \  }}ˆfd„||||fD «       \  }}}}||||fS )Nr   c              3   ó8   K  — | ]  }t        |d d¬«      –— Œ y­w)Tr‹   ru  Nr   ©rn  rý   s     rI   rq  zMLightGlueForKeypointMatching._concat_early_stopped_outputs.<locals>.<genexpr>{  s$   è ø€ ò 3
àô ˜¨TÀ×DÐDñ3
ùó   ‚c              3   ó8   K  — | ]  }t        |d d¬«      –— Œ y­w)Tr   ru  Nr   r�  s     rI   rq  zMLightGlueForKeypointMatching._concat_early_stopped_outputs.<locals>.<genexpr>  s$   è ø€ ò >
àô ˜¨TÀ×CÐCñ>
ùr‚  c              3   ó(   •K  — | ]	  }|‰   –— Œ y ­wrr   r>   )rn  rý   Úearly_stops_indicess     €rI   rq  zMLightGlueForKeypointMatching._concat_early_stopped_outputs.<locals>.<genexpr>ƒ  s!   øè ø€ ò g
àð Ð&Õ'ñg
ùs   ƒ)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™kÐ*=Ó>Ðä�l‰lÐ.×4Ñ4°QÑ7Ó8ˆØ+¨CÑ0ˆØ1°-Ñ@Ðñ3
à"Ð$BÐCô3
Ñ/ˆÐ/ñ>
à*Ð,MÐNô>
Ñ:ˆÐ:óg
ð ØØ.Ø1ð	ôg
Ñcˆ�Ð"@ÐBcð .Ð/PÐRYÐ[jÐjÐjrJ   r^   r_   rØ   c                 ó  ‡— |j                   \  Š}ˆfd„|||fD «       \  }}}|d d …df   }|d d …df   }|d d …df   }|d d …df   }	|d d …df   }
|d d …df   }t        j                  ‰dz  d|fd|j                  |j                  ¬«      }t        j
                  ‰dz  d|f|j                  |j                  ¬«      }t        ‰dz  «      D ]¶  }t        j                  ||   dk(  d||   j                  d||   j                  d¬«      «      «      ||d||   f<   t        j                  |	|   dk(  d||   j                  d|	|   j                  d¬«      «      «      ||d||   f<   |
|   ||d||   f<   ||   ||d||   f<   Œ¸ ||fS )Nc              3   óJ   •K  — | ]  }|j                  ‰d z  d d«      –— Œ y­w)r   r‹   N)r°   )rn  rý   r×   s     €rI   rq  zJLightGlueForKeypointMatching._do_final_keypoint_pruning.<locals>.<genexpr>˜  s'   øè ø€ ò -
Ø7=ˆF�N‰N˜:¨™?¨A¨r×2ñ-
ùs   ƒ #r   r£   r   r‹   r9  )r  )
r¦   re   Úfullrü   r  ÚzerosrJ  r%  r!  Úclamp)rF   r  r^   r_   rØ   r'  r,  r-  r*  r+  r1  r2  Ú_matchesÚ_matching_scoresrO  r×   s                  @rI   Ú_do_final_keypoint_pruningz7LightGlueForKeypointMatching._do_final_keypoint_pruningŽ  sä  ø€ ð  Ÿ™‰ˆ
�Aó-
ØBIÈ7ÐTcÐAdô-
Ñ)ˆ�˜/ð š1˜a˜4‘=ˆØš1˜a˜4‘=ˆØš1˜a˜4‘=ˆØš1˜a˜4‘=ˆØ*ª1¨a¨4Ñ0ÐØ*ª1¨a¨4Ñ0Ðô —:‘:˜z¨Q™°°=ÐAÀ2ÈgÏnÉnÐdk×dqÑdqÔrˆÜ Ÿ;™;Ø˜1‰_˜a Ð/¸¿¹Èo×NcÑNcô
Ðô �z Q‘Ó'ò 	FˆAÜ*/¯+©+Ø˜‘˜rÑ! 2 x°¡{×'9Ñ'9¸!¸XÀa¹[×=NÑ=NÐSTÐ=NÓ=UÓ'Vó+ˆH�Q˜˜8 A™;Ð&Ñ'ô +0¯+©+Ø˜‘˜rÑ! 2 x°¡{×'9Ñ'9¸!¸XÀa¹[×=NÑ=NÐSTÐ=NÓ=UÓ'Vó+ˆH�Q˜˜8 A™;Ð&Ñ'ð 3CÀ1Ñ2EÐ˜Q  8¨A¡;Ð.Ñ/Ø2BÀ1Ñ2EÐ˜Q  8¨A¡;Ð.Ò/ð	Fð Ð)Ð)Ð)rJ   r6  r7  rÑ   c           
      óJ	  ‡'— |rdnd }|rdnd }	|j                   d   dk(  rT|j                   d d }
|j                  |
dt        j                  ¬«      |j	                  |
«      |j	                  |
«      ||	fS |j
                  }|j                   \  }}}}t        j                  |j                  |d«      d¬«      }|j                  |dz  |d«      }|�|j                  |dz  |«      nd }|j                  |dz  || j                  «      }t        j                  |dz  |¬«      }t        |||«      }| j                  |||¬	«      \  }}|d   }| j                  dkD  }| j                  dkD  }g }g }g }g }g }t        j                  d||¬«      j                  |dz  d«      }t        j                  |«      }t!        | j"                  «      D �]E  }|�'t%        | j&                  |d d …dd…d d …f   |d
„ ¬«      }n4t        j(                  ||j+                  «       d   f|j
                  ¬«      } | j,                  |   |||||¬«      }|\  }}}|r||z   }|r|	|z   }	|�r“|| j"                  dz
  k  r+ | j.                  |   |«      } | j1                  | |||¬«      }!n%t        j(                  |t        j2                  ¬«      }!t        j4                  |!«      �r|!j7                  d«      Š'|‰'   }"| j9                  |||‰'¬«      \  }#}$|j;                  t=        |"«      «       |j;                  t=        |#«      «       |j;                  t=        |$«      «       |r:|j;                  t=        |‰'   «      «       |j;                  t=        |‰'   «      «       ||!    }t?        ˆ'fd„||d   |d   ||fD «       «      \  }}%}&}}|%|&f}|rt?        ˆ'fd„|| fD «       «      \  }}} t        j@                  |!«      r n$|s�Œ)| jC                  ||||| |«      \  }}}}}�ŒH |r4|r2| jE                  |||||«      \  }}}}| jG                  ||||«      \  }}nE| j9                  ||| j"                  dz
  «      \  }}t        j                  |«      | j"                  z  }|j                  |d|«      }|||||	fS )Nr>   r   r   r‹   r]  r£   rŒ   rû   rV  c                  óL   — t        j                  dt         j                  ¬«      S )NTr]  )re   rý   rW   )Úargss    rI   ú<lambda>z@LightGlueForKeypointMatching._match_image_pair.<locals>.<lambda>ò  s   € ´E·L±LÀÌUÏZÉZÔ4X€ rJ   )r�   Úinputs_embedsrŸ   Úand_mask_functionrè   )rŸ   r‰   rÑ   )r[  )rd  c              3   ó*   •K  — | ]
  }|‰    –— Œ y ­wrr   r>   ©rn  rý   rd  s     €rI   rq  zALightGlueForKeypointMatching._match_image_pair.<locals>.<genexpr>#  s"   øè ø€ ò Và"ð  ˜|Õ,ñVùó   ƒc              3   ó*   •K  — | ]
  }|‰    –— Œ y ­wrr   r>   rš  s     €rI   rq  zALightGlueForKeypointMatching._match_image_pair.<locals>.<genexpr>)  s"   øè ø€ ò là &ð # K <Õ0ñlùr›  )$r¦   rì   re   rT   Ú	new_zerosrü   r^  r°   rD  r   r=  rY  r/   r0   ÚexpandÚ	ones_likerJ  rE  r   r�   r_  r:  rK  rM  rb  rW   ÚanyrŽ   re  Ú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_indicesrX  Údo_early_stopÚdo_keypoint_pruningr…  r^   r_   r†  r‡  Úpruned_keypoints_indicesÚpruned_keypoints_iterationsrP  Úextended_attention_maskÚlayer_outputrc   Ú	attentionrZ  ra  Úearly_stopped_image_indicesÚearly_stopped_matchesÚearly_stopped_matching_scoresÚkeypoints_0Ú
keypoint_1rd  s(                                          @rI   Ú_match_image_pairz.LightGlueForKeypointMatching._match_image_pair³  s|  ø€ ñ #7™B¸DÐÙ0™°dˆà�?‰?˜1Ñ Ò"Ø—O‘O C RÐ(ˆEà×"Ñ" 5¨"´E·I±IÐ"Ó>Ø×#Ñ# EÓ*Ø×#Ñ# EÓ*Ø!Øðð ð ×!Ñ!ˆØ2;·/±/Ñ/ˆ
�AÐ,¨aÜ#Ÿi™i¨¯©°ZÀÓ(DÈ!ÔLÐà×%Ñ% j°1¡nÐ6KÈQÓOˆ	ØFJÐFVˆt�|‰|˜J¨™NÐ,AÔBÐ\`ˆØ!×)Ñ)¨*°q©.Ð:OÐQU×QvÑQvÓwˆÜŸ™ Z°!¡^¸FÔCˆä'¨	°6¸5ÓAˆ	à04×0IÑ0IØ˜Ð9Mð 1Jó 1
Ñ-ˆÐ-ð -¨QÑ/ˆ	ð ×-Ñ-°Ñ1ˆð #×3Ñ3°aÑ7Ðà ÐØˆØˆØ)+Ð&Ø,.Ð)ä#(§<¡<°Ð3HÐQWÔ#X×#_Ñ#_Ð`jÐmnÑ`nÐprÓ#sÐ Ü&+§o¡oÐ6NÓ&OÐ#ä  §¡Ó1ó X	ˆKØÐÜ*CØŸ;™;Ø"-ªa°°1°²a¨iÑ"8Ø#'á&Xô+Ñ'ô +0¯*©*°jÀ+×BRÑBRÓBTÐUWÑBXÐ5YÐbk×brÑbrÔ*sÐ'à?˜4×2Ñ2°;Ñ?ØØØ6Ø%9Ø"3ôˆLð 5AÑ1ˆK˜¨	Ù#Ø$5¸Ñ$EÐ!Ù Ø!/°)Ñ!;�âØ §¡°1Ñ!4Ò4à+M¨4×+@Ñ+@ÀÑ+MÈkÓ+ZÐ(ð +/×*MÑ*MØ,¨k¸4ÐL_ð +Nó +Ñ'ô
 +0¯*©*°ZÄuÇzÁzÔ*RÐ'ä—9‘9Ð0Õ1ð #6×"GÑ"GÈÓ"J�KØ2?ÀÑ2LÐ/ØKO×KfÑKfØ# T¨;ÀKð Lgó LÑHÐ)Ð+Hð (×.Ñ.¬tÐ4OÓ/PÔQØ—N‘N¤4Ð(=Ó#>Ô?Ø#×*Ñ*¬4Ð0MÓ+NÔOÙ*Ø6×=Ñ=¼dÐC[Ð\gÑChÓ>iÔjØ9×@Ñ@ÄÐFaÐbmÑFnÓAoÔpð +>Ð?RÐ>RÑ*SÐ'ÜPUó Và'2°I¸a±LÀ)ÈAÁ,ÐPTÐVcÐ&dôVó QÑM�K ¨j¸$Àð "-¨jÐ 9�IÙ*Üfkó lð !9Ø ;Ø 4ð+ôló gÑcÐ0Ð2MÐOcô —9‘9Ð0Ô1Ùã"ð ×3Ñ3Ø#Ø!ØØ0Ø3Ø,Ø#óñ d�˜YÐ(@À$ÒHcð]X	ñt Ñ0ð ×2Ñ2Ø'Ø2Ø5ØØ#óñ hÐ*Ð,MÈwÐXgð (,×'FÑ'FØ.ØØØ%ó	(Ñ$ˆG‘_ð (,×'BÑ'BÀ;ÐPTÐVZ×VeÑVeÐhiÑViÓ'jÑ$ˆG�_Ü05·±ÀÓ0PÐSW×SbÑSbÑ0bÐ-à,M×,UÑ,UØ˜Ð0ó-
Ð)ð
 ØØ-ØØð
ð 	
rJ   r  Úlabelsc           
      ó0  — d }|�t        d«      ‚|�|n| j                  j                  }|�|n| j                  j                  }|j                  dk7  s|j                  d«      dk7  rt        d«      ‚|j                  \  }}}	}
}|j                  |dz  |	|
|«      }| j                  |«      }|d d \  }}}}|j                  |ddd«      j                  |«      }|j                  |dd| j                  «      j                  |«      }|j                  |dd«      }|j                  «       }|d d …d d …d d …df   |z  |d d …d d …d d …df<   |d d …d d …d d …df   |
z  |d d …d d …d d …df<   | j                  |||
||||¬	«      \  }}}}}t        ||||||||¬
«      S )Nz9LightGlue is not trainable, no labels should be provided.é   r£   r   zOInput must be a 5D tensor of shape (batch_size, 2, num_channels, height, width)r,   r‹   r   )rb   rÑ   r‰   )r]   r^   r_   r`   ra   rb   rc   rd   )rL   r�   rÑ   r‰   Úndimr:  r¦   r°   rB  ÚtorD  Ú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à1BÐ1NÑ-ÐTX×T_ÑT_×TqÑTqÐà$8Ð$DÑ È$Ï+É+×JjÑJjð 	ð ×Ñ Ò! \×%6Ñ%6°qÓ%9¸QÒ%>ÜÐnÓoÐoà1=×1CÑ1CÑ.ˆ
�A�x ¨Ø#×+Ñ+¨J¸©N¸HÀfÈeÓTˆØ"×4Ñ4°\ÓBÐà*=¸b¸qÐ*AÑ'ˆ	�1�k 4Ø×%Ñ% j°!°R¸Ó;×>Ñ>¸|ÓLˆ	Ø!×)Ñ)¨*°a¸¸T×=bÑ=bÓc×fÑfÐgsÓtˆØ�|‰|˜J¨¨2Ó.ˆà&Ÿ_™_Ó.ÐØ);ºAºqÂ!ÀQ¸JÑ)GÈ%Ñ)OÐš1ša¢ A˜:Ñ&Ø);ºAºqÂ!ÀQ¸JÑ)GÈ&Ñ)PÐš1ša¢ A˜:Ñ&àEI×E[ÑE[ØØØØØØ/Ø!5ð F\ó F
ÑBˆ� %¨¸
ô /ØØØ+ØØØØ'Ø!ô	
ð 		
rJ   r—   rr   )NNN)rN   rO   rP   rQ   r%   r…   rT   rU   rT  re   rx   rW   rh   rY  rb  re  ri  r~  rŠ  r’  r²  r   r   rf   Ú
LongTensorr\   r–   rX   rY   s   @rI   r?  r?  è  sÒ  ø„ ñð˜õ ð<(°Sð (¸Uó (ð glñ?Ø Ÿ<™<ð?Ø49·L±Lð?ØX\Ð_cÑXcð?à	ˆu�|‰|˜U 5§<¡<°·±Ð#=Ñ>Ð>Ñ	?ó?ð#Ø$)§L¡Lð#Ø?Bð#ØJOÏ,É,ð#Ødi×dpÑdpð#à	�‰ó#ó&(ð¨U¯\©\ð À5Ç<Á<ð Ð^að Ðfk×frÑfró ð#_à—\‘\ð#_ð —<‘<ð#_ð �l‰lð	#_ð
 —‘ð#_ð —l‘lð#_ð $Ÿl™lð#_ð ó#_òJkð@#*à—‘ð#*ð —‘ð#*ð Ÿ™ð	#*ð
 —|‘|ð#*ð 
ˆu�|‰|˜UŸ\™\Ð)Ñ	*ó#*ðV %)Ø)-Ø,0ñq
à—<‘<ðq
ð —\‘\ðq
ð ð	q
ð
 ðq
ð �l‰l˜TÑ!ðq
ð   $™;ðq
ð # T™kðq
ð 
ˆu�|‰|˜UŸ\™\¨5¯<©<¸ÀÐEÑ	Fóq
ðf Øð +/Ø)-Ø,0ñ4
à×'Ñ'ð4
ð × Ñ  4Ñ'ð4
ð   $™;ð	4
ð
 # T™kð4
ð 
Ð0Ñ	0ò4
ó ó ô4
rJ   r?  )r  r?  r%   rl   r}   )MÚcollections.abcr   Údataclassesr   ÚnumpyrR  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Õ     sN  ðõ %Ý !ã Û Ý .Ý Ý +å 3Ý 6Ý Bß FÝ &ß WÕ WÝ 1Ý *ß -Ý >Ý (Ý 9ß JÝ Qß iÝ )ð 
ˆ×	Ñ	˜HÓ	%€ñ Ð9Ô:ØôARÐ&ó ARó ó ;ðARñH ðôð ô 7 kó  7ó óð 7ôF	Ð$Aô 	ôXÐ5ô Xñ 
�:ÔôXÐ!;ó Xó ðXô §¡ô ð" ô/)˜ó /)ó ð/)ôd�7ô ôP> §	¡	ô P>ðfØ—‘ðØ-2¯\©\ðØJOÏ,É,ðà
‡\�\óô& B§I¡Iô &ôR	 B§I¡Iô 	ð ô˜ó ó ðð$ E§L¡Lð $¸Uð $ÀuÈUÏ\É\Ð[`×[gÑ[gÐMgÑGhó $ð@ 5§<¡<ð ¸ð ÀSð ÈUÏ\É\ó ñ, ðôô
o
Ð#;ó o
óð
o
òd�rJ   