a
    ==ic                     @   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i | t|tjs0J d| j}|dkrLt|tsTJ d|dkrft|tsnJ d|| _	|| _
|dkrt|tsJ d|dkrt|tsJ d|| _|| _|dkr|d u rt|d d n|}|d u rt|d d n|}n$|d u r
dn|}|d u rdn|}|dkrh|
d u rDt|d d n|
}
|	d u rbt|d d n|	}	n$|
d u rvdn|
}
|	d u rdn|	}	|dkrt|tsJ d	|dkrt|tsJ d
|
dkrt|
tsJ d|	dkrt|	tsJ d|| _|| _|
| _|	| _|dv s.J d|| _|dkrT|d }||||g}n|dkrr|d }||||g}|dksJ 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ScalarZ
field_typer   intkernel_hkernel_wstride_hstride_wpad_tpad_bpad_rpad_lorderZcreate_paramkernelbiasnp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__ j/home/droni/.local/share/virtualenvs/DPS-5Je3_V2c/lib/python3.9/site-packages/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   numpyr   r   r(   r(   r(   r)   <module>   s   