U
    ­Ê¹j.  ã                   @   sê   d dl mZmZmZmZ d dlZd dlmZmZ dee eedœdd„Z	ee edœdd	„Z
eeee f d
œdd„Zdejeee  eee ee f dœdd„Zeedœdd„Zeedœdd„Zejejeejejf dœdd„ZdS )é    )ÚListÚOptionalÚTupleÚUnionN)ÚnnÚTensor)ÚtensorsÚdimÚreturnc                 C   s    t | ƒdkr| d S t | |¡S )zg
    Efficient version of torch.cat that avoids a copy if there is only a single element in a list
    é   r   )ÚlenÚtorchÚcat)r   r	   © r   úU/var/www/html/bwave/python/venv/lib/python3.8/site-packages/torchvision/ops/_utils.pyÚ_cat   s    r   )Úboxesr
   c              	   C   sp   t dd„ | D ƒdd�}g }t| ƒD ]*\}}| t |d d …d d…f |¡¡ q"t |dd�}tj||gdd�}|S )Nc                 S   s   g | ]}|‘qS r   r   )Ú.0Úbr   r   r   Ú
<listcomp>   s     z/convert_boxes_to_roi_format.<locals>.<listcomp>r   ©r	   r   )r   Ú	enumerateÚappendr   Z	full_liker   )r   Zconcat_boxesÚtempÚir   ZidsZroisr   r   r   Úconvert_boxes_to_roi_format   s    $r   )r   c                 C   sd   t | ttfƒr0| D ]}t | d¡dkd¡ qn0t | tjƒrTt |  d¡dkd¡ nt dd¡ d S )Nr   é   zNThe shape of the tensor in the boxes list is not correct as List[Tensor[L, 4]]é   z5The boxes tensor shape is not correct as Tensor[K, 5]Fz>boxes is expected to be a Tensor[L, 5] or a List[Tensor[K, 4]])Ú
isinstanceÚlistÚtupler   Z_assertÚsizer   )r   Z_tensorr   r   r   Úcheck_roi_boxes_shape   s     ÿr"   )ÚmodelÚnorm_classesr
   c                 C   sØ   |s$t jjjt jt jt jjjt jg}|D ] }t	|t j
ƒs(td|› d�ƒ‚q(t|ƒ}g }g }|  ¡ D ]l}t| ¡ d ƒr’| dd„ |jdd�D ƒ¡ qbt||ƒr¶| dd„ | ¡ D ƒ¡ qb| dd„ | ¡ D ƒ¡ qb||fS )	NzClass z  is not a subclass of nn.Module.c                 s   s   | ]}|j r|V  qd S ©N©Zrequires_grad©r   Úpr   r   r   Ú	<genexpr>@   s      z-split_normalization_params.<locals>.<genexpr>F)Zrecursec                 s   s   | ]}|j r|V  qd S r%   r&   r'   r   r   r   r)   B   s      c                 s   s   | ]}|j r|V  qd S r%   r&   r'   r   r   r   r)   D   s      )r   ÚmodulesZ	batchnormZ
_BatchNormZ	LayerNormZ	GroupNormZinstancenormZ_InstanceNormZLocalResponseNormÚ
issubclassÚModuleÚ
ValueErrorr    ÚnextÚchildrenÚextendÚ
parametersr   )r#   r$   ÚtÚclassesZnorm_paramsZother_paramsÚmoduler   r   r   Úsplit_normalization_params)   s(    û
r5   )r2   r
   c                 C   sH   |   ¡ r&| jtjtjfkr| S |  ¡ S | jtjtjfkr<| S |  ¡ S d S r%   )	Zis_floating_pointÚdtyper   Úfloat32Úfloat64ÚfloatZint32Zint64Úint©r2   r   r   r   Ú_upcastH   s    r<   c                 C   s   | j tjtjfkr|  ¡ S | S r%   )r6   r   r7   r8   r9   r;   r   r   r   Ú_upcast_non_floatP   s    r=   )Úboxes1Úboxes2r
   c                 C   sÂ   | j dd�\}}}}|j dd�\}}}}	t ||¡}
t ||¡}t ||¡}t ||	¡}t |¡}||k||
k@ }|| |
|  || ||   ||< || ||  || |	|   | }||fS )Néÿÿÿÿr   )Zunbindr   ÚmaxÚminZ
zeros_like)r>   r?   Úx1Úy1Zx2Úy2Zx1gZy1gZx2gZy2gZxkis1Zykis1Zxkis2Zykis2ZintsctkÚmaskZunionkr   r   r   Ú_loss_inter_unionW   s    
$$rG   )r   )N)Útypingr   r   r   r   r   r   r   r:   r   r   r"   r,   Útyper5   r<   r=   rG   r   r   r   r   Ú<module>   s"   
 ÿ 
þý