o
    toi8                     @  s4   d dl mZ d dlZd dlmZ G dd deZdS )    )annotationsN)
CommonPoolc                   @  sD   e Zd Z							dddZdd Zdd Zdd	 Zd
d ZdS )MaxPoolNc	           	      C  s   |d urt |t|ks$t |dks$|d ur1t |t|ks$t |dkr1| j||||||||dS tj| dd||||||||dS )N   )auto_pad	ceil_mode	dilationskernel_shapepadsstorage_orderstridesMAXr   )minmax	_max_poolr   _run)	selfxr   r   r   r	   r
   r   r    r   R/home/ubuntu/.local/lib/python3.10/site-packages/onnx/reference/ops/op_max_pool.pyr      s4   $zMaxPool._runc	                   s:  d u rdd t t|d D |d u r dd t t|D }|d u r/dd t t|D }t| t fddt  D }	|jdd  }
dd |
D }|rt t|
D ]C}tt|
| |	|   || d ||  d  ||  d ||< || d ||  |
| |	| d	  k}|r||  d8  < qXn,t t|
D ]%}tt|
| |	|   || d ||  d  ||  d ||< q|rX|d
krX|dv r1t t|
D ]S}|dkrtt|
| ||  ||< ntt|
| ||  ||< || d ||  || d ||  d  |
|  }|d |	|d	f< ||	|d	f  |	|df< qn't t|
D ] }tt|
| || d ||  d  d ||  ||< q7t|
dkrl| 	||||||	|||	S t|
dkr| 
||||||	|||	S t|
dkr| ||||||	|||	S td|j d)Nc                 S     g | ]}d qS r   r   .0ir   r   r   
<listcomp>B       z%MaxPool._max_pool.<locals>.<listcomp>   c                 S  r   r   r   r   r   r   r   r   D   r   c                 S  r   r   r   r   r   r   r   r   F   r   c                   s    g | ]}| |   fqS r   r   r   n_dimsr
   r   r   r   I   s     c                 S  r   r   r   )r   sr   r   r   r   L   r   r   r   NOTSET)
SAME_UPPER
SAME_LOWERr#      zNot implemented yet for shape .)rangelennparrayshapeintceilsumfloor_max_pool_1d_max_pool_2d_max_pool_3dRuntimeError)r   r   r   r   r   r	   r
   r   r   new_padsinput_spatial_shapeoutput_spatial_shaper   $need_to_reduce_out_size_in_ceil_modepad_ir   r   r   r   6   s   





zMaxPool._max_poolc
                   s  d}
|j d d t|	 }tj||jd}tj|tjdd}|j }|d }|d |d |d | }|
r7dn|d 	
|d | | |   	
fdd	}t|D ]}|| qct	| j
dkrw|fS | |fS )
NFr   dtyper:   
fill_valuer   r   c           
        s   | 	 }| 
 }| 
 }t D ]L}| d  }|d   }d }d}t ||D ]}	|	dk s6|	kr7q,|d u sC||	  |krK||	  }|	}q,||| < | 	 |  || < qd S )Nr   r   r   r;   r'   )
cx_dy_di_dphhstarthendYhh_indexhI_dataX_dataY_data
dilation_hheightr	   r4   pooled_heightstride_hx_stepy_stepr   r   	iteration   s$   z'MaxPool._max_pool_1d.<locals>.iteration)r+   tupler)   zerosr:   fullint64ravelr'   r(   outputreshaper   r   r   r   r   r	   r4   r   r   r6   global_poolingy_dimsyindicesx_dimschannelstotal_channelsrT   r@   r   rJ   r   r0      s,    
zMaxPool._max_pool_1dc
                   s\  d}
|j d d t|	 }tj||jd}tj|tjdd}|j }|d }|d tdkr3|d nd|d tdkrC|d nd	|d | }|
rOdn|d |
rWdn|d  	 |d |d | | |   	
fd	d
}t	|D ]}|| qt| j
dkr|fS | |fS )NFr   r9   r;   r<   r   r%   r   c                   sn  |  }|  }t D ]}| d  }|d   }t 	D ]}| d  }|d   }|	 | }	d }
d}d}t ||D ]E}|dk sP|krQqFt ||D ]3}|dk sa|krbqW| | }|dk ss|jd krtqW|
d u s||  |
kr||  }
|}|}qWqF|
d u rq"|
||	 < 
dkr|  |  | n	|  | |   ||	 < q"qd S )Nr>   r   r   r   r   r;   )r'   r+   )r@   rA   rB   rD   rE   rF   pwwstartwend
pool_indexrG   rH   w_indexrI   winput_indexrK   rL   rM   rN   
dilation_wrO   r	   r4   rP   pooled_widthr   rQ   stride_wwidthrR   rS   r   r   rT     sH   
z'MaxPool._max_pool_2d.<locals>.iterationr+   rU   r)   rV   r:   rW   rX   r(   rY   r'   rZ   r[   r\   r   rl   r   r1      s4   *#
zMaxPool._max_pool_2dc
                   s  d}
|j d d t|	 }tj||jd}tj|tjdd}|j }|d }|d tdkr3|d ndtdkr?|d nd|d tdkrO|d ndtdkr[|d nd
|d	 | }|
rgdn|d	 |
rodn|d |
rwdn|d    
 |d	 |d |d | | |   	
fd
d}t	|D ]}|| qt| j
dkrЈ|fS | |fS )NFr   r9   r;   r<   r   r%      r   c              	     s  |  }|  }|  }t D ]}| 	d  }|d   }t D ]}| 	d  }|d   }	t 
D ]}
|
 	d  }|d   }| 
 |
  |
 }d }d}d}d}t ||D ]S}|dk sr|krsqht ||	D ]A}|dk s|krqyt ||D ]/}|dk s|krq|  |  | }|d u s||  |kr||  }|}|}|}qqyqh||| < dkr|  |   |  | n|  | |  |    || < q<q&qd S )Nr>   r   rd   r   )r   r   r   r;   r?   )r@   rA   rB   rC   rD   rE   rF   re   rf   rg   pddstartdendrh   rG   rH   ri   d_indexrI   rj   drk   rK   rL   rM   depth
dilation_drN   rm   rO   r	   r4   pooled_depthrP   rn   r   stride_drQ   ro   rp   rR   rS   r   r   rT   b  sp   

z'MaxPool._max_pool_3d.<locals>.iterationrq   r\   r   rx   r   r2   ;  s<   26
zMaxPool._max_pool_3d)NNNNNNN)__name__
__module____qualname__r   r   r0   r1   r2   r   r   r   r   r      s    
* 8Mr   )
__future__r   numpyr)   "onnx.reference.ops._op_common_poolr   r   r   r   r   r   <module>   s   