U
    T?hC                     @   s   d dl Z d dlZd dlZd dlZd dlmZ d dlmZ d dlmZm	Z	m
Z
 d dlZe	eef ZdZdd Zejdd	d
Zdeje
e dddZG dd dZdd Zdd Zedkre  dS )    N)OrderedDict)pprint)AnyDictListtuning_resultsc                 C   s(   t | D ]\}}|jtkr|  S qdS )N)	enumeratekey_TUNING_RESULTS_KEY)metadata_propsidxprop r   R/var/www/html/venv/lib/python3.8/site-packages/onnxruntime/tools/offline_tuning.py_find_tuning_results_in_props   s    

r   )modelc                 C   s,   t | j}|dk rd S | j| }t|jS )Nr   )r   r   jsonloadsvalue)r   r   Ztuning_results_propr   r   r   extract   s
    

r   F)r   r   c                 C   sR   t | j}|s|dkstd|dkr2| j| | j }t|_t||_	| S )Nr   z<the supplied onnx file already have tuning results embedded!)
r   r   AssertionErrorpopaddr   r
   r   dumpsr   )r   r   	overwriter   entryr   r   r   embed#   s    

r   c                   @   sJ   e Zd ZG dd dZdd Zee dddZdd	 Zed
ddZ	dS )Mergerc                   @   s4   e Zd Zeeeef dddZdd Zdd ZdS )	zMerger.EpAndValidators)ep
validatorsc                 C   s,   || _ t|| _|tt| f| _d S N)r   copydeepcopyr    tuplesorteditemsr
   )selfr   r    r   r   r   __init__2   s    zMerger.EpAndValidators.__init__c                 C   s
   t | jS r!   )hashr
   r'   r   r   r   __hash__7   s    zMerger.EpAndValidators.__hash__c                 C   s   | j |j ko| j|jkS r!   )r   r
   )r'   otherr   r   r   __eq__:   s    zMerger.EpAndValidators.__eq__N)__name__
__module____qualname__strr   r(   r+   r-   r   r   r   r   EpAndValidators1   s   r2   c                 C   s   t  | _d S r!   )r   ev_to_resultsr*   r   r   r   r(   =   s    zMerger.__init__)r   c                 C   s   |D ]}|  | qd S r!   )
_merge_one)r'   r   trsr   r   r   merge@   s    zMerger.mergec           
      C   sd   g }| j  D ]P\}}i }|j|j|d}| D ] \\}}}||i }	||	|< q2|| q|S )N)r   r    results)r3   r&   r   r    
setdefaultappend)
r'   r   evflat_resultsr7   r5   op_sig
params_sig	kernel_id
kernel_mapr   r   r   
get_mergedD   s    
zMerger.get_merged)r5   c                 C   sf   t |d |d }| j|i }|d  D ]2\}}| D ] \}}||f|kr>||||f< q>q.d S )Nr   r    r7   )r   r2   r3   r8   r&   )r'   r5   r:   r;   r<   r?   r=   r>   r   r   r   r4   S   s    zMerger._merge_oneN)
r.   r/   r0   r2   r(   r   TuningResultsr6   r@   r4   r   r   r   r   r   0   s
   r   c                  C   s   t  } | jddd}|jddd}|d |d |jd	d
d}|jddddd |jddd |jddd |jdddd |jddd}|jddd |jdddd |jddd}|jddd |  }tt|dkr|   t	d  |S )!NzCommand to executecmd)helpdestr   z2Extract embedded tuning results from an onnx file.)rC   
input_onnxoutput_jsonr   z+Embed the tuning results into an onnx file.z--forcez-f
store_truez+Overwrite the tuning results if it existed.)actionrC   output_onnxzPath of the output onnx file.zPath of the input onnx file.
input_json+z5Path(s) of the tuning results file(s) to be embedded.)nargsrC   r6   z4Merge multiple tuning results files as a single one.z'Path of the output tuning results file.z/Paths of the tuning results files to be merged.r   z Pretty print the tuning results.json_or_onnxz+A tuning results json file or an onnx file.r   r   )
argparseArgumentParseradd_subparsers
add_parseradd_argument
parse_argslenvars
print_helpexit)parserZsub_parsersZextract_parserZembed_parserZmerge_parserZpprint_parserargsr   r   r   rS   \   s(    

rS   c                  C   s  t  } | jdkr^tt| j}|d krFtj| j d t	d t
|t| jd n|| jdkrt| j}t }dd | jD D ]}|| qt|| | j}t|| j n| jdkr
t }d	d | jD D ]}|| qt
| t| jd n| jd
krd }zt
t| j}W n tk
rD   Y nX |d krz@t| j}t|}|d krtj| j d t	d W n tk
r   Y nX |d krtj| j d t	d t| n d S )Nr   z( does not have tuning results embedded!
r   wr   c                 S   s   g | ]}t t|qS r   r   loadopen.0fr   r   r   
<listcomp>   s     zmain.<locals>.<listcomp>r6   c                 S   s   g | ]}t t|qS r   r[   r^   r   r   r   ra      s     r   z1 is not a valid tuning results file or onnx file!)rS   rB   r   onnxZ
load_modelrE   sysstderrwriterW   r   dumpr]   rF   r   rJ   r6   r   r@   forceZ
save_modelrI   r\   rM   	Exceptionr   )rY   r   r   Zmergerr   r   r   mainx   sN    







ri   __main__)F)rN   r"   r   rc   collectionsr   r   typingr   r   r   rb   r1   rA   r   r   Z
ModelProtor   r   r   rS   ri   r.   r   r   r   r   <module>   s"   	,0