a
    ==ic                     @   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|v rh|d dkrhq*dd |j
D }t|d	ksJ d
dd |jD }t|dksJ 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i |}|D ]}	| |	| q|D ]}
| ||
 q| | q*|D ]~}||v r || }n&|| }|d jd }|dd ||< || D ]4}|jD ]}| || | | qX| | qN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   y/home/droni/.local/share/virtualenvs/DPS-5Je3_V2c/lib/python3.9/site-packages/caffe2/python/nomnigraph_transformations.py<lambda>       z#transpose_network.<locals>.<lambda>c                 S   s   g | ]}|qS r   r   .0xr   r   r   
<listcomp>   r   z%transpose_network.<locals>.<listcomp>ZConvorderZNCHWc                 S   s   g | ]}|qS r   r   r	   r   r   r   r      r      z$Conv operator should have two inputsc                 S   s   g | ]}|qS r   r   r	   r   r   r   r      r      z#Conv operator should have an outputZ	NCHW2NHWCZ	NHWC2NCHWZNHWCr   N)r   ZdataFlownodesZ
isOperatornamer   Z
ArgsToDict
annotationZoperator_defarginputslenoutputsZ
deleteEdgerangeZcreateUniqueDataNodeZ
createNodengZNeuralNetOperatorZ
createEdgeappendr   ZCreateOperatorZ
deleteNodeZreplaceAllUsesWith)nnincomingoutgoingZdfgZ
orig_nodesnodearg_dictr   r   inpZoutpidxZnew_inptranspZnew_outp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   