Ë
    ëÓ^jeW  ã                  óþ   — U d Z ddlmZ ddlmZ ddlmZ ddlZddlm	c m
Z ddlm	Z	 ddlmZ  e«       ZdZd	ed
<   dd„Z G d„ de	j$                  «      Z	 	 	 	 	 	 	 	 	 	 	 	 dd„Zdd„Z	 	 	 	 	 	 	 	 	 	 	 	 dd„Zg d¢Zy)uã  Keypoint helper primitives for GroupPose-style decoding.

Keypoint predictions are dense ``[N, K, KEYPOINT_PRED_DIM]`` tensors where the trailing channel layout is fixed:

================  ===========  ==========================================================
Slot index        Name         Meaning
================  ===========  ==========================================================
``0``             ``x``        Normalized x coordinate (image-relative).
``1``             ``y``        Normalized y coordinate (image-relative).
``2``             ``findable`` Logit for "annotator could find this keypoint" (``v > 0``).
``3``             ``visible``  Logit for "fully visible" (``v == 2``).
``4`` â€“ ``6``     ``L_*``      Lower-triangular Cholesky parameters ``Lxx``, ``Lxy``, ``Lyy``.
``7``             ``class``    Per-keypoint class-logit contribution aggregated into detection-class logits.
================  ===========  ==========================================================
é    )Úannotations)ÚSequence)ÚcastN)Únn)Ú
get_loggeré   ÚintÚKEYPOINT_PRED_DIMc                ó   — |dz   | z  |z   S )u$  Apply AdaLN modulation to a feature tensor.

    Args:
        features: Input feature map to modulate.
        scale: Per-feature scale terms.
        shift: Per-feature shift terms.

    Returns:
        Modulated features with the same shape as ``features``.

    Example:
        Apply modulation to a batch of 2 query tokens, each with 4 channels:

        .. code-block:: python

            features = torch.zeros(2, 4)          # (batch, dim)
            scale    = torch.ones(2, 4) * 0.1     # small positive scale
            shift    = torch.ones(2, 4) * (-0.5)  # constant shift

            out = modulate(features, scale, shift)
            # scale=0.1 â†’ effective multiplier is 1.1; shift=-0.5 applied additively
            # out[0] â‰ˆ tensor([-0.5000, -0.5000, -0.5000, -0.5000])
    g      ð?© )ÚfeaturesÚscaleÚshifts      úh/var/www/ramen.bs-engineer-server.com/venv/lib/python3.12/site-packages/rfdetr/models/heads/keypoints.pyÚmodulater   '   s   € ð2 �C‰K˜8Ñ# eÑ+Ð+ó    c                  ó.   ‡ — e Zd ZdZddˆ fd„Zdd„Zˆ xZS )ÚConditionalQueryInitializerzTInitialize keypoint query tokens with adaptive layer-normalization style modulation.c           	     ó   •— t         ‰| �  «        |xs |}t        j                  t	        j
                  ||«      «      | _        t        j                  |d¬«      | _        t        j                  t        j                  ||«      t        j                  «       t        j                  ||dz  «      «      | _        t        t        j                  | j                  d   «      }t        j                  j                  |j                   d«       t        j                  j                  |j"                  d«       t        j                  ||«      | _        y)zäCreate the initializer.

        Args:
            dim: Query conditioning dimensionality.
            num_queries: Number of query tokens to instantiate.
            out_dim: Output embedding size. Defaults to ``dim``.
        F)Úelementwise_affineé   éÿÿÿÿr   N)ÚsuperÚ__init__r   Ú	ParameterÚtorchÚrandnÚqueriesÚ	LayerNormÚ
query_normÚ
SequentialÚLinearÚGELUÚadaLN_modulationr   ÚinitÚ	constant_ÚweightÚbiasÚout_proj)ÚselfÚdimÚnum_queriesÚout_dimÚada_ln_projectionÚ	__class__s        €r   r   z$ConditionalQueryInitializer.__init__F   sæ   ø€ ô 	‰ÑÔØ’.˜Sˆä—|‘|¤E§K¡K°¸WÓ$EÓFˆŒÜŸ,™, wÀ5ÔIˆŒÜ "§¡Ü�I‰I�c˜3ÓÜ�G‰G‹IÜ�I‰I�c˜7 Q™;Ó'ó!
ˆÔô
 !¤§¡¨D×,AÑ,AÀ"Ñ,EÓFÐÜ
�‰×ÑÐ+×2Ñ2°AÔ6Ü
�‰×ÑÐ+×0Ñ0°!Ô4äŸ	™	 '¨7Ó3ˆ�r   c                ó2  — | j                  | j                  «      }| j                  |j                  d«      «      }|j	                  dd¬«      \  }}}| j                  t        |||«      «      |z  | j                  z   }t        t        j                  |«      S )ax  Return modulated query embeddings.

        Args:
            query_features: Tensor of shape ``(B, dim)`` containing conditioning features.

        Returns:
            Tensor of shape ``(B, num_queries, out_dim)`` with initialized keypoint queries.

        Example:
            Initialize 17 keypoint queries conditioned on a batch of 2 detection embeddings:

            .. code-block:: python

                initializer = ConditionalQueryInitializer(dim=256, num_queries=17)
                query_features = torch.randn(2, 256)   # (B=2, dim=256)

                keypoint_queries = initializer(query_features)
                # keypoint_queries.shape == (2, 17, 256)
                # Each of the 17 query slots is independently modulated by the
                # per-detection conditioning vector before being passed to the
                # GroupPose keypoint decoder.
        éþÿÿÿr   r   ©r+   )
r    r   r$   Ú	unsqueezeÚchunkr)   r   r   r   ÚTensor)r*   Úquery_featuresÚnormed_query_featuresÚ
modulationr   r   ÚgateÚmodulated_query_featuress           r   Úforwardz#ConditionalQueryInitializer.forward^   sŽ   € ð0 !%§¡°·±Ó =ÐØ#'×#8Ñ#8¸×9QÑ9QÐRTÓ9UÓ#Vˆ
Ø'×-Ñ-¨a°RÐ-Ó8Ñˆˆu�dØ#'§=¡=´Ð:OÐQVÐX]Ó1^Ó#_ÐbfÑ#fÐim×iuÑiuÑ#uÐ Ü”E—L‘LÐ":Ó;Ð;r   )N)r+   r	   r,   r	   r-   z
int | NoneÚreturnÚNone)r6   útorch.Tensorr<   r>   )Ú__name__Ú
__module__Ú__qualname__Ú__doc__r   r;   Ú__classcell__)r/   s   @r   r   r   C   s   ø„ Ù^ö4÷0<r   r   c                ój  — | j                   \  }}}|dk\  sJ d«       ‚t        |«      }|dk(  rt        d«      ‚|dkD  rX|j                  «       |k\  rEt        j                  dt        |j                  «       «      |«       | j                  |«      }	|	|	|	|	fS ||z  }
| j                  |||
|«      }|t        j                  ||j                  ¬«      |f   }t        j                  ||
t        j                  |j                  ¬«      }t        |«      D ]  \  }}d||d	|…f<   Œ ||   }|j                  d
«      j!                  |j"                  ¬«      }|j!                  t        j$                  «      }t        j&                  |j"                  «      j(                  }t        j*                  |«      ||kD  z  }t        j*                  |d	d	…d	d	…d	d…f   «      j-                  d
¬«      t        j*                  |d	d	…d	d	…d	d…f   «      j-                  d
¬«      z  }t        j*                  |d	d	…d	d	…df   «      |d	d	…d	d	…df   dkD  z  }||z  |z  |j/                  d«      z  }|j                  d
«      j!                  |j"                  ¬«      }|j1                  d¬«      }|j1                  d¬«      j!                  |j"                  ¬«      }|j3                  |«      j5                  «       }t7        j8                  |d	d	…d	d	…d	d…f   |d	d	…d	d	…d	d…f   d¬«      j                  d
«      |j!                  |j"                  «      z  |j/                  d«      z  }|j                  d
«      |z  }t7        j:                  |d	d	…d	d	…df   |d	d	…d	d	…df   dkD  j!                  |j"                  «      d¬«      |j!                  |j"                  «      z  j                  d
«      |z  }t7        j:                  |d	d	…d	d	…df   |d	d	…d	d	…df   dkD  j!                  |j"                  «      d¬«      |j!                  |j"                  «      z  j                  d
«      |z  }|d	d	…d	d	…d	d…f   |d	d	…d	d	…d	d…f   z
  j!                  t        j$                  «      } | d	d	…d	d	…df   }!| d	d	…d	d	…df   }"|d	d	…d	d	…df   j!                  t        j$                  «      }#|d	d	…d	d	…df   j!                  t        j$                  «      }$|d	d	…d	d	…df   j!                  t        j$                  «      }%t        j*                  |#«      t        j*                  |$«      z  t        j*                  |%«      z  }&|&j-                  «       s3t        j=                  d|& j                  «       j?                  «       «       ||&z  }'|#}(|$})|%}*|(jA                  «       }+|*jA                  «       },|+|!z  |)|"z  z   }-|,|"z  }.|-|-z  |.|.z  z   }/|'t        j*                  |-«      z  t        j*                  |.«      z  t        j*                  |/«      z  }'|'j                  d
«      j!                  |j"                  ¬«      }0|0j1                  d¬«      }1d|/|j3                  |«      j/                  d«      z  z  |(|*z   z
  }2t        jB                  |2ddt        j&                  |2j"                  «      jD                  ¬«      }2|2jG                  |' d«      }3|3j                  d
«      |1z  }4|0dk  }5t        jH                  |5t        jJ                  |4«      |4«      }4||||4fS )uA	  Compute the keypoint loss vector per matched target.

    The tensor layout follows GroupPose-style keypoints where each target class
    defines how many valid keypoints it owns. The returned Gaussian NLL follows
    the r-flow formulation directly:
    ``0.5 * maha2 / area - (log_l11 + log_l22)``. It intentionally omits the
    normal Gaussian constant and does not clamp the precision Cholesky
    parameters, so valid losses may be negative.

    Args:
        all_pred_keypoints: Predicted keypoints with shape ``(N, K_total, >=7)``.
        target_keypoints: Ground truth keypoints with shape ``(N, K_max, 3)``.
        target_classes: Class ids per target with shape ``(N,)``.
        target_areas: Target box areas with shape ``(N,)``.
        num_keypoints_per_class: Number of keypoints per class.

    Returns:
        Tuple of location, findable BCE, visible BCE, and raw Gaussian NLL losses.
        Each tensor has shape ``(n_targets,)``.

    Example:
        Compute losses for 2 matched targets, each with 17 keypoints (COCO layout):

        .. code-block:: python

            n_targets, K, pred_dim = 2, 17, 7
            all_pred_keypoints = torch.randn(n_targets, K, pred_dim)

            # Ground truth: 17 keypoints per target, each (x, y, visibility)
            # visibility: 0=not labeled, 1=labeled but occluded, 2=fully visible
            target_keypoints = torch.rand(n_targets, K, 3)
            target_keypoints[:, :, 2] = 2.0   # mark all keypoints fully visible

            target_classes = torch.zeros(n_targets, dtype=torch.long)  # single class (person)
            target_areas   = torch.tensor([0.05, 0.12])  # normalized box areas

            loc_loss, findable_loss, visible_loss, nll_loss = compute_l1_keypoint_loss(
                all_pred_keypoints,
                target_keypoints,
                target_classes,
                target_areas,
                num_keypoints_per_class=[17],
            )
            # Each output tensor has shape (2,) â€” one scalar loss per matched target.
            # loc_loss:      area-normalized mean L1 distance for visible keypoints
            # findable_loss: BCE for "annotator could locate this keypoint"
            # visible_loss:  BCE for "keypoint is fully visible (v==2)"
            # nll_loss:      Gaussian NLL incorporating Cholesky uncertainty parameters
    é   úIExpected all_pred_keypoints last dim >= 7 (x,y,2 logits + 3 chol params).r   zInum_keypoints_per_class must be non-empty when computing keypoint losses.zÂtarget_classes max index %d >= num_keypoints_per_class length %d; skipping keypoint loss for this batch to avoid crashing training. Check that your keypoint schema covers all annotation classes.)Údevice)ÚdtyperG   TNr   ©rH   é   r2   é   ©ÚminÚnone)Ú	reductionr   é   é   é   zGNLL loss: %d keypoint(s) with non-finite uncertainty dropped from loss.ç      à?ç        ©ÚnanÚposinfÚneginf)&ÚshapeÚlenÚ
ValueErrorÚmaxÚloggerÚwarningr	   Ú	new_zerosÚviewr   ÚarangerG   ÚzerosÚboolÚ	enumerateÚsumÚtorH   Úfloat32ÚfinfoÚepsÚisfiniteÚallr3   ÚclampÚ	clamp_minÚsqrtÚFÚl1_lossÚ binary_cross_entropy_with_logitsÚdebugÚitemÚexpÚ
nan_to_numrM   Úmasked_fillÚwhereÚ
zeros_like)6Úall_pred_keypointsÚtarget_keypointsÚtarget_classesÚtarget_areasÚnum_keypoints_per_classÚ	n_targetsÚtotal_padded_num_keypointsÚpred_dimÚnum_classesrb   ÚkpadÚsplit_pred_keypointsÚselected_pred_keypointsÚactive_keypoints_maskÚ	class_idxÚnum_keypointsÚkeypoints_loss_maskÚkeypoints_per_targetÚareaÚarea_epsÚ
valid_areaÚvalid_xyÚvalid_visibilityÚlocation_loss_maskÚlocation_countÚvalid_countÚdenom_keypointsÚsafe_area_sqrtÚscaled_masked_l1Úlocation_lossÚfindable_lossÚvisible_lossÚdxdyÚdxÚdyÚraw_log_l11Úraw_l21Úraw_log_l22Úfinite_uncertaintyÚgaussian_loss_maskÚlog_l11Úl21Úlog_l22Úl11Úl22Úu0Úu1Úmaha2Úgaussian_countÚgaussian_valid_countÚnll_rawÚnll_keypointsÚnll_lossÚno_valids6                                                         r   Úcompute_l1_keypoint_lossr®   }   sý  € ðr 7I×6NÑ6NÑ3€IÐ)¨8Ø�qŠ=ÐeÐeÓeˆ=ÜÐ-Ó.€Kà�aÒÜÐdÓeÐeà�1‚}˜×+Ñ+Ó-°Ò<Ü�‰ðMô �×"Ñ"Ó$Ó%Øô	
ð #×,Ñ,¨YÓ7ˆØ�e˜U EÐ)Ð)à%¨Ñ4€DØ-×2Ñ2°9¸kÈ4ÐQYÓZÐØ2Ü�‰�YÐ';×'BÑ'BÔCÀ^ÐSñÐô "ŸK™K¨°TÄÇÁÐTh×ToÑToÔpÐÜ$-Ð.EÓ$Fò @Ñ ˆ	�=Ø;?Ð˜i¨¨-¨Ð7Ò8ð@ð 0°Ñ?ÐØ.×2Ñ2°2Ó6×9Ñ9Ð@W×@]Ñ@]Ð9Ó^ÐØ�?‰?œ5Ÿ=™=Ó)€DÜ�{‰{˜4Ÿ:™:Ó&×*Ñ*€HÜ—‘ Ó%¨°©Ñ9€JÜ�~‰~Ð5²aº¸B¸Q¸B°hÑ?Ó@×DÑDÈÐDÓLÌuÏ~É~ØššA˜r ˜r˜Ñ"óPç	�cˆb€cƒkñ€Hô —~‘~Ð&6²qº!¸Q°wÑ&?Ó@ÐDTÒUVÒXYÐ[\ÐU\ÑD]Ð`aÑDaÑbÐØ,Ð/?Ñ?À(ÑJÈZ×MaÑMaÐbcÓMdÑdÐØ'×+Ñ+¨BÓ/×2Ñ2Ð9P×9VÑ9VÐ2ÓW€NØ ×&Ñ&¨1Ð&Ó-€KØ*×0Ñ0°QÐ0Ó7×:Ñ:ÐAX×A^ÑA^Ð:Ó_€OØ—^‘^ HÓ-×2Ñ2Ó4€Nô 	
�	‰	Ð)ª!ªQ°°°¨(Ñ3Ð5EÂaÊÈBÈQÈBÀhÑ5OÐ[aÔb×fÑfÐgiÓjØ
×
Ñ
Ð 7× =Ñ =Ó
>ñ	?à
×
"Ñ
" 1Ó
%ñ	&ð ð
 %×(Ñ(¨Ó,¨{Ñ:€Mô 	
×*Ñ*Ø#¢A¢q¨! GÑ,Øša¢ A˜gÑ&¨Ñ*×.Ñ.Ð/F×/LÑ/LÓMØô	
ð
 ×
 Ñ
 Ð!8×!>Ñ!>Ó
?ñ	@÷ 
�cˆ"ƒg�ñ €Mô 	
×*Ñ*Ø#¢A¢q¨! GÑ,Øša¢ A˜gÑ&¨Ñ*×.Ñ.Ð/F×/LÑ/LÓMØô	
ð
 ×
 Ñ
 Ð!8×!>Ñ!>Ó
?ñ	@÷ 
�cˆ"ƒg�ñ €Lð $¢A¢q¨"¨1¨" HÑ-Ð0@ÂÂAÀrÈÀrÀÑ0JÑJ×NÑNÌuÏ}É}Ó]€DØ	Ša’�Aˆg‰€BØ	Ša’�Aˆg‰€Bà)ª!ªQ°¨'Ñ2×5Ñ5´e·m±mÓD€KØ%¢aª¨A gÑ.×1Ñ1´%·-±-Ó@€GØ)ª!ªQ°¨'Ñ2×5Ñ5´e·m±mÓD€KÜŸ™¨Ó4´u·~±~ÀgÓ7NÑNÔQV×Q_ÑQ_Ð`kÓQlÑlÐØ×!Ñ!Ô#Ü�‰ØUØ Ð ×%Ñ%Ó'×,Ñ,Ó.ô	
ð ,Ð.@Ñ@Ðð €GØ
€CØ€Gà
�+‰+‹-€CØ
�+‰+‹-€CØ	ˆr‰�C˜"‘HÑ	€BØ	ˆr‰€BØ�‰G�b˜2‘gÑ€EØ+¬e¯n©n¸RÓ.@Ñ@Ä5Ç>Á>ÐRTÓCUÑUÔX]×XfÑXfÐglÓXmÑmÐØ'×+Ñ+¨BÓ/×2Ñ2Ð9P×9VÑ9VÐ2ÓW€NØ)×/Ñ/°AÐ/Ó6ÐØ�U˜TŸ^™^¨HÓ5×?Ñ?ÀÓBÑBÑCÀwÐQXÑGXÑY€GÜ×Ñ˜w¨C¸ÄEÇKÁKÐPW×P]ÑP]ÓD^×DbÑDbÔc€GØ×'Ñ'Ð);Ð(;¸SÓA€MØ× Ñ  Ó$Ð';Ñ;€HØ Ñ"€HÜ�{‰{˜8¤U×%5Ñ%5°hÓ%?ÀÓJ€Hð ˜-¨°xÐ?Ð?r   c                óØ   — |j                  | j                  ¬«      }t        j                  | «      j	                  dd¬«      }t        j                  | |j                  «       «      }||z
  S )z;Compute pairwise BCE-with-logits summed along the last dim.rI   rK   T)r+   Úkeepdim)rf   rH   ro   Úsoftplusre   r   ÚmatmulÚt)ÚxÚyÚy_floatr±   Údots        r   Ú_cdist_bce_with_logitsr¸   #  sS   € à�d‰d˜Ÿ™ˆdÓ!€GÜ�z‰z˜!‹}× Ñ  Q°Ð Ó5€HÜ
�,‰,�q˜'Ÿ)™)›+Ó
&€CØ�c‰>Ðr   c           	     óH  — | j                   \  }}}}|dk\  sJ d«       ‚|j                   d   }	t        |«      }
|
dk(  rt        d«      ‚|	dk(  r5t        j                  |||	f| j
                  | j                  ¬«      }||||fS ||
z  }| j                  |||
||«      }t        j                  |||	f| j
                  | j                  ¬«      }t        j                  |||	f| j
                  | j                  ¬«      }t        j                  |||	f| j
                  | j                  ¬«      }t        j                  |||	f| j
                  | j                  ¬«      }||z  }t        |
«      D �]2  }||k(  j                  «       j                  d«      }|j                  «       dk(  rŒ:||   }|dk(  rŒE|dd…dd…|d|…dd…f   }|j                  d|«      dd…d|…dd…f   }|j                   d   }|j                  d|«      j                  t        j                  «      }t        j                  |j                  «      j                   }t        j"                  |«      ||kD  z  }|dd…dd…dd…f   }t        j"                  |dd…dd…df   «      |dd…dd…df   dkD  z  t        j"                  |«      j%                  d	¬
«      z  |j'                  d«      z  }|j)                  d¬
«      j                  t        j                  «      }|j+                  d¬«      }|dkD  } |j-                  |«      j/                  «       }!|dd…dd…dd…dd…f   j1                  ||d«      j                  t        j                  «      }"|j                  t        j                  «      }#|"j'                  d«      |#j'                  d«      z
  }$|$j3                  «       j)                  d	«      }%|j'                  d«      }&|%j5                  |& d«      }%|%j)                  d	«      }'|'|j'                  d«      z  j7                  |!j'                  d«      «      }(t        j8                  |(ddd¬«      }(|(j1                  |||«      j                  | j                  «      |dd…dd…|f<   |dd…dd…dd…df   j1                  ||«      j                  t        j                  «      })|dd…dd…dd…df   j1                  ||«      j                  t        j                  «      }*|dd…dd…dd…df   j1                  ||«      j                  t        j                  «      }+|)},|*}-|+}.|,j;                  «       }/|.j;                  «       }0t        j"                  |"«      j%                  d	¬
«      }1|1t        j"                  |)«      z  t        j"                  |*«      z  t        j"                  |+«      z  }2|$d   }3|$d   }4|/j'                  d«      |3z  |-j'                  d«      |4z  z   }5|0j'                  d«      |4z  }6|5|5z  |6|6z  z   }7|&|2j'                  d«      z  t        j"                  |5«      z  t        j"                  |6«      z  t        j"                  |7«      z  }8d|7|j-                  |«      j                  d|d«      z  z  |,|.z   j'                  d«      z
  }9t        j8                  |9ddt        j                  |9j                  «      j<                  ¬«      }9|9j5                  |8 d«      }9|9j)                  d	«      }:|:|j'                  d«      z  j1                  |||«      };|;j?                  | j'                  d«       d«       |;j                  | j                  «      |dd…dd…|f<   |dd…dd…dd…df   j1                  ||«      }<|dd…dd…df   dkD  j                  | j                  «      j1                  ||«      }=|dd…dd…dd…df   j1                  ||«      }>|dd…dd…df   dkD  j                  | j                  «      j1                  ||«      }?tA        |<|=«      j1                  |||«      tC        |«      z  |dd…dd…|f<   tA        |>|?«      j1                  |||«      tC        |«      z  |dd…dd…|f<   �Œ5 ||||fS )uÚ  Compute many-to-many keypoint matching costs.

    Args:
        all_pred_keypoints: Predicted keypoints of shape ``(B, Q, K_total, >=7)``.
        target_keypoints: Ground truth keypoints with shape ``(N, Kmax, 3)``.
        target_classes: Class ids for each target with shape ``(N,)``.
        target_areas: Target box areas with shape ``(N,)``.
        num_keypoints_per_class: Number of keypoints per class.

    Returns:
        Tuple ``(cost_l1, cost_findable, cost_visible, cost_nll)`` each of shape ``(B, Q, N)``.

    Example:
        Compute matching costs for 1 image with 4 decoder queries against 2 ground-truth
        targets, each with 17 COCO keypoints:

        .. code-block:: python

            B, Q, K_total, pred_dim = 1, 4, 17, 7
            n_targets = 2

            all_pred_keypoints = torch.randn(B, Q, K_total, pred_dim)

            target_keypoints = torch.rand(n_targets, K_total, 3)
            target_keypoints[:, :, 2] = 2.0   # mark all keypoints fully visible

            target_classes = torch.zeros(n_targets, dtype=torch.long)  # single class (person)
            target_areas   = torch.tensor([0.05, 0.12])

            cost_l1, cost_findable, cost_visible, cost_nll = compute_keypoint_matching_cost(
                all_pred_keypoints,
                target_keypoints,
                target_classes,
                target_areas,
                num_keypoints_per_class=[17],
            )
            # Each output tensor has shape (1, 4, 2) â€” (B, Q, N).
            # cost_l1[:, q, n]  is the area-normalized L1 cost for query q against target n.
            # cost_nll[:, q, n] incorporates the Cholesky precision uncertainty.
            # These cost matrices are passed to the Hungarian matcher.
    rE   rF   r   zQnum_keypoints_per_class must be non-empty when computing keypoint matching costs.)rG   rH   rK   NrJ   r   r2   rL   rT   rU   rP   rQ   rR   ).r   ).rK   rS   r   )"rY   rZ   r[   r   rb   rG   rH   r`   ÚrangeÚnonzeroÚsqueezeÚnumelÚindex_selectrf   rg   rh   ri   rj   rk   r3   re   rl   rm   rn   ÚreshapeÚabsrv   Údivru   rt   rM   Úmasked_fill_r¸   Úfloat)@ry   rz   r{   r|   r}   Úbr,   Útotal_num_keypointsr€   r~   r�   rb   r‚   ÚpredÚcost_l1Úcost_findableÚcost_visibleÚcost_nllÚflat_bqr†   Útarget_indicesÚnum_kptsÚpred_by_classÚtarget_by_classÚn_targets_by_classÚareasr‹   rŒ   Ú	target_xyÚvisibleÚvalid_per_targetÚ	nll_denomÚhas_visibleÚ	area_sqrtÚpred_xy_flatÚtarget_xy_f32ÚdiffÚ
per_kpt_l1Úvisible_btkÚ
scaled_locÚloc_costr›   rœ   r�   r    r¡   r¢   r£   r¤   Ú	finite_xyÚfinite_predr™   rš   r¥   r¦   r§   Úkeypoint_maskÚnll_kÚnll_sumÚmean_nllÚpred_findableÚtarget_findableÚpred_visibleÚtarget_visibles@                                                                   r   Úcompute_keypoint_matching_costré   +  sO  € ðb 5G×4LÑ4LÑ1€A€{Ð'¨Ø�qŠ=ÐeÐeÓeˆ=Ø ×&Ñ& qÑ)€IÜÐ-Ó.€Kà�aÒÜÐlÓmÐmà�A‚~Ü—‘Ø�˜YÐ'Ø%×,Ñ,Ø$×*Ñ*ô
ˆð
 �e˜U EÐ)Ð)à +Ñ-€DØ×"Ñ" 1 k°;ÀÀhÓO€Dä�k‰kØ	
ˆK˜Ð#Ø!×(Ñ(Ø ×&Ñ&ô€Gô
 —K‘KØ	
ˆK˜Ð#Ø!×(Ñ(Ø ×&Ñ&ô€Mô
 —;‘;Ø	
ˆK˜Ð#Ø!×(Ñ(Ø ×&Ñ&ô€Lô
 �{‰{Ø	
ˆK˜Ð#Ø!×(Ñ(Ø ×&Ñ&ô€Hð �+‰o€GÜ˜;Ó'ó qˆ	Ø(¨IÑ5×>Ñ>Ó@×HÑHÈÓKˆØ×ÑÓ! QÒ&ØØ*¨9Ñ5ˆØ�qŠ=ØàšQ¢ 9¨i¨x¨iºÐ:Ñ;ˆØ*×7Ñ7¸¸>ÓJÊ1ÈiÈxÈiÒYZÈ?Ñ[ˆØ,×2Ñ2°1Ñ5Ðà×)Ñ)¨!¨^Ó<×?Ñ?ÄÇÁÓNˆÜ—;‘;˜uŸ{™{Ó+×/Ñ/ˆÜ—^‘^ EÓ*¨e°hÑ.>Ñ?ˆ
Ø#¢A¢q¨"¨1¨" HÑ-ˆ	ä�N‰N˜?ª1ªa°¨7Ñ3Ó4Øšq¢! Q˜wÑ'¨!Ñ+ñ-ä�n‰n˜YÓ'×+Ñ+°Ð+Ó3ñ4ð ×"Ñ" 1Ó%ñ&ð 	ð #Ÿ;™;¨1˜;Ó-×0Ñ0´·±Ó?ÐØ$×*Ñ*¨qÐ*Ó1ˆ	Ø&¨Ñ*ˆà—O‘O HÓ-×2Ñ2Ó4ˆ	ð %¢Qªª1¨b¨q¨b [Ñ1×9Ñ9¸'À8ÈQÓO×RÑRÔSX×S`ÑS`ÓaˆØ!Ÿ™¤U§]¡]Ó3ˆð ×%Ñ% aÓ(¨=×+BÑ+BÀ1Ó+EÑEˆØ—X‘X“Z—^‘^ BÓ'ˆ
Ø×'Ñ'¨Ó*ˆØ×+Ñ+¨[¨L¸#Ó>ˆ
Ø—^‘^ BÓ'ˆ
à ×!4Ñ!4°QÓ!7Ñ7×<Ñ<¸Y×=PÑ=PÐQRÓ=SÓTˆÜ×#Ñ# H°#¸cÈ#ÔNˆØ(0×(8Ñ(8ØØØó)
÷ ‰"Ð×%Ñ%Ó
&ð	 	’’1�nÐ$Ñ%ð $¢A¢qª!¨Q JÑ/×7Ñ7¸ÀÓJ×MÑMÌeÏmÉmÓ\ˆØ¢¢1¢a¨ 
Ñ+×3Ñ3°G¸XÓF×IÑIÌ%Ï-É-ÓXˆØ#¢A¢qª!¨Q JÑ/×7Ñ7¸ÀÓJ×MÑMÌeÏmÉmÓ\ˆàˆØˆØˆØ�k‰k‹mˆØ�k‰k‹mˆä—N‘N <Ó0×4Ñ4¸Ð4Ó<ˆ	Ø¤%§.¡.°Ó"=Ñ=ÄÇÁÈwÓ@WÑWÔZ_×ZhÑZhÐitÓZuÑuˆà�&‰\ˆØ�&‰\ˆØ�]‰]˜1Ó Ñ" S§]¡]°1Ó%5¸Ñ%:Ñ:ˆØ�]‰]˜1Ó Ñ"ˆØ�R‘˜"˜r™'Ñ!ˆð ˜+×/Ñ/°Ó2Ñ2´U·^±^ÀBÓ5GÑGÌ%Ï.É.ÐY[ÓJ\Ñ\Ô_d×_mÑ_mÐnsÓ_tÑtð 	ð �u˜uŸ™¨xÓ8×=Ñ=¸aÐASÐUVÓWÑWÑXØ�gÑß
‰)�A‹,ñˆô × Ñ  ¨C¸ÄEÇKÁKÐPU×P[ÑP[ÓD\×D`ÑD`ÔaˆØ×!Ñ! = .°#Ó6ˆØ—)‘)˜B“-ˆà˜i×1Ñ1°!Ó4Ñ4×=Ñ=¸aÀÐN`ÓaˆØ×Ñ˜{×4Ñ4°QÓ7Ð7¸Ô=Ø)1¯©Ð5G×5MÑ5MÓ)Nˆ’’A�~Ð%Ñ&à%¢aªªA¨q jÑ1×9Ñ9¸'À8ÓLˆàšQ¢ 1˜WÑ%¨Ñ)ß‰RÐ"×(Ñ(Ó)ß‰WØ"Øóð 	ð %¢Qªª1¨a ZÑ0×8Ñ8¸À(ÓKˆàšQ¢ 1˜WÑ%¨Ñ)ß‰RÐ"×(Ñ(Ó)ß‰WØ"Øóð 	ô /EÀ]ÐTcÓ.d×.lÑ.lØØØó/
ô �(‹Oñ	/ˆ’aš˜NÐ*Ñ+ô
 .DÀLÐR`Ó-a×-iÑ-iØØØó.
ô �(‹Oñ	.ˆ’Qš˜>Ð)Ó*ð[qðj �M <°Ð9Ð9r   )r   ré   r®   )r   r>   r   r>   r   r>   r<   r>   )ry   r>   rz   r>   r{   r>   r|   r>   r}   zSequence[int]r<   z=tuple[torch.Tensor, torch.Tensor, torch.Tensor, torch.Tensor])r´   r>   rµ   r>   r<   r>   )rB   Ú
__future__r   Úcollections.abcr   Útypingr   r   Útorch.nn.functionalr   Ú
functionalro   Úrfdetr.utilities.loggerr   r]   r
   Ú__annotations__r   ÚModuler   r®   r¸   ré   Ú__all__r   r   r   ú<module>ró      sí   ðòõ  #å $Ý ã ß Ð Ý å .á	‹€ð Ð �3Ó ó,ô87< "§)¡)ô 7<ðtc@Ø$ðc@à"ðc@ð !ðc@ð ð	c@ð
 +ðc@ð Cóc@óLðO:Ø$ðO:à"ðO:ð !ðO:ð ð	O:ð
 +ðO:ð CóO:òd�r   