a
    ==ic                     @   sN   d dl mZ d dlZG dd dZdd Zdd Zd	d
 Zdd Zdd Z	dS )    )	workspaceNc                   @   s&   e Zd ZdddZdd Zdd ZdS )	
NetDefNodeNc                 C   s2   || _ || _i | _i | _| | d| _|| _d S )NF)nameoptypeopsprevinsertInputvisitedop)selfr   r   pr
    r   |/home/droni/.local/share/virtualenvs/DPS-5Je3_V2c/lib/python3.9/site-packages/caffe2/experiments/python/SparseTransformer.py__init__   s    
zNetDefNode.__init__c                 C   sT   t |tr.|D ]}|| j|j< | |j| j< qn"t |trP|| j|j< | |j| j< dS )z}
        Insert input of this op
        also maintain the output of previous op
        p: a node or a list of node
        N)
isinstancelistr   r   r   r   )r   r   ir   r   r   r   %   s    

zNetDefNode.insertInputc                 C   s"   t |tr| j|j= |j| j= d S )N)r   r   r   r   r   )r   r   r   r   r   deleteInput3   s    

zNetDefNode.deleteInput)NN)__name__
__module____qualname__r   r   r   r   r   r   r   r      s   
	r   c                 C   sn   t | }tj|}|j}|j}|j}t | d | t | d | t | d | | d | d | d fS )zN
    Combine mask and weights
    create wcsr, iw, jw, return their names
    wcsriwjw)	r   Z	FetchBlobscipysparseZ
csr_matrixdataZindptrindicesZFeedBlob)Zweight_namewZw_csrr   r   r   r   r   r   maskNallocate9   s    
r   c                 C   sB  | j   }|| jjd | jjd d }|j jd }t|j	d d||}d|_
|}	| | | jdks| jdkstd qt| jd	krtd
 | jdkr | j}
t|
jd	 \}}}|
jd }||| jj	d d ||||}|j jd }t| jj	d d d|	|}d|_
|}	| jdkrj| j}
|||}|j jd }tt|d|	|}d|_
|}	d| _
| }d}| j D ]*\}}|jdks|jdkrd}|} q|s\| j  } | | td t| jj qq\|||jj	d }|j jd }tt|d|	|}d|_
| | t| j  t|j dS )zK
    Add trans before and after this FC_Prune->(Relu)->FC_Prune chain.
    r   Z_trans	TransposeTFC_PruneReluzReaching the end of the chain   z+A FC/Relu giving more than 1 useful outputs   Z_Sparse	FC_SparseFzNo FC/RElu childrenN)r   
itervaluesnextr!   r
   inputnetProtor   outputr	   r   r   printlenr   r   r&   r#   str	iteritemstyper   )curid2nodename2idr   modelpreZcurrent_blobZtrans_opZ
trans_nodeZpre_newr
   r   r   r   Z	bias_nameZsps_opZsps_nodeZrel_opZrel_nodeflag_tempr   r   r   transFCReluI   sp     





r:   c                 C   sN   | j s | jdkr t| |||| d| _ | j D ]\}}t||||| q0d S )Nr"   T)r	   r   r:   r   r0   Prune2Sparse)r2   r3   r4   r   r5   r   nr   r   r   r;      s
    r;   c                 C   sr   g }g }| }|j  D ]\}}|| q|rn|d }|dd }||j |j  D ]\}}|| qXq*|S )zG
    Use topological order(BFS) to print the op of a net in a list
    r   r$   N)r   r0   appendr
   )net_rootZ	bfs_queueop_listr2   r8   r<   noder   r   r   net2list   s    rA   c                 C   s   t d | j }i }i }tddd }t|jD ]\}}|jdkrDq0|jr\d|j|j|f nd|j|f }t||j|d}|||< d}	|jD ]$}
|
|vrq|	|||
   d	}	q|	s|	| |j
D ]}|||< qq0|||fS )
NzWelcome to model checkerr>   rootZPrintz%s/%s (op#%d)z
%s (op#%d))r
   FT)r-   r*   r+   r   	enumerater
   r1   r   r)   r   r,   )r5   protoZnet_name2idZnet_id2noder>   Zop_idr
   Zop_nameZop_nodeZif_has_layer_inputZ
input_nameZoutput_namer   r   r   
netbuilder   s2    




rE   )
Zcaffe2.pythonr   Zscipy.sparser   r   r   r:   r;   rA   rE   r   r   r   r   <module>   s   H