B
    #=6\ú  ã               @   sÆ   d dl mZ d dl mZ d dl mZ d dl mZ d dlm  mZ d dl	m
Z
 d dlmZ d dlZd dlmZmZ d dlZG d	d
„ d
eƒZdd„ ZejZejZejZejZejZejZejZejZdS )é    )Úabsolute_import)Údivision)Úprint_function)Úunicode_literalsN)Úcore)Ú
caffe2_pb2)ÚPopenÚPIPEc               @   sÀ   e Zd Zd)dd„Zedd„ ƒZedd„ ƒZedd	„ ƒZed
d„ ƒZedd„ ƒZ	dd„ Z
dd„ Zdd„ Zd*dd„Zdd„ Zdd„ Zdd„ Zdd„ Zdd„ Zd d!„ Zd+d#d$„Zd,d%d&„Zd'd(„ ZdS )-ÚNNModuleNc             C   s¤   |d k	r–d }t |tjƒr&| ¡  ¡ }nt |tjƒr:| ¡ }|d k	rti }x|D ]}||  ¡ ||< qLW t ||¡| _	q |rŒt 
|¡\| _	| _q tdƒ‚n
t ¡ | _	d S )NzDNNModule can be constructed with core.Net or caffe2_pb2.NetDef types)Ú
isinstancer   ZNetZProtoZSerializeToStringr   ÚNetDefÚCZNNModuleFromProtobufDistributedÚ	_NNModuleZNNModuleFromProtobufZ_OpListÚ	Exceptionr
   )ÚselfÚnetZ
device_mapZserialized_protoZserialized_device_mapÚk© r   ú;/tmp/pip-install-l3r2oljg/torch/caffe2/python/nomnigraph.pyÚ__init__   s"    

zNNModule.__init__c             C   s
   | j  ¡ S )N)r   ÚdataFlow)r   r   r   r   r   (   s    zNNModule.dataFlowc             C   s
   | j  ¡ S )N)r   ZgetExecutionOrder)r   r   r   r   ÚcontrolFlow,   s    zNNModule.controlFlowc             C   s   | j  ¡ jS )N)r   r   Únodes)r   r   r   r   r   0   s    zNNModule.nodesc             C   s   | j  ¡ jS )N)r   r   Ú	operators)r   r   r   r   r   4   s    zNNModule.operatorsc             C   s   | j  ¡ jS )N)r   r   Útensors)r   r   r   r   r   8   s    zNNModule.tensorsc             C   s   | j  ¡  |¡S )N)r   r   Ú
createNode)r   Úvalr   r   r   r   <   s    zNNModule.createNodec             C   s   | j  ¡  |¡S )N)r   r   Ú
deleteNode)r   Únoder   r   r   r   ?   s    zNNModule.deleteNodec             C   s   | j  ¡  ||¡S )N)r   r   Ú
createEdge)r   ÚaÚbr   r   r   r   B   s    zNNModule.createEdgec             C   s,   |r| j  ¡  ||¡ n| j  ¡  |¡ d S )N)r   r   Ú
deleteEdge)r   r    r!   r   r   r   r"   E   s    zNNModule.deleteEdgec             C   s   | j  ¡  ||¡S )N)r   r   ÚreplaceNode)r   Zold_nodeÚnew_noder   r   r   r#   K   s    zNNModule.replaceNodec             C   s   t  ||¡ d S )N)r   ÚreplaceProducer)r   ZtensorZnew_producerr   r   r   r%   N   s    zNNModule.replaceProducerc             C   s   t  ||¡ d S )N)r   ÚreplaceAllUsesWith)r   Z
old_tensorZ
new_tensorr   r   r   r&   Q   s    zNNModule.replaceAllUsesWithc             C   s   t  ||¡ d S )N)r   ÚreplaceAsConsumer)r   Zold_consumerZnew_consumerr   r   r   r'   T   s    zNNModule.replaceAsConsumerc             C   s   | j  ||||¡ d S )N)r   ÚreplaceSubgraph)r   Úsubgraphr$   ÚinputsÚoutputsr   r   r   r(   W   s    zNNModule.replaceSubgraphc             C   s   | j  |¡ d S )N)r   ÚdeleteSubgraph)r   r)   r   r   r   r,   Z   s    zNNModule.deleteSubgraphÚ_uniquec             C   s   | j  |¡S )N)r   ÚcreateUniqueDataNode)r   Úprefixr   r   r   r.   ]   s    zNNModule.createUniqueDataNodec             C   s.   |st  ¡ }| j |¡}t  ¡ }| |¡ |S )N)r   r   r   ÚconvertToCaffe2ProtoZParseFromString)r   Z	old_protoÚoutputZ	new_protor   r   r   r0   `   s    
zNNModule.convertToCaffe2Protoc             c   s.   x(| j  ¡ D ]}t ||¡}|r|V  qW d S )N)r   ZgetMutableNodesr   ZmatchSubgraph)r   ÚpatternÚnÚmr   r   r   Úmatchh   s    zNNModule.match)NN)N)r-   )N)Ú__name__Ú
__module__Ú__qualname__r   Úpropertyr   r   r   r   r   r   r   r   r"   r#   r%   r&   r'   r(   r,   r.   r0   r5   r   r   r   r   r
      s&   



r
   c          
   C   sš   t | ƒ} dd„ }|dƒrŽtdtd}y|j |  d¡¡ W n> tk
rx } z |jtjksh|jtj	krfn‚ W d d }~X Y nX |j 
¡  | ¡  nt| ƒ d S )Nc                s$   t ‡ fdd„tjd  tj¡D ƒƒS )Nc             3   s&   | ]}t  t j |ˆ ¡t j¡V  qd S )N)ÚosÚaccessÚpathÚjoinÚX_OK)Ú.0r<   )Úxr   r   ú	<genexpr>r   s   z+render.<locals>.<lambda>.<locals>.<genexpr>ÚPATH)Úanyr:   ÚenvironÚsplitÚpathsep)r@   r   )r@   r   Ú<lambda>q   s   
zrender.<locals>.<lambda>z
graph-easy)Ústdinzutf-8)Ústrr   r	   rH   ÚwriteÚencodeÚIOErrorÚerrnoÚEPIPEÚEINVALÚcloseÚwaitÚprint)ÚsZ
cmd_existsÚpÚer   r   r   Úrendero   s    

rV   )Ú
__future__r   r   r   r   Z!caffe2.python._import_c_extensionÚpythonZ_import_c_extensionr   Zcaffe2.pythonr   Zcaffe2.protor   r:   Ú
subprocessr   r	   rM   Úobjectr
   rV   ZNeuralNetOperatorÚOperatorZNeuralNetDataÚDataZ
NNSubgraphZNNMatchGraphZGraphZ
Annotationr   r   r   r   Ú<module>   s&   a