o
    to™iB$  ã                   @  s€   d dl mZ d dlZd dlZd dlmZ ejG dd„ dƒƒZG dd„ dƒZ	ddd„Z
ddd„ZG dd„ dƒZG dd„ deƒZdS )é    )ÚannotationsN)ÚOpRunc                   @  s†   e Zd ZU dZded< dZded< dZded< dZded< dZded	< dZ	ded
< dZ
ded< dZded< dZded< dZded< dS )ÚPrepareContextNznp.ndarray | NoneÚboxes_data_r   ÚintÚboxes_size_Úscores_data_Úscores_size_Úmax_output_boxes_per_class_Úscore_threshold_Úiou_threshold_Únum_batches_Únum_classes_Ú
num_boxes_)Ú__name__Ú
__module__Ú__qualname__r   Ú__annotations__r   r   r	   r
   r   r   r   r   r   © r   r   ú]/home/ubuntu/.local/lib/python3.10/site-packages/onnx/reference/ops/op_non_max_suppression.pyr      s   
 r   c                   @  s   e Zd ZdZ	ddd	d
„ZdS )ÚSelectedIndex)Úbatch_index_Ú
box_index_Úclass_index_r   Úbatch_indexr   Úclass_indexÚ	box_indexÚreturnÚNonec                 C  s   || _ || _|| _d S ©N)r   r   r   )Úselfr   r   r   r   r   r   Ú__init__   s   
zSelectedIndex.__init__N)r   r   r   )r   r   r   r   r   r   r   r   )r   r   r   Ú	__slots__r!   r   r   r   r   r      s    ÿr   ÚlhsÚfloatÚrhsr   útuple[float, float]c                 C  s   | |kr|| fS | |fS r   r   )r#   r%   r   r   r   Úmax_min&   s   r'   Ú
boxes_dataú
np.ndarrayÚ
box_index1r   Ú
box_index2Úcenter_point_boxÚiou_thresholdÚboolc                 C  sö  | | }| | }|dkrYt |d |d ƒ\}}t |d |d ƒ\}	}
t||	ƒ}t||
ƒ}||kr2dS t |d |d ƒ\}}t |d |d ƒ\}}t||ƒ}t||ƒ}||krXdS nh|d d }|d d }|d d }|d d }|d | }|d | }|d | }	|d | }
t||	ƒ}t||
ƒ}||kr™dS |d | }|d | }|d | }|d | }t||ƒ}t||ƒ}||krÁdS || ||  }|dkrÏdS || ||  }|
|	 ||  }|| | }|dksñ|dksñ|dkródS || }||kS )Nr   é   é   Fé   )r'   ÚmaxÚmin)r(   r*   r+   r,   r-   Úbox1Úbox2Úx1_minÚx1_maxÚx2_minÚx2_maxÚintersection_x_minÚintersection_x_maxÚy1_minÚy1_maxÚy2_minÚy2_maxÚintersection_y_minÚintersection_y_maxÚbox1_width_halfÚbox1_height_halfÚbox2_width_halfÚbox2_height_halfÚintersection_areaÚarea1Úarea2Ú
union_areaÚintersection_over_unionr   r   r   Úsuppress_by_iou,   s`   



ÿ



ÿrK   c                   @  s,   e Zd Zdddd„Zddd„Zddd„ZdS )ÚBoxInfor   éÿÿÿÿÚscorer$   Úidxr   c                 C  s   || _ || _d S r   ©Úscore_Úidx_)r    rN   rO   r   r   r   r!   s   s   
zBoxInfo.__init__r   r.   c                 C  s$   | j |j k p| j |j ko| j|jkS r   rP   )r    r%   r   r   r   Ú__lt__w   s   ÿzBoxInfo.__lt__Ústrc                 C  s   d| j › d| j› dS )NzBoxInfo(z, ú)rP   )r    r   r   r   Ú__repr__|   s   zBoxInfo.__repr__N)r   rM   )rN   r$   rO   r   )r   r.   )r   rT   )r   r   r   r!   rS   rV   r   r   r   r   rL   r   s    
rL   c                   @  s2   e Zd Zdd
d„Zddd„Z				ddd„ZdS )ÚNonMaxSuppressionÚpcr   Úmax_output_boxes_per_classr   r-   r$   Úscore_thresholdr   útuple[int, float, float]c                 C  sL   |j d urt|j d dƒ}|jd ur|jd }|jd ur!|jd }|||fS )Nr   )r
   r2   r   r   )r    rX   rY   r-   rZ   r   r   r   Úget_thresholds_from_inputs   s   





z,NonMaxSuppression.get_thresholds_from_inputsÚboxes_tensorr)   Úscores_tensorÚ!max_output_boxes_per_class_tensorÚiou_threshold_tensorÚscore_threshold_tensorc           	      C  s‚   ||_ ||_|jdkr||_|jdkr||_|d ur"|jdkr"||_|j|_|j|_|j}|j}|d |_	|d |_
|d |_d S )Nr   r/   )r   r   Úsizer
   r   r   r   r	   Úshaper   r   r   )	r    rX   r]   r^   r_   r`   ra   Ú
boxes_dimsÚscores_dimsr   r   r   Úprepare_compute“   s   	



z!NonMaxSuppression.prepare_computeNc              	   C  sø  t ƒ }|  ||||||¡ |  |ddd¡\}}}|jdkr&tjdtjdfS |j}|j}	g }
t	|j
ƒD ]”}t	|jƒD ]Œ}||f}|| }g }|	| }|jd urht	|jƒD ]}|| |krf| t|| |ƒ¡ qTnt	|jƒD ]}| t|| |ƒ¡ qmt|ƒ}g }t|ƒdkrÆt|ƒ|k rÆ|d }d}|D ]}t||j|j||ƒr¤d} nq”|r¶| |¡ |
 t|||jƒ¡ | ¡  t|ƒdkrÆt|ƒ|k sŒq:q3tjt|
ƒdftjd}t	|jd ƒD ]}|
| j||df< |
| j||df< |
| j||d	f< qÛ|fS )
Nr   )r   )ÚdtyperM   TFr0   r/   r1   )r   rf   r\   rb   ÚnpÚemptyÚint64r   r   Úranger   r   r   r   ÚappendrL   ÚsortedÚlenrK   rR   r   Úpoprc   r   r   r   )r    ÚboxesÚscoresrY   r-   rZ   r,   rX   r(   Úscores_dataÚselected_indicesr   r   Úbox_score_offsetÚbatch_boxesÚcandidate_boxesÚclass_scoresr   Úsorted_boxesÚselected_boxes_inside_classÚnext_top_scoreÚselectedÚselected_indexÚresultÚir   r   r   Ú_run°   sŒ   	úü

ÿ€þÿûø

ÿç€å5zNonMaxSuppression._run)
rX   r   rY   r   r-   r$   rZ   r$   r   r[   )rX   r   r]   r)   r^   r)   r_   r)   r`   r)   ra   r)   )NNNN)r   r   r   r\   rf   r   r   r   r   r   rW   €   s    

!ùrW   )r#   r$   r%   r$   r   r&   )r(   r)   r*   r   r+   r   r,   r   r-   r$   r   r.   )Ú
__future__r   ÚdataclassesÚnumpyrh   Úonnx.reference.op_runr   Ú	dataclassr   r   r'   rK   rL   rW   r   r   r   r   Ú<module>   s   

F