o
    toi+(                     @  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Z
d)ddZ		 d*d+ddZ	 	 		d,d-d$d%ZG d&d' d'eZdS ).    )annotationsN)OpRun)
_get_index_get_indicesauto_padstrinput_spatial_shape
tuple[int]kernel_spatial_shapestrides_spatialoutput_spatial_shapereturnc              
   C  s   dgt | }| dv r)tt |D ]}|| d ||  ||  ||  ||< qn| dkr.	 t |dkrEt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   V/home/ubuntu/.local/lib/python3.10/site-packages/onnx/reference/ops/_op_common_pool.py_get_pad_shape   s.   r   c                 C  s   dgt | }| dv r+tt |D ]}ttt|| t||  ||< qt|S | dkrQtt |D ]}ttt|| || d  t||  ||< q5t|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%   r   tuple[int] | None	ceil_mode
int | Nonec           	      C  sJ  |s
t | |||}n`|rtjntj}dgt| }| dv r9tt|D ]}t|t|| t||  ||< q#n1| dkrj|d u rEtdtt|D ]}t|t|| ||  ||  t||  d ||< qKt|dkrt	d| d|d|d	|d
|dt
|dkrt	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-   Fpadded
np.ndarrayx_shapekernel_shapestrides_shaper$   pooling_typecount_include_padindicesboolpadsnp.ndarray | Nonec              
     s:  |dkrt j}n|dkrt j}ntd|dtd t d d gt|}|	r9t j|jdt j	d	}|r>t j
nt j fd
d}tjtd td g| R  D ]| d d f } fddtD }ttj| }g }|D ]}z	|||  W q ty   Y qw t |}|dkr|dkr|||< q_|t t |  }|||< |	rzt j|| d}W n ty   | }| |t |< Y nw t |}t||}dd  |
d d df  }||7 }t|dd  }||< q_|	r|| j|fS || jS )NAVGMAXzPooling type z& does not support. Should be AVG, MAX.   r   r   )
fill_valuedtypec                     s    fddt D S )Nc              	     sH   g | ] }t tt|d   |   |  t|  d qS )r;   r   )r   r    r#   .0r   )r1   r   r,   r2   r0   r   r   
<listcomp>   s    

z-_pool.<locals>.loop_range.<locals>.<listcomp>r   r   )r1   r   r,   spatial_sizer2   r0   r   r   
loop_range   s   
z_pool.<locals>.loop_rangec                   s>   g | ]}t | |d    | |d     |  qS )r;   rB   r?   )r1   shaper2   r   r   rA      s    z_pool.<locals>.<listcomp>)nan)r!   averagemaxNotImplementedErrorr   zeroslistfullrE   int64r"   r)   	itertoolsproductr   append
IndexErrorarraywhereisnan
nan_to_numr+   	TypeErrorcopyargmaxr   r   astyper>   )r.   r0   r1   r2   r$   r   r3   r4   r'   r5   r7   fpoolyzrD   windowlistilisti2valuesr   window_valsno_nanwindow_vals_minargcoordinatesdeltanew_argr   )r1   r   r,   rE   rC   r2   r0   r   _poolw   s`   
*


rh   c                   @  s$   e Zd Z							dddZdS )
CommonPoolNc                   s  |dkr|d u rdd |D }d u rdd |D d |
d u s&t |
dkr0dgt |jd  }
t|}|dkr:d	n|}d u sFt dkrZdgt |jd  }|jdd  }|}nIt d
kr\}}}}|| || g}t|jdd  t| }|dkrtjnd}tj|dd||f||ffd|d}n}|jdd  }|}|dv r	|dkrtjnd}t||||
||}t||||
|}|dkr|d d }|d | }|d d }|d | }n|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rD|S |fS )Nr:   c                 S     g | ]}d qS )r   r   r@   sr   r   r   rA          z#CommonPool._run.<locals>.<listcomp>c                 S  rj   )r   r   rk   r   r   r   rA      rm   r;   r   r   NOTSETr      )r   r   constant)modeconstant_values)r   r   r   c                   s    g | ]}| |   fqS r   r   r?   n_dimsr7   r   r   rA     s     )r4   r'   r5   r7   )r   rE   rK   r!   rR   rF   padr-   r   r   rh   output
isinstancer   )selfr3   r4   xr   r'   	dilationsr1   r7   storage_orderstridesr   r0   r.   pad_top
pad_bottompad_left	pad_rightconstr$   new_padsresr   rs   r   _run   s   

	zCommonPool._run)NNNNNNN)__name__
__module____qualname__r   r   r   r   r   ri      s    ri   )r   r   r   r	   r
   r	   r   r	   r   r	   r   r	   )
r   r   r   r	   r
   r	   r   r	   r   r	   )Nr   )r   r   r   r	   r
   r	   r   r	   r   r&   r'   r(   r   r	   )r   r   FN)r.   r/   r0   r	   r1   r	   r2   r	   r$   r	   r   r	   r3   r   r4   r(   r'   r(   r5   r6   r7   r8   r   r/   )
__future__r   rN   numpyr!   onnx.reference.op_runr   %onnx.reference.ops._op_common_indicesr   r   r   r%   r-   rh   ri   r   r   r   r   <module>   s    

?R