U
    d                     @   s^   d dl mZ d dlmZ d dlmZ dddZdd	 Zd
d ZdddZ	dddZ
dd ZdS )    )core)initializers)ParameterTagsNFc                 K   s   t ||di f}t |	|di f}	| js:t  }t  }	|pF| j }tjg}d|krd|tj	 | j
|d ||g|tjd}| j
|d |g|	|d}|
rd|d< |rd	|d
< ||||g|f|S )N
XavierFillConstantFillZfreeze_bias_w)
param_nameshapeinitializertags_bZ
TENSORCOREZengineTfloat16_compute)r   update_initializerinit_paramsZExternalInitializernetNextNamer   ZBIASappendZCOMPUTED_PARAMcreate_paramZWEIGHT)modelZop_callblob_inblob_outdim_indim_outweight_init	bias_initWeightInitializerBiasInitializerZenable_tensor_corer   kwargsZ	bias_tagsweightbias r    </tmp/pip-unpacked-wheel-ua33x9lu/caffe2/python/helpers/fc.py_FC_or_packed_FC   sD        r"   c                 O   s   t | | jjf||S N)r"   r   ZFCr   argsr   r    r    r!   fc9   s    r&   c                 O   s   t | | jjf||S r#   )r"   r   ZPackedFCr$   r    r    r!   	packed_fc=   s    r'      c
                 K   s   t ||di f}t |	|di f}	|p0| j }| j|d ||g|d}| j|d ||g|d}| j|d |g|	d}| jj||||g|f|
S )z[FC_Decomp version
    Here we assume that the rank of original input is bigger than 5.
    r   r   Z_u)r   r	   r
   Z_vr   )r   r   r   r   r   Z	FC_Decomp)r   r   r   r   r   Zrank_approxr   r   r   r   r   uvr   r    r    r!   	fc_decompA   s6        r+   h㈵>皙?c              	   K   s:  |r|ndi f}|r|ndi f}|r(|ndi f}|p<| j  }|d }| jrV| jjg |d dg|
d}| j|d g |d fd	||gi|d }| jjg |d
 ||gdd}| j|d g |d fd	||gi|d }| j|d g |d fd	|gi|d }| j|d g |d fd	||gi|d }| jjg |d dg|d}n~t|d | j}t|d | j}t|d | j}t|d
 | j}t|d | j}t|d | j}t|d | j}| | | | |	r| j j	||||||||g||gf|S | j j	||||||||g|f|S dS )z3FC_Prune version
    Runnable so far. Great!:)
    r   r   Z_compress_rateZ_lb   )r	   valuer   r   r	   _mg      ?Z_ag_dwr   Z	_mask_seqZ_thresN)
r   r   r   Zparam_init_netr   __getattr__r   ZScopedBlobReferenceAddParameterZFC_Prune)r   r   r   r   r   r   r   Z	mask_init	thresholdZneed_compress_rateZcomp_lbr   Zcompress_rateZcompress_lbr   maskZag_dwr   Zmask_seqZthresr    r    r!   fc_pruneb   s    
       

    r5   c                 K   s\   |r|r|r|st d | | | | | | | | | jj|||||g|f|S )z*FC_Sparse: Only takes in allocated weightsz
Warning...)printr2   r   Z	FC_Sparse)r   r   r   Zw_csriwZjwr   r   r    r    r!   	fc_sparse   s    



r8   )NNNNFF)r(   NNNN)NNNr,   Fr-   )Zcaffe2.pythonr   Zcaffe2.python.modelingr   Z%caffe2.python.modeling.parameter_infor   r"   r&   r'   r+   r5   r8   r    r    r    r!   <module>   s2            
,        
#         
W