U
    qhi9                     @  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                   @  s6   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 k	r$t |t|ksHt |dksH|d k	rbt |t|ksHt |dkrb| 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   B/tmp/pip-unpacked-wheel-xnis5xre/onnx/reference/ops/op_max_pool.pyr      sF    

zMaxPool._runc	                   sF  d kr"dd t t|d D |d kr@dd t t|D }|d kr^dd t t|D }t| t fddt  D }	|jdd  }
dd |
D }|r<t t|
D ]}tt|
| |	|   || d ||  d  ||  d ||< || d ||  |
| |	| d	  k}|r||  d8  < qnZt t|
D ]L}tt|
| |	|   || d ||  d  ||  d ||< qH|r|d
kr|dkrjt t|
D ]}|dkrtt|
| ||  ||< ntt|
| ||  ||< || d ||  || d ||  d  |
|  }|d |	|d	f< ||	|d	f  |	|df< qnNt t|
D ]@}tt|
| || d ||  d  d ||  ||< qvt|
dkr| 	||||||	|||	S t|
dkr| 
||||||	|||	S t|
dkr0| ||||||	|||	S td|j dd S )Nc                 S  s   g | ]}d qS r   r   .0ir   r   r   
<listcomp>B   s     z%MaxPool._max_pool.<locals>.<listcomp>   c                 S  s   g | ]}d qS r   r   r   r   r   r   r   D   s     c                 S  s   g | ]}d qS r   r   r   r   r   r   r   F   s     c                   s    g | ]}| |   fqS r   r   r   Zn_dimsr
   r   r   r   I   s     c                 S  s   g | ]}d qS r   r   )r   sr   r   r   r   L   s     r   r   NOTSET)
SAME_UPPERZ
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_padsZinput_spatial_shapeoutput_spatial_shaper   Z$need_to_reduce_out_size_in_ceil_modeZ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 | }|
rndn|d 	
|d | | |   	
fdd	}t|D ]}|| qt	| j
dkr|fS | |fS )
NFr   dtyper3   Z
fill_valuer   r   c           
        s   | 	 }| 
 }| 
 }t D ]}| d  }|d   }d }d}t ||D ]>}	|	dk sX|	krnqX|d ks||	  |krX||	  }|	}qX||| < | 	 |  || < q d S )Nr   r   r   r4   r#   )
cx_dy_di_dphhstarthendYhh_indexhI_dataX_dataY_data
dilation_hheightr	   r0   pooled_heightstride_hx_stepy_stepr   r   	iteration   s     z'MaxPool._max_pool_1d.<locals>.iteration)r'   tupler%   zerosr3   fullint64ravelr#   r$   outputreshaper   r   r   r   r   r	   r0   r   r   r1   Zglobal_poolingZy_dimsyindicesZx_dimsZchannelsZtotal_channelsrL   r8   r   rB   r   r,      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rf|d nd|d tdkr|d nd	|d | }|
rdn|d |
rdn|d  	 |d |d | | |   	
fd	d
}t	|D ]}|| q t| j
dkrL|fS | |fS )NFr   r2   r4   r5   r   r!   r   c                   sx  |  }|  }t D ]X}| d  }|d   }t 	D ](}| d  }|d   }|	 | }	d }
d}d}t ||D ]}|dk s|krqt ||D ]h}|dk s|krq| | }|dk s|jd krq|
d ks||  |
kr||  }
|}|}qq|
d kr*qF|
||	 < 
dkrT|  |  | n|  | |   ||	 < qFqd S )Nr6   r   r   r   r   r4   )r#   r'   )r8   r9   r:   r<   r=   r>   pwwstartwend
pool_indexr?   r@   w_indexrA   winput_indexrC   rD   rE   rF   
dilation_wrG   r	   r0   rH   pooled_widthr   rI   stride_wwidthrJ   rK   r   r   rL     s@    
z'MaxPool._max_pool_2d.<locals>.iterationr'   rM   r%   rN   r3   rO   rP   r$   rQ   r#   rR   rS   rT   r   r_   r   r-      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rf|d ndtdkr~|d nd|d tdkr|d ndtdkr|d nd
|d	 | }|
rdn|d	 |
rdn|d |
rdn|d    
 |d	 |d |d | | |   	
fd
d}t	|D ]}|| qxt| j
dkr|fS | |fS )NFr   r2   r4   r5   r   r!      r   c              	     s  |  }|  }|  }t D ]}| 	d  }|d   }t D ]}| 	d  }|d   }	t 
D ]l}
|
 	d  }|d   }| 
 |
  |
 }d }d}d}d}t ||D ]}|dk s|krqt ||	D ]}|dk s|krqt ||D ]j}|dk s|kr8q|  |  | }|d ksl||  |kr||  }|}|}|}qqq||| < dkr|  |   |  | n|  | |  |    || < q|qNq d S )Nr6   r   rW   r   )r   r   r   r4   r7   )r8   r9   r:   r;   r<   r=   r>   rX   rY   rZ   pdZdstartZdendr[   r?   r@   r\   Zd_indexrA   r]   dr^   rC   rD   rE   depthZ
dilation_drF   r`   rG   r	   r0   Zpooled_depthrH   ra   r   Zstride_drI   rb   rc   rJ   rK   r   r   rL   b  sh    

z'MaxPool._max_pool_3d.<locals>.iterationrd   rT   r   rh   r   r.   ;  s<    26zMaxPool._max_pool_3d)NNNNNNN)__name__
__module____qualname__r   r   r,   r-   r.   r   r   r   r   r      s          
* 8Mr   )
__future__r   Znumpyr%   Z"onnx.reference.ops._op_common_poolr   r   r   r   r   r   <module>   s   