ó
    Eñi)  ã                   óÞ   • S SK r S SKr S SK JrJr  S SKJr  S SKJr  SSKJ	r	  SSK
JrJr  \ R                  R                    SS	\S
\S\S\S\S\4S jj5       r " S S\R$                  5      rg)é    N)ÚnnÚTensor)Ú_pair)Ú_assert_has_opsé   )Ú_log_api_usage_onceé   )Úcheck_roi_boxes_shapeÚconvert_boxes_to_roi_formatÚinputÚboxesÚoutput_sizeÚspatial_scaleÚsampling_ratioÚreturnc                 ó°  • [         R                  R                  5       (       d2  [         R                  R                  5       (       d  [	        [
        5        [        5         [        U5        Un[        U5      n[        U[         R                  5      (       d  [        U5      n[         R                  R                  R                  XX2S   US   U5      u  pgU$ )aì  
Performs Position-Sensitive Region of Interest (RoI) Align operator
mentioned in Light-Head R-CNN.

Args:
    input (Tensor[N, C, H, W]): The input tensor, i.e. a batch with ``N`` elements. Each element
        contains ``C`` feature maps of dimensions ``H x W``.
    boxes (Tensor[K, 5] or List[Tensor[L, 4]]): the box coordinates in (x1, y1, x2, y2)
        format where the regions will be taken from.
        The coordinate must satisfy ``0 <= x1 < x2`` and ``0 <= y1 < y2``.
        If a single Tensor is passed, then the first column should
        contain the index of the corresponding element in the batch, i.e. a number in ``[0, N - 1]``.
        If a list of Tensors is passed, then each Tensor will correspond to the boxes for an element i
        in the batch.
    output_size (int or Tuple[int, int]): the size of the output (in bins or pixels) after the pooling
        is performed, as (height, width).
    spatial_scale (float): a scaling factor that maps the box coordinates to
        the input coordinates. For example, if your boxes are defined on the scale
        of a 224x224 image and your input is a 112x112 feature map (resulting from a 0.5x scaling of
        the original image), you'll want to set this to 0.5. Default: 1.0
    sampling_ratio (int): number of sampling points in the interpolation grid
        used to compute the output value of each pooled output bin. If > 0,
        then exactly ``sampling_ratio x sampling_ratio`` sampling points per bin are used. If
        <= 0, then an adaptive number of grid points are used (computed as
        ``ceil(roi_width / output_width)``, and likewise for height). Default: -1

Returns:
    Tensor[K, C / (output_size[0] * output_size[1]), output_size[0], output_size[1]]: The pooled RoIs
r   r	   )ÚtorchÚjitÚis_scriptingÚ
is_tracingr   Úps_roi_alignr   r
   r   Ú
isinstancer   r   ÚopsÚtorchvision)r   r   r   r   r   ÚroisÚoutputÚ_s           ÚY/home/mande/repo/quber/.venv/lib/python3.13/site-packages/torchvision/ops/ps_roi_align.pyr   r      sž   € ôJ �9‰9×!Ñ!×#Ñ#¬E¯I©I×,@Ñ,@×,BÑ,BÜœLÔ)ÜÔÜ˜%Ô Ø€DÜ˜Ó$€KÜ�dœEŸL™L×)Ñ)Ü*¨4Ó0ˆÜ—	‘	×%Ñ%×2Ñ2Ø�]°¡N°KÀ±NÀNó�I€Fð €Mó    c                   ó`   ^ • \ rS rSrSrS\S\S\4U 4S jjrS\S\S	\4S
 jr	S	\
4S jrSrU =r$ )Ú
PSRoIAligné>   z
See :func:`ps_roi_align`.
r   r   r   c                 ó\   >• [         TU ]  5         [        U 5        Xl        X l        X0l        g ©N)ÚsuperÚ__init__r   r   r   r   )Úselfr   r   r   Ú	__class__s       €r   r&   ÚPSRoIAlign.__init__C   s*   ø€ ô 	‰ÑÔÜ˜DÔ!Ø&ÔØ*ÔØ,Õr   r   r   r   c                 óZ   • [        XU R                  U R                  U R                  5      $ r$   )r   r   r   r   )r'   r   r   s      r   ÚforwardÚPSRoIAlign.forwardO   s%   € Ü˜E¨×)9Ñ)9¸4×;MÑ;MÈt×ObÑObÓcÐcr   c                 ó†   • U R                   R                   SU R                   SU R                   SU R                   S3nU$ )Nz(output_size=z, spatial_scale=z, sampling_ratio=Ú))r(   Ú__name__r   r   r   )r'   Úss     r   Ú__repr__ÚPSRoIAlign.__repr__R   sS   € à�~‰~×&Ñ&Ð'ð (Ø×+Ñ+Ð,Ø˜t×1Ñ1Ð2Ø × 3Ñ 3Ð4Øð	ð 	
ð ˆr   )r   r   r   )r/   Ú
__module__Ú__qualname__Ú__firstlineno__Ú__doc__ÚintÚfloatr&   r   r+   Ústrr1   Ú__static_attributes__Ú__classcell__)r(   s   @r   r!   r!   >   sX   ø† ñð
-àð
-ð ð
-ð ÷	
-ðd˜Vð d¨6ð d°fô dð˜#÷ ò r   r!   )g      ð?éÿÿÿÿ)r   Útorch.fxr   r   Útorch.nn.modules.utilsr   Útorchvision.extensionr   Úutilsr   Ú_utilsr
   r   ÚfxÚwrapr7   r8   r   ÚModuler!   © r   r   Ú<module>rF      s‡   ðÛ Û ß Ý (Ý 1å 'ß Fð ‡�‡�ð
 Øñ/Øð/àð/ð ð/ð ð	/ð
 ð/ð ô/ó ð/ôd�—‘õ r   