U
    <c	                     @   s   d dl Z d dlm  mZ ddlmZmZmZm	Z	 ddl
mZmZ ddlmZ eejeejeejG dd de jjZdS )    N   )conv_backwardconv_args_and_kwargsconv_pickerconv_input_for_string_padding)ExpandedWeightimplements_per_sample_grads)forward_helperc                   @   s$   e Zd Zedd Zedd ZdS )ConvPerSampleGradc                 G   sB  t ||\}}|d }|d dk}t|d tr||d jdd  }|d |d  }	}
t||	|d |
|}||d f}d|d< t|||}|\}}t|ddd	}| |krtd
| d|  d| || _	|jd | _
|j| _|j| _|| _|d |d  | _| _|d |d  | _| _t|tr.|| _|| _|d | _|S )Nr   paddingZsamer      dilation         zBExpanded Weights only support convolution with batched input, got z with anunbatched input of dim z, expected input of dim stridegroupsbias)r   
isinstancestrshaper   r	   r   ZdimRuntimeErrorconv_fnZ
batch_sizeZrequires_gradZinput_required_gradZorig_input_shapewas_same_paddingr   r   r   r   r   inputweightr   )ctxZkwarg_namesr   Zexpanded_args_and_kwargsZexpanded_argsZexpanded_kwargsZ
orig_inputr   Zkernel_sizer   r   r   outputr   Zbatched_dim_size r   Z/tmp/pip-unpacked-wheel-gikjz4vx/torch/nn/utils/_expanded_weights/conv_expanded_weights.pyforward   s4    
zConvPerSampleGrad.forwardc                 C   s   t | j| |S )N)r   r   )r   Zgrad_outputr   r   r   backward2   s    zConvPerSampleGrad.backwardN)__name__
__module____qualname__staticmethodr    r!   r   r   r   r   r
      s   
%r
   )ZtorchZtorch.nn.functionalnnZ
functionalFZ
conv_utilsr   r   r   r   Zexpanded_weights_implr   r   Zexpanded_weights_utilsr	   Zconv1dZconv2dZconv3dZautogradZFunctionr
   r   r   r   r   <module>   s   