U
    qh{)                     @  s   d dl mZ d dlZd dlZd dlmZ d dlmZm	Z	 ddddddddd	Z
dddddd
ddZdddddddddddZddddddddddddddddZG dd deZdS )    )annotationsN)OpRun)
_get_index_get_indicesstrz
tuple[int])auto_padinput_spatial_shapekernel_spatial_shapestrides_spatialoutput_spatial_shapereturnc              
   C  s   dgt | }| dkrRtt |D ],}|| d ||  ||  ||  ||< q"n| dkrZt |dkrtd| d|d|d|d		t|S )
Nr   
SAME_UPPER
SAME_LOWER   VALIDz&Unable to compute pad shape, auto_pad=, input_spatial_shape=, kernel_spatial_shape=, strides_spatial=.)lenrangeRuntimeErrortuple)r   r   r	   r
   r   	pad_shapei r   F/tmp/pip-unpacked-wheel-xnis5xre/onnx/reference/ops/_op_common_pool.py_get_pad_shape   s    
r   )r   r   r	   r
   r   c                 C  s   dgt | }| dkrPtt |D ]*}ttt|| t||  ||< q"nL| dkrtt |D ]6}ttt|| || d  t||  ||< qdt|S )Nr   r   r   r   )r   r   intnpceilfloatr   )r   r   r	   r
   	out_shaper   r   r   r   _get_output_shape_no_ceil)   s     

r$   ztuple[int] | Nonez
int | None)r   r   r	   r
   r   	ceil_moder   c           	      C  sN  |st | |||}n|rtjntj}dgt| }| dkrrtt|D ](}t|t|| t||  ||< qFnb| dkr|d krtdtt|D ]<}t|t|| ||  ||  t||  d ||< qt|dkr
t	d| d|d|d	|d
|dt
|dkrFt	d|d| d|d|d	|d
|dt|S )Nr   r   r   zCpad_shape cannot be None if auto_pad is 'VALID' and ceil_mode is 1.r   z)Unable to compute output shape, auto_pad=r   r   r   z, ceil_mode=r   z3output shape cannot be null or negative, out_shape=z, auto_pad=)r$   r    r!   floorr   r   r   r"   
ValueErrorr   minr   )	r   r   r	   r
   r   r%   r#   	round_fctr   r   r   r   _get_output_shape@   sX       

"(r*   Fz
np.ndarrayboolznp.ndarray | None)paddedx_shapekernel_shapestrides_shaper#   r   pooling_typecount_include_padr%   indicespadsr   c              
     sN  |dkrt j}n |dkr t j}ntd|dtd t d d ft|}|	rrt j|jdt j	d	}|r|t j
nt j fd
d}tjtd td f|  D ]l| d d f } fddtD }ttj| }g }|D ]6}z|||  W n tk
r8   Y qY nX qt |}|dkrj|dkrj|||< q|t t |  }|||< |	rzt j|| d}W n0 tk
r   | }| |t |< Y nX t |}t||}dd  |
d d df  }||7 }t|dd  }||< q|	rB|| j|fS || jS )NZAVGMAXzPooling type z& does not support. Should be AVG, MAX.   r   r   )Z
fill_valuedtypec                     s    fddt D S )Nc              	     sH   g | ]@}t tt|d   |   |  t|  d qS )r5   r   )r   r   r"   .0r   )r.   r   r)   r/   r-   r   r   
<listcomp>   s   

z-_pool.<locals>.loop_range.<locals>.<listcomp>r   r   )r.   r   r)   spatial_sizer/   r-   r   r   
loop_range   s    
z_pool.<locals>.loop_rangec                   s>   g | ]6}t | |d    | |d     |  qS )r5   r;   r8   )r.   shaper/   r   r   r:      s
   z_pool.<locals>.<listcomp>)nan)r    ZaveragemaxNotImplementedErrorr   zeroslistfullr>   Zint64r!   r&   	itertoolsproductr   append
IndexErrorarraywhereisnanZ
nan_to_numr(   	TypeErrorcopyZargmaxr   r   Zastyper7   )r,   r-   r.   r/   r#   r   r0   r1   r%   r2   r3   Zfpoolyzr=   ZwindowZlistiZlisti2valuesr   Zwindow_valsZno_nanZwindow_vals_minargZcoordinatesdeltaZnew_argr   )r.   r   r)   r>   r<   r/   r-   r   _poolw   sZ    
*



rS   c                   @  s   e Zd ZdddZdS )
CommonPoolNc                   s  |dkr|d krdd |D }d kr8dd |D d |
d ksLt |
dkr`dgt |jd  }
t|}|dkrtd	n|}d kst dkrdgt |jd  }|jdd  }|}nt d
kr4\}}}}|| || g}t|jdd  t| }|dkrtjnd}tj|dd||f||ffd|d}n}|jdd  }|}|dkr|dkrdtjnd}t||||
||}t||||
|}|dkr|d d }|d | }|d d }|d | }n0|d d }|d | }|d d }|d | }tj|dd||f||ffd|d}nt||||
||}t d  t fddt	 D }t
||j||
|||||t | jdk|d}t|tr|S |fS )Nr4   c                 S  s   g | ]}d qS )r   r   r9   sr   r   r   r:      s     z#CommonPool._run.<locals>.<listcomp>c                 S  s   g | ]}d qS )r   r   rU   r   r   r   r:      s     r5   r   r   NOTSETr      )r   r   Zconstant)modeZconstant_values)r   r   r   c                   s    g | ]}| |   fqS r   r   r8   Zn_dimsr3   r   r   r:     s     )r1   r%   r2   r3   )r   r>   rC   r    rI   r?   padr*   r   r   rS   output
isinstancer   )selfr0   r1   xr   r%   Z	dilationsr.   r3   Zstorage_orderstridesr   r-   r,   Zpad_topZ
pad_bottomZpad_leftZ	pad_rightconstr#   Znew_padsresr   rZ   r   _run   s    
    
	zCommonPool._run)NNNNNNN)__name__
__module____qualname__rc   r   r   r   r   rT      s          rT   )Nr   )r   r   FN)
__future__r   rE   Znumpyr    Zonnx.reference.op_runr   Z%onnx.reference.ops._op_common_indicesr   r   r   r$   r*   rS   rT   r   r   r   r   <module>   s     ?    &R