U
    d                     @   s:   d dl mZ d dlm  mZ d dlmZmZ dd Z	dS )    )defaultdictN)coreutilsc                 C   s  i }t dd }| j}dd | jD }|D ]}| r*|jdkr*t|jjj	}d|krh|d dkrhq*dd |j
D }t|d	kstd
dd |jD }t|dkstd|D ]}	| |	| q|D ]}
| ||
 qtd	D ]Z}| || j}|td}| || | | || |||  | |||< qtt|D ]V}| || j}|td}| |||  | || |||| < |||< qLd|d< | tjdg g f|}|D ]}	| |	| q|D ]}
| ||
 q| | q*|D ]~}||kr|| }n&|| }|d jd }|dd ||< || D ]4}|jD ]}| || | | qT| | qJqdS )z
    Convert all Convolutions operators which are in the NCHW order
    to NHWC order and also transform their inputs and outputs so that the
    rest of the graph is not affected.
    c                   S   s   g S )N r   r   r   L/tmp/pip-unpacked-wheel-ua33x9lu/caffe2/python/nomnigraph_transformations.py<lambda>       z#transpose_network.<locals>.<lambda>c                 S   s   g | ]}|qS r   r   .0xr   r   r   
<listcomp>   s     z%transpose_network.<locals>.<listcomp>ZConvorderZNCHWc                 S   s   g | ]}|qS r   r   r	   r   r   r   r      s        z$Conv operator should have two inputsc                 S   s   g | ]}|qS r   r   r	   r   r   r   r      s        z#Conv operator should have an outputZ	NCHW2NHWCZ	NHWC2NCHWZNHWCr   N)r   ZdataFlowZnodesZ
isOperatornamer   Z
ArgsToDict
annotationZoperator_defarginputslenAssertionErroroutputsZ
deleteEdgerangeZcreateUniqueDataNodeZ
createNodengZNeuralNetOperatorZ
createEdgeappendr   ZCreateOperatorZ
deleteNodeZreplaceAllUsesWith)nnincomingoutgoingZdfgZ
orig_nodesnodeZarg_dictr   r   inpZoutpidxZnew_inpZtranspZnew_outpZnew_nodeZorig_tensorZ
new_tensorZout_opsZopnodeoutr   r   r   transpose_network	   sf    




r!   )
collectionsr   Zcaffe2.python.nomnigraphpythonZ
nomnigraphr   Zcaffe2.pythonr   r   r!   r   r   r   r   <module>   s   