o
    Ne  ã                   @   s4   d dl mZ ddlZd
dd„Zdd„ Zd
dd	„ZdS )é   )Úcoreé    Nc           	      C   sÐ   |   |¡}|d usJ d |¡ƒ‚|jtjjjksJ d |¡ƒ‚t|jƒ}|s*|dfS d}t	|ƒD ]\}}|d u s<|dk rF|r@J ‚|||< d}q0t
dd„ |D ƒƒsWJ d |¡ƒ‚tt |¡ƒt |j¡ }||fS )	NzVariable {} cannot be foundzVariable {} is not Tensorr   FTc                 S   s   g | ]}|d k‘qS )r   © )Ú.0Úsr   r   úLD:\Projects\ConvertPro\env\Lib\site-packages\paddle/fluid/memory_analysis.pyÚ
<listcomp>"   s    ÿz+get_var_and_memory_size.<locals>.<listcomp>zshape {} is not deterministic)Z_find_var_recursiveÚformatÚtyper   ÚVarDescÚVarTypeZ
LOD_TENSORÚlistÚshapeÚ	enumerateÚallÚintÚnpÚprodZsize_of_dtypeZdtype)	ÚblockÚvar_nameÚ
batch_sizeÚvarr   Zhas_noneÚir   Úmem_sizer   r   r   Úget_var_and_memory_size   s,   
ÿ
€
ÿÿr   c                 C   s,   t  ¡ }| | g¡ | |t jjj¡ ~d S ©N)r   Z	LoDTensorZ	_set_dimsZ_mutable_datar   r   ZINT8)ÚsizeZplaceÚtr   r   r   Úpre_allocate_memory(   s   r   c                 C   sî   | j dks	J dƒ‚d}d}d}tƒ }g }|  ¡ }t | jg ¡d }t|jƒD ]L\}	}
|
j|
j	 }|D ]%}||v r9q2| 
|¡ t|||ƒ\}}|jrN||7 }q2||7 }t||ƒ}q2||	 }|D ]}||vreq^t|||ƒ\}}||8 }q^q&||fS )Nr   z4only support to analysis program with only one blockr   )Z
num_blocksÚsetZglobal_blockr   Z_get_eager_deletion_varsÚdescr   ÚopsZinput_arg_namesZoutput_arg_namesÚaddr   ZpersistableÚmax)Úprogramr   Zcur_tmp_memZmax_tmp_memZmax_persistable_memZvisited_varsZalived_varsr   Zgc_varsr   ÚopZ	var_namesr   r   r   Zcur_gc_varsÚ_r   r   r   Úget_max_memory_info0   s6   


ür'   r   )Ú r   Únumpyr   r   r   r'   r   r   r   r   Ú<module>   s
   
