U
    qh$                     @  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	d
ddZ
dddddd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   M/tmp/pip-unpacked-wheel-xnis5xre/onnx/reference/ops/op_non_max_suppression.pyr      s   
r   c                   @  s&   e Zd ZdZd	dddddddZdS )
SelectedIndexbatch_index_class_index_
box_index_r   r   None)batch_indexclass_index	box_indexreturnc                 C  s   || _ || _|| _d S Nr   )selfr   r   r   r   r   r   __init__   s    zSelectedIndex.__init__N)r   r   r   )r   r   r   	__slots__r"   r   r   r   r   r      s
        r   floatztuple[float, float])lhsrhsr   c                 C  s   | |kr|| fS | |fS r    r   )r%   r&   r   r   r   max_min&   s    r'   
np.ndarrayr   bool)
boxes_data
box_index1
box_index2center_point_boxiou_thresholdr   c                 C  s  | | }| | }|dkrt |d |d \}}t |d |d \}	}
t||	}t||
}||krddS t |d |d \}}t |d |d \}}t||}t||}||krdS n|d d }|d d }|d d }|d d }|d | }|d | }|d | }	|d | }
t||	}t||
}||kr4dS |d | }|d | }|d | }|d | }t||}t||}||krdS || ||  }|dkrdS || ||  }|
|	 ||  }|| | }|dks|dks|dkrdS || }||kS )Nr         F   )r'   maxmin)r*   r+   r,   r-   r.   Zbox1Zbox2Zx1_minZx1_maxZx2_minZx2_maxZintersection_x_minZintersection_x_maxZy1_minZy1_maxZy2_minZy2_maxZintersection_y_minZintersection_y_maxZbox1_width_halfZbox1_height_halfZbox2_width_halfZbox2_height_halfZintersection_areaZarea1Zarea2Z
union_areaZintersection_over_unionr   r   r   suppress_by_iou,   s^    










r4   c                   @  s:   e Zd ZddddddZdd	d
dZdd	ddZdS )BoxInfor   r$   r   )scoreidxc                 C  s   || _ || _d S r    Zscore_idx_)r!   r7   r8   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    r9   )r!   r&   r   r   r   __lt__w   s    zBoxInfo.__lt__strc                 C  s   d| j  d| j dS )NzBoxInfo(z, )r9   )r!   r   r   r   __repr__|   s    zBoxInfo.__repr__N)r   r6   )r   r   r   r"   r;   r>   r   r   r   r   r5   r   s   r5   c                   @  sB   e Zd ZddddddddZddddddd	d
dZdd ZdS )NonMaxSuppressionr   r   r$   ztuple[int, float, float])pcmax_output_boxes_per_classr.   score_thresholdr   c                 C  sL   |j d k	rt|j d d}|jd k	r.|jd }|jd k	rB|jd }|||fS )Nr   )r
   r2   r   r   )r!   r@   rA   r.   rB   r   r   r   get_thresholds_from_inputs   s    




z,NonMaxSuppression.get_thresholds_from_inputsr(   )r@   boxes_tensorscores_tensor!max_output_boxes_per_class_tensoriou_threshold_tensorscore_threshold_tensorc           	      C  sz   ||_ ||_|jdkr||_|jdk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!   r@   rD   rE   rF   rG   rH   Z
boxes_dimsZscores_dimsr   r   r   prepare_compute   s    	




z!NonMaxSuppression.prepare_computec              	   C  s  |p| j }t }| |||||| | |ddd\}}}|jdkrVtjdtjdfS |j}|j	}	g }
t
|jD ]}t
|jD ]}||f}|| }g }|	| }|jd k	rt
|jD ]$}|| |kr|t|| | qn$t
|jD ]}|t|| | qt|}g }t|dkrt||k r|d }d}|D ]&}t||j|j||r6d} q^q6|r|| |
t|||j |  qqqpt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   )Zdtyper6   TFr0   r/   r1   )r-   r   rK   rC   rI   npemptyZint64r   r   ranger   r   r   r   appendr5   sortedlenr4   r:   r   poprJ   r   r   r   )r!   ZboxesZscoresrA   r.   rB   r-   r@   r*   Zscores_dataZselected_indicesr   r   Zbox_score_offsetZbatch_boxesZcandidate_boxesZclass_scoresr   Zsorted_boxesZselected_boxes_inside_classZnext_top_scoreselectedZselected_indexresultir   r   r   _run   s    	






zNonMaxSuppression._runN)r   r   r   rC   rK   rV   r   r   r   r   r?      s   r?   )
__future__r   ZdataclassesZnumpyrL   Zonnx.reference.op_runr   Z	dataclassr   r   r'   r4   r5   r?   r   r   r   r   <module>   s   F