o
    .ѹgC                     @   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dejfd	d
Zddejde
e fddZG dd dZdd Zdd Zedkrce  dS 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   d/Users/admin/.pyenv/versions/3.10.0/lib/python3.10/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   Fc                 C   sR   t | j}|s|dksJ d|dkr| j| | j }t|_t||_| S )Nr   z<the supplied onnx file already have tuning results embedded!)	r   r   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dee fddZdd	 Zd
efddZ	dS )Mergerc                   @   s6   e Zd Zdedeeef f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    r1   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 ](\}}i }|j|j|d}| D ]\\}}}||i }	||	|< q|| q|S )N)r   r   results)r2   r%   r   r   
setdefaultappend)
r&   r   evflat_resultsr6   r4   op_sig
params_sig	kernel_id
kernel_mapr   r   r   
get_mergedD   s   
zMerger.get_mergedr4   c                 C   sf   t |d |d }| j|i }|d  D ]\}}| D ]\}}||f|vr/||||f< qqd S )Nr   r   r6   )r   r1   r2   r7   r%   )r&   r4   r9   r:   r;   r>   r<   r=   r   r   r   r3   S   s   zMerger._merge_oneN)
r-   r.   r/   r1   r'   r   TuningResultsr5   r?   r3   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rz|   t	d  |S )!NzCommand to executecmd)helpdestr   z2Extract embedded tuning results from an onnx file.)rB   
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.)actionrB   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.)nargsrB   r5   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ArgumentParserZadd_subparsersZ
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   rP   \   s(   

rP   c                  C   s  t  } | jdkr/tt| j}|d u r#tj| j d t	d t
|t| jd d S | jdkr_t| j}t }dd | jD D ]}|| qEt|| | j}t|| j d S | jdkrt }d	d | jD D ]}|| qot
| t| jd d S | jd
krd }z
t
t| j}W n	 ty   Y nw |d u rzt| j}t|}|d u rtj| j d t	d W n	 ty   Y nw |d u rtj| j d t	d t| d S 	 d S )Nr   z( does not have tuning results embedded!
r   wr   c                 S      g | ]	}t t|qS r   r   loadopen.0fr   r   r   
<listcomp>       zmain.<locals>.<listcomp>r5   c                 S   rX   r   rY   r\   r   r   r   r_      r`   r   z1 is not a valid tuning results file or onnx file!)rP   rA   r   onnxZ
load_modelrD   sysstderrwriterT   r   dumpr[   rE   r   rI   r5   r   r?   forceZ
save_modelrH   rZ   rL   	Exceptionr   )rV   r   r   Zmergerr   r   r   mainx   sT   






rh   __main__)F)rM   r!   r   rb   collectionsr   r   typingr   r   r   ra   r0   r@   r   r   Z
ModelProtor   r   r   rP   rh   r-   r   r   r   r   <module>   s&   	,0
