§
    ù²ÅjA-  ã                   óh  — d dl Z d dlmZmZ d dlZd dl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mZmZ d„ Zd„ Zd„ Z ed¬¦  «        d„ ¦   «         Zej        j        	 	 	 ddedeeee         f         dee         dedededefd„¦   «         Z G d„ dej         ¦  «        Z!dS ) é    N)ÚListÚUnion)ÚnnÚTensor)Úis_compile_supported)ÚBroadcastingList2)Ú_pair)Ú_assert_has_opsÚ_has_opsé   )Ú_log_api_usage_onceé   )Úcheck_roi_boxes_shapeÚconvert_boxes_to_roi_formatc                  ó   ‡ — ˆ fd„}|S )zkLazily wrap a function with torch.compile on the first call

    This avoids eagerly importing dynamo.
    c                 óJ   •‡ — t          j        ‰ ¦  «        ˆˆ fd„¦   «         }|S )Nc                  óš   •— t          j        ‰fi ‰¤Ž} t          j        ‰¦  «        |¦  «        t	          ¦   «         ‰j        <    || i |¤ŽS ©N)ÚtorchÚcompileÚ	functoolsÚwrapsÚglobalsÚ__name__)ÚargsÚkwargsÚcompiled_fnÚcompile_kwargsÚfns      €€úJC:\Projects\Historical\venv\Lib\site-packages\torchvision/ops/roi_align.pyÚcompile_hookz7lazy_compile.<locals>.decorate_fn.<locals>.compile_hook   sS   ø€ åœ-¨Ð=Ð=¨nÐ=Ð=ˆKØ%8¥Y¤_°RÑ%8Ô%8¸Ñ%EÔ%E�G‰IŒI�b”kÑ"Ø�; Ð/¨Ð/Ð/Ð/ó    )r   r   )r   r!   r   s   ` €r    Údecorate_fnz!lazy_compile.<locals>.decorate_fn   s?   øø€ Ý	Œ˜Ñ	Ô	ð	0ð 	0ð 	0ð 	0ð 	0ñ 
Ô	ð	0ð
 Ðr"   © )r   r#   s   ` r    Úlazy_compiler%      s$   ø€ ðð ð ð ð ð Ðr"   c                 óø  ‡ ‡‡‡‡— ‰                       ¦   «         \  }Š}}|                     d¬¦  «        }|                     d¬¦  «        }|                     ¦   «         }	|                     ¦   «         }
t          j        |	|dz
  k    |dz
  |	dz   ¦  «        }t          j        |	|dz
  k    |dz
  |	¦  «        }	t          j        |	|dz
  k    |                     ‰ j        ¦  «        |¦  «        }t          j        |
|dz
  k    |dz
  |
dz   ¦  «        }t          j        |
|dz
  k    |dz
  |
¦  «        }
t          j        |
|dz
  k    |                     ‰ j        ¦  «        |¦  «        }||	z
  }||
z
  }d|z
  }d|z
  }ˆˆ ˆˆˆfd„} ||	|
¦  «        } ||	|¦  «        } |||
¦  «        } |||¦  «        }d„ } |||¦  «        } |||¦  «        } |||¦  «        } |||¦  «        }||z  ||z  z   ||z  z   ||z  z   }|S )Nr   ©Úminr   ç      ð?c                 óf  •— ‰�J‰€J ‚t          j        ‰d d …d d d …f         | d¦  «        } t          j        ‰d d …d d d …f         |d¦  «        }‰‰d d …d d d d d f         t          j        ‰‰j        ¬¦  «        d d d …d d d d f         | d d …d d d …d d d …d f         |d d …d d d d …d d d …f         f         S )Nr   ©Údevice)r   ÚwhereÚaranger,   )ÚyÚxÚchannelsÚinputÚroi_batch_indÚxmaskÚymasks     €€€€€r    Úmasked_indexz+_bilinear_interpolate.<locals>.masked_indexB   sû   ø€ ð ÐØÐ$Ð$Ð$Ý”˜E ! ! ! T¨1¨1¨1 *Ô-¨q°!Ñ4Ô4ˆAÝ”˜E ! ! ! T¨1¨1¨1 *Ô-¨q°!Ñ4Ô4ˆAØØ˜!˜!˜!˜T 4¨¨t°TÐ9Ô:ÝŒL˜¨%¬,Ð7Ñ7Ô7¸¸a¸a¸aÀÀtÈTÐSWÐ8WÔXØˆaˆaˆa��q�q�q˜$    4Ð'Ô(Øˆaˆaˆa��t˜Q˜Q˜Q  a a aÐ'Ô(ð*ô
ð 	
r"   c           	      óT   — | d d …d d d …d d d …d f         |d d …d d d d …d d d …f         z  S r   r$   )r/   r0   s     r    Ú
outer_prodz)_bilinear_interpolate.<locals>.outer_prodW   sI   € Ø����D˜!˜!˜!˜T 1 1 1 dÐ*Ô+¨a°°°°4¸¸q¸q¸qÀ$ÈÈÈÐ0IÔ.JÑJÐJr"   )ÚsizeÚclampÚintr   r-   ÚtoÚdtype)r2   r3   r/   r0   r5   r4   Ú_ÚheightÚwidthÚy_lowÚx_lowÚy_highÚx_highÚlyÚlxÚhyÚhxr6   Úv1Úv2Úv3Úv4r8   Úw1Úw2Úw3Úw4Úvalr1   s   ``  ``                      @r    Ú_bilinear_interpolaterR   #   sQ  øøøøø€ ð "'§¢¡¤Ñ€A€x�˜ð 	
�Š�Aˆ‰Œ€AØ	�Š�Aˆ‰Œ€AØ�EŠE‰GŒG€EØ�EŠE‰GŒG€EÝŒ[˜ &¨1¡*Ò,¨f°q©j¸%À!¹)ÑDÔD€FÝŒK˜ ¨!¡Ò+¨V°a©Z¸Ñ?Ô?€EÝŒ�E˜V a™ZÒ'¨¯ª¨e¬kÑ):Ô):¸AÑ>Ô>€AåŒ[˜ %¨!¡)Ò+¨U°Q©Y¸À¹	ÑBÔB€FÝŒK˜ ¨¡Ò*¨E°A©I°uÑ=Ô=€EÝŒ�E˜U Q™YÒ&¨¯ª¨U¬[Ñ(9Ô(9¸1Ñ=Ô=€Aà	
ˆU‰€BØ	
ˆU‰€BØ	ˆr‰€BØ	ˆr‰€Bð

ð 
ð 
ð 
ð 
ð 
ð 
ð 
ð 
ð 
ˆ�e˜UÑ	#Ô	#€BØ	ˆ�e˜VÑ	$Ô	$€BØ	ˆ�f˜eÑ	$Ô	$€BØ	ˆ�f˜fÑ	%Ô	%€BðKð Kð Kð 
ˆ�B˜Ñ	Ô	€BØ	ˆ�B˜Ñ	Ô	€BØ	ˆ�B˜Ñ	Ô	€BØ	ˆ�B˜Ñ	Ô	€Bà
ˆr‰'�B˜‘GÑ
˜b 2™gÑ
%¨¨R©Ñ
/€CØ€Jr"   c                 óŒ   — t          j        ¦   «         r0| j        r)| j        t           j        k    r|                      ¦   «         S | S r   )r   Úis_autocast_enabledÚis_cudar=   ÚdoubleÚfloat)Útensors    r    Ú
maybe_castrY   e   s=   € ÝÔ Ñ"Ô"ð  v¤~ð ¸&¼,Í%Ì,Ò:VÐ:VØ�|Š|‰~Œ~Ðàˆr"   T)Údynamicc           
      ó^  — | j         }t          | ¦  «        } t          |¦  «        }|                      ¦   «         \  }}}	}
t          j        || j        ¬¦  «        }t          j        || j        ¬¦  «        }|d d …df                              ¦   «         }|rdnd}|d d …df         |z  |z
  }|d d …df         |z  |z
  }|d d …df         |z  |z
  }|d d …df         |z  |z
  }||z
  }||z
  }|s,t          j        |d	¬
¦  «        }t          j        |d	¬
¦  «        }||z  }||z  }|dk    }|r|nt          j        ||z  ¦  «        }|r|nt          j        ||z  ¦  «        }	 |rNt          ||z  d¦  «        }t          j        || j        ¬¦  «        }t          j        || j        ¬¦  «        }d }d }nƒt          j        ||z  d¬
¦  «        }t          j        |	| j        ¬¦  «        }t          j        |
| j        ¬¦  «        }|d d d …f         |d d …d f         k     }|d d d …f         |d d …d f         k     }d„ } ||¦  «        |d d d …d f          ||¦  «        z  z   |d d d d …f         dz    
                    | j         ¦  «         |||z  ¦  «        z  z   }  ||¦  «        |d d d …d f          ||¦  «        z  z   |d d d d …f         dz    
                    | j         ¦  «         |||z  ¦  «        z  z   }!t          | || |!||¦  «        }"|sLt          j        |d d …d d d d d …d f         |"d¦  «        }"t          j        |d d …d d d d d d …f         |"d¦  «        }"|"                     d¦  «        }#t          |t          j        ¦  «        r|#|d d …d d d f         z  }#n|#|z  }#|# 
                    |¦  «        }#|#S )Nr+   r   g      à?g        r   r   é   é   r)   r'   c                 ó   — | d d …d d f         S r   r$   )Úts    r    Úfrom_Kz_roi_align.<locals>.from_K¬   s   € Ø����D˜$�ÔÐr"   )éÿÿÿÿéþÿÿÿ)r=   rY   r9   r   r.   r,   r;   r:   ÚceilÚmaxr<   rR   r-   ÚsumÚ
isinstancer   )$r2   ÚroisÚspatial_scaleÚpooled_heightÚpooled_widthÚsampling_ratioÚalignedÚ
orig_dtyper>   r?   r@   ÚphÚpwr3   ÚoffsetÚroi_start_wÚroi_start_hÚ	roi_end_wÚ	roi_end_hÚ	roi_widthÚ
roi_heightÚ
bin_size_hÚ
bin_size_wÚexact_samplingÚroi_bin_grid_hÚroi_bin_grid_wÚcountÚiyÚixr5   r4   r`   r/   r0   rQ   Úoutputs$                                       r    Ú
_roi_alignr€   r   sg  € à”€Jå�uÑÔ€EÝ�dÑÔ€DàŸ*š*™,œ,Ñ€A€qˆ&�%å	Œ�m¨E¬LÐ	9Ñ	9Ô	9€BÝ	Œ�l¨5¬<Ð	8Ñ	8Ô	8€Bð
 ˜˜˜˜A˜”J—N’NÑ$Ô$€MØÐ$ˆSˆS €FØ�q�q�q˜!�t”*˜}Ñ,¨vÑ5€KØ�q�q�q˜!�t”*˜}Ñ,¨vÑ5€KØ�Q�Q�Q˜�T”
˜]Ñ*¨VÑ3€IØ�Q�Q�Q˜�T”
˜]Ñ*¨VÑ3€Ià˜KÑ'€IØ˜[Ñ(€JØð 6Ý”K 	¨sÐ3Ñ3Ô3ˆ	Ý”[ °Ð5Ñ5Ô5ˆ
à˜mÑ+€JØ˜\Ñ)€Jà# aÒ'€Nà'5Ða�^�^½5¼:ÀjÐS`ÑF`Ñ;aÔ;a€NØ'5Ð_�^�^½5¼:ÀiÐR^ÑF^Ñ;_Ô;_€Nðð ð 6Ý�N ^Ñ3°QÑ7Ô7ˆÝŒ\˜.°´Ð>Ñ>Ô>ˆÝŒ\˜.°´Ð>Ñ>Ô>ˆØˆØˆˆå”˜N¨^Ñ;ÀÐCÑCÔCˆõ Œ\˜&¨¬Ð6Ñ6Ô6ˆÝŒ\˜%¨¬Ð5Ñ5Ô5ˆØ�4˜˜˜�7”˜n¨Q¨Q¨Q°¨WÔ5Ò5ˆØ�4˜˜˜�7”˜n¨Q¨Q¨Q°¨WÔ5Ò5ˆð ð  ð  ð 	ˆˆ{ÑÔØ
ˆT�1�1�1�dˆ]Ô
˜f˜f ZÑ0Ô0Ñ
0ñ	1àˆd�D˜!˜!˜!ˆmÔ˜sÑ"×
&Ò
& u¤{Ñ
3Ô
3°f°f¸ZÈ.Ñ=XÑ6YÔ6YÑ
Yñ	Zð ð 	ˆˆ{ÑÔØ
ˆT�1�1�1�dˆ]Ô
˜f˜f ZÑ0Ô0Ñ
0ñ	1àˆd�D˜!˜!˜!ˆmÔ˜sÑ"×
&Ò
& u¤{Ñ
3Ô
3°f°f¸ZÈ.Ñ=XÑ6YÔ6YÑ
Yñ	Zð õ
    }°a¸¸EÀ5Ñ
IÔ
I€Cð ð GÝŒk˜%    4¨¨t°Q°Q°Q¸Ð <Ô=¸sÀAÑFÔFˆÝŒk˜%    4¨¨t°T¸1¸1¸1Ð <Ô=¸sÀAÑFÔFˆà�WŠW�XÑÔ€FÝ�%�œÑ&Ô&ð Ø�%˜˜˜˜4  tÐ+Ô,Ñ,ˆˆà�%‰ˆà�YŠY�zÑ"Ô"€Fà€Mr"   r)   ra   Fr2   ÚboxesÚoutput_sizerh   rk   rl   Úreturnc           	      óÊ  — t           j                             ¦   «         s2t           j                             ¦   «         st	          t
          ¦  «         t          |¦  «         |}t          |¦  «        }t          |t           j	        ¦  «        st          |¦  «        }t           j                             ¦   «         sit          ¦   «         r!t          j        ¦   «         rH| j        s| j        r:t          | j        j        ¦  «        r!t%          | |||d         |d         ||¦  «        S t'          ¦   «          t           j        j                             | |||d         |d         ||¦  «        S )aj  
    Performs Region of Interest (RoI) Align operator with average pooling, as described in Mask 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``.
            If the tensor is quantized, we expect a batch size of ``N == 1``.
        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
        aligned (bool): If False, use the legacy implementation.
            If True, pixel shift the box coordinates it by -0.5 for a better alignment with the two
            neighboring pixel indices. This version is used in Detectron2

    Returns:
        Tensor[K, C, output_size[0], output_size[1]]: The pooled RoIs.
    r   r   )r   ÚjitÚis_scriptingÚ
is_tracingr   Ú	roi_alignr   r	   rf   r   r   r   Ú$are_deterministic_algorithms_enabledrU   Úis_mpsr   r,   Útyper€   r
   ÚopsÚtorchvision)r2   r�   r‚   rh   rk   rl   rg   s          r    rˆ   rˆ   Ë   sK  € õR Œ9×!Ò!Ñ#Ô#ð '­E¬I×,@Ò,@Ñ,BÔ,Bð 'Ý�IÑ&Ô&Ð&Ý˜%Ñ Ô Ð Ø€DÝ˜Ñ$Ô$€KÝ�d�EœLÑ)Ô)ð 1Ý*¨4Ñ0Ô0ˆÝŒ9×!Ò!Ñ#Ô#ð så‘
”
ð	sÝ$ÔIÑKÔKð	sØQVÔQ^ð	sØbgÔbnð	så" 5¤<Ô#4Ñ5Ô5ð	sõ ˜e T¨=¸+Àa¼.È+ÐVWÌ.ÐZhÐjqÑrÔrÐrÝÑÔÐÝŒ9Ô ×*Ò*Øˆt�] K°¤N°KÀ´NÀNÐT[ñô ð r"   c            	       ó€   ‡ — e Zd ZdZ	 ddee         dededefˆ fd„Zde	d	e
e	ee	         f         d
e	fd„Zd
efd„Zˆ xZS )ÚRoIAlignz 
    See :func:`roi_align`.
    Fr‚   rh   rk   rl   c                 óž   •— t          ¦   «                              ¦   «          t          | ¦  «         || _        || _        || _        || _        d S r   )ÚsuperÚ__init__r   r‚   rh   rk   rl   )Úselfr‚   rh   rk   rl   Ú	__class__s        €r    r’   zRoIAlign.__init__  sL   ø€ õ 	‰Œ×ÒÑÔÐÝ˜DÑ!Ô!Ð!Ø&ˆÔØ*ˆÔØ,ˆÔØˆŒˆˆr"   r2   rg   rƒ   c                 óR   — t          ||| j        | j        | j        | j        ¦  «        S r   )rˆ   r‚   rh   rk   rl   )r“   r2   rg   s      r    ÚforwardzRoIAlign.forward  s'   € Ý˜  dÔ&6¸Ô8JÈDÔL_ÐaeÔamÑnÔnÐnr"   c           
      ód   — | j         j        › d| j        › d| j        › d| j        › d| j        › d�
}|S )Nz(output_size=z, spatial_scale=z, sampling_ratio=z
, aligned=ú))r”   r   r‚   rh   rk   rl   )r“   Úss     r    Ú__repr__zRoIAlign.__repr__  sh   € àŒ~Ô&ð ð ØÔ+ðð à#Ô1ðð ð !%Ô 3ðð ð œð	ð ð ð 	
ð ˆr"   )F)r   Ú
__module__Ú__qualname__Ú__doc__r   r;   rW   Úboolr’   r   r   r   r–   Ústrrš   Ú__classcell__)r”   s   @r    r�   r�     sÕ   ø€ € € € € ðð ð ðð à& sÔ+ðð ðð ð	ð
 ðð ð ð ð ð ðo˜Vð o¨5°¸¸f¼Ð1EÔ+Fð oÈ6ð oð oð oð oð	˜#ð 	ð 	ð 	ð 	ð 	ð 	ð 	ð 	r"   r�   )r)   ra   F)"r   Útypingr   r   r   Útorch.fxr   r   Útorch._dynamo.utilsr   Útorch.jit.annotationsr   Útorch.nn.modules.utilsr	   Útorchvision.extensionr
   r   Úutilsr   Ú_utilsr   r   r%   rR   rY   r€   ÚfxÚwrapr;   rW   rž   rˆ   ÚModuler�   r$   r"   r    ú<module>r¬      sæ  ðØ Ð Ð Ð Ø Ð Ð Ð Ð Ð Ð Ð à €€€Ø €€€Ø Ð Ð Ð Ð Ð Ð Ð Ø 4Ð 4Ð 4Ð 4Ð 4Ð 4Ø 3Ð 3Ð 3Ð 3Ð 3Ð 3Ø (Ð (Ð (Ð (Ð (Ð (Ø ;Ð ;Ð ;Ð ;Ð ;Ð ;Ð ;Ð ;à 'Ð 'Ð 'Ð 'Ð 'Ð 'Ø FÐ FÐ FÐ FÐ FÐ FÐ FÐ Fðð ð ð&=ð =ð =ðDð ð ð €�dÐÑÔðUð Uñ ÔðUðp „„ð
 ØØð7ð 7Øð7à�˜˜fœÐ%Ô&ð7ð # 3Ô'ð7ð ð	7ð
 ð7ð ð7ð ð7ð 7ð 7ñ „ð7ðtð ð ð ð ˆrŒyñ ô ð ð ð r"   