U
    qhS4                     @  s<   d dl mZ d dlZd dlmZ dd ZG dd deZdS )    )annotationsN)OpRunc	           X   *   C  s  |d kr dd | j dd  D }|d kr6|j dd  }|d krZdd | j dd  D d }|d krzdd | j dd  D }| j d |j d | ks|j d | dkrtd| j  d	|j  d
| d|j d | j d | t|j dd  | j d  | f d	|dkr4g }	d}
|j d | }|j d }t| j d D ]}t|D ]}| ||d || |d | f }||| |d |  }zt||d ||d|||	}W n~ ttfk
r  } zZtd| j  d	|j  d
| d| d|j  d|j  d| d| d| d| d| d|W 5 d }~X Y nX |dkr:|
|j d 7 }
|	||f qDq6| j d ft|	d d j dd  }|
|d< tj	t
||	d d jd}d}|	D ]N\}}||||d |||j d  f< ||j d 7 }||j d krd}q|d k	r0dd |j D }|j d |d< |t
|}||7 }|S |d dksTt|t|krht|}g }t|j d |  }t|D ]d\}}t|j | | }||j | |j | d |d    ||| || d |d    q|tj	t
||jd}td|j d td|j d g}t|D ]4\}}t|j | | }|td|j | | q||t
|< |}|}|dkrg }g }tt| j d D ]}| j | }|||  d ||  }|d ||  ||  | } |dkr| d d }!n| d }!| |! }"||! ||" q|| }t| j dkr| j \}#}$}%|\}&|\}'t|%|& |d  |d  |' d }(|d })d|&d  }*|) }+|(|' },t	| j d |j d |(f}	|d k	r|	d d d d d d f  |d7  < t|#D ]}-t|j d D ]}.t|$D ]}/||.|.d |/|/d f }0t|+|,|'D ]Z}1|1|+ |' }2|2|(krJq*|1|&d  }td||* t||* |& |% }3}4| |-|-d |/|/d |3|4f }5|5j |0j krRt|* | dt|&|&|% ||* |&   }6}7|0d dd d|6|7f }8|5j |8j kr4td|5j  d|8j  d|* d| d |& d!|% d"|' dt|5d#|8d$d% }9nt|5d#|0d$d% }9|	|-|.|2f  |97  < q*qqq|	S t| j d&kr$| j \}#}$}%}:|\}&};|\}'}<t|%|& |d  |d  |' d }(t|:|; |d  |d  |< d }=|d |d  })}>d|&d  d|;d   }*}?|) |>  }+}@|(|' |=|<  },}At	| j d |j d |(|=f}	|d k	r|d'|	d d d d d d d d f< t|#D ]l}-t|j d D ]T}.t|$D ]B}/||.|.d |/|/d f }0t|+|,|'D ]}1|1|+ |' }2|2|(k	r 	q |1|&d  }td||* t||* |& |% }3}4t|@|A|<D ]}B|B|@ |< }C|C|=k	rz	qZ|B|;d  }Dtd|D|? t|D|? |; |: }E}F| |-|-d |/|/d |3|4|E|Ff }5|5j |0j k
rt|* | dt|&|&|% ||* |&   }6}7t|? |D dt|;|;|: |D|? |;   }G}H|0d dd d|6|7|G|Hf }8|5j |8j k
rtd|5j  d|8j  d|* d(|? d| d)|D d |& d*|; d!|% d+|: d"|' d,|< dt|5d#|8d$d% }9nt|5d#|0d$d% }9|	|-|.|2|Cf  |97  < 	qZ	q qҐqĐq|	S t| j d-kr| j \}#}$}%}:}I|\}&};}J|\}'}<}Kt|%|& |d  |d  |' d }(t|:|; |d  |d&  |< d }=t|I|J |d  |d-  |K d }L|d |d |d   })}>}Md|&d  d|;d  d|Jd    }*}?}N|) |> |M   }+}@}O|(|' |=|< |L|K   },}A}Pt	| j d |j d |(|=|Lf}	|d k	r|d.|	d d d d d d d d d d f< t|#D ]"}-t|j d D ]
}.t|$D ]}/||.|.d |/|/d f }0t|+|,|'D ]}1|1|+ |' }2|2|(krq|1|&d  }td||* t||* |& |% }3}4t|@|A|<D ]h}B|B|@ |< }C|C|=krbqB|B|;d  }Dtd|D|? t|D|? |; |: }E}Ft|O|P|KD ]
}Q|Q|O |K }R|R|Lkrq|Q|Jd  }Std|S|N t|S|N |J |I }T}U| |-|-d |/|/d |3|4|E|F|T|Uf }5|5j |0j krpt|* | dt|&|&|% ||* |&   }6}7t|? |D dt|;|;|: |D|? |;   }G}Ht|N |S dt|J|J|I |S|N |J   }V}W|0d dd d|6|7|G|H|V|Wf }8|5j |8j krRtd|5j  d|8j  d|* d(|? d/|N d| d)|D d0|S d |& d*|; d1|J d!|% d+|: d2|I d"|' d,|< d3|K d#t|5d#|8d$d% }9nt|5d#|0d$d% }9|	|-|.|2|C|Rf  |97  < qqBqqqq|	S td4| j  d	|j  d| d5d S )6Nc                 S  s   g | ]}d qS     .0sr   r   >/tmp/pip-unpacked-wheel-xnis5xre/onnx/reference/ops/op_conv.py
<listcomp>   s     z(_conv_implementation.<locals>.<listcomp>   c                 S  s   g | ]}d qS )r   r   r   r   r   r
   r      s     c                 S  s   g | ]}d qS r   r   r   r   r   r
   r      s     r   r   zShape inconsistencies, X.shape=z
, W.shape=z, group=z, W should be ./z, gx.shape=z, gw.shape=z, auto_pad=z, dilations=z, kernel_shape=z, pads=z
, strides=)dtypec                 S  s   g | ]}d qS r   r   r   r   r   r
   r   G   s     >   
SAME_LOWER
SAME_UPPERVALIDr      )r   r   r   zUnexpected shape z != z, oh=z, i=z, kh=z, sH=z, sth=)r   r   )r   r   )r   r      )r   r   r   r   z, ow=z, j=z, kw=z, sW=z, stw=   )r   r   r   r   r   z, oz=z, z=z, kz=z, sZ=z, stz=zThe convolution for X.shape=z is not implemented yet.)shape
ValueErrornpprodrange_conv_implementationRuntimeErrorappendlistzerostupler   Zreshapeminmaxlen	enumeratesliceintdot)XXWBauto_pad	dilationsgroupkernel_shapepadsstridesrestdZmgZdwbgZgxZgwZcveZ	new_shapefinalpZndZnew_kernel_shapeidZdiZnew_windicesheadtailZtarget_sizeZ
pad_neededZpad_headZpad_tailZsNZsCZsHZkhZsthZh_outZh0ZohZbhehnnwcwiohrZih1Zih2imgZjh1Zjh2Zw_r	   ZsWkwZstwZw_outZw0ZowZbwewZjowrjZiw1Ziw2Zjw1Zjw2ZsZZkzZstzZz_outZz0ZozZbzZezZzoZzrzZiz1Ziz2Zjz1Zjz2r   r   r
   r      s   *T

$N
&"
 && 



$
(
"",2&$$
&
"
"( P,

$$$( 
,
"
"
".&n  2r   c                   @  s   e Zd ZdddZdS )ConvNc
           
   
   C  sB   t |jdk r td|j dt|||||||||		|jfS )Nr   z3X must have at least 3 dimensions but its shape is r   )r$   r   r   r   Zastyper   )
selfr)   r*   r+   r,   r-   r.   r/   r0   r1   r   r   r
   _run+  s$            z	Conv._run)NNNNNNN)__name__
__module____qualname__rM   r   r   r   r
   rK   *  s          rK   )
__future__r   Znumpyr   Zonnx.reference.op_runr   r   rK   r   r   r   r
   <module>   s     !