U
    dx                     @   s   d dl Z d dlZd dlmZmZ d dlm  mZ d dl	m
Z
 d dlm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 )	    N)PIPEPopen)
caffe2_pb2)corec                   @   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	rd }t |tjr&|  }nt |tjr:| }|d k	rpi }|D ]}||  ||< qJt||| _	q|rt
|\| _	| _qt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-unpacked-wheel-ua33x9lu/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 r   )r
   ZgetExecutionOrderr   r   r   r   controlFlow+   s    zNNModule.controlFlowc                 C   s   | j  jS r   )r
   r   nodesr   r   r   r   r   /   s    zNNModule.nodesc                 C   s   | j  jS r   )r
   r   	operatorsr   r   r   r   r   3   s    zNNModule.operatorsc                 C   s   | j  jS r   )r
   r   tensorsr   r   r   r   r   7   s    zNNModule.tensorsc                 C   s   | j  |S r   )r
   r   
createNode)r   valr   r   r   r   ;   s    zNNModule.createNodec                 C   s   | j  |S r   )r
   r   
deleteNode)r   noder   r   r   r   >   s    zNNModule.deleteNodec                 C   s   | j  ||S r   )r
   r   
createEdger   abr   r   r   r   A   s    zNNModule.createEdgec                 C   s,   |r| j  || n| j  | d S r   )r
   r   
deleteEdger   r   r   r   r!   D   s    zNNModule.deleteEdgec                 C   s   | j  ||S r   )r
   r   replaceNode)r   Zold_nodenew_noder   r   r   r"   J   s    zNNModule.replaceNodec                 C   s   t || d S r   )r	   replaceProducer)r   ZtensorZnew_producerr   r   r   r$   M   s    zNNModule.replaceProducerc                 C   s   t || d S r   )r	   replaceAllUsesWith)r   Z
old_tensorZ
new_tensorr   r   r   r%   P   s    zNNModule.replaceAllUsesWithc                 C   s   t || d S r   )r	   replaceAsConsumer)r   Zold_consumerZnew_consumerr   r   r   r&   S   s    zNNModule.replaceAsConsumerc                 C   s   | j |||| d S r   )r
   replaceSubgraph)r   subgraphr#   inputsoutputsr   r   r   r'   V   s    zNNModule.replaceSubgraphc                 C   s   | j | d S r   )r
   deleteSubgraph)r   r(   r   r   r   r+   Y   s    zNNModule.deleteSubgraph_uniquec                 C   s   | j |S r   )r
   createUniqueDataNode)r   prefixr   r   r   r-   \   s    zNNModule.createUniqueDataNodec                 C   s.   |st  }| j|}t  }|| |S r   )r   r   r
   convertToCaffe2ProtoZParseFromString)r   Z	old_protooutputZ	new_protor   r   r   r/   _   s    
zNNModule.convertToCaffe2Protoc                 c   s*   | j  D ]}t||}|r
|V  q
d S r   )r   ZgetMutableNodesr	   ZmatchSubgraph)r   patternnmr   r   r   matchg   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-   r/   r4   r   r   r   r   r      s0   








r   c              
   C   s   t | } dd }|drtdtd}z|j| d W n> tk
rx } z |jtjksh|jtj	krfn W 5 d }~X Y nX |j
  |  nt|  d S )Nc                    s&   t  fddtddtjD S )Nc                 3   s&   | ]}t t j| t jV  qd S r   )osaccesspathjoinX_OK).0r;   xr   r   	<genexpr>p   s   z+render.<locals>.<lambda>.<locals>.<genexpr>PATH )anyr9   getenvsplitpathsepr?   r   r?   r   <lambda>p   s   zrender.<locals>.<lambda>z
graph-easy)stdinzutf-8)strr   r   rI   writeencodeIOErrorerrnoEPIPEEINVALclosewaitprint)sZ
cmd_existsper   r   r   rendern   s    

rW   )rN   r9   
subprocessr   r   Z!caffe2.python._import_c_extensionpythonZ_import_c_extensionr	   Zcaffe2.protor   Zcaffe2.pythonr   objectr   rW   ZNeuralNetOperatorZOperatorZNeuralNetDataDataZ
NNSubgraphZNNMatchGraphZGraphZ
Annotationr   r   r   r   <module>   s   b