§
    kŠtjx]  ã                   ón   — d dl mZ d dlZd dlmZ d dlmZ d dl	m
Z
 ddlmZmZ d„ Z G d„ d¦  «        ZdS )	é    )ÚPathN)Ú
ModelProtoé   )Úattribute_to_kwargÚfind_by_namec                 óú  — t          ¦   «         }|                     d„ | j        D ¦   «         ¦  «         |                     d„ | j        D ¦   «         ¦  «         g }| j        D �]H}|}d„ |j        D ¦   «         }|�ri }|j        D ]æ}i }	|j        t          j        j        k    r7t          |j
        |¦  «        \  }
}|j        |
i}	|                     |¦  «         n||j        t          j        j        k    rSg }|j        D ]?}t          ||¦  «        \  }
}|                     |
¦  «         |                     |¦  «         Œ@|j        |i}	nt          |¦  «        }	|                     |	¦  «         Œçt!          j        |j        |j        |j        fd|j        i|¤Ž}|                     |¦  «         �ŒJ|                      d¦  «         | j                             |¦  «         |                     d„ | j        D ¦   «         ¦  «         g }| j        D ];}|j        |v r|                     |j        ¦  «         Œ&|                     |¦  «         Œ<d„ | j        D ¦   «         }|D ]}| j                             |¦  «         |j        |v rZ	 | j                             ||j                 ¦  «         ŒL# t2          $ r& |j        dk     rt7          d	|j        › d
�¦  «         Y Œ{w xY wŒ€|                     d„ | j        D ¦   «         ¦  «         | |fS )zÄClean unused initializers from graph.

    Returns:
        A cleaned graph without unused initializers
        A list of tensor names, which are not produced by this graph and its subgraphes
    c              3   ó2   K  — | ]}|j         D ]}|¯|V — Œ	Œd S ©N)Úinput)Ú.0ÚnodeÚ
input_names      úa/var/www/html/CA-Chatbot/venv/lib/python3.11/site-packages/onnxruntime/quantization/onnx_model.pyú	<genexpr>z-_clean_initializers_helper.<locals>.<genexpr>   s9   è è € Ð"pÐ"p°$ÐW[ÔWaÐ"pÐ"pÈÐeoÐ"p :Ð"pÐ"pÐ"pÐ"pÐ"pÐ"pÐ"pó    c              3   ó2   K  — | ]}|j         ¯	|j         V — Œd S r
   ©Úname)r   Úg_outs     r   r   z-_clean_initializers_helper.<locals>.<genexpr>   s+   è è € Ð"VÐ"V°%È5Ì:Ð"V 5¤:Ð"VÐ"VÐ"VÐ"VÐ"VÐ"Vr   c                 óz   — g | ]8}|j         t          j        j        k    s|j         t          j        j        k    ¯6|‘Œ9S © )ÚtypeÚonnxÚAttributeProtoÚGRAPHÚGRAPHS©r   Úattrs     r   ú
<listcomp>z._clean_initializers_helper.<locals>.<listcomp>   sG   € ð 
ð 
ð 
àØŒy�DÔ/Ô5Ò5Ð5¸¼ÅdÔFYÔF`Ò9`Ð9`ð à9`Ð9`Ð9`r   r   r   c              3   ó.   K  — | ]}|j         D ]}|V — ŒŒd S r
   )Úoutput)r   r   r!   s      r   r   z-_clean_initializers_helper.<locals>.<genexpr>@   s4   è è € Ð-fÐ-f¸ÐZ^ÔZeÐ-fÐ-fÐPV¨fÐ-fÐ-fÐ-fÐ-fÐ-fÐ-fÐ-fr   c                 ó   — i | ]
}|j         |“ŒS r   r   ©r   r   s     r   ú
<dictcomp>z._clean_initializers_helper.<locals>.<dictcomp>J   s   € Ð@Ð@Ð@¨5�U”Z Ð@Ð@Ð@r   é   zWarning: invalid weight name z' found in the graph (not a graph input)c              3   ó$   K  — | ]}|j         V — Œd S r
   r   r#   s     r   r   z-_clean_initializers_helper.<locals>.<genexpr>T   s$   è è € Ð-RÐ-R¸U¨e¬jÐ-RÐ-RÐ-RÐ-RÐ-RÐ-Rr   )ÚsetÚupdater   r!   Ú	attributer   r   r   r   Ú_clean_initializers_helperÚgr   r   ÚgraphsÚappendr   Úonnx_helperÚ	make_nodeÚop_typer   Ú
ClearFieldÚextendÚdifference_updateÚinitializerÚremoveÚStopIterationÚ
ir_versionÚprint)ÚgraphÚmodelÚrequesting_tensor_namesÚ	new_nodesr   Únew_nodeÚgraph_attrsÚkwargsr   Únew_attributeÚcleaned_sub_graphÚsub_requesting_tensor_namesÚcleaned_graphesÚsubgraphÚunused_initializerr4   Úname_to_inputs                    r   r*   r*      s‘  € õ "™eœeÐØ×"Ò"Ð"pÐ"p¸%¼*Ð"pÑ"pÔ"pÑpÔpÐpØ×"Ò"Ð"VÐ"V¸5¼<Ð"VÑ"VÔ"VÑVÔVÐVà€IØ”
ð  #ñ  #ˆØˆð
ð 
àœð
ñ 
ô 
ˆð
 ñ 	nØˆFØœð -ð -�Ø "�Ø”9¥Ô 3Ô 9Ò9Ð9õ 3°4´6¸5ÑAÔAñØ)Ø3à%)¤YÐ0AÐ$B�MØ+×2Ò2Ð3NÑOÔOÐOÐOØ”Y¥$Ô"5Ô"<Ò<Ð<Ø&(�OØ$(¤Kð Tð T˜õ 7°xÀÑGÔGñØ-Ø7à'×.Ò.Ð/@ÑAÔAÐAØ/×6Ò6Ð7RÑSÔSÐSÐSØ%)¤Y°Ð$@�M�Må$6°tÑ$<Ô$<�MØ—’˜mÑ,Ô,Ð,Ð,Ý"Ô,¨T¬\¸4¼:ÀtÄ{ÐmÐmÐY]ÔYbÐmÐflÐmÐmˆHØ×Ò˜Ñ"Ô"Ð"Ñ"à	×Ò�VÑÔÐØ	„J×Ò�iÑ Ô Ð à×-Ò-Ð-fÐ-fÀÄÐ-fÑ-fÔ-fÑfÔfÐfàÐØÔ(ð 3ð 3ˆØÔÐ6Ð6Ð6Ø#×*Ò*¨;Ô+;Ñ<Ô<Ð<Ð<ð ×%Ò% kÑ2Ô2Ð2Ð2à@Ð@°E´KÐ@Ñ@Ô@€MØ)ð uð uˆØÔ× Ò  Ñ-Ô-Ð-ØÔ˜}Ð,Ð,ðuØ”×"Ò" =°Ô1AÔ#BÑCÔCÐCÐCøÝ ð uð uð uØÔ# aÒ'Ð'ÝÐs¸+Ô:JÐsÐsÐsÑtÔtÐtøøðuøøøð -ð ×-Ò-Ð-RÐ-RÀeÄkÐ-RÑ-RÔ-RÑRÔRÐRàÐ)Ð)Ð)s   É;%J!Ê!-KËKc                   óŽ  — e Zd Zdefd„Zd„ Zd„ Zd„ Zd„ Zd„ Z	d„ Z
d	„ Zd
„ Zd„ Zd„ Zd„ Zd„ Zd„ Zd„ Zd„ Zdefd„Zd„ Zd„ Zd„ Zd„ Zd„ Zd„ Zd„ Zd6d„Zd6d„Zd6d„Zd„ Z d „ Z!d!„ Z"d"„ Z#e$d#„ ¦   «         Z%e$d$„ ¦   «         Z&d%„ Z'd7d'„Z(e$d(„ ¦   «         Z)d)„ Z*d*„ Z+e$d+„ ¦   «         Z,d,„ Z-d-„ Z.d.„ Z/d/„ Z0ded0e1fd1„Z2d2„ Z3d3„ Z4d6d4„Z5d5„ Z6dS )8Ú	ONNXModelr:   c                 ó   — || _         d S r
   )r:   )Úselfr:   s     r   Ú__init__zONNXModel.__init__Z   s   € ØˆŒ
ˆ
ˆ
r   c                 ó$   — | j         j        j        S r
   )r:   r9   r   ©rJ   s    r   ÚnodeszONNXModel.nodes]   s   € ØŒzÔÔ$Ð$r   c                 ó$   — | j         j        j        S r
   ©r:   r9   r4   rM   s    r   r4   zONNXModel.initializer`   s   € ØŒzÔÔ+Ð+r   c                 ó   — t          |¦  «        dk    rt          d¦  «        ‚|                      ¦   «         D ]}|                      |d¦  «         Œ|D ];}|                      |¦  «         | j        j        j                             |¦  «         Œ<d S )Nr   zCan add an empty list.Úgain)ÚlenÚ
ValueErrorr4   Ú_check_initr:   r9   r-   )rJ   ÚinitsÚinits      r   Úinitializer_extendzONNXModel.initializer_extendc   s    € Ýˆu‰:Œ:˜Š?ˆ?ÝÐ5Ñ6Ô6Ð6Ø×$Ò$Ñ&Ô&ð 	+ð 	+ˆDØ×Ò˜T 6Ñ*Ô*Ð*Ð*Øð 	6ð 	6ˆDØ×Ò˜TÑ"Ô"Ð"ØŒJÔÔ(×/Ò/°Ñ5Ô5Ð5Ð5ð	6ð 	6r   c                 ó   — | j         j        S r
   )r:   r9   rM   s    r   r9   zONNXModel.graphl   s   € ØŒzÔÐr   c                 ó   — | j         j        S r
   )r:   r7   rM   s    r   r7   zONNXModel.ir_versiono   s   € ØŒzÔ$Ð$r   c                 ó   — | j         j        S r
   )r:   Úopset_importrM   s    r   r\   zONNXModel.opset_importr   s   € ØŒzÔ&Ð&r   c                 ó´   — | j         j        D ]}|j        |k    r
||_         d S Œ| j         j                             t          j        ||¦  «        g¦  «         d S r
   )r:   r\   ÚdomainÚversionr2   r.   Úmake_opsetid)rJ   r^   r_   Úopsets       r   Úset_opset_importzONNXModel.set_opset_importu   sg   € Ø”ZÔ,ð 	ð 	ˆEØŒ|˜vÒ%Ð%Ø '�”Ø��ð &ð 	Œ
Ô×&Ò&­Ô(@ÀÈÑ(QÔ(QÐ'RÑSÔSÐSÐSÐSr   c                 óx   — || j         j        j        v r&| j         j        j                             |¦  «         d S d S r
   )r:   r9   r   r5   ©rJ   r   s     r   Úremove_nodezONNXModel.remove_node}   s?   € Ø�4”:Ô#Ô(Ð(Ð(ØŒJÔÔ!×(Ò(¨Ñ.Ô.Ð.Ð.Ð.ð )Ð(r   c                 ó:   — |D ]}|                       |¦  «         Œd S r
   )re   )rJ   Únodes_to_remover   s      r   Úremove_nodeszONNXModel.remove_nodes�   s2   € Ø#ð 	#ð 	#ˆDØ×Ò˜TÑ"Ô"Ð"Ð"ð	#ð 	#r   c                 óv   — | j         j        j                             |                      |¦  «        g¦  «         d S r
   )r:   r9   r   r2   Ú_check_noderd   s     r   Úadd_nodezONNXModel.add_node…   s5   € ØŒ
ÔÔ×$Ò$ d×&6Ò&6°tÑ&<Ô&<Ð%=Ñ>Ô>Ð>Ð>Ð>r   c                 ó:   — |D ]}|                       |¦  «         Œd S r
   )rk   )rJ   Únodes_to_addr   s      r   Ú	add_nodeszONNXModel.add_nodesˆ   s0   € Ø ð 	 ð 	 ˆDØ�MŠM˜$ÑÔÐÐð	 ð 	 r   c                 óÆ   — t          |j        | j        j        j        ¦  «        €<|                      |¦  «         | j        j        j                             |g¦  «         d S d S r
   )r   r   r:   r9   r4   rU   r2   )rJ   Útensors     r   Úadd_initializerzONNXModel.add_initializerŒ   s]   € Ý˜œ T¤ZÔ%5Ô%AÑBÔBÐJØ×Ò˜VÑ$Ô$Ð$ØŒJÔÔ(×/Ò/°°Ñ9Ô9Ð9Ð9Ð9ð KÐJr   c                 óL   — | j         j        j        D ]}|j        |k    r|c S Œd S r
   )r:   r9   r4   r   )rJ   r   rp   s      r   Úget_initializerzONNXModel.get_initializer‘   s9   € Ø”jÔ&Ô2ð 	ð 	ˆFØŒ{˜dÒ"Ð"Ø���ð #àˆtr   c                 óL   — | j         j        j        D ]}|j        |k    r|c S Œd S r
   )r:   r9   r   r   )rJ   r   r   s      r   Úfind_graph_inputzONNXModel.find_graph_input—   s9   € Ø”ZÔ%Ô+ð 	ð 	ˆEØŒz˜ZÒ'Ð'Ø���ð (àˆtr   c                 óL   — | j         j        j        D ]}|j        |k    r|c S Œd S r
   )r:   r9   r!   r   )rJ   Úoutput_namer!   s      r   Úfind_graph_outputzONNXModel.find_graph_output�   s9   € Ø”jÔ&Ô-ð 	ð 	ˆFØŒ{˜kÒ)Ð)Ø���ð *àˆtr   Útensor_namec                 óê   — d„ | j         j        j        D ¦   «         }||v r||         j        S |                      |¦  «        }|r|j        j        S |                      |¦  «        }|r|j        j        S d S )Nc                 ó(   — i | ]}|j         |j        “ŒS r   )r   r   )r   Úobjs     r   r$   z-ONNXModel.get_tensor_type.<locals>.<dictcomp>¤   s   € ÐUÐUÐU°#˜3œ8 S¤XÐUÐUÐUr   )r:   r9   Ú
value_infoÚtensor_typeru   r   rx   )rJ   ry   Útensor_type_mapÚg_inputÚg_outputs        r   Úget_tensor_typezONNXModel.get_tensor_type£   s‡   € ØUÐU¸¼Ô9IÔ9TÐUÑUÔUˆà˜/Ð)Ð)Ø" ;Ô/Ô;Ð;à×'Ò'¨Ñ4Ô4ˆØð 	,Ø”<Ô+Ð+à×)Ò)¨+Ñ6Ô6ˆØð 	-Ø”=Ô,Ð,àˆtr   c                 ó   — | j         j        j        D ]P}|j        dk    rC|j        d         |k    r2|j        D ]*}|j        dk    rt          j        |j	        ¦  «        c c S Œ+ŒQ|  
                    |¦  «        }|�t          j        |¦  «        S d S )NÚConstantr   Úvalue)r:   r9   r   r0   r!   r)   r   Úonnx_numpy_helperÚto_arrayÚtrs   )rJ   rw   r   r   r4   s        r   Úget_constant_valuezONNXModel.get_constant_value³   s¯   € Ø”JÔ$Ô)ð 	Fð 	FˆDØŒ|˜zÒ)Ð)Ø”;˜q”> [Ò0Ð0Ø $¤ð Fð F˜Øœ9¨Ò/Ð/Ý#4Ô#=¸d¼fÑ#EÔ#EÐEÐEÐEÐEÐEð 0øð ×*Ò*¨;Ñ7Ô7ˆØÐ"Ý$Ô-¨kÑ:Ô:Ð:àˆtr   c                 ó8   — d„ | j         j        j        D ¦   «         S )Nc                 ó   — h | ]	}|j         ’Œ
S r   r   )r   r4   s     r   ú	<setcomp>z5ONNXModel.get_initializer_name_set.<locals>.<setcomp>Ã   s   € ÐQÐQÐQ [�Ô ÐQÐQÐQr   rP   rM   s    r   Úget_initializer_name_setz"ONNXModel.get_initializer_name_setÂ   s   € ØQÐQ°D´JÔ4DÔ4PÐQÑQÔQÐQr   c                 ó  — || j         j        j        v ro| j         j        j                             |¦  «         | j         j        j        D ];}|j        |j        k    r'| j         j        j                             |¦  «          d S Œ:d S d S r
   )r:   r9   r4   r5   r   r   )rJ   rp   r   s      r   Úremove_initializerzONNXModel.remove_initializerÅ   s‘   € Ø�T”ZÔ%Ô1Ð1Ð1ØŒJÔÔ(×/Ò/°Ñ7Ô7Ð7ØœÔ)Ô/ð ð �Ø”: ¤Ò,Ð,Ø”JÔ$Ô*×1Ò1°%Ñ8Ô8Ð8Ø�E�Eð -ð 2Ð1ðð r   c                 ó:   — |D ]}|                       |¦  «         Œd S r
   )r�   )rJ   Úinit_to_remover4   s      r   Úremove_initializerszONNXModel.remove_initializersÍ   s2   € Ø)ð 	1ð 	1ˆKØ×#Ò# KÑ0Ô0Ð0Ð0ð	1ð 	1r   c                 ó¸   — |                       ¦   «         }t          ¦   «         }| j        j        j        D ]%}|j        |vr|                     |j        ¦  «         Œ&|S r
   )r�   r'   r:   r9   r   r   Úadd)rJ   Úinitializer_namesÚnon_initializer_inputsr   s       r   Úget_non_initializer_inputsz$ONNXModel.get_non_initializer_inputsÑ   s`   € Ø ×9Ò9Ñ;Ô;ÐÝ!$¡¤ÐØ”ZÔ%Ô+ð 	7ð 	7ˆEØŒzÐ!2Ð2Ð2Ø&×*Ò*¨5¬:Ñ6Ô6Ð6øØ%Ð%r   c                 ó–   — i }| j         j        j        D ]4}|j        D ]*}|r&||vr|g||<   Œ||                              |¦  «         Œ+Œ5|S r
   )r:   r9   r   r   r-   )rJ   Úinput_name_to_nodesr   r   s       r   r™   zONNXModel.input_name_to_nodesÙ   s�   € Ø ÐØ”JÔ$Ô)ð 	Eð 	EˆDØ"œjð Eð E�
Øð EØ!Ð)<Ð<Ð<Ø;?¸&Ð+¨JÑ7Ð7à+¨JÔ7×>Ò>¸tÑDÔDÐDøðEð #Ð"r   c                 óT   — i }| j         j        j        D ]}|j        D ]	}|r|||<   Œ
Œ|S r
   )r:   r9   r   r!   )rJ   Úoutput_name_to_noder   rw   s       r   r›   zONNXModel.output_name_to_nodeä   sQ   € Ø ÐØ”JÔ$Ô)ð 	<ð 	<ˆDØ#œ{ð <ð <�Øð <Ø7;Ð'¨Ñ4øð<ð #Ð"r   Nc                 ó’   — |€|                       ¦   «         }g }|j        D ]&}||v r ||         D ]}|                     |¦  «         ŒŒ'|S r
   )r™   r!   r-   )rJ   r   r™   Úchildrenr!   s        r   Úget_childrenzONNXModel.get_childrenì   sk   € ØÐ&Ø"&×":Ò":Ñ"<Ô"<ÐàˆØ”kð 	*ð 	*ˆFØÐ,Ð,Ð,Ø/°Ô7ð *ð *�DØ—O’O DÑ)Ô)Ð)Ð)øØˆr   c                 óˆ   — |€|                       ¦   «         }g }|j        D ]!}||v r|                     ||         ¦  «         Œ"|S r
   )r›   r   r-   )rJ   r   r›   Úparentsr   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›   rS   r   )rJ   r   Úidxr›   r   s        r   Ú
get_parentzONNXModel.get_parent  sY   € ØÐ&Ø"&×":Ò":Ñ"<Ô"<ÐåˆtŒz‰?Œ?˜cÒ!Ð!Ø�4à”
˜3”ˆØÐ+Ð+Ð+Ø�4à" 5Ô)Ð)r   c                 óx   — t          |j        ¦  «        }|                     |¦  «         t          ||¦  «        }|S )z­Find out if a node exists in a graph or a node is in the
        new set of nodes created during quantization.

        Returns:
            The node found or None.
        )Úlistr   r2   r   )rJ   Ú	node_nameÚnew_nodes_listr9   Úgraph_nodes_listr   s         r   Úfind_node_by_namezONNXModel.find_node_by_name  s=   € õ   ¤
Ñ+Ô+ÐØ×Ò Ñ/Ô/Ð/Ý˜IÐ'7Ñ8Ô8ˆØˆr   c                 ó
  — d}| j         j        j        D ]n}|j        re|j                             |¦  «        rK	 t          |j        t          |¦  «        d…         ¦  «        }t          ||¦  «        }Œ^# t          $ r Y Œjw xY wŒo|S )z¿
        Gets the largest node name (int) suffix for all node names that begin with `node_name_prefix`.
        Example: for nodes my_prefix_0 and my_prefix_3, this method returns 3.
        éÿÿÿÿN)	r:   r9   r   r   Ú
startswithÚintrS   ÚmaxrT   )rJ   Únode_name_prefixÚsuffixr   Úindexs        r   Úget_largest_node_name_suffixz&ONNXModel.get_largest_node_name_suffix  s£   € ð
 ˆà”JÔ$Ô)ð 	ð 	ˆDØŒyð ˜TœY×1Ò1Ð2BÑCÔCð ðÝ ¤	­#Ð.>Ñ*?Ô*?Ð*AÐ*AÔ BÑCÔC�EÝ  ¨Ñ/Ô/�F�FøÝ!ð ð ð Ø�Hðøøøøð ˆs   ¸9A2Á2
A?Á>A?c                 óü   — d}| j         j        j        D ]g}|j                             |¦  «        rK	 t          |j        t          |¦  «        d…         ¦  «        }t          ||¦  «        }ŒW# t          $ r Y Œcw xY wŒh|S )ab  
        Gets the largest initializer name integer suffix for all initializer names that begin
        with `initializer_name_prefix`. This can be used to create unique initializer names.

        Example: for initializer names 'my_weight_0' and 'my_weight_3', this method returns 3 if
                 `initializer_name_prefix` is 'my_weight_'.
        r¬   N)	r:   r9   r4   r   r­   r®   rS   r¯   rT   )rJ   Úinitializer_name_prefixr±   r4   r²   s        r   Ú#get_largest_initializer_name_suffixz-ONNXModel.get_largest_initializer_name_suffix+  s    € ð ˆàœ:Ô+Ô7ð 	ð 	ˆKØÔ×*Ò*Ð+BÑCÔCð ðÝ Ô 0µÐ5LÑ1MÔ1MÐ1OÐ1OÔ PÑQÔQ�EÝ  ¨Ñ/Ô/�F�FøÝ!ð ð ð Ø�Hðøøøð	ð ˆs   ±9A+Á+
A8Á7A8c                 ór   — g }|j         D ],}|j        D ]"}||j        k    r|                     |¦  «         Œ#Œ-|S )zD
        Find all nodes with given initializer as an input.
        )r   r   r   r-   )rJ   r9   r4   rN   r   Ú
node_inputs         r   Úfind_nodes_by_initializerz#ONNXModel.find_nodes_by_initializer?  sX   € ð ˆØ”Jð 	'ð 	'ˆDØ"œjð 'ð '�
Ø Ô!1Ò1Ð1Ø—L’L Ñ&Ô&Ð&øð'ð ˆr   c                 ó˜   — t          t          |¦  «        dz
  dd¦  «        D ]'}||         }|j        D ]}|j        | k    r||fc c S ŒŒ(dS )Nr   r¬   )NN)ÚrangerS   r4   r   )r   Ú
graph_pathÚgidr9   rp   s        r   Ú__get_initializerzONNXModel.__get_initializerJ  sw   € å�˜Z™œ¨1Ñ,¨b°"Ñ5Ô5ð 	)ð 	)ˆCØ˜s”OˆEØÔ+ð )ð )�Ø”; $Ò&Ð&Ø! 5˜=Ð(Ð(Ð(Ð(Ð(ð 'ð)ð ˆzr   c           	      óÜ  — g }| d         }|j         D �]}d„ |j        D ¦   «         }|�ri }|j        D ]Ñ}|j        dk    r<|                      |j        ¦  «         |j        t                               | ¦  «        i}ns|j        dk    rYg }|j        D ]E}	|                      |	¦  «         | 	                    t                               | ¦  «        g¦  «         ŒF|j        |i}nt          |¦  «        }|                     |¦  «         ŒÒt          j        |j        |j        |j        fd|j        i|¤Ž}|j        dk    �rØd}
d}d}d}|j        D ]�}|j        d	k    rt          j        |¦  «        }
Œ"|j        d
k    rt          j        |¦  «        }ŒB|j        dk    rt          j        |¦  «        }Œb|j        dk    rt          j        |¦  «        }Œ‚|
dk    �r)|dk    �r"|dk    �r|j        d         }|dk    �rt                               |j        d         | ¦  «        \  }}|r t'          j        |¦  «        }t'          j        |j        ¦  «        }|j        |_        |j                             |¦  «         |j        D ])}|j        |k    r|j                             |¦  «          nŒ*|j         	                    |g¦  «         nP|dz  }t          j        d|j        d         g|g|j        r
|j        dz   nd¬¦  «        }|                     |¦  «         t          j        d|j        d         |g|j        d         t3          |j        ¦  «        dk    rdndz   g|j        r
|j        dz   nd¬¦  «        }|                     |¦  «         t3          |j        ¦  «        dk    r^t          j        d|j        d         dz   |j        d         g|j        |j        r
|j        dz   nd¬¦  «        }|                     |¦  «         �Œé|                     |¦  «         �Œ |                     |¦  «         �Œ|                     d¦  «         |j          	                    |¦  «         |                      ¦   «          |S )Nr¬   c                 ó>   — g | ]}|j         d k    s|j         dk    ¯|‘ŒS )é   é
   )r   r   s     r   r   z8ONNXModel.__replace_gemm_with_matmul.<locals>.<listcomp>X  s1   € Ð`Ð`Ð` D¸d¼iÈ1ºn¸nÐPTÔPYÐ]_ÒP_ÐP_˜4ÐP_ÐP_ÐP_r   rÁ   rÂ   r   ÚGemmg      ð?r   ÚalphaÚbetaÚtransAÚtransBr   Ú_TransposedÚ	TransposeÚ
_TransposeÚ )ÚinputsÚoutputsr   ÚMatMulé   Ú_MatMulÚAddÚ_Addr   )r   r)   r   r-   r+   r   rH   Ú$_ONNXModel__replace_gemm_with_matmulr,   r2   r   r(   r.   r/   r0   r   r!   Úget_attribute_valueÚ_ONNXModel__get_initializerr†   r‡   Ú
from_arrayÚTr4   r5   rS   r1   Úpop)r¼   r<   r9   r   r>   r?   r   Úkvr…   rD   rÄ   rÅ   rÆ   rÇ   ÚinputBÚBÚBs_graphÚB_arrayÚB_transr   Útranspose_nodeÚmatmul_noderk   s                          r   Ú__replace_gemm_with_matmulz$ONNXModel.__replace_gemm_with_matmulS  sÁ  € àˆ	Ø˜2”ˆØ”Jð S	'ñ S	'ˆDØ`Ð`¨D¬NÐ`Ñ`Ô`ˆKØñ Ø�Ø œNð &ð &�DØ”y A’~�~Ø"×)Ò)¨$¬&Ñ1Ô1Ð1Ø"œi­×)MÒ)MÈjÑ)YÔ)YÐZ˜˜Øœ bš˜Ø "˜Ø(,¬ð ]ð ]˜HØ&×-Ò-¨hÑ7Ô7Ð7Ø!ŸLšL­)×*NÒ*NÈzÑ*ZÔ*ZÐ)[Ñ\Ô\Ð\Ð\Ø"œi¨Ð/˜˜å/°Ñ5Ô5˜Ø—M’M "Ñ%Ô%Ð%Ð%Ý"Ô,Ø”L $¤*¨d¬kðð Ø@DÄ	ðØMSðð �ð Œ|˜vÒ%Ñ%Ø�Ø�Ø�Ø�Ø œNð Gð G�DØ”y GÒ+Ð+Ý +Ô ?ÀÑ EÔ E˜˜Øœ fÒ,Ð,Ý*Ô>¸tÑDÔD˜˜Øœ hÒ.Ð.Ý!,Ô!@ÀÑ!FÔ!F˜˜Øœ hÒ.Ð.Ý!,Ô!@ÀÑ!FÔ!F˜øØ˜C’<‘< D¨C¢K¡K°F¸a²K±KØ!œZ¨œ]�FØ ’{‘{Ý&/×&AÒ&AÀ$Ä*ÈQÄ-ÐQ[Ñ&\Ô&\™˜˜8Øð =å&7Ô&@ÀÑ&CÔ&C˜GÝ&7Ô&BÀ7Ä9Ñ&MÔ&M˜GØ+,¬6˜GœLØ$Ô0×7Ò7¸Ñ:Ô:Ð:Ø)1¬ð *ð * Ø#(¤:°Ò#7Ð#7Ø$,¤N×$9Ò$9¸%Ñ$@Ô$@Ð$@Ø$) Eð $8ð %Ô0×7Ò7¸¸	ÑBÔBÐBÐBà" mÑ3˜FÝ-8Ô-BØ +Ø(,¬
°1¬ Ø)/¨ØAEÄÐ%R T¤Y°Ñ%=Ð%=ÐPRð	.ñ .ô .˜Nð &×,Ò,¨^Ñ<Ô<Ð<å"-Ô"7Ø Ø $¤
¨1¤¨vÐ6Ø!%¤¨Q¤ÅÀDÄJÁÄÐRSÒ@SÐ@S°9°9ÐY[Ñ!\Ð ]Ø6:´iÐG˜TœY¨Ñ2Ð2ÀRð	#ñ #ô #�Kð ×$Ò$ [Ñ1Ô1Ð1å˜4œ:‘”¨Ò*Ð*Ý#.Ô#8Ø!Ø$(¤K°¤N°YÑ$>ÀÄ
È1ÄÐ#NØ$(¤KØ7;´yÐ!H ¤¨VÑ!3Ð!3Àbð	$ñ $ô $˜ð "×(Ò(¨Ñ2Ô2Ð2ùð ×$Ò$ TÑ*Ô*Ð*Ñ*ð × Ò  Ñ&Ô&Ð&Ñ&à×Ò˜Ñ Ô Ð ØŒ
×Ò˜)Ñ$Ô$Ð$Ø�ŠÑÔÐØˆr   c                 ód   — |                       ¦   «         g}t                               |¦  «         d S r
   )r9   rH   rÓ   )rJ   r¼   s     r   Úreplace_gemm_with_matmulz"ONNXModel.replace_gemm_with_matmul±  s+   € Ø—j’j‘l”l�^ˆ
Ý×,Ò,¨ZÑ8Ô8Ð8Ð8Ð8r   Fc                 ó4  — |                       ¦   «          |r=t          j                             | j        dt          |¦  «        j        dz   d¬¦  «         | j        j        j        D ]}|  	                    |d¦  «         Œt          j
        | j        |¦  «         dS )zS
        Save model to external data, which is needed for model size > 2GB
        Tz.data)Úall_tensors_to_one_fileÚlocationÚconvert_attributeÚendN)Útopological_sortr   Úexternal_data_helperÚconvert_model_to_external_datar:   r   r   r9   r4   rU   Ú
save_model)rJ   Úoutput_pathÚuse_external_data_formatrW   s       r   Úsave_model_to_filezONNXModel.save_model_to_fileµ  s©   € ð 	×ÒÑÔÐØ#ð 	ÝÔ%×DÒDØ”
Ø(,Ý˜kÑ*Ô*Ô/°'Ñ9Ø"&ð	 Eñ ô ð ð ”JÔ$Ô0ð 	*ð 	*ˆDØ×Ò˜T 5Ñ)Ô)Ð)Ð)ÝŒ˜œ
 KÑ0Ô0Ð0Ð0Ð0r   c                 óÜ   — t          |t          ¦  «        rt          |t          ¦  «        sJ ‚t          t          | j        ¦  «        ¦  «        D ]}| j        |         |k    r
|| j        |<   Œd S r
   )Ú
isinstanceÚstrr»   rS   r   )r   Ú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                 óf   — | j         j        j        D ]}t                               |||¦  «         Œd S r
   )r:   r9   r   rH   rö   )rJ   ró   rô   r   s       r   Úreplace_input_of_all_nodesz$ONNXModel.replace_input_of_all_nodesÌ  sB   € Ø”JÔ$Ô)ð 	Oð 	OˆDÝ×(Ò(¨¨~¸~ÑNÔNÐNÐNð	Oð 	Or   c                 óx   — | j         j        j        D ]'}|j        |v rt                               |||¦  «         Œ(d S r
   )r:   r9   r   r   rH   rö   )rJ   ró   rô   Únode_names_setr   s        r   Úreplace_input_of_nodesz ONNXModel.replace_input_of_nodesÐ  sM   € Ø”JÔ$Ô)ð 	Sð 	SˆDØŒy˜NÐ*Ð*Ý×,Ò,¨T°>À>ÑRÔRÐRøð	Sð 	Sr   c                 óÜ   — t          |t          ¦  «        rt          |t          ¦  «        sJ ‚t          t          | j        ¦  «        ¦  «        D ]}| j        |         |k    r
|| j        |<   Œd S r
   )rñ   rò   r»   rS   r!   )r   Ú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:   r9   r   rH   rÿ   )rJ   rý   rþ   r   s       r   Úreplace_output_of_all_nodesz%ONNXModel.replace_output_of_all_nodesÜ  sB   € Ø”JÔ$Ô)ð 	Rð 	RˆDÝ×)Ò)¨$°ÀÑQÔQÐQÐQð	Rð 	Rr   c                 óx   — | j         j        j        D ]'}|j        |v rt                               |||¦  «         Œ(d S r
   )r:   r9   r   r   rH   rÿ   )rJ   rý   rþ   rú   r   s        r   Úreplace_output_of_nodesz!ONNXModel.replace_output_of_nodesà  sM   € Ø”JÔ$Ô)ð 	Vð 	VˆDØŒy˜NÐ*Ð*Ý×-Ò-¨d°OÀ_ÑUÔUÐUøð	Vð 	Vr   c                 ó¨  — |                       ¦   «         }g }|                      ¦   «         }|D ]Q}|j        dk    rD|                      |j        d         ¦  «        s$|j        d         |vr|                     |¦  «         ŒR|                      |¦  «         g }|                      ¦   «         D ]’}|j        |vr‡|                      |j        ¦  «        sm|                     |¦  «         |  	                    ¦   «         j
        D ]>}|j        |j        k    r,|  	                    ¦   «         j
                             |¦  «         Œ?Œ“|                      |¦  «         d S )Nr„   r   )r™   rN   r0   Úis_graph_outputr!   r-   rh   r4   r   r9   r   r5   r’   )rJ   r™   Úunused_nodesrN   r   Úununsed_weightsÚwÚgraph_inputs           r   Úremove_unused_constantz ONNXModel.remove_unused_constantå  sW  € Ø"×6Ò6Ñ8Ô8Ðð ˆØ—
’
‘”ˆØð 	*ð 	*ˆDà” 
Ò*Ð*Ø×,Ò,¨T¬[¸¬^Ñ<Ô<ð +à”K ”NÐ*=Ð=Ð=à×#Ò# DÑ)Ô)Ð)øà×Ò˜,Ñ'Ô'Ð'àˆØ×!Ò!Ñ#Ô#ð 	?ð 	?ˆAØŒvÐ0Ð0Ð0¸×9MÒ9MÈaÌfÑ9UÔ9UÐ0Ø×&Ò& qÑ)Ô)Ð)à#'§:¢:¡<¤<Ô#5ð ?ð ?�KØ"Ô'¨1¬6Ò1Ð1ØŸ
š
™œÔ*×1Ò1°+Ñ>Ô>Ð>øøà× Ò  Ñ1Ô1Ð1Ð1Ð1r   c                 óX   ‡— t          ˆfd„| j        j        j        D ¦   «         ¦  «        S )Nc              3   ó.   •K  — | ]}|j         ‰k    V — Œd S r
   r   )r   r!   rw   s     €r   r   z,ONNXModel.is_graph_output.<locals>.<genexpr>  s*   øè è € ÐTÐT°&�6”; +Ò-ÐTÐTÐTÐTÐTÐTr   )Úanyr:   r9   r!   )rJ   rw   s    `r   r  zONNXModel.is_graph_output   s.   ø€ ÝÐTÐTÐTÐT¸D¼JÔ<LÔ<SÐTÑTÔTÑTÔTÐTr   Úreturnc                 óX   ‡— t          ˆfd„| j        j        j        D ¦   «         ¦  «        S )Nc              3   ó.   •K  — | ]}|j         ‰k    V — Œd S r
   r   )r   r   ry   s     €r   r   z+ONNXModel.is_graph_input.<locals>.<genexpr>  s*   øè è € ÐQÐQ°�5”: Ò,ÐQÐQÐQÐQÐQÐQr   )r  r:   r9   r   )rJ   ry   s    `r   Úis_graph_inputzONNXModel.is_graph_input  s.   ø€ ÝÐQÐQÐQÐQ¸$¼*Ô:JÔ:PÐQÑQÔQÑQÔQÐQr   c                 óZ  — dgt          |                      ¦   «         ¦  «        z  }i }g }t          |                      ¦   «         ¦  «        D ]“\  }}t          d„ |j        D ¦   «         ¦  «        ||<   ||         dk    r.|                     |                      ¦   «         |         ¦  «         Œ`|j        D ]+}|sŒ||vr|g||<   Œ||                              |¦  «         Œ,Œ”d„ |                      ¦   «         D ¦   «         }d„ | j        j        j        D ¦   «         }||z   }	|	 	                    ¦   «          d }
|	D ]a}|
|k    rŒ	|}
||v rR||         D ]I}||         dz
  ||<   ||         dk    r-|                     |                      ¦   «         |         ¦  «         ŒJŒbd}t          |¦  «        }||k     rv||         j
        D ]]}||v rW||         D ]N}||         dz
  ||<   ||         dk    r2|                     |                      ¦   «         |         ¦  «         |dz   }ŒOŒ^|dz   }||k     °v|t          |                      ¦   «         j        ¦  «        k    s
J d¦   «         ‚|                      ¦   «                              d¦  «         |                      ¦   «         j                             |¦  «         d S )Nr   c              3   ó   K  — | ]}|¯d V — Œ	dS )r   Nr   )r   Ú_s     r   r   z-ONNXModel.topological_sort.<locals>.<genexpr>  s'   è è € Ð&BÐ&B¨QÀÐ&B qÐ&BÐ&BÐ&BÐ&BÐ&BÐ&Br   c                 ó   — g | ]	}|j         ‘Œ
S r   r   )r   rW   s     r   r   z.ONNXModel.topological_sort.<locals>.<listcomp>  s   € ÐFÐFÐF¨4˜TœYÐFÐFÐFr   c                 ó   — g | ]	}|j         ‘Œ
S r   r   r#   s     r   r   z.ONNXModel.topological_sort.<locals>.<listcomp>  s   € ÐLÐLÐL¨E˜UœZÐLÐLÐLr   r   zGraph is not a DAGr   )rS   rN   Ú	enumerateÚsumr   r-   r4   r:   r9   Úsortr!   r   r1   r2   )rJ   Ú
deps_countÚdeps_to_nodesÚsorted_nodesÚnode_idxr   r   r•   Úgraph_input_namesÚinput_namesÚprev_input_nameÚstartrè   r!   s                 r   ré   zONNXModel.topological_sort  s  € Ø�S�3˜tŸzšz™|œ|Ñ,Ô,Ñ,ˆ
ØˆØˆÝ'¨¯
ª
©¬Ñ5Ô5ð 	?ð 	?‰NˆH�då#&Ð&BÐ&B°$´*Ð&BÑ&BÔ&BÑ#BÔ#BˆJ�xÑ Ø˜(Ô# qÒ(Ð(Ø×#Ò# D§J¢J¡L¤L°Ô$:Ñ;Ô;Ð;Øà"œjð ?ð ?�
Ø!ð ØØ ]Ð2Ð2Ø19°
�M *Ñ-Ð-à! *Ô-×4Ò4°XÑ>Ô>Ð>Ð>ð?ð GÐF°4×3CÒ3CÑ3EÔ3EÐFÑFÔFÐØLÐL°T´ZÔ5EÔ5KÐLÑLÔLÐØ'Ð*;Ñ;ˆØ×ÒÑÔÐØˆØ%ð 		Dð 		DˆJØ *Ò,Ð,Øà(ˆOØ˜]Ð*Ð*Ø -¨jÔ 9ð Dð D�HØ+5°hÔ+?À!Ñ+C�J˜xÑ(Ø! (Ô+¨qÒ0Ð0Ø$×+Ò+¨D¯JªJ©L¬L¸Ô,BÑCÔCÐCøøàˆÝ�,ÑÔˆà�cŠkˆkØ& uÔ-Ô4ð *ð *�Ø˜]Ð*Ð*Ø$1°&Ô$9ð *ð *˜Ø/9¸(Ô/CÀaÑ/G˜
 8Ñ,Ø% hÔ/°1Ò4Ð4Ø(×/Ò/°·
²
±´¸XÔ0FÑGÔGÐGØ"%¨¡'˜CøøØ˜A‘IˆEð �cŠkˆkð •c˜$Ÿ*š*™,œ,Ô+Ñ,Ô,Ò,Ð,Ð,Ð.BÑ,Ô,Ð,Ø�
Š
‰Œ×Ò Ñ'Ô'Ð'Ø�
Š
‰ŒÔ× Ò  Ñ.Ô.Ð.Ð.Ð.r   c                 óP   — t          |                      ¦   «         | j        ¦  «        S r
   )r*   r9   r:   rM   s    r   Úclean_initializerszONNXModel.clean_initializers<  s   € Ý)¨$¯*ª*©,¬,¸¼
ÑCÔCÐCr   c                 óî   — |j         t          j        j        k    rZ|                     d¦  «        rEt          |j        ¦  «        }t          d„ |D ¦   «         ¦  «        rt          d|j	        ›d�¦  «        ‚|S )NÚraw_datac              3   ó(   K  — | ]}|d z  d k    V — ŒdS )é   Nr   )r   Úis     r   r   z(ONNXModel._check_init.<locals>.<genexpr>C  s+   è è € Ð3Ð3¨A˜˜C™ CÒ'Ð3Ð3Ð3Ð3Ð3Ð3r   zInitializer z	 has nan.)
Ú	data_typer   ÚTensorProtoÚFLOAT8E4M3FNÚHasFieldr¦   r%  r  rT   r   )rJ   rW   ÚtestÚbs       r   rU   zONNXModel._check_init?  sz   € ØŒ>�TÔ-Ô:Ò:Ð:Ø�}Š}˜ZÑ(Ô(ð LÝ˜œÑ'Ô'�ÝÐ3Ð3°Ð3Ñ3Ô3Ñ3Ô3ð LÝ$Ð%J°D´IÐ%JÐ%JÐ%JÑKÔKÐKØˆr   c                 ó  — |j         dk    r€|j        d         }|                      |¦  «        }|j        }|t          j        j        t          j        j        t          j        j        t          j        j	        hv rt          d|› d�¦  «        ‚|S )z¾
        A quantization to float 8 does not use quantized bias but float 16 bias.
        This function checks that DequantizeLinear is not used to
        dequantize from float 16.
        ÚDequantizeLinearrÏ   z;Unsupported DequantizeLinear operator, dequantization from ú.)r0   r   rs   r)  r   r*  ÚFLOAT16ÚFLOATÚDOUBLEÚBFLOAT16ÚRuntimeError)rJ   r   Ú
zero_pointrW   Údtypes        r   rj   zONNXModel._check_nodeG  s�   € ð Œ<Ð-Ò-Ð-Øœ AœˆJØ×'Ò'¨
Ñ3Ô3ˆDØ”NˆEØÝÔ Ô(ÝÔ Ô&ÝÔ Ô'ÝÔ Ô)ð	ð ð õ #Ð#iÐafÐ#iÐ#iÐ#iÑjÔjÐjØˆr   r
   )F)7Ú__name__Ú
__module__Ú__qualname__r   rK   rN   r4   rX   r9   r7   r\   rb   re   rh   rk   rn   rq   rs   ru   rx   rò   r‚   r‰   r�   r�   r’   r—   r™   r›   rž   r¡   r¤   rª   r³   r¶   r¹   ÚstaticmethodrÕ   rÓ   rã   rï   rö   rø   rû   rÿ   r  r  r
  r  Úboolr  ré   r#  rU   rj   r   r   r   rH   rH   Y   s{  € € € € € ð˜jð ð ð ð ð%ð %ð %ð,ð ,ð ,ð6ð 6ð 6ð ð  ð  ð%ð %ð %ð'ð 'ð 'ðTð Tð Tð/ð /ð /ð#ð #ð #ð?ð ?ð ?ð ð  ð  ð:ð :ð :ð
ð ð ðð ð ðð ð ð¨3ð ð ð ð ð ð ð ðRð Rð Rðð ð ð1ð 1ð 1ð&ð &ð &ð	#ð 	#ð 	#ð#ð #ð #ð	ð 	ð 	ð 	ðð ð ð ð*ð *ð *ð *ð
ð 
ð 
ðð ð ð"ð ð ð(	ð 	ð 	ð ðð ñ „\ðð ð[ð [ñ „\ð[ðz9ð 9ð 9ð1ð 1ð 1ð 1ð  ð/ð /ñ „\ð/ðOð Oð OðSð Sð Sð
 ð1ð 1ñ „\ð1ðRð Rð RðVð Vð Vð
2ð 2ð 2ð6Uð Uð UðR¨#ð R°$ð Rð Rð Rð Rð
2/ð 2/ð 2/ðhDð Dð Dðð ð ð ðð ð ð ð r   rH   )Úpathlibr   r   Úonnx.helperÚhelperr.   Úonnx.numpy_helperÚnumpy_helperr†   Úonnx.onnx_pbr   Úquant_utilsr   r   r*   rH   r   r   r   ú<module>rE     s¿   ðð
 Ð Ð Ð Ð Ð à €€€Ø !Ð !Ð !Ð !Ð !Ð !Ø -Ð -Ð -Ð -Ð -Ð -Ø #Ð #Ð #Ð #Ð #Ð #à 9Ð 9Ð 9Ð 9Ð 9Ð 9Ð 9Ð 9ðG*ð G*ð G*ðTð ð ð ð ñ ô ð ð ð r   