U
    <cA                     @   s   d Z ddlZddlZddlZddlZddlZddlZddlZddlZddl	Z	ddl
Z
ddlZddlmZ ddlZdZddddd	d
gZdd Zdd ZdefddZdd Zdd	 Zdd
 ZddddZdS )a-  
model_dump: a one-stop shop for TorchScript model inspection.

The goal of this tool is to provide a simple way to extract lots of
useful information from a TorchScript model and make it easy for humans
to consume.  It (mostly) replaces zipinfo, common uses of show_pickle,
and various ad-hoc analysis notebooks.

The tool extracts information from the model and serializes it as JSON.
That JSON can then be rendered by an HTML+JS page, either by
loading the JSON over HTTP or producing a fully self-contained page
with all of the code and data burned-in.
    N)Dicti @  get_storage_infohierarchical_pickleget_model_infoget_inline_skeletonburn_in_infoget_info_and_burn_skeletonc                 C   s   t | tjjjst| jdks"t| jdks0t| jd ks>tt | j	t
sNtt| j	dks`t| j	d }t |t
sxtt|dkst|d dkstt |d tjjjst|d jdkst|d jdst|d jdd	gt|d
d   }|S )NZpersobj   r      storagetorchZStorage    )
isinstancer   utilsshow_pickle
FakeObjectAssertionErrormodulenamestateargstuplelen	FakeClassendswithreplacelist)r   sastorage_info r!   C/tmp/pip-unpacked-wheel-gikjz4vx/torch/utils/model_dump/__init__.pyr   Z   s    
$c                 C   s.  t | tttttd fr| S t | tr4dd | D S t | trNdtt| iS t | t	r|dtt| 
 tt|  dS t | tjjjr| j d| j }|ds|ds|d	r| jd
kst|t| jdS |dkr | jd kst| j\}}}}}}t|}d|||||giS |dkr| jd ks:t| j\}}}}}	}}t|}t |	tsftt |	d tjjjst|	d jdkst|	d jdkrt|	dkstt |	d tstt |	d tstt|	dd }
ng }
|	d jg|
 }d||||||giS |dkrT| jd ks2t| j\}}t |tsLtt|S td|r| jd ksrt| j\}t |tstt|S |dkr| jd kst| j\}t |tst|S |dkr
| jd kst| j\}t |tst|t|fdS td| tdt|  d S )Nc                 S   s   g | ]}t |qS r!   )r   ).0dr!   r!   r"   
<listcomp>p   s     z'hierarchical_pickle.<locals>.<listcomp>Z__tuple_values__T)Z__is_dict__keysvalues.z
__torch__.ztorch.jit.LoweredWrapper.ztorch.jit.LoweredModule.r!   )Z__module_type__r   ztorch._utils._rebuild_tensor_v2Z__tensor_v2__ztorch._utils._rebuild_qtensorr   r   Zper_tensor_affine   r
   r   Z__qtensor__z"torch.jit._pickle.restore_type_tagz%torch\.jit\._pickle\.build_[a-z]+listztorch.devicezbuiltin.UnicodeDecodeErrorz*Can't prepare fake object of type for JS: z#Can't prepare data of type for JS: )r   boolintfloatstrtyper   r   r   dictr&   r'   r   r   r   r   r   r   
startswithr   r   r   r   r   r   re	fullmatch	Exception)datatypenamer   offsetsizeZstrideZrequires_gradhooksr    Z	quantizerZquantizer_extraZquantizer_jsonr	   typZlsr   msgr!   r!   r"   r   l   s    

 







c           +         s^  t | tjr"t| }|  j}nDt | trB| }t|  j}n$d}| 	dt
j |  }| 	d |pl|}t| dg } D ]\}tdd|j}dkr|n|krtd d| |t|j|j|j|jd qdk	std	 d
 }fdd}	|	d}
|	d}i   fdd}i } D ]}|jds`qH|}| }W 5 Q R X |jd }| }W 5 Q R X t |}dt!|dkrt |d tr|d dkr|\}}fdd}t"||}t#|}|s|d |d d t!|kr<|t!|df g }t$||dd D ]\}}|^}}}|d }||kszt|\}}}|\}} }!t!|t!|%d
krd}d}||| }"||"d
|| |!||||g qR|||j< qHt&t'd }#i }$ D ]z}|#(|js&q|j|kr6q|B}zt)*|}%|%|$|j< W n" t)j+k
r|   d|$|j< Y nX W 5 Q R X qdh}&i }' D ]}|jdsq|}t,j-j.j/|dd * }(W 5 Q R X t
0 })t11|(|) |)2 }*tj34|j|&kr"t!|*|kr"q|*|'|j< qW 5 Q R X d!t||||t# ||
||$|'d"
iS )#zGet JSON-friendly information about a model.

    The result is suitable for being saved as model_info.json,
    or passed to burn_in_info.
    bufferr   Nz/.*r   zMismatched prefixes: z != )filenamecompressionZcompressed_size	file_sizez/versionzutf-8c              
      sX    d k	st  d|  d ,}tjjj|dd }t|W  5 Q R  S Q R X d S )N/.pklTZcatch_invalid_utf8)r   openr   r   r   DumpUnpicklerloadr   )r   handleraw)path_prefixzfr!   r"   
get_pickle   s    z"get_model_info.<locals>.get_pickler4   	constantsc                    s   |  krt   | <  |  S N)r   )s)interned_stringsr!   r"   ist   s    zget_model_info.<locals>.istz.pyz
.debug_pklr)   ZFORMAT_WITH_STRING_TABLEc           
         sL   | \}\\}}}}}}d  fdd|D } | }	|||	|f||f|fS )Nr   c                 3   s   | ]} | V  qd S rK   r!   )r#   x
text_tabler!   r"   	<genexpr>  s     z;get_model_info.<locals>.parse_new_format.<locals>.<genexpr>)join)
linenumZtext_indexesZ	fname_idxr6   startendtagtextfnamerP   r!   r"   parse_new_format  s    z(get_model_info.<locals>.parse_new_format)r   )r   r   r   r   r   r\   r
   z/extra/.*\.jsonzINVALID JSONzbytecode.pklr@   TrA   model)
titler>   version	zip_filesrM   
code_files
model_datarJ   extra_files_jsonsextra_pickles)5r   osPathLikefspathstatst_sizer-   pathlibPathseekioSEEK_ENDtellzipfileZipFileinfolistr1   subr<   r3   appendr/   compress_typecompress_sizer>   r   readdecodestripr   rB   pickleloadsr   mapr   zipencodecompileescaper2   jsonrD   JSONDecodeErrorr   r   r   rC   StringIOpprintgetvaluepathbasename)+Zpath_or_filer_   Zextra_file_size_limitZdefault_titler>   ra   Zziprefixr`   rI   rc   rJ   rN   rb   rE   Zraw_codeZ	raw_debugZdebug_info_t_contentr[   Z
debug_infoZ
code_partsZdiZdi_nextrV   Zsource_rangerW   sourceZs_startZs_endZs_textZs_fileZs_linerY   Zextra_files_json_patternrd   Zjson_contentZalways_render_picklesre   r	   bufcontentsr!   )rM   rG   rQ   rH   r"   r      s    












(
 
c                  C   s   t jdk rtdddl} | jtd}| jtd}dD ]<}| jt| d}d	tj	
| }|d
| d|}q:|dd| }|S )zGet a fully-inlined skeleton of the frontend.

    The returned HTML page has no external network dependencies for code.
    It can load model_info.json over HTTP, or be passed to burn_in_info.
    )r)      z'get_inline_skeleton requires Python 3.7r   Nzskeleton.htmlzcode.js)ZpreactZhtmz.mjszdata:application/javascript,zhttps://unpkg.com/z?modulez src="./code.js">z>
)sysversion_infor3   importlib.resources	resources	read_text__package__read_binaryurllibparsequoter   )	importlibskeletonZjs_codeZ	js_moduleZjs_libZjs_urlr!   r!   r"   r   a  s    
c                 C   s"   |  ddtj|dd dd S )zBurn model info into the HTML skeleton.

    The result will render the hard-coded model info and
    have no external network dependencies for code or data.
    zBURNED_IN_MODEL_INFO = nullzBURNED_IN_MODEL_INFO = T	sort_keysr?   z\/)r   r   dumps)r   infor!   r!   r"   r   w  s    c                 K   s    t | f|}t }t||}|S rK   )r   r   r   )Zpath_or_bytesiokwargsZ
model_infor   pager!   r!   r"   r     s    
)stdoutc                C   s   t  }|jdddgd |d |d || dd  }t|j|jd}|pXtj}|j	dkr~|
tj|d	d
d  n.|j	dkrt }t||}|
| ntdd S )Nz--styler   html)choicesz--titler^   r
   )r_   Tr   
zInvalid style)argparseArgumentParseradd_argument
parse_argsr   r^   r_   r   r   stylewriter   r   r   r   r3   )argvr   parserr   r   outputr   r   r!   r!   r"   main  s    





r   )__doc__r   rf   rn   rk   r1   r   rq   r   r{   r   urllib.parser   typingr   Ztorch.utils.show_pickler   ZDEFAULT_EXTRA_FILE_SIZE_LIMIT__all__r   r   r   r   r   r   r   r!   r!   r!   r"   <module>   s8   @ Q
 '