U
    d                     @   s4   d dl mZ d dlmZ d dlZG dd deZdS )    )schema)
ModelLayerNc                
       s*   e Zd ZdZd	 fdd	Zdd Z  ZS )
Conva  
        Convolutional layer
        Input:
        - input_record: at least has the shape info of C (num_channels)
        - output_dim: number of convolutional filters
        - kernel_h, kernel_w: kernel size for h and w
        - stride_h, stride_w: stride for h and w
        - pad_b, pad_l, pad_r, pad_t: padding sizes, if stride == 1,
                                      'None' value will do auto padding
        - order: either 'NHWC' or 'NCHW'
    NNHWCconvc                    s  t t| j|||f| t|tjs,td| j}|dkrHt|t	sPtd|dkrbt|t	sjtd|| _
|| _|dkrt|t	std|dkrt|t	std|| _|| _|dkr|d krt	|d d n|}|d krt	|d d n|}n$|d krdn|}|d krdn|}|dkrd|
d kr@t	|d d n|
}
|	d kr^t	|d d n|	}	n$|
d krrdn|
}
|	d krdn|	}	|dkrt|t	std	|dkrt|t	std
|
dkrt|
t	std|	dkrt|	t	s td|| _|| _|
| _|	| _|dks*td|| _|dkrP|d }||||g}n|dkrn|d }||||g}|dkstd|r|ndi f}|r|n
dddif}| jd|||d| _| jd|g||d| _ttj|ff| d| _d S )NzIncorrect input typer   z#kernel_h should be positive integerz#kernel_w should be positive integerz#stride_h should be positive integerz#stride_w should be positive integer      zpad_t should be int >= 0zpad_b should be int >= 0zpad_r should be int >= 0zpad_l should be int >= 0)r   NCHWz$order should either 'NHWC' or 'NCHW'r   r	   z>Number of input channels in conv parameters should be positiveZ
XavierFillZConstantFillvalueg        Zconv_kernel)
param_nameshapeZinitializerZ	optimizerZ	conv_biasoutput)superr   __init__
isinstancer   ZScalarAssertionErrorZ
field_typer   intkernel_hkernel_wstride_hstride_wpad_tpad_bpad_rpad_lorderZcreate_paramkernelbiasnpZfloat32Zget_next_blob_referenceoutput_schema)selfmodelinput_recordZ
output_dimr   r   r   r   r   r   r   r   r   Zkernel_initZ	bias_initZkernel_optimZ
bias_optimnamekwargsZ
input_dimsZinput_cZkernel_shape	__class__ =/tmp/pip-unpacked-wheel-ua33x9lu/caffe2/python/layers/conv.pyr      s    

 


 
 	
zConv.__init__c                 C   sN   |j | j | j| jg | j | j| j| j| j	| j
| j| j| j| jd d S )N)	r   r   r   r   r   r   r   r   r   )r   r#   Zfield_blobsr   r   r    r   r   r   r   r   r   r   r   r   )r!   netr(   r(   r)   add_opsz   s    zConv.add_ops)
NNNNr   NNNNr   )__name__
__module____qualname____doc__r   r+   __classcell__r(   r(   r&   r)   r      s                   ^r   )Zcaffe2.pythonr   Zcaffe2.python.layers.layersr   Znumpyr   r   r(   r(   r(   r)   <module>   s   