§
    kŠtjñ ã                  óè   — d dl m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m	Z	 d dl
mZ erd dlmZ d dlmZ d dlmZmZmZmZmZmZmZmZmZ d d	lmZmZ  ej        e¦  «        Z G d
„ d¦  «        Z dS )é    )ÚannotationsN)Údeque)ÚPath)ÚTYPE_CHECKING©ÚSymbolicShapeInferenceHelper)Úconvert_float_to_float16)	ÚAttributeProtoÚ
GraphProtoÚ
ModelProtoÚ	NodeProtoÚTensorProtoÚValueInfoProtoÚhelperÚnumpy_helperÚ
save_model)Úload_external_data_for_tensorÚuses_external_datac                  ó  — e Zd Zd„ Zd„ Zd„ Zi dfd„Zdyd„Zdyd„Zd„ Z	d	„ Z
d
„ Zd„ Zd„ Zd„ Zd„ Zd„ Zd„ Zd„ Zd„ Zdzd„Zdzd„Zdzd„Zdzd„Zed„ ¦   «         Zd„ Zed„ ¦   «         Zd„ Zd„ Zd„ Zd{d„Zdzd„Z dzd „Z!g fd!„Z"ddg dfd"„Z#d#„ Z$d$„ Z%	 	 	 d|d%„Z&d}d'„Z'ddg fd~d*„Z(d}d+„Z)d,„ Z*d-„ Z+dd/„Z,d0„ Z-dd1„Z.dzd2„Z/d3„ Z0dzd€d8„Z1dzd€d9„Z2ed�d=„¦   «         Z3d>„ Z4d?„ Z5d‚d@„Z6d‚dA„Z7dzdB„Z8dC„ Z9dD„ Z:dzdE„Z;dydF„Z<edG„ ¦   «         Z=dH„ Z>dI„ Z?dJ„ Z@d}dK„ZAdƒdL„ZBdM„ ZCedydN„¦   «         ZDdƒdO„ZEe	 	 	 	 d„dQ„¦   «         ZF	 	 	 	 d„dR„ZGdS„ ZHdT„ ZIdydU„ZJed…d†d\„¦   «         ZKe	 	 	 	 d‡dˆdh„¦   «         ZLdi„ ZMd‰dk„ZNdŠdm„ZOdn„ ZPdo„ ZQd‹ds„ZRdŒdu„ZSd�dx„ZTdS )ŽÚ	OnnxModelc                ó0   — |                       |¦  «         d S ©N)Ú
initialize©ÚselfÚmodels     úa/var/www/html/CA-Chatbot/venv/lib/python3.11/site-packages/onnxruntime/transformers/onnx_model.pyÚ__init__zOnnxModel.__init__$   s   € Ø�Š˜ÑÔÐÐÐó    c                óh   — || _         i | _        d | _        d| _        d | _        d | _        d | _        d S ©NT)r   Ú_node_name_suffixÚshape_infer_helperÚenable_shape_inferÚ
all_graphsÚ_dtype_dictÚ_shape_dictr   s     r   r   zOnnxModel.initialize'   s@   € Ø!&ˆŒ
Ø13ˆÔØ@DˆÔØ(,ˆÔØ37ˆŒð
 37ˆÔØ37ˆÔÐÐr   c                ó   — d| _         d S )NF)r$   ©r   s    r   Údisable_shape_inferencez!OnnxModel.disable_shape_inference4   s   € Ø"'ˆÔÐÐr   Fc                ó  — | j         r…| j        �|rddlm}  || j        ¦  «        | _        	 | j                             |¦  «        r| j        S n># t
          $ r1 d| _         t          dt          j        ¦   «         d         ¦  «         Y nw xY wd S )Nr   r   Fzfailed in shape inference)	r$   r#   r   r   ÚinferÚ	ExceptionÚprintÚsysÚexc_info)r   Údynamic_axis_mappingÚupdater   s       r   Úinfer_runtime_shapezOnnxModel.infer_runtime_shape7   sÁ   € ØÔ"ð 	FØÔ&Ð.°&Ð.ØKÐKÐKÐKÐKÐKà*FÐ*FÀtÄzÑ*RÔ*R�Ô'ðFØÔ*×0Ò0Ð1EÑFÔFð 3ØÔ2Ð2ð3øåð Fð Fð FØ*/�Ô'ÝÐ1µ3´<±>´>À!Ô3DÑEÔEÐEÐEÐEðFøøøð ˆts   ­ A Á8B
Â	B
c                óÆ   — i }|s|                       ¦   «         n| j        j        j        }|D ]4}|j        D ]*}|r&||vr|g||<   Œ||                              |¦  «         Œ+Œ5|S r   )Únodesr   ÚgraphÚnodeÚinputÚappend)r   Úexclude_subgraphsÚinput_name_to_nodesÚnodes_to_searchr7   Ú
input_names         r   r;   zOnnxModel.input_name_to_nodesG   s—   € Ø ÐØ.?ÐZ˜$Ÿ*š*™,œ,˜,ÀTÄZÔEUÔEZˆØ#ð 	Eð 	EˆDØ"œjð Eð E�
Øð EØ!Ð)<Ð<Ð<Ø;?¸&Ð+¨JÑ7Ð7à+¨JÔ7×>Ò>¸tÑDÔDÐDøðEð #Ð"r   c                ó„   — i }|s|                       ¦   «         n| j        j        j        }|D ]}|j        D ]	}|r|||<   Œ
Œ|S r   )r5   r   r6   r7   Úoutput)r   r:   Úoutput_name_to_noder<   r7   Úoutput_names         r   r@   zOnnxModel.output_name_to_nodeS   sg   € Ø ÐØ.?ÐZ˜$Ÿ*š*™,œ,˜,ÀTÄZÔEUÔEZˆØ#ð 	<ð 	<ˆDØ#œ{ð <ð <�Øð <Ø7;Ð'¨Ñ4øð<ð #Ð"r   c                ó:   — t          | j        j        ¦  «        g}|S r   )Úlistr   Ú	functions)r   Úall_functionss     r   rD   zOnnxModel.functions\   s   € Ý˜dœjÔ2Ñ3Ô3Ð4ˆØÐr   c                óv   — g }|                       ¦   «         D ]!}|j        D ]}|                     |¦  «         ŒŒ"|S r   )Úgraphsr7   r9   )r   Ú	all_nodesr6   r7   s       r   r5   zOnnxModel.nodes`   sQ   € Øˆ	Ø—[’[‘]”]ð 	'ð 	'ˆEØœ
ð 'ð '�Ø× Ò  Ñ&Ô&Ð&Ð&ð'àÐr   c                ó   — | j         j        S r   )r   r6   r)   s    r   r6   zOnnxModel.graphg   s   € ØŒzÔÐr   c                ó"  — | j         �| j         S g | _         | j        j        g}|rå|                     d¦  «        }| j                              |¦  «         |j        D ]¬}|j        D ]¢}|j        t          j	        j
        k    r6t          |j        t          ¦  «        sJ ‚|                     |j        ¦  «         |j        t          j	        j        k    r6|j        D ].}t          |t          ¦  «        sJ ‚|                     |¦  «         Œ/Œ£Œ­|°å| j         S ©Nr   )r%   r   r6   Úpopr9   r7   Ú	attributeÚtyper
   ÚAttributeTypeÚGRAPHÚ
isinstanceÚgr   ÚGRAPHSrG   )r   Úgraph_queuer6   r7   ÚattrrR   s         r   rG   zOnnxModel.graphsj   s#  € ØŒ?Ð&Ø”?Ð"ØˆŒØ”zÔ'Ð(ˆØð 	2Ø—O’O AÑ&Ô&ˆEØŒO×"Ò" 5Ñ)Ô)Ð)Øœ
ð 2ð 2�Ø œNð 2ð 2�DØ”y¥NÔ$@Ô$FÒFÐFÝ)¨$¬&µ*Ñ=Ô=Ð=Ð=Ð=Ø#×*Ò*¨4¬6Ñ2Ô2Ð2Ø”y¥NÔ$@Ô$GÒGÐGØ!%¤ð 2ð 2˜AÝ#-¨aµÑ#<Ô#<Ð<Ð<Ð#<Ø'×.Ò.¨qÑ1Ô1Ð1Ð1øð2ð	 ð 	2ð ŒÐr   c                ó€   — g }|                       ¦   «         D ]&}|j        D ]}|                     |j        ¦  «         ŒŒ'|S r   )rG   r8   r9   Úname)r   Úinput_namesr6   r8   s       r   Úget_graphs_input_namesz OnnxModel.get_graphs_input_names}   sS   € ØˆØ—[’[‘]”]ð 	/ð 	/ˆEØœð /ð /�Ø×"Ò" 5¤:Ñ.Ô.Ð.Ð.ð/àÐr   c                ó€   — g }|                       ¦   «         D ]&}|j        D ]}|                     |j        ¦  «         ŒŒ'|S r   )rG   r?   r9   rW   )r   Úoutput_namesr6   r?   s       r   Úget_graphs_output_namesz!OnnxModel.get_graphs_output_names„   sS   € ØˆØ—[’[‘]”]ð 	1ð 	1ˆEØœ,ð 1ð 1�Ø×#Ò# F¤KÑ0Ô0Ð0Ð0ð1àÐr   c                óN   — |                       ¦   «         D ]}||j        v r|c S Œd S r   )rG   r7   ©r   r7   r6   s      r   Úget_graph_by_nodezOnnxModel.get_graph_by_node‹   s9   € Ø—[’[‘]”]ð 	ð 	ˆEØ�u”zÐ!Ð!Ø���ð "àˆtr   c                óR   — |                       ¦   «         D ]}||j        k    r|c S Œd S r   )rG   rW   )r   Ú
graph_namer6   s      r   Úget_graph_by_namezOnnxModel.get_graph_by_name‘   s9   € Ø—[’[‘]”]ð 	ð 	ˆEØ˜UœZÒ'Ð'Ø���ð (àˆtr   c                ó†   — t          |j        ¦  «        D ]\  }}|j        D ]}||v r|c c S ŒŒt          |j        ¦  «        S r   )Ú	enumerater7   r8   Úlen)r   r6   ÚoutputsÚidxr7   r8   s         r   Úget_topological_insert_idz#OnnxModel.get_topological_insert_id—   sb   € Ý" 5¤:Ñ.Ô.ð 	ð 	‰IˆC�Øœð ð �Ø˜GÐ#Ð#Ø�J�J�J�J�Jð $ðõ �5”:‰ŒÐr   c                ó¶   — |                       ¦   «         D ](}||j        v r|j                             |¦  «          d S Œ)t                               d|¦  «         d S )NzFailed to remove node %s)rG   r7   ÚremoveÚloggerÚwarningr^   s      r   Úremove_nodezOnnxModel.remove_nodež   se   € Ø—[’[‘]”]ð 	ð 	ˆEØ�u”zÐ!Ð!Ø”
×!Ò! $Ñ'Ô'Ð'Ø��ð "õ 	�ŠÐ1°4Ñ8Ô8Ð8Ð8Ð8r   c                ó:   — |D ]}|                       |¦  «         Œd S r   )rm   )r   Únodes_to_remover7   s      r   Úremove_nodeszOnnxModel.remove_nodes¥   s2   € Ø#ð 	#ð 	#ˆDØ×Ò˜TÑ"Ô"Ð"Ð"ð	#ð 	#r   Nc                ó  — |�|| j         j        j        k    r'| j         j        j                             |g¦  «         d S |                      |¦  «        }|                      ||j        ¦  «        }|j                             ||¦  «         d S r   )	r   r6   rW   r7   Úextendrb   rh   r?   Úinsert)r   r7   ra   r6   Ú
insert_idxs        r   Úadd_nodezOnnxModel.add_node©   s†   € ØÐ ¨t¬zÔ/?Ô/DÒ!DÐ!DØŒJÔÔ!×(Ò(¨$¨Ñ0Ô0Ð0Ð0Ð0à×*Ò*¨:Ñ6Ô6ˆEØ×7Ò7¸¸t¼{ÑKÔKˆJØŒJ×Ò˜j¨$Ñ/Ô/Ð/Ð/Ð/r   c                ó¦   — |€&| j         j        j                             |¦  «         d S |D ]%}||j                 }|                      ||¦  «         Œ&d S r   )r   r6   r7   rr   rW   ru   )r   Únodes_to_addÚnode_name_to_graph_namer7   ra   s        r   Ú	add_nodeszOnnxModel.add_nodes±   sf   € Ø"Ð*ØŒJÔÔ!×(Ò(¨Ñ6Ô6Ð6Ð6Ð6à$ð 0ð 0�Ø4°T´YÔ?�
Ø—’˜d JÑ/Ô/Ð/Ð/ð0ð 0r   c                óâ   — |�|| j         j        j        k    r'| j         j        j                             |g¦  «         d S |                      |¦  «        }|j                             |g¦  «         d S r   )r   r6   rW   Úinitializerrr   rb   )r   Útensorra   r6   s       r   Úadd_initializerzOnnxModel.add_initializer¹   sp   € ØÐ ¨t¬zÔ/?Ô/DÒ!DÐ!DØŒJÔÔ(×/Ò/°°Ñ9Ô9Ð9Ð9Ð9à×*Ò*¨:Ñ6Ô6ˆEØÔ×$Ò$ f XÑ.Ô.Ð.Ð.Ð.r   c                óâ   — |�|| j         j        j        k    r'| j         j        j                             |g¦  «         d S |                      |¦  «        }|j                             |g¦  «         d S r   )r   r6   rW   r8   rr   rb   )r   r8   ra   r6   s       r   Ú	add_inputzOnnxModel.add_inputÀ   so   € ØÐ ¨t¬zÔ/?Ô/DÒ!DÐ!DØŒJÔÔ"×)Ò)¨5¨'Ñ2Ô2Ð2Ð2Ð2à×*Ò*¨:Ñ6Ô6ˆEØŒK×Ò ˜wÑ'Ô'Ð'Ð'Ð'r   c                óÜ   — t          |t          ¦  «        rt          |t          ¦  «        sJ ‚t          t          | j        ¦  «        ¦  «        D ]}| j        |         |k    r
|| j        |<   Œd S r   )rQ   ÚstrÚrangere   r8   )r7   Úold_input_nameÚnew_input_nameÚjs       r   Úreplace_node_inputzOnnxModel.replace_node_inputÇ   sm   € å˜.­#Ñ.Ô.ÐRµ:¸nÍcÑ3RÔ3RÐRÐRÐRÝ•s˜4œ:‘”Ñ'Ô'ð 	/ð 	/ˆAØŒz˜!Œ} Ò.Ð.Ø .�”
˜1‘øð	/ð 	/r   c                ól   — |                       ¦   «         D ]}t                               |||¦  «         Œd S r   )r5   r   r†   )r   rƒ   r„   r7   s       r   Úreplace_input_of_all_nodesz$OnnxModel.replace_input_of_all_nodesÎ   sB   € Ø—J’J‘L”Lð 	Oð 	OˆDÝ×(Ò(¨¨~¸~ÑNÔNÐNÐNð	Oð 	Or   c                óÜ   — t          |t          ¦  «        rt          |t          ¦  «        sJ ‚t          t          | j        ¦  «        ¦  «        D ]}| j        |         |k    r
|| j        |<   Œd S r   )rQ   r�   r‚   re   r?   )r7   Úold_output_nameÚnew_output_namer…   s       r   Úreplace_node_outputzOnnxModel.replace_node_outputÒ   sp   € å˜/­3Ñ/Ô/ÐTµJ¸ÕPSÑ4TÔ4TÐTÐTÐTÝ•s˜4œ;Ñ'Ô'Ñ(Ô(ð 	1ð 	1ˆAØŒ{˜1Œ~ Ò0Ð0Ø!0�”˜A‘øð	1ð 	1r   c                óf   — | j         j        j        D ]}t                               |||¦  «         Œd S r   )r   r6   r7   r   rŒ   )r   rŠ   r‹   r7   s       r   Úreplace_output_of_all_nodesz%OnnxModel.replace_output_of_all_nodesÙ   sD   € ð ”JÔ$Ô)ð 	Rð 	RˆDÝ×)Ò)¨$°ÀÑQÔQÐQÐQð	Rð 	Rr   c                ój   — |                       ¦   «         D ]}|j        D ]}|j        |k    r|c c S ŒŒd S r   )rG   r{   rW   )r   rW   r6   r|   s       r   Úget_initializerzOnnxModel.get_initializerã   sV   € Ø—[’[‘]”]ð 	"ð 	"ˆEØÔ+ð "ð "�Ø”; $Ò&Ð&Ø!�M�M�M�M�Mð 'ð"ð ˆtr   c                óx   — g }|                       ¦   «         D ]"}|j        |k    r|                     |¦  «         Œ#|S r   )r5   Úop_typer9   )r   r’   r5   r7   s       r   Úget_nodes_by_op_typezOnnxModel.get_nodes_by_op_typeê   sC   € ØˆØ—J’J‘L”Lð 	#ð 	#ˆDØŒ|˜wÒ&Ð&Ø—’˜TÑ"Ô"Ð"øØˆr   c                ó
  — |€|                       ¦   «         }g }|�?|t          |j        ¦  «        k     r&|j        |         }||v rt          ||         ¦  «        }n)|j        D ]!}||v r|                     ||         ¦  «         Œ"|S r   )r;   re   r?   rC   rr   )r   r7   r;   Úoutput_indexÚchildrenr?   s         r   Úget_childrenzOnnxModel.get_childrenñ   s£   € ØÐ&Ø"&×":Ò":Ñ"<Ô"<ÐàˆØÐ#Ø�c $¤+Ñ.Ô.Ò.Ð.Øœ \Ô2�ØÐ0Ð0Ð0Ý#Ð$7¸Ô$?Ñ@Ô@�Høàœ+ð Að A�ØÐ0Ð0Ð0Ø—O’OÐ$7¸Ô$?Ñ@Ô@Ð@øàˆr   c                óˆ   — |€|                       ¦   «         }g }|j        D ]!}||v r|                     ||         ¦  «         Œ"|S r   )r@   r8   r9   )r   r7   r@   Úparentsr8   s        r   Úget_parentszOnnxModel.get_parents  sZ   € ØÐ&Ø"&×":Ò":Ñ"<Ô"<ÐàˆØ”Zð 	;ð 	;ˆEØÐ+Ð+Ð+Ø—’Ð2°5Ô9Ñ:Ô:Ð:øØˆr   c                ó˜   — |€|                       ¦   «         }t          |j        ¦  «        |k    rd S |j        |         }||vrd S ||         S r   )r@   re   r8   )r   r7   Úir@   r8   s        r   Ú
get_parentzOnnxModel.get_parent  sY   € ØÐ&Ø"&×":Ò":Ñ"<Ô"<ÐåˆtŒz‰?Œ?˜aÒÐØ�4à”
˜1”ˆØÐ+Ð+Ð+Ø�4à" 5Ô)Ð)r   c                óÆ   — t          |j        ¦  «        D ]K\  }}||v rB||         }|j        |k    r
||vr||fc S t                               d|› d|j        › �¦  «         ŒLdS )a  
        Find parent node based on constraints on op_type.

        Args:
            node (str): current node name.
            parent_op_type (str): constraint of parent node op_type.
            output_name_to_node (dict): dictionary with output name as key, and node as value.
            exclude (list): list of nodes that are excluded (not allowed to match as parent).

        Returns:
            parent: The matched parent node. None if not found.
            index: The input index of matched parent node. None if not found.
        zTo find first z
, current ©NN)rd   r8   r’   rk   Údebug)r   r7   Úparent_op_typer@   Úexcluderœ   r8   Úparents           r   Úmatch_first_parentzOnnxModel.match_first_parent  s‹   € õ " $¤*Ñ-Ô-ð 	^ð 	^‰HˆAˆuØÐ+Ð+Ð+Ø,¨UÔ3�Ø”> ^Ò3Ð3¸ÀgÐ8MÐ8MØ! 1˜9Ð$Ð$Ð$å—L’LÐ!\°.Ð!\Ð!\ÈFÌNÐ!\Ð!\Ñ]Ô]Ð]øØˆzr   c                óô  — |€J ‚|�|dk    sJ ‚|€|                       ¦   «         }|€4|                      ||||¦  «        \  }}|�|                     |¦  «         |S |t          |j        ¦  «        k    r4t
                               d|› dt          |j        ¦  «        › �¦  «         dS |                      |||¦  «        }|�|j        |k    r||vr|S |�%t
                               d|› d|j        › �¦  «         dS )a*  
        Find parent node based on constraints on op_type and index.
        When input_index is None, we will find the first parent node based on constraints,
        and return_indice will be appended the corresponding input index.

        Args:
            node (str): current node name.
            parent_op_type (str): constraint of parent node op_type.
            input_index (int or None): only check the parent given input index of current node.
            output_name_to_node (dict): dictionary with output name as key, and node as value.
            exclude (list): list of nodes that are excluded (not allowed to match as parent).
            return_indice (list): a list to append the input index when input_index is None.

        Returns:
            parent: The matched parent node.
        Nr   zinput_index z >= node inputs zExpect z, Got )	r@   r¤   r9   re   r8   rk   r    r�   r’   )	r   r7   r¡   Úinput_indexr@   r¢   Úreturn_indicer£   Úindexs	            r   Úmatch_parentzOnnxModel.match_parent0  s-  € ð2 ÐÐÐØÐ" k°QÒ&6Ð&6Ð&6Ð6àÐ&Ø"&×":Ò":Ñ"<Ô"<ÐàÐØ ×3Ò3°D¸.ÐJ]Ð_fÑgÔg‰MˆF�EØÐ(Ø×$Ò$ UÑ+Ô+Ð+ØˆMà�#˜dœj™/œ/Ò)Ð)Ý�LŠLÐV¨ÐVÐVÅSÈÌÁ_Ä_ÐVÐVÑWÔWÐWØ�4à—’  {Ð4GÑHÔHˆØÐ &¤.°NÒ"BÐ"BÀvÐU\ÐG\ÐG\ØˆMàÐÝ�LŠLÐI >ÐIÐI¸¼ÐIÐIÑJÔJÐJàˆtr   c                óÌ   — t          |¦  «        D ]S\  }}t          |t          t          f¦  «        sJ ‚g }|                      ||d         |d         ||¦  «        }|r|||fc S ŒTdS )Nr   é   )éÿÿÿÿNN)rd   rQ   rC   ÚtupleÚmatch_parent_path)r   r7   Úpathsr@   rœ   Úpathr§   Úmatcheds           r   Úmatch_parent_pathszOnnxModel.match_parent_pathsb  s†   € Ý  Ñ'Ô'ð 	1ð 	1‰GˆAˆtÝ˜d¥T­5 MÑ2Ô2Ð2Ð2Ð2ØˆMØ×,Ò,¨T°4¸´7¸DÀ¼GÐEXÐZgÑhÔhˆGØð 1Ø˜' =Ð0Ð0Ð0Ð0ð1àˆ~r   c                óN  — g g g }}}t          |¦  «        D ]‹\  }}t          |t          t          f¦  «        sJ ‚g }	|                      ||d         |d         ||	¦  «        }
|
r?|                     |¦  «         |                     |
¦  «         |                     |	¦  «         ŒŒ|||fS )Nr   r«   )rd   rQ   rC   r­   r®   r9   )r   r7   r¯   r@   Úmatch_iÚmatchesÚreturn_indicesrœ   r°   r§   r±   s              r   Úmatch_parent_paths_allz OnnxModel.match_parent_paths_allk  s¼   € Ø+-¨r°2˜.�ˆÝ  Ñ'Ô'ð 	5ð 	5‰GˆAˆtÝ˜d¥T­5 MÑ2Ô2Ð2Ð2Ð2ØˆMØ×,Ò,¨T°4¸´7¸DÀ¼GÐEXÐZgÑhÔhˆGØð 5Ø—’˜qÑ!Ô!Ð!Ø—’˜wÑ'Ô'Ð'Ø×%Ò% mÑ4Ô4Ð4øØ˜ Ð/Ð/r   c           	     óÎ  — |�"t          |¦  «        t          |¦  «        k    sJ ‚|€|                      ¦   «         }|}g }t          |¦  «        D ]–\  }}	|                      ||	|�||         nd|g |¬¦  «        }
|
€S|�,t                               d|› d||         › d|	› �d¬¦  «         n"t                               d|› d|	› �d¬¦  «          dS |                     |
¦  «         |
}Œ—|S )aJ  
        Find a sequence of input edges based on constraints on parent op_type and index.
        When input_index is None, we will find the first parent node based on constraints,
        and return_indice will be appended the corresponding input index.

        Args:
            node (str): current node name.
            parent_op_types (str): constraint of parent node op_type of each input edge.
            parent_input_index (list): constraint of input index of each input edge. None means no constraint.
            output_name_to_node (dict): dictionary with output name as key, and node as value.
            return_indice (list): a list to append the input index
                                  When there is no constraint on input index of an edge.

        Returns:
            parents: a list of matched parent node.
        N)r¢   r§   zFailed to match index=z parent_input_index=ú	 op_type=T©Ú
stack_info)re   r@   rd   r©   rk   r    r9   )r   r7   Úparent_op_typesÚparent_input_indexr@   r§   Úcurrent_nodeÚmatched_parentsrœ   r’   Úmatched_parents              r   r®   zOnnxModel.match_parent_pathw  sK  € ð0 Ð)ÝÐ)Ñ*Ô*­c°/Ñ.BÔ.BÒBÐBÐBÐBàÐ&Ø"&×":Ò":Ñ"<Ô"<ÐàˆØˆÝ# OÑ4Ô4ð 	*ð 	*‰JˆAˆwØ!×.Ò.ØØØ);Ð)GÐ" 1Ô%Ð%ÈTØ#ØØ+ð /ñ ô ˆNð Ð%Ø%Ð1Ý—L’LØq°ÐqÐqÐHZÐ[\ÔH]ÐqÐqÐhoÐqÐqØ#'ð !ñ ô ð ð õ
 —L’LÐ!O¸!Ð!OÐ!OÀgÐ!OÐ!OÐ\`�LÑaÔaÐaØ�t�tà×"Ò" >Ñ2Ô2Ð2Ø)ˆLˆLàÐr   Tc                óB  — |                       ||¦  «        }t          |¦  «        }t          |¦  «        dk    rf|                     ¦   «         }|j        |k    r|S |r0|                       ||¦  «        }|D ]}|                     |¦  «         Œt          |¦  «        dk    °fd S rK   )r—   r   re   rL   r’   Ú
appendleft)	r   r7   Ú
child_typer;   Ú	recursiver–   Údqr¾   Úchilds	            r   Úfind_first_child_by_typez"OnnxModel.find_first_child_by_type¯  s­   € Ø×$Ò$ TÐ+>Ñ?Ô?ˆÝ�8‰_Œ_ˆÝ�"‰gŒg˜ŠkˆkØŸ6š6™8œ8ˆLØÔ# zÒ1Ð1Ø#Ð#àð )Ø×,Ò,¨\Ð;NÑOÔO�Ø%ð )ð )�EØ—M’M %Ñ(Ô(Ð(Ð(õ �"‰gŒg˜Škˆkð ˆtr   Úedgesúlist[tuple[int, int]] | Nonec                ó  — |�‡t          |¦  «        t          |¦  «        k    sJ ‚|D ]b}t          |t          ¦  «        rIt          |¦  «        dk    r6t          |d         t          ¦  «        rt          |d         t          ¦  «        sJ ‚Œc|€|                      ¦   «         }|}g }t          |¦  «        D ]Ò\  }	}
d}|€|                      ||¬¦  «        }n$|                      ||||	         d         ¬¦  «        }|D ]L}|j        |
k    r?||vr;|�5|j        ||	         d                  |j	        ||	         d                  k    rŒH|} nŒM|€%t                               d|	› d|
› �d	¬
¦  «          dS |                     |¦  «         |}ŒÓ|S )a¾  
        Find a sequence of input edges based on constraints on parent op_type and index.
        Note that we use greedy approach and only consider the first matched child, so it has chance to miss matching.

        Args:
            node (str): current node name.
            child_op_types (str): constraint of child node op_type of each input edge.
            edges (list): each edge is represented by two integers: output index of parent node, input index of child node.
                         None means no constraint.
            exclude(list): list of nodes that are excluded (not allowed to match as child).

        Returns:
            children: a list of matched children node.
        Né   r   r«   )r;   )r;   r•   zFailed to match child r¹   Trº   )re   rQ   r­   Úintr;   rd   r—   r’   r8   r?   rk   r    r9   )r   r7   Úchild_op_typesrÈ   r;   r¢   Úedger¾   Úmatched_childrenrœ   r’   Úmatched_childÚchildren_nodesrÆ   s                 r   Úmatch_child_pathzOnnxModel.match_child_path¾  sá  € ð, ÐÝ�u‘:”:¥ ^Ñ!4Ô!4Ò4Ð4Ð4Ð4Øð ð �å˜t¥UÑ+Ô+ðÝ03°D±	´	¸Q²°Å:ÈdÐSTÌgÕWZÑC[ÔC[°Õ`jÐkoÐpqÔkrÕtwÑ`xÔ`x°°Ðx°ð Ð&Ø"&×":Ò":Ñ"<Ô"<ÐàˆØÐÝ# NÑ3Ô3ð 	)ð 	)‰JˆAˆwØ ˆMàˆ}Ø!%×!2Ò!2°<ÐUhÐ!2Ñ!iÔ!i��à!%×!2Ò!2Ø Ð6IÐX]Ð^_ÔX`ÐabÔXcð "3ñ "ô "�ð (ð ð �Ø”= GÒ+Ð+°¸WÐ0DÐ0DØÐ(¨U¬[¸¸q¼À!¼Ô-EÈÔI\Ð]bÐcdÔ]eÐfgÔ]hÔIiÒ-iÐ-iØ ð %*�MØ�EøàÐ$Ý—’ÐK°aÐKÐKÀ'ÐKÐKÐX\�Ñ]Ô]Ð]Ø�t�tà×#Ò# MÑ2Ô2Ð2Ø(ˆLˆLàÐr   c                ón  — |€|                       ¦   «         }|                      ||¦  «        }t          |¦  «        }t          |¦  «        dk    rf|                     ¦   «         }|j        |k    r|S |r0|                      ||¦  «        }|D ]}|                     |¦  «         Œt          |¦  «        dk    °fd S rK   )r@   rš   r   re   rL   r’   rÂ   )	r   r7   Úparent_typer@   rÄ   r™   rÅ   r¾   r£   s	            r   Úfind_first_parent_by_typez#OnnxModel.find_first_parent_by_typeý  sÅ   € ØÐ&Ø"&×":Ò":Ñ"<Ô"<Ðà×"Ò" 4Ð)<Ñ=Ô=ˆÝ�7‰^Œ^ˆÝ�"‰gŒg˜ŠkˆkØŸ6š6™8œ8ˆLØÔ# {Ò2Ð2Ø#Ð#àð *Ø×*Ò*¨<Ð9LÑMÔM�Ø%ð *ð *�FØ—M’M &Ñ)Ô)Ð)Ð)õ �"‰gŒg˜Škˆkð ˆtr   c                ó  — |                       d¦  «        D ]E}|j        d         |k    r2|j        D ]*}|j        dk    rt	          j        |j        ¦  «        c c S Œ+ŒF|                      |¦  «        }|�t	          j        |¦  «        S d S )NÚConstantr   Úvalue)r“   r?   rM   rW   r   Úto_arrayÚtr�   )r   rA   r7   Úattr{   s        r   Úget_constant_valuezOnnxModel.get_constant_value  s¤   € Ø×-Ò-¨jÑ9Ô9ð 	<ð 	<ˆDØŒ{˜1Œ~ Ò,Ð,Øœ>ð <ð <�CØ”x 7Ò*Ð*Ý+Ô4°S´UÑ;Ô;Ð;Ð;Ð;Ð;Ð;ð +øð ×*Ò*¨;Ñ7Ô7ˆØÐ"ÝÔ(¨Ñ5Ô5Ð5àˆtr   c                ót   — t          |j        ¦  «        D ]"\  }}|                      |¦  «        }|�||fc S Œ#dS )NrŸ   )rd   r8   rÜ   )r   r7   rœ   r8   rØ   s        r   Úget_constant_inputzOnnxModel.get_constant_input  sQ   € Ý! $¤*Ñ-Ô-ð 	 ð 	 ‰HˆAˆuØ×+Ò+¨EÑ2Ô2ˆEØÐ Ø˜%�x���ð !ð ˆzr   ç�íµ ÷Æ°>c                ó€   — |                       |¦  «        \  }}|�#|j        dk    rt          ||z
  ¦  «        |k     r|S dS )Nr«   r¬   )rÞ   ÚsizeÚabs)r   r7   Úexpected_valueÚdeltarœ   rØ   s         r   Úfind_constant_inputzOnnxModel.find_constant_input%  sK   € Ø×*Ò*¨4Ñ0Ô0‰ˆˆ5ØÐ ¤¨q¢ µS¸ÀÑ9OÑ5PÔ5PÐSXÒ5XÐ5XØˆHàˆrr   c           	     ó   — |                       |¦  «        }|€"t                               |› d|› d�¦  «         dS t          |j        ¦  «        |k    r,t                               |› d|› d|› d|j        › �¦  «         dS dS )Nú z is not initializer.Fz shall have z dimensions. Got shape T)rÜ   rk   r    re   Úshape)r   rA   Ú
dimensionsÚdescriptionrØ   s        r   Ú$is_constant_with_specified_dimensionz.OnnxModel.is_constant_with_specified_dimension,  s•   € Ø×'Ò'¨Ñ4Ô4ˆØˆ=Ý�LŠL˜KÐKÐK¨+ÐKÐKÐKÑLÔLÐLØ�5åˆuŒ{ÑÔ˜zÒ)Ð)Ý�LŠL˜KÐsÐs¨+ÐsÐsÀ:ÐsÐsÐfkÔfqÐsÐsÑtÔtÐtØ�5àˆtr   c                ó8   — |                       |||¦  «        dk    S rK   )rå   )r   r7   rã   rä   s       r   Úhas_constant_inputzOnnxModel.has_constant_input8  s   € Ø×'Ò'¨¨n¸eÑDÔDÈÒIÐIr   c                óŠ  — |€|                       ¦   «         }||j        d                  }g }t          |¦  «        }t          |¦  «        dk    ru|                     ¦   «         }||v rŒ,||vrE|                     |¦  «         |j        D ](}||v r"||         }|D ]}	|                     |	¦  «         ŒŒ)t          |¦  «        dk    °u|S rK   )r;   r?   r   re   rL   r9   rÂ   )
r   Ú	root_nodeÚ
stop_nodesr;   r–   Úunique_nodesrÅ   r¾   r?   rÆ   s
             r   Úget_children_subgraph_nodesz%OnnxModel.get_children_subgraph_nodes;  së   € ØÐ&Ø"&×":Ò":Ñ"<Ô"<Ðà& yÔ'7¸Ô':Ô;ˆàˆå�8‰_Œ_ˆÝ�"‰gŒg˜ŠkˆkØŸ6š6™8œ8ˆLØ˜zÐ)Ð)Øà <Ð/Ð/Ø×#Ò# LÑ1Ô1Ð1à*Ô1ð 1ð 1�FØÐ!4Ð4Ð4Ø#6°vÔ#>˜Ø%-ð 1ð 1˜EØŸMšM¨%Ñ0Ô0Ð0Ð0øõ �"‰gŒg˜Škˆkð Ðr   c                ó  — g }|j         j        D ]w}|                     d¦  «        r|                     |j        ¦  «         Œ2|                     d¦  «        r|                     |j        ¦  «         Œb|                     d¦  «         Œx|S )zConvert tensor shape to listÚ	dim_valueÚ	dim_paramú?)rè   ÚdimÚHasFieldr9   rô   rõ   )r   Útensor_typeÚ
shape_listÚds       r   Útensor_shape_to_listzOnnxModel.tensor_shape_to_listT  s“   € àˆ
ØÔ"Ô&ð 	'ð 	'ˆAØ�zŠz˜+Ñ&Ô&ð 'Ø×!Ò! !¤+Ñ.Ô.Ð.Ð.Ø—’˜KÑ(Ô(ð 'Ø×!Ò! !¤+Ñ.Ô.Ð.Ð.à×!Ò! #Ñ&Ô&Ð&Ð&ØÐr   rW   r�   Úsymbolic_shape_helperú#SymbolicShapeInferenceHelper | Nonec                óÔ  — | j         €¡i | _         t          j        | j        j        j        | j        j        j        | j        j        j        ¦  «        D ] }|j        j	        j
        | j         |j        <   Œ!| j        j        j        D ]$}|j        | j         vr|j        | j         |j        <   Œ%|| j         v r| j         |         S |�'||j        v r|j        |         }|j        j	        j
        S dS )zXTry get data type given a name (could be initializer, input or output of graph or node).N)r&   Ú	itertoolsÚchainr   r6   Ú
value_infor8   r?   rN   rù   Ú	elem_typerW   r{   Ú	data_typeÚ	known_vi_)r   rW   rý   r  r{   s        r   Ú	get_dtypezOnnxModel.get_dtype`  sý   € ð ÔÐ#Ø!ˆDÔÝ'œoØ”
Ô Ô+Ø”
Ô Ô&Ø”
Ô Ô'ñô ð Zð Z�
ð
 5?´OÔ4OÔ4Y�Ô  ¤Ñ1Ð1à#œzÔ/Ô;ð Oð O�ØÔ#¨4Ô+;Ð;Ð;Ø9DÔ9N�DÔ$ [Ô%5Ñ6øà�4Ô#Ð#Ð#ØÔ# DÔ)Ð)à Ð,°Ð9NÔ9XÐ1XÐ1XØ.Ô8¸Ô>ˆJØ”?Ô.Ô8Ð8àˆtr   c                ó¤  — | j         �€i | _         t          j        | j        j        j        | j        j        j        | j        j        j        ¦  «        D ]‡}|j        j	         
                    d¦  «        rfg }|j        j	        j        j        D ]>}|j        r|                     |j        ¦  «         Œ$|                     |j        ¦  «         Œ?|| j         |j        <   Œˆ| j        j        j        D ]$}|j        | j         vr|j        | j         |j        <   Œ%|| j         v r| j         |         S |�'||j        v r|j        |         }|j        j	        j        S dS )zTTry get shape given a name (could be initializer, input or output of graph or node).Nrè   )r'   r   r  r   r6   r  r8   r?   rN   rù   rø   rè   r÷   rõ   r9   rô   rW   r{   Údimsr  r  )r   rW   rý   r  rè   r÷   r{   s          r   Ú	get_shapezOnnxModel.get_shapey  sc  € ð ÔÑ#Ø!ˆDÔÝ'œoØ”
Ô Ô+Ø”
Ô Ô&Ø”
Ô Ô'ñô ð >ð >�
ð
 ”?Ô.×7Ò7¸Ñ@Ô@ð >Ø�EØ)œÔ:Ô@ÔDð 8ð 8˜Øœ=ð 8Ø!ŸLšL¨¬Ñ7Ô7Ð7Ð7à!ŸLšL¨¬Ñ7Ô7Ð7Ð7Ø8=�DÔ$ Z¤_Ñ5øà#œzÔ/Ô;ð Jð J�ØÔ#¨4Ô+;Ð;Ð;Ø9DÔ9I�DÔ$ [Ô%5Ñ6øà�4Ô#Ð#Ð#ØÔ# DÔ)Ð)à Ð,°Ð9NÔ9XÐ1XÐ1XØ.Ô8¸Ô>ˆJØ”?Ô.Ô8Ð8àˆtr   r7   r   Úattribute_namec                ó`   — | j         D ]%}|j        |k    rt          j        |¦  «        }|c S Œ&d S r   )rM   rW   r   Úget_attribute_value)r7   r
  rU   rØ   s       r   Úget_node_attributezOnnxModel.get_node_attribute™  sE   € à”Nð 	ð 	ˆDØŒy˜NÒ*Ð*ÝÔ2°4Ñ8Ô8�Ø���ð +ð ˆtr   c                ób  — |                       ¦   «         }d}|                      ¦   «         D ]L}|j        dk    r?|                      |d|¬¦  «        }|r%|j        dk    r|j        d         |j        d<   |dz  }ŒM|dk    r1t
                               d|¦  «         |                      ¦   «          dS dS )av  Remove Cast node that are followed by another Cast node like  --> Cast --> Cast -->
        Note that this shall be used carefully since it might introduce semantic change.
        For example, float -> int -> float could get different value than the original float value.
        So, it is recommended to used only in post-processing of mixed precision conversion.
        r   ÚCast)r@   r«   zRemoved %d cascaded Cast nodesN)r@   r5   r’   r�   r8   rk   ÚinfoÚprune_graph)r   r@   Úremoved_countr7   r£   s        r   Úremove_cascaded_cast_nodesz$OnnxModel.remove_cascaded_cast_nodes¡  sÇ   € ð #×6Ò6Ñ8Ô8ÐØˆØ—J’J‘L”Lð 	'ð 	'ˆDØŒ|˜vÒ%Ð%ØŸš¨¨qÐFY˜ÑZÔZ�Øð '˜fœn°Ò6Ð6Ø$*¤L°¤O�D”J˜q‘MØ! QÑ&�Møà˜1ÒÐÝ�KŠKÐ8¸-ÑHÔHÐHØ×ÒÑÔÐÐÐð Ðr   c                ó@  — |                       d¬¦  «        }| j        r|€t                               d¦  «         g }|                      ¦   «         D ]l}|j        dk    r_|                      |j        d         |¦  «        }|                      |j        d         |¦  «        }|r||k    r| 	                    |¦  «         Œm|�r^t          |                      ¦   «         ¦  «        }t          |                      ¦   «         ¦  «        }|D ]ï}t          t          |j        ¦  «        |z  ¦  «        rˆt          t          |j        ¦  «        |z  ¦  «        sct          |                      ¦   «         |j        d                  ¦  «        dk    r-|                      |j        d         |j        d         ¦  «         n-Œ®|                      |j        d         |j        d         ¦  «         |                      |¦  «         Œðt                               dt          |¦  «        ¦  «         dS dS )	zKRemove cast nodes that are not needed: input and output has same data type.T)r2   NzFshape inference failed which might impact useless cast node detection.r  r   r«   z4Removed %d Cast nodes with output type same as input)r3   r$   rk   rl   r5   r’   r  r8   r?   r9   ÚsetrY   r\   Úboolre   r;   rŽ   rˆ   rm   r  )r   Úshape_inferro   r7   Úinput_dtypeÚoutput_dtypeÚgraph_input_namesÚgraph_output_namess           r   Úremove_useless_cast_nodesz#OnnxModel.remove_useless_cast_nodes´  s  € à×.Ò.°dÐ.Ñ;Ô;ˆØÔ"ð 	e {Ð':Ý�NŠNÐcÑdÔdÐdàˆØ—J’J‘L”Lð 	1ð 	1ˆDØŒ|˜vÒ%Ð%Ø"Ÿnšn¨T¬Z¸¬]¸KÑHÔH�Ø#Ÿ~š~¨d¬k¸!¬n¸kÑJÔJ�Øð 1 ;°,Ò#>Ð#>Ø#×*Ò*¨4Ñ0Ô0Ð0øàñ 	Ý # D×$?Ò$?Ñ$AÔ$AÑ BÔ BÐÝ!$ T×%AÒ%AÑ%CÔ%CÑ!DÔ!DÐØ'ð 
'ð 
'�Ý�˜DœKÑ(Ô(Ð+=Ñ=Ñ>Ô>ð SÝ ¥ T¤Z¡¤Ð3DÑ!DÑEÔEð !Í3Ø×0Ò0Ñ2Ô2°4´:¸a´=ÔAñLô LàòLð Lð ×8Ò8¸¼ÀA¼ÈÌÐTUÌÑWÔWÐWÐWà à×3Ò3°D´KÀ´NÀDÄJÈqÄMÑRÔRÐRØ× Ò  Ñ&Ô&Ð&Ð&å�KŠKØFÝ�OÑ$Ô$ñô ð ð ð ð	ð 	r   c                óh   — t                                d¦  «         |                      d|¬¦  «         d S )NzbThe function convert_model_float32_to_float16 is deprecated. Use convert_float_to_float16 instead!T)Úuse_symbolic_shape_inferÚkeep_io_types)rk   rl   r	   )r   Úcast_input_outputs     r   Ú convert_model_float32_to_float16z*OnnxModel.convert_model_float32_to_float16Ö  s=   € Ý�ŠØpñ	
ô 	
ð 	
ð 	×%Ò%¸tÐSdÐ%ÑeÔeÐeÐeÐer   c                ó   ‡— d‰vrd‰d<   | j         }|�rzddlm}  ||¦  «        }	 |                     |dd¬¦  «        }|��"i }|j        j        D ]½}t          |j        d¦  «        r¦t          |j        j        d	¦  «        rŒ|j        j        j	        t          j        k    rm|j        rft          ¦   «         }	|	                     |¦  «         t          |	j        j        d
¦  «        r|	j        j                             d
¦  «         |	||j        <   Œ¾|j        j        D ]}|j        |v r||j        = Œ|                     ¦   «         D ]!}|j        j                             |¦  «         Œ"n*# t$          $ r t&                               d¦  «         Y nw xY wd|i}
|
                     ˆfd„dD ¦   «         ¦  «         t-          |fi |
¤Ž}|                      |¦  «         |                      ¦   «          |                      ¦   «          dS )aÍ	  Convert a model to half (default) or mixed precision.
           To use mixed precision, user need specify which graph inputs, outputs, operator type
           or list of nodes shall keep in float32.

           Note that the conversion might not proceed without type information for the whole graph.

           By default, we use symbolic shape inference to get type information. The benefit of symbolic shape inference
           is that it could handle fused operators in com.microsoft domain. Those operators cannot be handled in onnx shape
           inference so symbolic shape inference is recommended for optimized model.

           When symbolic shape inference is used (even if it failed), ONNX shape inference will be disabled.

           Note that onnx shape inference will fail for model larger than 2GB. For large model, you have to enable
           symbolic shape inference. If your model is not optimized, you can also use model path to call
           convert_float_to_float16 in float16.py (see https://github.com/microsoft/onnxruntime/pull/15067) to
           avoid the 2GB limit.

        Args:
            use_symbolic_shape_infer (bool, optional): use symbolic shape inference instead of onnx shape inference.
                                                       Defaults to True.
            keep_io_types (Union[bool, List[str]], optional): boolean or a list of float32 input/output names.
                                                              If True, model inputs/outputs should be left as float32.
                                                              Defaults to True.
            op_block_list (List[str], optional): List of operator types to leave as float32.
                                                 Defaults to None, which will use `float16.DEFAULT_OP_BLOCK_LIST`.
            node_block_list (List[str], optional): List of node names to leave as float32. Defaults to None.
            force_fp16_initializers(bool): force converting all float initializers to float16.
                                           Default to false.
            min_positive_val (float, optional): minimal positive value. Defaults to 1e-7.
            max_finite_val (float, optional): maximal finite value. Defaults to 1e4.
            force_fp16_inputs(Dict[str, List[int]]): Force the conversion of the inputs of some operators to float16, even if
                                                     this script's preference it to keep them in float32.
        r  Tr   r   F)Ú
auto_mergeÚguess_output_rankNrù   r  rè   ziFailed to run symbolic shape inference. Please file an issue in https://github.com/microsoft/onnxruntime.Údisable_shape_inferc                ó*   •— i | ]}|‰v ¯|‰|         “ŒS © r'  )Ú.0ÚkeyÚkwargss     €r   ú
<dictcomp>z6OnnxModel.convert_float_to_float16.<locals>.<dictcomp>(  s4   ø€ ð ð ð àð ˜&�=�=ð �V˜C”[ð !�=�=r   )r  Úmin_positive_valÚmax_finite_valÚop_block_listÚnode_block_listÚforce_fp16_initializersÚforce_fp16_inputsÚ#use_bfloat16_as_blocked_nodes_dtype)r   r#   r   Úinfer_shapesr6   r  ÚhasattrrN   rù   r  r   Ú	UNDEFINEDrW   r   ÚCopyFromÚ
ClearFieldÚvaluesr9   r-   rk   rl   r2   r	   r   r  r  )r   r  r*  r   r   r#   Úmodel_with_shapeÚname_viÚviÚvi_copyÚ
parametersÚ
fp16_models     `         r   r	   z"OnnxModel.convert_float_to_float16Ü  s�  ø€ ðD  &Ð(Ð(Ø&*ˆF�?Ñ#à”
ˆØ#ñ "	ð HÐGÐGÐGÐGÐGà!=Ð!=¸eÑ!DÔ!DÐðØ#5×#BÒ#BÀ5ÐUYÐmrÐ#BÑ#sÔ#sÐ ð
 $Ñ/Ø �GØ.Ô4Ô?ð 7ð 7˜å# B¤G¨]Ñ;Ô;ð
7å '¨¬Ô(;¸[Ñ IÔ Ið
7ð !#¤Ô 3Ô =ÅÔAVÒ VÐ VØ "¤ð !Wõ '5Ñ&6Ô&6˜GØ#×,Ò,¨RÑ0Ô0Ð0Ý& w¤|Ô'?ÀÑIÔIð MØ '¤Ô 8× CÒ CÀGÑ LÔ LÐ LØ/6˜G B¤GÑ,øØ#œkÔ4ð 1ð 1˜Øœ7 gÐ-Ð-Ø '¨¬Ð 0øØ%ŸnšnÑ.Ô.ð :ð :˜ØœÔ.×5Ò5°bÑ9Ô9Ð9Ð9øøÝð ð ð Ý—’Øñô ð ð ð ðøøøð
 ,Ð-EÐFˆ
Ø×Òðð ð ð ð	ðñ ô ñ	
ô 	
ð 	
õ" .¨eÐBÐB°zÐBÐBˆ
Ø�Š˜
Ñ#Ô#Ð#à×'Ò'Ñ)Ô)Ð)à×&Ò&Ñ(Ô(Ð(Ð(Ð(s   §D=E% Å%$FÆFc                óÆ  — |r|                      d¦  «        r|n|dz   }n|dz   }d}|| j        v r| j        |         dz   }n†|                      ¦   «         D ]q}|j        rh|j                             |¦  «        rN	 t          |j        t          |¦  «        d…         ¦  «        }t          |dz   |¦  «        }Œa# t          $ r Y Œmw xY wŒr|| j        |<   |t          |¦  «        z   S )ar  Create a unique node name that starts with a prefix (default is operator type).
           The name will not be duplicated with any name that generated or existed in current graphs.
        Args:
            op_type (str): operator type
            name_prefix (str, optional): prefix of node name. Defaults to None.

        Returns:
            str: node name
        Ú_r   r«   N)
Úendswithr"   r5   rW   Ú
startswithrÌ   re   ÚmaxÚ
ValueErrorr�   )r   r’   Úname_prefixÚprefixÚsuffixr7   r¨   s          r   Úcreate_node_namezOnnxModel.create_node_name?  s  € ð ð 	#Ø$/×$8Ò$8¸Ñ$=Ô$=ÐV�[�[ÀKÐRUÑDUˆFˆFà˜s‘]ˆFàˆØ�TÔ+Ð+Ð+ØÔ+¨FÔ3°aÑ7ˆFˆFð Ÿ
š
™œð !ð !�Ø”9ð ! ¤×!5Ò!5°fÑ!=Ô!=ð !ð!Ý # D¤I­c°&©k¬k¨m¨mÔ$<Ñ =Ô =˜Ý!$ U¨Q¡Y°Ñ!7Ô!7˜˜øÝ%ð !ð !ð !Ø ˜ð!øøøøð *0ˆÔ˜vÑ&à�˜F™œÑ#Ð#s   Á9<B6Â6
CÃCc                óL   — | j         j        j        D ]}|j        |k    r|c S Œd S r   )r   r6   r8   rW   )r   r=   r8   s      r   Úfind_graph_inputzOnnxModel.find_graph_inputb  s9   € Ø”ZÔ%Ô+ð 	ð 	ˆEØŒz˜ZÒ'Ð'Ø���ð (àˆtr   c                óL   — | j         j        j        D ]}|j        |k    r|c S Œd S r   )r   r6   r?   rW   )r   rA   r?   s      r   Úfind_graph_outputzOnnxModel.find_graph_outputh  s9   € Ø”jÔ&Ô-ð 	ð 	ˆFØŒ{˜kÒ)Ð)Ø���ð *àˆtr   c                ó‚  — |€|                       ¦   «         }g }|                      ||¦  «        }t          |¦  «        }t          |¦  «        dk    rn|                     ¦   «         }||v rŒ,||vr>|                     |¦  «         |j        D ]!}||v r|                     ||         ¦  «         Œ"t          |¦  «        dk    °n|S rK   )r@   rš   r   re   rL   r9   r8   rÂ   )	r   r7   rð   r@   rñ   r™   rÅ   r¾   r8   s	            r   Úget_parent_subgraph_nodesz#OnnxModel.get_parent_subgraph_nodesn  sÛ   € ØÐ&Ø"&×":Ò":Ñ"<Ô"<Ðàˆà×"Ò" 4Ð)<Ñ=Ô=ˆÝ�7‰^Œ^ˆÝ�"‰gŒg˜ŠkˆkØŸ6š6™8œ8ˆLØ˜zÐ)Ð)Øà <Ð/Ð/Ø×#Ò# LÑ1Ô1Ð1à)Ô/ð Bð B�EØÐ 3Ð3Ð3ØŸšÐ&9¸%Ô&@ÑAÔAÐAøõ �"‰gŒg˜Škˆkð Ðr   c                ó$  — g }|j         D ]0}|                      |¦  «        r||vr|                     |¦  «         Œ1|rS|                      |g ¦  «        }|D ]:}|j         D ]0}|                      |¦  «        r||vr|                     |¦  «         Œ1Œ;|S )z@
        Find graph inputs that linked to current node.
        )r8   rJ  r9   rN  )r   r¾   rÄ   Úgraph_inputsr8   Úparent_nodesr7   s          r   Úget_graph_inputszOnnxModel.get_graph_inputs„  sÏ   € ð ˆØ!Ô'ð 	+ð 	+ˆEØ×$Ò$ UÑ+Ô+ð +°¸\Ð0IÐ0IØ×#Ò# EÑ*Ô*Ð*øàð 	3Ø×9Ò9¸,ÈÑKÔKˆLØ$ð 3ð 3�Ø!œZð 3ð 3�EØ×,Ò,¨UÑ3Ô3ð 3¸À\Ð8QÐ8QØ$×+Ò+¨EÑ2Ô2Ð2øð3ð Ðr   c                óN   — t          |j        ¦  «        D ]\  }}|| k    r|c S ŒdS )Nr¬   )rd   r8   )Únode_outputÚ
child_noder¨   r8   s       r   r¦   zOnnxModel.input_index•  s>   € å% jÔ&6Ñ7Ô7ð 	ð 	‰LˆE�5Ø˜Ò#Ð#Ø���ð $àˆrr   c                ój  — |                       ¦   «         }g }|                      ¦   «         }|D ]1}|j        dk    r$|j        d         |vr|                     |¦  «         Œ2|                      |¦  «         t          |¦  «        dk    r,t                               dt          |¦  «        › �¦  «         d S d S )Nr×   r   zRemoved unused constant nodes: )	r;   r5   r’   r?   r9   rp   re   rk   r    )r   r;   Úunused_nodesr5   r7   s        r   Úremove_unused_constantz OnnxModel.remove_unused_constantœ  sÂ   € Ø"×6Ò6Ñ8Ô8Ðð ˆØ—
’
‘”ˆØð 	*ð 	*ˆDØŒ|˜zÒ)Ð)¨d¬k¸!¬nÐDWÐ.WÐ.WØ×#Ò# DÑ)Ô)Ð)øà×Ò˜,Ñ'Ô'Ð'åˆ|ÑÔ˜qÒ Ð Ý�LŠLÐN½3¸|Ñ;LÔ;LÐNÐNÑOÔOÐOÐOÐOð !Ð r   c                ó¶   — t          ¦   «         }|j        D ]B}|j        t          j        k    r+|j        j        }|D ]}|                     |j        ¦  «         ŒŒC|S )zD
        Get inputs to all nodes in all subgraphs of a node
        )	r  rM   rN   r
   rP   rR   r7   r2   r8   )r   r7   Úsubgraph_nodes_inputsrU   Úchild_nodesrU  s         r   Ú_get_subgraph_inputs_of_nodez&OnnxModel._get_subgraph_inputs_of_node«  sl   € õ
 !$¡¤ÐØ”Nð 	Cð 	CˆDØŒy�NÔ0Ò0Ð0Ø"œfœk�Ø"-ð Cð C�JØ)×0Ò0°Ô1AÑBÔBÐBÐBøØ$Ð$r   c                óä   ‡— t          t          ˆfd„| j        j        j        ¦  «        ¦  «        }t          ¦   «         }|D ],}|                      |¦  «        }|                     |¦  «         Œ-||fS )zˆ
        Get input names to all nodes in all subgraphs where subgraphs are
        graph attributes of a node in the main graph
        c                ó   •— | j         ‰v S r   ©r’   )r7   Úops_with_graph_attrss    €r   ú<lambda>z:OnnxModel._get_subgraph_nodes_and_inputs.<locals>.<lambda>½  s   ø€ °$´,ÐBVÐ2V€ r   )rC   Úfilterr   r6   r7   r  r\  r2   )r   r`  Úsubgraph_nodesrZ  Úparent_nodeÚsubgraph_inputs_of_parent_nodes    `    r   Ú_get_subgraph_nodes_and_inputsz(OnnxModel._get_subgraph_nodes_and_inputs¸  sƒ   ø€ õ
 �fÐ%VÐ%VÐ%VÐ%VÐX\ÔXbÔXhÔXmÑnÔnÑoÔoˆÝ #¡¤ÐØ)ð 	Ið 	IˆKØ-1×-NÒ-NÈ{Ñ-[Ô-[Ð*Ø!×(Ò(Ð)GÑHÔHÐHÐHØÐ4Ð4Ð4r   c                óÀ  ‡— |€d„ | j         j        j        D ¦   «         n|}|                      d¬¦  «        }|                      ¦   «         }d„ }t          |                      ¦   «         ¦  «        dk    r{|                      h d£¬¦  «        \  }}t          |¦  «        d	k    rt           	                    d
¦  «         dS | j         j        j
        D ]}	|	|v rŒ|	j        D ]}
|
|v r
|
|vr||
gz  }ŒŒ i }t          ¦   «         }|D ]!}
|
|v r|                     ||
         ¦  «         Œ"t          |¦  «        d	k    r}|                     ¦   «         }	 ||	¦  «        }|rI||vrE|	||<   |	j        D ]8}t          |¦  «        d	k    r#||v r||vr|                     ||         ¦  «         Œ9t          |¦  «        d	k    °}g }d	}| j         j        j
        D ]U}	 ||	¦  «        }|                     |¦  «        }|r,|j        |	j        k    r||	k    r|                     |	¦  «         ŒP|dz  }ŒVd| _        | j         j                             d¦  «         | j         j        j
                             |¦  «         g }|�[| j         j        j        D ] }
|
j        |vr|                     |
¦  «         Œ!|D ]&}
| j         j        j                             |
¦  «         Œ'g }|rZ|                      ¦   «         Šˆfd„| j         j        j        D ¦   «         }|D ]&}| j         j        j                             |¦  «         Œ'|s|s|d	k    rœg }|r%|                     t          |¦  «        › d�¦  «         |r%|                     t          |¦  «        › d�¦  «         |d	k    r|                     |› d�¦  «         t                               dd                     |¦  «        ¦  «         |                      ¦   «          dS )a×  
        Prune graph to keep only required outputs. It removes unnecessary nodes that are not linked
        (directly or indirectly) to any required output.

        There is also an option to remove graph inputs that are not used to generate any required output.

        Args:
            outputs (list): a list of graph outputs to retain. If it is None, all graph outputs will be kept.
            allow_remove_graph_inputs (bool): allow remove graph inputs.
        Nc                ó   — g | ]	}|j         ‘Œ
S r'  ©rW   )r(  r?   s     r   ú
<listcomp>z)OnnxModel.prune_graph.<locals>.<listcomp>Ð  s   € ÐJÐJÐJ¨˜œÐJÐJÐJr   T)r:   c                óŽ   — | j         d         r| j         d         S t          t          d„ | j         D ¦   «         ¦  «        d ¦  «        S )Nr   c                ó   — g | ]}|¯|‘ŒS r'  r'  ©r(  Úos     r   rj  zCOnnxModel.prune_graph.<locals>.get_first_output.<locals>.<listcomp>Ø  s   € Ð:Ð:Ð: A¸Ð:˜aÐ:Ð:Ð:r   )r?   ÚnextÚiter)r7   s    r   Úget_first_outputz/OnnxModel.prune_graph.<locals>.get_first_outputÕ  sE   € ØŒ{˜1Œ~ð &Ø”{ 1”~Ð%Ý�Ð:Ð:¨¬Ð:Ñ:Ô:Ñ;Ô;¸TÑBÔBÐBr   r«   >   ÚIfÚLoopÚScan)r`  r   z)Skip prune_graph since graph has subgraphr7   c                ó&   •— g | ]}|j         ‰v¯|‘ŒS r'  ri  )r(  r8   r;   s     €r   rj  z)OnnxModel.prune_graph.<locals>.<listcomp>#  s&   ø€ ÐrÐrÐr¨ÈEÌJÐ^qÐLqÐLq˜uÐLqÐLqÐLqr   z inputsz outputsz nodesz
Removed %sz, )r   r6   r?   r;   r@   re   rG   rf  rk   r    r7   r   r9   rL   r8   rÂ   Úgetr’   r%   r7  rr   rW   rj   r  ÚjoinÚupdate_graph)r   rf   Úallow_remove_graph_inputsÚkeep_outputsÚ"input_name_to_nodes_for_main_graphr@   rq  rc  rZ  r7   r?   Úoutput_to_noderÅ   Úfirst_outputrW   Únodes_to_keepÚnum_nodes_removedÚ	kept_nodeÚoutput_to_removeÚinput_to_removeÚremovedr;   s                        @r   r  zOnnxModel.prune_graphÄ  sÃ  ø€ ð OVÈoÐJÐJ°$´*Ô2BÔ2IÐJÑJÔJÐJÐcjˆà-1×-EÒ-EÐX\Ð-EÑ-]Ô-]Ð*Ø"×6Ò6Ñ8Ô8Ðð	Cð 	Cð 	Cõ
 ˆt�{Š{‰}Œ}ÑÔ Ò!Ð!à48×4WÒ4WØ%;Ð%;Ð%;ð 5Xñ 5ô 5Ñ1ˆNÐ1õ �>Ñ"Ô" aÒ'Ð'å—’ÐHÑIÔIÐIØ�ð œ
Ô(Ô-ð 
1ð 
1�ð ˜>Ð)Ð)Øð #œkð 1ð 1�FØÐ!6Ð6Ð6¸6ÐIkÐ;kÐ;kØ$¨¨Ñ0˜øð1ð
 ˆõ ‰WŒWˆØ"ð 	7ð 	7ˆFØÐ,Ð,Ð,Ø—	’	Ð-¨fÔ5Ñ6Ô6Ð6øÝ�"‰gŒg˜ŠkˆkØ—6’6‘8”8ˆDØ+Ð+¨DÑ1Ô1ˆLØð A °^Ð!CÐ!CØ/3�˜|Ñ,Ø œJð Að A�DÝ˜4‘y”y 1’}�}¨$Ð2EÐ*EÐ*EÈDÐXfÐLfÐLfØŸšÐ&9¸$Ô&?Ñ@Ô@Ð@øõ �"‰gŒg˜Škˆkð ˆØÐØ”JÔ$Ô)ð 		'ð 		'ˆDØ+Ð+¨DÑ1Ô1ˆLØ&×*Ò*¨<Ñ8Ô8ˆIð ð '˜YÔ.°$´,Ò>Ð>À9ÐPTÒCTÐCTØ×$Ò$ TÑ*Ô*Ð*Ð*à! QÑ&Ð!Ð!ð ð 	Œð 	Œ
Ô×#Ò# FÑ+Ô+Ð+ØŒ
ÔÔ×$Ò$ ]Ñ3Ô3Ð3ð ÐØÐØœ*Ô*Ô1ð 4ð 4�Ø”; gÐ-Ð-Ø$×+Ò+¨FÑ3Ô3Ð3øØ*ð 7ð 7�Ø”
Ô Ô'×.Ò.¨vÑ6Ô6Ð6Ð6ð ˆØ$ð 	4Ø"&×":Ò":Ñ"<Ô"<ÐØrÐrÐrÐr°$´*Ô2BÔ2HÐrÑrÔrˆOØ'ð 4ð 4�Ø”
Ô Ô&×-Ò-¨dÑ3Ô3Ð3Ð3àð 	:Ð.ð 	:Ð2CÀaÒ2GÐ2GØˆGØð AØ—’¥# oÑ"6Ô"6Ð?Ð?Ð?Ñ@Ô@Ð@Øð CØ—’¥#Ð&6Ñ"7Ô"7ÐAÐAÐAÑBÔBÐBØ  1Ò$Ð$Ø—’Ð"3Ð;Ð;Ð;Ñ<Ô<Ð<Ý�KŠK˜ d§i¢i°Ñ&8Ô&8Ñ9Ô9Ð9à×ÒÑÔÐÐÐr   c                ó  — | j         j        }t          ¦   «         }|j        D ]Z}|j        dv r*|                      |¦  «        }|                     |¦  «         |j        dk    r|                     |j        ¦  «         Œ[|rt           	                    d|› �¦  «         g }|rG|j        D ] }|j
        |vr|                     |¦  «         Œ!|D ]}|j                             |¦  «         Œd„ |D ¦   «         }	t           	                    dt          |¦  «        › d|	› �¦  «         g }
g }|j        D ]U}|j
        |vr0|                      |j
        ¦  «        s|
                     |¦  «         Œ;|                     |j
        ¦  «         ŒV|
D ]}|j                             |¦  «         Œd„ |
D ¦   «         }	t           	                    dt          |
¦  «        › d|	› �¦  «         |rt           	                    d	|› �¦  «         |                      ¦   «          d S )
N)rs  rt  rr  r×   zremaining input names: c                ó   — g | ]	}|j         ‘Œ
S r'  ri  ©r(  r8   s     r   rj  z*OnnxModel.update_graph.<locals>.<listcomp>K  s   € ÐDÐDÐD¨%˜5œ:ÐDÐDÐDr   zremove z unused inputs: c                ó   — g | ]	}|j         ‘Œ
S r'  ri  )r(  r{   s     r   rj  z*OnnxModel.update_graph.<locals>.<listcomp>Y  s   € ÐQÐQÐQ°˜;Ô+ÐQÐQÐQr   z unused initializers: zremaining initializers:)r   r6   r  r7   r’   r\  r2   r8   rk   r    rW   r9   rj   re   r{   rL  rX  )r   Úverbosery  r6   Úremaining_input_namesr7   Úsubgraph_inputs_of_nodeÚinputs_to_remover8   Únames_to_removeÚweights_to_removeÚweights_to_keepr{   s                r   rx  zOnnxModel.update_graph3  sn  € Ø”
Ô ˆå #¡¤ÐØ”Jð 	9ð 	9ˆDØŒ|Ð5Ð5Ð5à*.×*KÒ*KÈDÑ*QÔ*QÐ'Ø%×,Ò,Ð-DÑEÔEÐEàŒ|˜zÒ)Ð)Ø%×,Ò,¨T¬ZÑ8Ô8Ð8øØð 	LÝ�LŠLÐJÐ3HÐJÐJÑKÔKÐKð ÐØ$ð 	*Øœð 3ð 3�Ø”:Ð%:Ð:Ð:Ø$×+Ò+¨EÑ2Ô2Ð2øØ)ð *ð *�Ø”×"Ò" 5Ñ)Ô)Ð)Ð)àDÐDÐ3CÐDÑDÔDˆÝ�ŠÐW�sÐ#3Ñ4Ô4ÐWÐWÀoÐWÐWÑXÔXÐXð ÐØˆØ Ô,ð 	9ð 	9ˆKØÔÐ'<Ð<Ð<ÀT×E[ÒE[Ð\gÔ\lÑEmÔEmÐ<Ø!×(Ò(¨Ñ5Ô5Ð5Ð5à×&Ò& {Ô'7Ñ8Ô8Ð8Ð8Ø,ð 	2ð 	2ˆKØÔ×$Ò$ [Ñ1Ô1Ð1Ð1àQÐQÐ?PÐQÑQÔQˆÝ�ŠÐ^�sÐ#4Ñ5Ô5Ð^Ð^È_Ð^Ð^Ñ_Ô_Ð_Øð 	FÝ�LŠLÐD°?ÐDÐDÑEÔEÐEà×#Ò#Ñ%Ô%Ð%Ð%Ð%r   c                ó–   — |D ]E}|j         D ];}||v rŒ||v r0||         D ]'}||vr!t                               d||¦  «            dS Œ(Œ<ŒFdS )Nz<it is not safe to remove nodes since output %s is used by %sFT)r?   rk   r    )r   ro   rz  r;   r@   Únode_to_remover�  Úimpacted_nodes           r   Úis_safe_to_fuse_nodeszOnnxModel.is_safe_to_fuse_nodes`  s�   € Ø-ð 	)ð 	)ˆNØ$2Ô$9ð )ð )Ð Ø# |Ð3Ð3Øà#Ð':Ð:Ð:Ø)<Ð=MÔ)Nð )ð )˜Ø(°Ð?Ð?Ý"ŸLšLØ ^Ø 0Ø -ñô ð ð
 $) 5 5 5 5ð @øð)ð ˆtr   c                ó   — t          ¦   «         }t          ¦   «         }g }d„ | j        D ¦   «         }d„ | j        D ¦   «         }||z   }|r|                     ¦   «          |D ]}|                     |¦  «         Œd}	|s| j        nt          | j        d„ ¬¦  «        }
d }t          |¦  «        t          |
¦  «        k    �r8t          |¦  «        |	k    r�n#t          |¦  «        }	t          |
¦  «        D ]ã\  }}||v rŒ
t          d„ |j        D ¦   «         ¦  «        }|dk    rL| 
                    |¦  «         |                     |¦  «         |j        D ]}|r|                     |¦  «         ŒŒzd}|j        D ]}|r||vr	d	}|j        }Œ|sL| 
                    |¦  «         |                     |¦  «         |j        D ]}|r|                     |¦  «         ŒŒãŒät          |¦  «        t          |
¦  «        k    �°8t          |¦  «        t          | j        ¦  «        k    r7t          d
t          |¦  «        › dt          | j        ¦  «        › d|› �¦  «        ‚|                      d¦  «         | j                             |¦  «         d S )Nc                ó   — g | ]	}|j         ‘Œ
S r'  ri  )r(  Úinits     r   rj  z4OnnxModel.graph_topological_sort.<locals>.<listcomp>w  s   € ÐEÐEÐE¨4˜TœYÐEÐEÐEr   c                ó   — g | ]	}|j         ‘Œ
S r'  ri  r†  s     r   rj  z4OnnxModel.graph_topological_sort.<locals>.<listcomp>x  s   € ÐAÐAÐA¨E˜UœZÐAÐAÐAr   r¬   c                ó   — | j         S r   ri  )Úxs    r   ra  z2OnnxModel.graph_topological_sort.<locals>.<lambda>‚  s
   € Ð_`Ô_e€ r   ©r)  c              3  ó   K  — | ]}|¯d V — Œ	dS )r«   Nr'  )r(  r@  s     r   ú	<genexpr>z3OnnxModel.graph_topological_sort.<locals>.<genexpr>Œ  s'   è è € Ð!=Ð!=¨¸1Ð!= !Ð!=Ð!=Ð!=Ð!=Ð!=Ð!=r   r   FTz)Graph is not a DAG: len(sorted_node_set)=z, len(graph.node)=z, failed at node r7   )r  r{   r8   ÚsortÚaddr7   Úsortedre   rd   Úsumr9   r?   rW   ÚRuntimeErrorr7  rr   )r6   Úis_deterministicÚdeps_setÚsorted_node_setÚsorted_nodesÚinitializer_namesr  rX   r=   Úsorted_node_set_lenÚgraph_nodesÚlast_node_nameÚnode_idxr7   Úinput_countr?   Úfaileds                    r   Úgraph_topological_sortz OnnxModel.graph_topological_sortq  s	  € å‘5”5ˆÝ™%œ%ˆØˆàEÐE°5Ô3DÐEÑEÔEÐØAÐA°U´[ÐAÑAÔAÐØ'Ð*;Ñ;ˆàð 	Ø×ÒÑÔÐà%ð 	%ð 	%ˆJØ�LŠL˜Ñ$Ô$Ð$Ð$à ÐØ(8Ðf�e”j�j½fÀUÄZÐUeÐUeÐ>fÑ>fÔ>fˆàˆÝ�/Ñ"Ô"¥c¨+Ñ&6Ô&6Ò6Ñ6Ý�?Ñ#Ô#Ð':Ò:Ð:ÙÝ"% oÑ"6Ô"6ÐÝ"+¨KÑ"8Ô"8ð ð ‘�˜$Ø˜Ð.Ð.ØÝ!Ð!=Ð!=¨T¬ZÐ!=Ñ!=Ô!=Ñ=Ô=�Ø !Ò#Ð#Ø ×'Ò'¨Ñ-Ô-Ð-Ø#×'Ò'¨Ñ1Ô1Ð1Ø"&¤+ð 1ð 1˜Ø!ð 1Ø$ŸLšL¨Ñ0Ô0Ð0øØØ�Ø"&¤*ð 3ð 3�JØ!ð 3 j¸Ð&@Ð&@Ø!%˜Ø)-¬˜øØð Ø ×'Ò'¨Ñ-Ô-Ð-Ø#×'Ò'¨Ñ1Ô1Ð1Ø"&¤+ð 1ð 1˜Ø!ð 1Ø$ŸLšL¨Ñ0Ô0Ð0øð1ð õ7 �/Ñ"Ô"¥c¨+Ñ&6Ô&6Ò6Ñ6õ: ˆÑÔ¥3 u¤z¡?¤?Ò2Ð2Ýð W½CÀÑ<PÔ<Pð  Wð  WÕdgÐhmÔhrÑdsÔdsð  Wð  Wð  GUð  Wð  Wñô ð ð 	×Ò˜Ñ Ô Ð ØŒ
×Ò˜,Ñ'Ô'Ð'Ð'Ð'r   c                óø   — 	 t                                | j        j        |¦  «         d S # t          $ rF}|r=t
                               d¦  «         t                                | j        ddd¬¦  «         |‚d }~ww xY w)NzaFailed to sort graph in topological order. Dumping model to _topo_sort_failed.onnx for debugging.z_topo_sort_failed.onnxT)Úsave_as_external_dataÚall_tensors_to_one_file)r   r¬  r   r6   r   rk   r  Úsave)r   r¡  Údump_model_on_failureÚes       r   Útopological_sortzOnnxModel.topological_sortª  s›   € ð
	Ý×,Ò,¨T¬ZÔ-=Ð?OÑPÔPÐPÐPÐPøÝð 	ð 	ð 	Ø$ð Ý—’Øwñô ð õ —’Ø”JÐ 8ÐPTÐnrð ñ ô ð ð ˆGøøøøð	øøøs   ‚%) ©
A9³AA4Á4A9é   c           	     óv  — t          |¦  «        j                             dd¬¦  «         d„ | j        D ¦   «         }d„ | j        j        D ¦   «         }|r)|s'| j                             ¦   «         }d|_        d|_        |�r*t          |¦  «        j        }	|	                     dd¬¦  «         |dz   }
|rt          |
¦  «        j	        nd }t          j                             |¦  «        r1t                               d|› �¦  «         t          j        |¦  «         |rQt          j                             |
¦  «        r1t                               d	|
› �¦  «         t          j        |
¦  «         n't          j        |	¦  «        rt#          d
|	› d�¦  «        ‚t%          | |d||||¬¦  «         d S t%          | |¦  «         d S )NT)r™   Úexist_okc                ó(   — g | ]}|j         d k    ¯|‘ŒS ©úcom.microsoft©Údomain)r(  Úopsets     r   rj  z"OnnxModel.save.<locals>.<listcomp>Æ  s$   € Ð]Ð]Ð]˜e¸U¼\È_Ò=\Ð=\�EÐ=\Ð=\Ð=\r   c                ó(   — g | ]}|j         d k    ¯|‘ŒS r¸  rº  ©r(  r7   s     r   rj  z"OnnxModel.save.<locals>.<listcomp>É  s$   € ÐWÐWÐW˜D¸¼ÀÒ8VÐ8V�4Ð8VÐ8VÐ8Vr   r«   r¹  z.datazDelete the existing onnx file: z(Delete the existing external data file: zOutput directory (z!) for external data is not empty.)r®  r¯  ÚlocationÚsize_thresholdÚconvert_attribute)r   r£   ÚmkdirÚopset_importr6   r7   r�  Úversionr»  rW   Úosr°   Úexistsrk   r  rj   Úlistdirr   r   )r   Úoutput_pathr®  r¯  rÀ  rÁ  Úms_opsetÚms_noder¼  Ú
output_dirÚexternal_data_pathr¿  s               r   r°  zOnnxModel.saveº  sï  € õ 	ˆ[ÑÔÔ ×&Ò&¨t¸dÐ&ÑCÔCÐCð ^Ð] uÔ'9Ð]Ñ]Ô]ˆð XÐW E¤KÔ$4ÐWÑWÔWˆØð 	+˜8ð 	+ØÔ&×*Ò*Ñ,Ô,ˆEØˆEŒMØ*ˆEŒLà ñ 	+å˜kÑ*Ô*Ô1ˆJØ×Ò T°DÐÑ9Ô9Ð9Ø!,¨wÑ!6ÐØ8OÐY•tÐ.Ñ/Ô/Ô4Ð4ÐUYˆHåŒw�~Š~˜kÑ*Ô*ð 'Ý—’ÐK¸kÐKÐKÑLÔLÐLÝ”	˜+Ñ&Ô&Ð&à&ð kÝ”7—>’>Ð"4Ñ5Ô5ð 2å—K’KÐ _ÐK]Ð _Ð _Ñ`Ô`Ð`Ý”IÐ0Ñ1Ô1Ð1øå”:˜jÑ)Ô)ð kÝ&Ð'i¸JÐ'iÐ'iÐ'iÑjÔjÐjåØØØ&*Ø(?Ø!Ø-Ø"3ðñ ô ð ð ð õ �u˜kÑ*Ô*Ð*Ð*Ð*r   c                óä   — t                                d¦  «         |                      ¦   «          t                               | j        |||||¦  «         t                                d|› �¦  «         d S )Nz Sort graphs in topological orderzModel saved to )rk   r  r³  r   r°  r   )r   rÈ  Úuse_external_data_formatr¯  rÀ  rÁ  s         r   Úsave_model_to_filezOnnxModel.save_model_to_fileï  sx   € õ 	�ŠÐ6Ñ7Ô7Ð7Ø×ÒÑÔÐõ 	�ŠØŒJØØ$Ø#ØØñ	
ô 	
ð 	
õ 	�ŠÐ3 kÐ3Ð3Ñ4Ô4Ð4Ð4Ð4r   c                ó�   — g }| j         j        j        D ]1}|                      |j        ¦  «        €|                     |¦  «         Œ2|S )z[
        Returns real graph inputs (excluding initializers from older onnx model).
        )r   r6   r8   r�   rW   r9   )r   rP  r8   s      r   Ú'get_graph_inputs_excluding_initializersz1OnnxModel.get_graph_inputs_excluding_initializers  sQ   € ð ˆØ”ZÔ%Ô+ð 	+ð 	+ˆEØ×#Ò# E¤JÑ/Ô/Ð7Ø×#Ò# EÑ*Ô*Ð*øØÐr   c                ób   — | j         j        D ]}|j        dv r	|j        c S Œt	          d¦  «        ‚)zÁGet opset version of onnx domain

        Raises:
            RuntimeError: ONNX model has no opset for default domain.

        Returns:
            int: opset version of onnx domain.
        )Ú zai.onnxz*ONNX model has no opset for default domain)r   rÃ  r»  rÄ  r   )r   r¼  s     r   Úget_opset_versionzOnnxModel.get_opset_version  sG   € ð ”ZÔ,ð 	%ð 	%ˆEØŒ|˜Ð.Ð.Ø”}Ð$Ð$Ð$ð /åÐGÑHÔHÐHr   c                ó  — i }|                       ¦   «         D ]3}|r|j        r
|j        dz   nd|j        z   }||vrdn
||         dz   ||<   Œ4t                               dt          |                     ¦   «         d„ ¬¦  «        › �¦  «         |S )z2
        Returns node count of operators.
        ú:rÓ  r«   z
Operators:c                ó$   — | d          | d         fS )Nr«   r   r'  )Úkvs    r   ra  z3OnnxModel.get_operator_statistics.<locals>.<lambda>*  s   € È2ÈaÌ5È&ÐRTÐUVÔRWÈ€ r   r™  )r5   r»  r’   rk   r  rž  Úitems)r   Úinclude_domainÚop_countr7   Úops        r   Úget_operator_statisticsz!OnnxModel.get_operator_statistics   s§   € ð ˆØ—J’J‘L”Lð 	Kð 	KˆDØ'5ÐM¸$¼+ÐM�$”+ Ñ#Ð#È2ÐQUÔQ]Ñ]ˆBØ "¨(Ð 2Ð 2˜1˜1¸À"¼ÈÑ9IˆH�R‰LˆLõ 	�ŠÐ[¥¨¯ªÑ(8Ô(8Ð>XÐ>XÐ!YÑ!YÔ!YÐ[Ð[Ñ\Ô\Ð\àˆr   rÓ  r|   r   Úbase_dirÚreturnrÌ   c                óX  — |                       d¦  «        rt          d¦  «        ‚| j        t          j        k    rt          d¦  «        ‚| j        }t          j        |¦  «        }| j        t          j        k    r6t          | |¦  «        }t          t          d„ |D ¦   «         ¦  «        ¦  «        S t          | ¦  «        rt          | |¦  «         |                       d¦  «        rt          | j        ¦  «        S t          j        | ¦  «        }t          |                     ¦   «         ¦  «        S )a  Converts a tensor def object to a hash for data comparison purposes.
        Args:
            tensor: a TensorProto object.
            base_dir: if external tensor exists, base_dir can help to find the path to it
        Returns:
            hash: a hash of the data.
        Úsegmentz*Currently not supporting loading segments.z4The element type in the input tensor is not defined.c              3  ó@   K  — | ]}|                      d ¦  «        V — ŒdS )zutf-8N)Údecode)r(  Úss     r   r›  z)OnnxModel.to_data_hash.<locals>.<genexpr>@  s.   è è € ÐFÐF°A˜aŸhšh wÑ/Ô/ÐFÐFÐFÐFÐFÐFr   Úraw_data)rø   rD  r  r   r5  Ú	TypeErrorr   Útensor_dtype_to_fieldÚSTRINGÚgetattrÚhashr­   r   r   rå  r   rÙ   Útobytes)r|   rÞ  Útensor_dtypeÚstorage_fieldÚutf8_stringsÚnp_datas         r   Úto_data_hashzOnnxModel.to_data_hash.  s  € ð �?Š?˜9Ñ%Ô%ð 	KÝÐIÑJÔJÐJØÔ�{Ô4Ò4Ð4ÝÐRÑSÔSÐSØÔ'ˆÝÔ4°\ÑBÔBˆàÔ�{Ô1Ò1Ð1Ý" 6¨=Ñ9Ô9ˆLÝ�ÐFÐF¸ÐFÑFÔFÑFÔFÑGÔGÐGå˜fÑ%Ô%ð 	<Ý)¨&°(Ñ;Ô;Ð;Ø�?Š?˜:Ñ&Ô&ð 	+Ý˜œÑ(Ô(Ð(å"Ô+¨FÑ3Ô3ˆGÝ˜ŸšÑ)Ô)Ñ*Ô*Ð*r   çñhãˆµøä>ç:Œ0âŽyE>Útensor1Útensor2Úsignature_cache1údict | NoneÚsignature_cache2ÚrtolÚfloatÚatolr  c                óô  — |r| j         |v r|| j                  nt                               | ¦  «        }|r|j         |v r||j                  nt                               |¦  «        }|�
||| j         <   |�
|||j         <   | j        |j        k    rk| j        |j        k    r[t          j        | ¦  «        }t          j        |¦  «        }	||k    r||	k                         ¦   «         S ddlm	}
  |
||	||¬¦  «        S dS )aà  Returns True when two tensors have same value.
           Note that name can be different.

        Args:
            tensor1 (TensorProto): initializer 1
            tensor2 (TensorProto): initializer 2
            signature_cache1 (dict): Optional dictionary to store data signatures of tensor1 in order to speed up comparison.
            signature_cache2 (dict): Optional dictionary to store data signatures of tensor2 in order to speed up comparison.
            rtol (float): Optional relative difference threshold for minor precision differences
            atol (float): Optional absolute difference threshold for minor precision differences
        Returns:
            bool: True when two initializers has same value.
        Nr   )Úallclose)rø  rú  F)
rW   r   rð  r  r  r   rÙ   ÚallÚnumpyrü  )ró  rô  rõ  r÷  rø  rú  Úsig1Úsig2Ún1Ún2rü  s              r   Úhas_same_valuezOnnxModel.has_same_valueJ  s2  € ð0  ð1Ø$+¤LÐ4DÐ$DÐ$Dð ˜Wœ\Ô*Ð*å×'Ò'¨Ñ0Ô0ð 	ð  ð1Ø$+¤LÐ4DÐ$DÐ$Dð ˜Wœ\Ô*Ð*å×'Ò'¨Ñ0Ô0ð 	ð
 Ð'Ø-1Ð˜Wœ\Ñ*ØÐ'Ø-1Ð˜Wœ\Ñ*ØÔ Ô 1Ò1Ð1°g´lÀgÄlÒ6RÐ6RÝÔ& wÑ/Ô/ˆBÝÔ& wÑ/Ô/ˆBØ�tŠ|ˆ|à˜bš—~’~Ñ'Ô'Ð'ð +Ð*Ð*Ð*Ð*Ð*à�x  B¨T¸Ð=Ñ=Ô=Ð=àˆur   c                ó¶   — |                       ¦   «         D ](}||j        v r|j                             |¦  «          d S Œ)t                               d|¦  «         d S )NzFailed to remove initializer %s)rG   r{   rj   rk   rl   )r   r|   r6   s      r   Úremove_initializerzOnnxModel.remove_initializer|  sg   € Ø—[’[‘]”]ð 	ð 	ˆEØ˜Ô*Ð*Ð*ØÔ!×(Ò(¨Ñ0Ô0Ð0Ø��ð +õ 	�ŠÐ8¸&ÑAÔAÐAÐAÐAr   Úcachec                ó  — t          |                      ¦   «         ¦  «        dk    rt                               d¦  «         t          | j        j        j        ¦  «        }dg|z  }t          |dz
  ¦  «        D ]q}||         dk    rŒt          |dz   |¦  «        D ]N}t           	                    | j        j        j        |         | j        j        j        |         ||¦  «        r|||<   ŒOŒrd}t          |¦  «        D ]c}||         dk    rU|dz  }|  
                    | j        j        j        |         j        | j        j        j        ||                  j        ¦  «         Œd|dk    r)|                      ¦   «          t          d|› d�¦  «         dS dS )a;  Remove initializers with duplicated values, and only keep the first one.
        It could help reduce size of models (like ALBert) with shared weights.
        If require_raw_data passed, method will only compare raw_data initializers to speed runtime
        Note: this function does not process subgraph.
        r«   z9remove_duplicated_initializer does not process subgraphs.r¬   r   zRemoved z# initializers with duplicated valueN)re   rG   rk   rl   r   r6   r{   r‚   r   r  rˆ   rW   rx  r.   )r   r  Úinitializer_countÚsamerœ   r…   Úcounts          r   Úremove_duplicated_initializerz'OnnxModel.remove_duplicated_initializerƒ  s«  € õ ˆt�{Š{‰}Œ}ÑÔ Ò!Ð!Ý�NŠNÐVÑWÔWÐWå ¤
Ô 0Ô <Ñ=Ô=ÐàˆtÐ'Ñ'ˆÝÐ(¨1Ñ,Ñ-Ô-ð 
	 ð 
	 ˆAØ�AŒw˜!Š|ˆ|ØÝ˜1˜q™5Ð"3Ñ4Ô4ð  ð  �Ý×+Ò+Ø”JÔ$Ô0°Ô3Ø”JÔ$Ô0°Ô3ØØñ	ô ð  ð  �D˜‘Gøð ð ˆÝÐ(Ñ)Ô)ð 	ð 	ˆAØ�AŒw˜!Š|ˆ|Ø˜‘
�Ø×/Ò/Ø”JÔ$Ô0°Ô3Ô8Ø”JÔ$Ô0°°a´Ô9Ô>ñô ð øð
 �1Š9ˆ9Ø×ÒÑÔÐÝÐG˜UÐGÐGÐGÑHÔHÐHÐHÐHð ˆ9r   rF  c                ó^  — t          |                      ¦   «         ¦  «        dk    rt                               d¦  «         d„ | j        j        j        D ¦   «         d„ | j        j        j        D ¦   «         z   dgz   }| j        j        j        D ]&}|j	        |vr||j	        z   |vr||j	        z   |_	        Œ'| j        j        j
        D ]¼}t          t          |j        ¦  «        ¦  «        D ];}|j        |         |vr*||j        |         z   |vr||j        |         z   |j        |<   Œ<t          t          |j        ¦  «        ¦  «        D ];}|j        |         |vr*||j        |         z   |vr||j        |         z   |j        |<   Œ<Œ½| j        j        j        D ]}|j	        |vr||j	        z   |_	        ŒdS )zýAdd prefix to initializer or intermediate outputs in graph. Main graph inputs and outputs are excluded.
        It could help avoid conflicting in name of node_args when merging two graphs.
        Note: this function does not process subgraph.
        r«   z/add_prefix_to_names does not process subgraphs.c                ó   — g | ]	}|j         ‘Œ
S r'  ri  )r(  rœ   s     r   rj  z1OnnxModel.add_prefix_to_names.<locals>.<listcomp>²  s   € Ð;Ð;Ð;˜q�A”FÐ;Ð;Ð;r   c                ó   — g | ]	}|j         ‘Œ
S r'  ri  rm  s     r   rj  z1OnnxModel.add_prefix_to_names.<locals>.<listcomp>²  s   € Ð>gÐ>gÐ>gÈ!¸q¼vÐ>gÐ>gÐ>gr   rÓ  N)re   rG   rk   rl   r   r6   r8   r?   r{   rW   r7   r‚   r  )r   rF  Úexcludedr{   r7   r…   r  s          r   Úadd_prefix_to_nameszOnnxModel.add_prefix_to_names¨  sÝ  € õ
 ˆt�{Š{‰}Œ}ÑÔ Ò!Ð!Ý�NŠNÐLÑMÔMÐMð <Ð; D¤JÔ$4Ô$:Ð;Ñ;Ô;Ð>gÐ>gÈtÌzÔO_ÔOfÐ>gÑ>gÔ>gÑgÐkmÐjnÑnˆàœ:Ô+Ô7ð 	Að 	AˆKØÔ xÐ/Ð/Ø˜KÔ,Ñ,°HÐ<Ð<Ø'-°Ô0@Ñ'@�KÔ$øà”JÔ$Ô)ð 	Að 	AˆDå�3˜tœz™?œ?Ñ+Ô+ð ?ð ?�Ø”:˜a”=¨Ð0Ð0Ø ¤
¨1¤Ñ-°XÐ=Ð=Ø(.°´¸A´Ñ(>˜œ
 1™øõ �3˜tœ{Ñ+Ô+Ñ,Ô,ð Að A�Ø”;˜q”>¨Ð1Ð1Ø ¤¨A¤Ñ.°hÐ>Ð>Ø)/°$´+¸a´.Ñ)@˜œ A™øðAð
 œ*Ô*Ô5ð 	;ð 	;ˆJØŒ hÐ.Ð.Ø"(¨:¬?Ñ":�
”øð	;ð 	;r   c                óD   — | j         j                             d¦  «         d S )Nr  )r   r6   r7  r)   s    r   Úclean_shape_inferzOnnxModel.clean_shape_inferÊ  s!   € ØŒ
Ô×#Ò# LÑ1Ô1Ð1Ð1Ð1r   c                ó"  — g }|                      | j        j        ¦  «         |�rêg }|D �]ß}t          |t          ¦  «        sŒt          j        |j        |j        |j	        ¦  «        D ]l}|j
        j        j        t          j        k    r  dS |j
                             d¦  «        r-|j
        j        j        j        j        t          j        k    r  dS Œm|j        D ]}|j        t          j        k    r  dS Œ|j        D �]}|j        dk    r/|j        D ]'}|j        dk    r|j        t          j        k    r   dS Œ(|j        D ]Ã}|j
        t0          j        k    r|                      |j        ¦  «         |j        D ]}|                      |¦  «         Œt          |j        t          ¦  «        r|j        j        t          j        k    r   dS |j        D ]2}t          |t          ¦  «        r|j        t          j        k    r    dS Œ3ŒÄ�Œ
�Œá|}|�°êdS )z$Check whether the model uses float16TÚsequence_typer  ÚtoF)r9   r   r6   rQ   r   r   r  r8   r?   r  rN   rù   r  r   ÚFLOAT16rø   r  r{   r  r7   r’   rM   rW   rœ   r
   rP   rR   rG   rÚ   Útensors)	r   ÚqueueÚ
sub_graphsr6   ÚvrÚ   r7   rU   rR   s	            r   Úuse_float16zOnnxModel.use_float16Í  sR  € àˆØ�Š�T”ZÔ%Ñ&Ô&Ð&Øñ %	ØˆJØð !,ñ !,�Ý! %­Ñ4Ô4ð Øå"œ¨¬°e´lÀEÔDTÑUÔUð (ð (�AØ”vÔ)Ô3µ{Ô7JÒJÐJØ#˜t˜t˜tØ”v—’ Ñ7Ô7ð (Øœ6Ô/Ô9ÔEÔOÕS^ÔSfÒfÐfØ#' 4 4 4øàÔ*ð $ð $�AØ”{¥kÔ&9Ò9Ð9Ø#˜t˜t˜tð :ð "œJð ,ñ ,�DØ”| vÒ-Ð-Ø$(¤Nð ,ð ,˜DØ#œy¨DÒ0Ð0°T´V½{Ô?RÒ5RÐ5RØ'+ t t t tøà $¤ð ,ð ,˜Øœ9­Ô(<Ò<Ð<Ø&×-Ò-¨d¬fÑ5Ô5Ð5à!%¤ð 1ð 1˜AØ&×-Ò-¨aÑ0Ô0Ð0Ð0å% d¤f­kÑ:Ô:ð (¸t¼vÔ?OÕS^ÔSfÒ?fÐ?fØ#' 4 4 4 4à!%¤ð ,ð ,˜AÝ)¨!­[Ñ9Ô9ð ,¸a¼kÍ[ÔM`Ò>`Ð>`Ø'+ t t t t tøð,ñ,ñ,ð( ˆEðK ñ %	ðN ˆur   Úgraph_inputr   Únew_typec                ó   — t          |t          ¦  «        sJ ‚|                      |j        ¦  «        sJ ‚|j        j        j        t          |¦  «        k    rdg fS |                      ¦   «         }d}g }|  	                    ¦   «         }|j        |v �rž||j                 }d„ |D ¦   «         }|rÔ|  
                    d¦  «        }	|	dz   |j        z   }
|j                             ¦   «         }|                     |¦  «         |
|_        t          j        d|j        g|
gt          |j        j        j        ¦  «        |	¬¦  «        }|j                             |g¦  «         |D ]#}t$                               ||j        |
¦  «         Œ$d„ |D ¦   «         }|D ]‰}t$                               |d¦  «        t          |¦  «        k    r&|                      |j        d         |j        ¦  «         |                      |j        d         ¦  «        s|                     |¦  «         ŒŠ|r|                      |¦  «         t          |¦  «        |j        j        _        ||fS )	aq  Change graph input type, and add Cast node if needed.

        Args:
            graph_input (ValueInfoProto): input of the graph
            new_type (int): new data type like TensorProto.INT32.

        Returns:
            NodeProto: a new Cast node that added. None if Cast node is not added.
            List[NodeProto]: Cast nodes that have been removed.
        Nc                ó(   — g | ]}|j         d k    ¯|‘ŒS ©r  r_  r¾  s     r   rj  z5OnnxModel.change_graph_input_type.<locals>.<listcomp>  s$   € ÐOÐOÐO t¸¼ÈÒ8NÐ8N˜dÐ8NÐ8NÐ8Nr   r  r@  ©r  rW   c                ó(   — g | ]}|j         d k    ¯|‘ŒS r   r_  r¾  s     r   rj  z5OnnxModel.change_graph_input_type.<locals>.<listcomp>-  s$   € ÐKÐKÐK 4°D´LÀFÒ4JÐ4J˜$Ð4JÐ4JÐ4Jr   r  r   )rQ   r   rJ  rW   rN   rù   r  rÌ   r6   r;   rH  r  r�  r6  r   Ú	make_noder7   rr   r   r†   r  rˆ   r?   rL  r9   rp   )r   r  r  r6   Únew_cast_nodero   r;   r5   Únodes_not_castÚ	node_namerA   Únew_value_infor7   Ú
nodes_casts                 r   Úchange_graph_input_typez!OnnxModel.change_graph_input_typeú  sk  € õ ˜+¥~Ñ6Ô6Ð6Ð6Ð6Ø×$Ò$ [Ô%5Ñ6Ô6Ð6Ð6Ð6àÔÔ'Ô1µS¸±]´]ÒBÐBØ˜�8ˆOà—
’
‘”ˆØˆØˆà"×6Ò6Ñ8Ô8ÐØÔÐ2Ð2Ñ2Ø'¨Ô(8Ô9ˆEð PÐO¨uÐOÑOÔOˆNØð VØ ×1Ò1°&Ñ9Ô9�	Ø'¨#™o°Ô0@Ñ@�Ø!&Ô!1×!5Ò!5Ñ!7Ô!7�Ø×'Ò'¨Ñ4Ô4Ð4Ø&1�Ô#Ý &Ô 0ØØ Ô%Ð&Ø �MÝ˜;Ô+Ô7ÔAÑBÔBØ"ð!ñ !ô !�ð ”
×!Ò! = /Ñ2Ô2Ð2à*ð Vð V�DÝ×0Ò0°°{Ô7GÈÑUÔUÐUÐUð LÐK¨5ÐKÑKÔKˆJØ"ð 1ð 1�Ý×/Ò/°°dÑ;Ô;½sÀ8¹}¼}ÒLÐLØ×3Ò3°D´KÀ´NÀKÔDTÑUÔUÐUØ×-Ò-¨d¬k¸!¬nÑ=Ô=ð 1Ø#×*Ò*¨4Ñ0Ô0Ð0øØð 3Ø×!Ò! /Ñ2Ô2Ð2å14°X±´ˆÔÔ$Ô.Ø˜oÐ-Ð-r   Úgraph_outputc                ó�  — t          |t          ¦  «        sJ ‚|                      |j        ¦  «        sJ ‚|j        j        j        t          |¦  «        k    rdS d}|                      ¦   «         }|  	                    d¦  «        }|dz   |j        z   }|  
                    |j        |¦  «         |j                             ¦   «         }|                     |¦  «         ||_        t          j        d|g|j        gt          |¦  «        |¬¦  «        }|j                             |g¦  «         t          |¦  «        |j        j        _        |S )a!  Change graph input type, and add Cast node if needed.

        Args:
            graph_input (str | ValueInfoProto): output of the graph
            new_type (int): new data type.

        Returns:
            NodeProto: a new Cast node that added. None if Cast node is not added.
        Nr  r@  r!  )rQ   r   rL  rW   rN   rù   r  rÌ   r6   rH  rˆ   r  r�  r6  r   r#  r7   rr   )r   r*  r  Ú	cast_noder6   r&  r=   r'  s           r   Úchange_graph_output_typez"OnnxModel.change_graph_output_type9  s?  € õ ˜,­Ñ7Ô7Ð7Ð7Ð7Ø×%Ò% lÔ&7Ñ8Ô8Ð8Ð8Ð8àÔÔ(Ô2µc¸(±m´mÒCÐCØ�4àˆ	Ø—
’
‘”ˆð ×)Ò)¨&Ñ1Ô1ˆ	Ø ‘_ |Ô'8Ñ8ˆ
Ø×'Ò'¨Ô(9¸:ÑFÔFÐFØÔ)×-Ò-Ñ/Ô/ˆØ×Ò Ñ-Ô-Ð-Ø(ˆÔÝÔ$ØØˆLØÔÐÝ�8‰}Œ}Øð
ñ 
ô 
ˆ	ð 	Œ
×Ò˜9˜+Ñ&Ô&Ð&Ý25°h±-´-ˆÔÔ%Ô/ØÐr   Úold_nameÚnew_namec                ó@  — ||                       ¦   «         v rt          d¦  «        ‚|                      ¦   «         }|j        D ]\}|j        |k    rOt
                               d||¦  «         |                      ||¦  «         |                      ||¦  «         ||_        Œ]d S )Nz{new_name} exists in graphz!replace output name from %s to %s)	r@   r   r6   r?   rW   rk   r    rˆ   rŽ   )r   r.  r/  r6   r?   s        r   Úrename_graph_outputzOnnxModel.rename_graph_outputb  s¨   € Ø�t×/Ò/Ñ1Ô1Ð1Ð1ÝÐ;Ñ<Ô<Ð<à—
’
‘”ˆØ”lð 	'ð 	'ˆFØŒ{˜hÒ&Ð&Ý—’Ð@À(ÈHÑUÔUÐUØ×/Ò/°¸(ÑCÔCÐCØ×0Ò0°¸8ÑDÔDÐDØ&�”øð	'ð 	'r   )Fr   rŸ   )NNNr!   )rÈ   rÉ   )rß   )rW   r�   rý   rþ   )r7   r   r
  r�   )T)FF)FTr´  F)rÓ  )r|   r   rÞ  r�   rß  rÌ   )NNrñ  rò  )ró  r   rô  r   rõ  rö  r÷  rö  rø  rù  rú  rù  rß  r  )r  rö  )rF  r�   )r  r   r  rÌ   )r*  r   r  rÌ   )r.  r�   r/  r�   )UÚ__name__Ú
__module__Ú__qualname__r   r   r*   r3   r;   r@   rD   r5   r6   rG   rY   r\   r_   rb   rh   rm   rp   ru   ry   r}   r   Ústaticmethodr†   rˆ   rŒ   rŽ   r�   r“   r—   rš   r�   r¤   r©   r²   r·   r®   rÇ   rÒ   rÕ   rÜ   rÞ   rå   rë   rí   rò   rü   r  r	  r  r  r  r!  r	   rH  rJ  rL  rN  rR  r¦   rX  r\  rf  r  rx  r’  r¬  r³  r°  rÏ  rÑ  rÔ  rÝ  rð  r  r  r  r  r  r  r)  r-  r1  r'  r   r   r   r   #   s©  € € € € € ðð ð ð8ð 8ð 8ð(ð (ð (ð 8:À%ð ð ð ð ð 
#ð 
#ð 
#ð 
#ð#ð #ð #ð #ðð ð ðð ð ð ð  ð  ðð ð ð&ð ð ðð ð ðð ð ðð ð ðð ð ð9ð 9ð 9ð#ð #ð #ð0ð 0ð 0ð 0ð0ð 0ð 0ð 0ð/ð /ð /ð /ð(ð (ð (ð (ð ð/ð /ñ „\ð/ðOð Oð Oð ð1ð 1ñ „\ð1ðRð Rð Rðð ð ðð ð ðð ð ð ð"ð ð ð ð*ð *ð *ð *ð UWð ð ð ð ð6 Ø ØØð0ð 0ð 0ð 0ðdð ð ð
0ð 
0ð 
0ð   Ø Øð6ð 6ð 6ð 6ðpð ð ð ð& /3Ø Øð= ð = ð = ð = ð = ð~ð ð ð ð$ð ð ðð ð ðð ð ð ð
ð 
ð 
ðJð Jð Jð Jðð ð ð ð2
ð 
ð 
ðð ð ð ð ð2ð ð ð ð ð@ ðð ð ñ „\ððð ð ð& ð  ð  ðDfð fð fð fða)ð a)ð a)ð a)ðF!$ð !$ð !$ð !$ðFð ð ðð ð ðð ð ð ð,ð ð ð ð" ðð ñ „\ððPð Pð Pð%ð %ð %ð
5ð 
5ð 
5ðmð mð mð mð^+&ð +&ð +&ð +&ðZð ð ð" ð6(ð 6(ð 6(ñ „\ð6(ðpð ð ð ð  ð $Ø $ØØð2+ð 2+ð 2+ñ „\ð2+ðn "'Ø $ØØð5ð 5ð 5ð 5ð2ð ð ðIð Ið Iðð ð ð ð ð+ð +ð +ð +ñ „\ð+ð6 ð )-Ø(,ØØð/ð /ð /ð /ñ „\ð/ðbBð Bð Bð#Ið #Ið #Ið #IðJ ;ð  ;ð  ;ð  ;ðD2ð 2ð 2ð+ð +ð +ðZ=.ð =.ð =.ð =.ð~'ð 'ð 'ð 'ðR
'ð 
'ð 
'ð 
'ð 
'ð 
'r   r   )!Ú
__future__r   r   ÚloggingrÅ  r/   Úcollectionsr   Úpathlibr   Útypingr   r#   r   Úfloat16r	   Úonnxr
   r   r   r   r   r   r   r   r   Úonnx.external_data_helperr   r   Ú	getLoggerr2  rk   r   r'  r   r   ú<module>r?     sz  ðð
 #Ð "Ð "Ð "Ð "Ð "à Ð Ð Ð Ø €€€Ø 	€	€	€	Ø 
€
€
€
Ø Ð Ð Ð Ð Ð Ø Ð Ð Ð Ð Ð Ø  Ð  Ð  Ð  Ð  Ð  àð @Ø?Ð?Ð?Ð?Ð?Ð?à ,Ð ,Ð ,Ð ,Ð ,Ð ,ð
ð 
ð 
ð 
ð 
ð 
ð 
ð 
ð 
ð 
ð 
ð 
ð 
ð 
ð 
ð 
ð 
ð 
ð 
ð 
ð 
ð 
ð XÐ WÐ WÐ WÐ WÐ WÐ WÐ Wà	ˆÔ	˜8Ñ	$Ô	$€ðI'ð I'ð I'ð I'ð I'ñ I'ô I'ð I'ð I'ð I'r   