Ë
    ÝÍ:jx]  ã                   óf   — 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y)	é    )ÚPathN)Ú
ModelProtoé   )Úattribute_to_kwargÚfind_by_namec                 ó^  — t        «       }|j                  d„ | j                  D «       «       |j                  d„ | j                  D «       «       g }| j                  D �]Í  }|}|j                  D �cg c]R  }|j
                  t        j                  j                  k(  s'|j
                  t        j                  j                  k(  r|‘ŒT }}|�rMi }|j                  D ]ú  }i }	|j
                  t        j                  j                  k(  r9t        |j                  |«      \  }
}|j                  |
i}	|j                  |«       n…|j
                  t        j                  j                  k(  rSg }|j                  D ]3  }t        ||«      \  }
}|j                  |
«       |j                  |«       Œ5 |j                  |i}	nt        |«      }	|j                  |	«       Œü t!        j"                  |j$                  |j&                  |j                  fd|j                  i|¤Ž}|j                  |«       �ŒÐ | j)                  d«       | j                  j+                  |«       |j-                  d„ | j                  D «       «       g }| j.                  D ]=  }|j                  |v r|j1                  |j                  «       Œ-|j                  |«       Œ? | j&                  D �ci c]  }|j                  |“Œ }}|D ]U  }| j.                  j1                  |«       |j                  |v sŒ-	 | j&                  j1                  ||j                     «       ŒW |j-                  d	„ | j&                  D «       «       | |fS c c}w c c}w # t2        $ r+ |j4                  dk  rt7        d|j                  › d�«       Y Œ»w xY w)
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   óH   K  — | ]  }|j                   D ]	  }|sŒ|–— Œ Œ y ­w©N)Úinput)Ú.0ÚnodeÚ
input_names      úx/home/mcse/projects/srt_converter/srt-converter-venv/lib/python3.12/site-packages/onnxruntime/quantization/onnx_model.pyú	<genexpr>z-_clean_initializers_helper.<locals>.<genexpr>   s&   è ø€ Ò"p°$ÐW[×WaÑWaÒ"pÈÒeo¤:Ð"p :Ñ"pùs   ‚"™	"c              3   óN   K  — | ]  }|j                   sŒ|j                   –— Œ y ­wr
   ©Úname)r   Úg_outs     r   r   z-_clean_initializers_helper.<locals>.<genexpr>   s   è ø€ Ò"V°%È5Ï:Ë: 5§:¥:Ñ"Vùs   ‚%”%r   r   c              3   óB   K  — | ]  }|j                   D ]  }|–— Œ Œ y ­wr
   )Úoutput)r   r   r   s      r   r   z-_clean_initializers_helper.<locals>.<genexpr>@   s$   è ø€ Ò-f¸ÐZ^×ZeÑZeÒ-fÐPV¬fÐ-f¨fÑ-fùs   ‚é   zWarning: invalid weight name z' found in the graph (not a graph input)c              3   ó4   K  — | ]  }|j                   –— Œ y ­wr
   r   )r   r   s     r   r   z-_clean_initializers_helper.<locals>.<genexpr>T   s   è ø€ Ò-R¸U¨e¯j­jÑ-Rùs   ‚)ÚsetÚupdater   r   Ú	attributeÚtypeÚonnxÚAttributeProtoÚGRAPHÚGRAPHSÚ_clean_initializers_helperÚgr   Ú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ÚattrÚgraph_attrsÚkwargsÚnew_attributeÚcleaned_sub_graphÚsub_requesting_tensor_namesÚcleaned_graphesÚsubgraphÚunused_initializerr+   r   Úname_to_inputs                     r   r!   r!      s^  € ô "›eÐØ×"Ñ"Ñ"p¸%¿*¹*Ô"pÔpØ×"Ñ"Ñ"V¸5¿<¹<Ô"VÔVà€IØ—
‘
ó  #ˆØˆð Ÿ™ö
àØ�y‰yœD×/Ñ/×5Ñ5Ò5¸¿¹Äd×FYÑFY×F`ÑF`Ò9`ò ð
ˆð 
ò
 ØˆFØŸ™ò -�Ø "�Ø—9‘9¤× 3Ñ 3× 9Ñ 9Ò9ô 3°4·6±6¸5ÓAñØ)Ø3à%)§Y¡YÐ0AÐ$B�MØ+×2Ñ2Ð3NÕOØ—Y‘Y¤$×"5Ñ"5×"<Ñ"<Ò<Ø&(�OØ$(§K¡Kò T˜ô 7°xÀÓGñØ-Ø7à'×.Ñ.Ð/@ÔAØ/×6Ñ6Ð7RÕSðTð &*§Y¡Y°Ð$@‘Mä$6°tÓ$<�MØ—‘˜mÕ,ð+-ô, #×,Ñ,¨T¯\©\¸4¿:¹:ÀtÇ{Á{ÑmÐY]×YbÑYbÐmÐflÑmˆHØ×Ñ˜Ö"ðA #ðD 
×Ñ�VÔØ	‡J�J×Ñ�iÔ à×-Ñ-Ñ-fÀÇÁÔ-fÔfàÐØ×(Ñ(ò 3ˆØ×ÑÐ6Ñ6Ø#×*Ñ*¨;×+;Ñ+;Õ<ð ×%Ñ% kÕ2ð3ð 5:·K±KÖ@¨5�U—Z‘Z Ñ&Ð@€MÐ@Ø)ò uˆØ×Ñ× Ñ  Ô-Ø×Ñ˜}Ò,ðuØ—‘×"Ñ" =°×1AÑ1AÑ#BÕCð	uð ×-Ñ-Ñ-RÀeÇkÁkÔ-RÔRàÐ)Ð)Ð)ùòs
ùòZ Aøô !ò uØ×#Ñ# aÒ'ÜÐ9¸+×:JÑ:JÐ9KÐKrÐsÔtùðuús   Á1AM.ËM3Ì(M8Í81N,Î+N,c                   ót  — 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d5d„Zd5d„Zd5d„Zd„ Z d „ Z!d!„ Z"d"„ Z#e$d#„ «       Z%e$d$„ «       Z&d%„ Z'd6d&„Z(e$d'„ «       Z)d(„ Z*d)„ Z+e$d*„ «       Z,d+„ Z-d,„ Z.d-„ Z/d.„ Z0ded/e1fd0„Z2d1„ Z3d2„ Z4d5d3„Z5d4„ Z6y)7Ú	ONNXModelr1   c                 ó   — || _         y r
   )r1   )Úselfr1   s     r   Ú__init__zONNXModel.__init__Z   s	   € Øˆ�
ó    c                 óB   — | j                   j                  j                  S r
   )r1   r0   r   ©rB   s    r   ÚnodeszONNXModel.nodes]   s   € Ø�z‰z×Ñ×$Ñ$Ð$rD   c                 óB   — | j                   j                  j                  S r
   )r1   r0   r+   rF   s    r   r+   zONNXModel.initializer`   s   € Ø�z‰z×Ñ×+Ñ+Ð+rD   c                 ó  — t        |«      dk(  rt        d«      ‚| j                  «       D ]  }| j                  |d«       Œ |D ]B  }| j                  |«       | j                  j
                  j                  j                  |«       ŒD y )Nr   zCan add an empty list.Úgain)ÚlenÚ
ValueErrorr+   Ú_check_initr1   r0   r$   )rB   ÚinitsÚinits      r   Úinitializer_extendzONNXModel.initializer_extendc   s|   € Üˆu‹:˜Š?ÜÐ5Ó6Ð6Ø×$Ñ$Ó&ò 	+ˆDØ×Ñ˜T 6Õ*ð	+àò 	6ˆDØ×Ñ˜TÔ"Ø�J‰J×Ñ×(Ñ(×/Ñ/°Õ5ñ	6rD   c                 ó.   — | j                   j                  S r
   )r1   r0   rF   s    r   r0   zONNXModel.graphl   s   € Ø�z‰z×ÑÐrD   c                 ó.   — | j                   j                  S r
   )r1   r.   rF   s    r   r.   zONNXModel.ir_versiono   s   € Ø�z‰z×$Ñ$Ð$rD   c                 ó.   — | j                   j                  S r
   )r1   Úopset_importrF   s    r   rT   zONNXModel.opset_importr   s   € Ø�z‰z×&Ñ&Ð&rD   c                 óÞ   — | j                   j                  D ]  }|j                  |k(  sŒ||_         y  | j                   j                  j	                  t        j                  ||«      g«       y r
   )r1   rT   ÚdomainÚversionr)   r%   Úmake_opsetid)rB   rV   rW   Úopsets       r   Úset_opset_importzONNXModel.set_opset_importu   s[   € Ø—Z‘Z×,Ñ,ò 	ˆEØ�|‰|˜vÓ%Ø '�”Ùð	ð
 	�
‰
×Ñ×&Ñ&¬×(@Ñ(@ÀÈÓ(QÐ'RÕSrD   c                 ó¨   — || j                   j                  j                  v r0| j                   j                  j                  j                  |«       y y r
   )r1   r0   r   r,   ©rB   r   s     r   Úremove_nodezONNXModel.remove_node}   s=   € Ø�4—:‘:×#Ñ#×(Ñ(Ñ(Ø�J‰J×Ñ×!Ñ!×(Ñ(¨Õ.ð )rD   c                 ó4   — |D ]  }| j                  |«       Œ y r
   )r]   )rB   Únodes_to_remover   s      r   Úremove_nodeszONNXModel.remove_nodes�   s   € Ø#ò 	#ˆDØ×Ñ˜TÕ"ñ	#rD   c                 ó‚   — | j                   j                  j                  j                  | j	                  |«      g«       y r
   )r1   r0   r   r)   Ú_check_noder\   s     r   Úadd_nodezONNXModel.add_node…   s.   € Ø�
‰
×Ñ×Ñ×$Ñ$ d×&6Ñ&6°tÓ&<Ð%=Õ>rD   c                 ó4   — |D ]  }| j                  |«       Œ y r
   )rc   )rB   Únodes_to_addr   s      r   Ú	add_nodeszONNXModel.add_nodesˆ   s   € Ø ò 	 ˆDØ�M‰M˜$Õñ	 rD   c                 óð   — t        |j                  | j                  j                  j                  «      €B| j                  |«       | j                  j                  j                  j                  |g«       y y r
   )r   r   r1   r0   r+   rM   r)   )rB   Útensors     r   Úadd_initializerzONNXModel.add_initializerŒ   sW   € Ü˜Ÿ™ T§Z¡Z×%5Ñ%5×%AÑ%AÓBÐJØ×Ñ˜VÔ$Ø�J‰J×Ñ×(Ñ(×/Ñ/°°Õ9ð KrD   c                 ót   — | j                   j                  j                  D ]  }|j                  |k(  sŒ|c S  y r
   ©r1   r0   r+   r   )rB   r   rh   s      r   Úget_initializerzONNXModel.get_initializer‘   s7   € Ø—j‘j×&Ñ&×2Ñ2ò 	ˆFØ�{‰{˜dÓ"Ø’ð	ð rD   c                 ót   — | j                   j                  j                  D ]  }|j                  |k(  sŒ|c S  y r
   )r1   r0   r   r   )rB   r   r   s      r   Úfind_graph_inputzONNXModel.find_graph_input—   s7   € Ø—Z‘Z×%Ñ%×+Ñ+ò 	ˆEØ�z‰z˜ZÓ'Ø’ð	ð rD   c                 ót   — | j                   j                  j                  D ]  }|j                  |k(  sŒ|c S  y r
   )r1   r0   r   r   )rB   Úoutput_namer   s      r   Úfind_graph_outputzONNXModel.find_graph_output�   s7   € Ø—j‘j×&Ñ&×-Ñ-ò 	ˆFØ�{‰{˜kÓ)Ø’ð	ð rD   Útensor_namec                 ó\  — | j                   j                  j                  D �ci c]  }|j                  |j                  “Œ }}||v r||   j
                  S | j                  |«      }|r|j                  j
                  S | j                  |«      }|r|j                  j
                  S y c c}w r
   )r1   r0   Ú
value_infor   r   Útensor_typern   rq   )rB   rr   ÚobjÚtensor_type_mapÚg_inputÚg_outputs         r   Úget_tensor_typezONNXModel.get_tensor_type£   sš   € Ø9=¿¹×9IÑ9I×9TÑ9TÖU°#˜3Ÿ8™8 S§X¡XÑ-ÐUˆÐUà˜/Ñ)Ø" ;Ñ/×;Ñ;Ð;à×'Ñ'¨Ó4ˆÙØ—<‘<×+Ñ+Ð+à×)Ñ)¨+Ó6ˆÙØ—=‘=×,Ñ,Ð,àùò Vs   £B)c                 ój  — | j                   j                  j                  D ]h  }|j                  dk(  sŒ|j                  d   |k(  sŒ&|j
                  D ]4  }|j                  dk(  sŒt        j                  |j                  «      c c S  Œj | j                  |«      }|�t        j                  |«      S y )NÚConstantr   Úvalue)r1   r0   r   r'   r   r   r   Úonnx_numpy_helperÚto_arrayÚtrl   )rB   rp   r   r5   r+   s        r   Úget_constant_valuezONNXModel.get_constant_value³   s¡   € Ø—J‘J×$Ñ$×)Ñ)ò 	FˆDØ�|‰|˜zÓ)Ø—;‘;˜q‘> [Ó0Ø $§¡ò F˜ØŸ9™9¨Ó/Ü#4×#=Ñ#=¸d¿f¹fÓ#EÔEñFð	Fð ×*Ñ*¨;Ó7ˆØÐ"Ü$×-Ñ-¨kÓ:Ð:àrD   c                 ó|   — | j                   j                  j                  D �ch c]  }|j                  ’Œ c}S c c}w r
   rk   )rB   r+   s     r   Úget_initializer_name_setz"ONNXModel.get_initializer_name_setÂ   s,   € Ø48·J±J×4DÑ4D×4PÑ4PÖQ [�× Ó ÒQÐQùÒQs   £9c                 ó†  — || j                   j                  j                  v rŸ| j                   j                  j                  j                  |«       | j                   j                  j                  D ]L  }|j
                  |j
                  k(  sŒ| j                   j                  j                  j                  |«        y  y y r
   )r1   r0   r+   r,   r   r   )rB   rh   r   s      r   Úremove_initializerzONNXModel.remove_initializerÅ   s�   € Ø�T—Z‘Z×%Ñ%×1Ñ1Ñ1Ø�J‰J×Ñ×(Ñ(×/Ñ/°Ô7ØŸ™×)Ñ)×/Ñ/ò �Ø—:‘: §¡Ó,Ø—J‘J×$Ñ$×*Ñ*×1Ñ1°%Ô8Ùñð 2rD   c                 ó4   — |D ]  }| j                  |«       Œ y r
   )r…   )rB   Úinit_to_remover+   s      r   Úremove_initializerszONNXModel.remove_initializersÍ   s   € Ø)ò 	1ˆKØ×#Ñ# KÕ0ñ	1rD   c                 óØ   — | j                  «       }t        «       }| j                  j                  j                  D ],  }|j
                  |vsŒ|j                  |j
                  «       Œ. |S r
   )rƒ   r   r1   r0   r   r   Úadd)rB   Úinitializer_namesÚnon_initializer_inputsr   s       r   Úget_non_initializer_inputsz$ONNXModel.get_non_initializer_inputsÑ   s_   € Ø ×9Ñ9Ó;ÐÜ!$£ÐØ—Z‘Z×%Ñ%×+Ñ+ò 	7ˆEØ�z‰zÐ!2Ò2Ø&×*Ñ*¨5¯:©:Õ6ð	7ð &Ð%rD   c                 óº   — i }| j                   j                  j                  D ]5  }|j                  D ]$  }|sŒ||vr|g||<   Œ||   j	                  |«       Œ& Œ7 |S r
   )r1   r0   r   r   r$   )rB   Úinput_name_to_nodesr   r   s       r   r�   zONNXModel.input_name_to_nodesÙ   sr   € Ø ÐØ—J‘J×$Ñ$×)Ñ)ò 	EˆDØ"Ÿj™jò E�
ÚØ!Ð)<Ñ<Ø;?¸&Ð+¨JÒ7à+¨JÑ7×>Ñ>¸tÕDñEð	Eð #Ð"rD   c                 ó†   — i }| j                   j                  j                  D ]  }|j                  D ]
  }|sŒ|||<   Œ Œ |S r
   )r1   r0   r   r   )rB   Úoutput_name_to_noder   rp   s       r   r‘   zONNXModel.output_name_to_nodeä   sP   € Ø ÐØ—J‘J×$Ñ$×)Ñ)ò 	<ˆDØ#Ÿ{™{ò <�ÚØ7;Ð'¨Ò4ñ<ð	<ð #Ð"rD   Nc                 ó�   — |€| j                  «       }g }|j                  D ]"  }||v sŒ||   D ]  }|j                  |«       Œ Œ$ |S r
   )r�   r   r$   )rB   r   r�   Úchildrenr   s        r   Úget_childrenzONNXModel.get_childrenì   s_   € ØÐ&Ø"&×":Ñ":Ó"<ÐàˆØ—k‘kò 	*ˆFØÐ,Ò,Ø/°Ñ7ò *�DØ—O‘O DÕ)ñ*ð	*ð ˆrD   c                 ó‚   — |€| j                  «       }g }|j                  D ]  }||v sŒ|j                  ||   «       Œ |S r
   )r‘   r   r$   )rB   r   r‘   Úparentsr   s        r   Úget_parentszONNXModel.get_parents÷   sQ   € ØÐ&Ø"&×":Ñ":Ó"<ÐàˆØ—Z‘Zò 	;ˆEØÐ+Ò+Ø—‘Ð2°5Ñ9Õ:ð	;ð ˆrD   c                 óŠ   — |€| j                  «       }t        |j                  «      |k  ry |j                  |   }||vry ||   S r
   )r‘   rK   r   )rB   r   Úidxr‘   r   s        r   Ú
get_parentzONNXModel.get_parent  sN   € ØÐ&Ø"&×":Ñ":Ó"<Ðäˆt�z‰z‹?˜cÒ!Øà—
‘
˜3‘ˆØÐ+Ñ+Øà" 5Ñ)Ð)rD   c                 ój   — t        |j                  «      }|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   r)   r   )rB   Ú	node_nameÚnew_nodes_listr0   Úgraph_nodes_listr   s         r   Úfind_node_by_namezONNXModel.find_node_by_name  s3   € ô   §
¡
Ó+ÐØ×Ñ Ô/Ü˜IÐ'7Ó8ˆØˆrD   c                 ó   — d}| j                   j                  j                  D ]Y  }|j                  sŒ|j                  j	                  |«      sŒ,	 t        |j                  t        |«      d «      }t        ||«      }Œ[ |S # t        $ r Y Œiw xY w)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)	r1   r0   r   r   Ú
startswithÚintrK   ÚmaxrL   )rB   Únode_name_prefixÚsuffixr   Úindexs        r   Úget_largest_node_name_suffixz&ONNXModel.get_largest_node_name_suffix  s‰   € ð
 ˆà—J‘J×$Ñ$×)Ñ)ò 	ˆDØ�y‹y˜TŸY™Y×1Ñ1Ð2BÕCðÜ §	¡	¬#Ð.>Ó*?Ð*AÐ BÓC�EÜ  ¨Ó/‘Fð		ð ˆøô "ò Ùðús   Á-BÂ	BÂBc                 ó  — d}| j                   j                  j                  D ]L  }|j                  j	                  |«      sŒ	 t        |j                  t        |«      d «      }t        ||«      }ŒN |S # t        $ r Y Œ\w xY w)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)	r1   r0   r+   r   r£   r¤   rK   r¥   rL   )rB   Úinitializer_name_prefixr§   r+   r¨   s        r   Ú#get_largest_initializer_name_suffixz-ONNXModel.get_largest_initializer_name_suffix+  s‡   € ð ˆàŸ:™:×+Ñ+×7Ñ7ò 	ˆKØ×Ñ×*Ñ*Ð+BÕCðÜ × 0Ñ 0´Ð5LÓ1MÐ1OÐ PÓQ�EÜ  ¨Ó/‘Fð		ð ˆøô "ò Ùðús   Á-A4Á4	B Á?B c                 ó�   — g }|j                   D ]4  }|j                  D ]#  }||j                  k(  sŒ|j                  |«       Œ% Œ6 |S )zD
        Find all nodes with given initializer as an input.
        )r   r   r   r$   )rB   r0   r+   rG   r   Ú
node_inputs         r   Úfind_nodes_by_initializerz#ONNXModel.find_nodes_by_initializer?  sP   € ð ˆØ—J‘Jò 	'ˆDØ"Ÿj™jò '�
Ø ×!1Ñ!1Ó1Ø—L‘L Õ&ñ'ð	'ð ˆrD   c                 óš   — t        t        |«      dz
  dd«      D ]/  }||   }|j                  D ]  }|j                  | k(  sŒ||fc c S  Œ1 y)Nr   r¢   )NN)ÚrangerK   r+   r   )r   Ú
graph_pathÚgidr0   rh   s        r   Ú__get_initializerzONNXModel.__get_initializerJ  s\   € äœ˜Z›¨1Ñ,¨b°"Ó5ò 	)ˆCØ˜s‘OˆEØ×+Ñ+ò )�Ø—;‘; $Ó&Ø! 5˜=Ô(ñ)ð	)ð
 rD   c           	      ó
  — g }| d   }|j                   D �]®  }|j                  D �cg c]#  }|j                  dk(  s|j                  dk(  sŒ"|‘Œ% }}|�r$i }|j                  D ]Ñ  }|j                  dk(  r=| j                  |j                  «       |j
                  t        j                  | «      i}nr|j                  dk(  rXg }|j                  D ]8  }	| j                  |	«       |j                  t        j                  | «      g«       Œ: |j
                  |i}nt        |«      }|j                  |«       ŒÓ 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"                  |«      }ŒM|j
                  d
k(  rt        j"                  |«      }Œr|j
                  dk(  sŒ‚t        j"                  |«      }Œ˜ |
dk(  �re|dk(  �r_|dk(  �rY|j                  d   }|dk(  �r;t        j%                  |j                  d   | «      \  }}|rºt'        j(                  |«      }t'        j*                  |j,                  «      }|j
                  |_        |j.                  j1                  |«       |j                  D ].  }|j
                  |k(  sŒ|j                  j1                  |«        n |j.                  j                  |g«       nY|dz  }t        j                  d|j                  d   g|g|j
                  r|j
                  dz   nd¬«      }|j                  |«       t        j                  d|j                  d   |g|j                   d   t3        |j                  «      dkD  rdndz   g|j
                  r|j
                  dz   nd¬«      }|j                  |«       t3        |j                  «      dkD  s�Œt        j                  d|j                   d   dz   |j                  d   g|j                   |j
                  r|j
                  dz   nd¬«      }|j                  |«       �Œ‹|j                  |«       �Œž|j                  |«       �Œ± |j5                  d«       |j                   j                  |«       | j7                  «        |S c c}w )Nr¢   é   é
   r   ÚGemmg      ð?r   ÚalphaÚbetaÚtransAÚtransBr   Ú_TransposedÚ	TransposeÚ
_TransposeÚ )ÚinputsÚoutputsr   ÚMatMulé   Ú_MatMulÚAddÚ_Addr   )r   r   r   r$   r"   r   r@   Ú$_ONNXModel__replace_gemm_with_matmulr#   r)   r   r   r%   r&   r'   r   r   Úget_attribute_valueÚ_ONNXModel__get_initializerr~   r   Ú
from_arrayÚTr+   r,   rK   r(   Úpop)r²   r3   r0   r   r5   r6   r7   Úkvr}   r<   r¹   rº   r»   r¼   ÚinputBÚBÚBs_graphÚB_arrayÚB_transr   Útranspose_nodeÚmatmul_noderc   s                          r   Ú__replace_gemm_with_matmulz$ONNXModel.__replace_gemm_with_matmulS  sY  € àˆ	Ø˜2‘ˆØ—J‘Jó S	'ˆDØ,0¯N©NÖ` D¸d¿i¹iÈ1ºnÐPT×PYÑPYÐ]_ÓP_š4Ð`ˆKÐ`ÚØ�Ø ŸN™Nò &�DØ—y‘y A’~Ø"×)Ñ)¨$¯&©&Ô1Ø"Ÿi™i¬×)MÑ)MÈjÓ)YÐZ™ØŸ™ bšØ "˜Ø(,¯©ò ]˜HØ&×-Ñ-¨hÔ7Ø!ŸL™L¬)×*NÑ*NÈzÓ*ZÐ)[Õ\ð]ð #Ÿi™i¨Ð/™ä/°Ó5˜Ø—M‘M "Õ%ð&ô #×,Ñ,Ø—L‘L $§*¡*¨d¯k©kñØ@DÇ	Á	ðØMSñ�ð �|‰|˜vÓ%Ø�Ø�Ø�Ø�Ø ŸN™Nò G�DØ—y‘y GÒ+Ü +× ?Ñ ?ÀÓ E™ØŸ™ fÒ,Ü*×>Ñ>¸tÓD™ØŸ™ hÒ.Ü!,×!@Ñ!@ÀÓ!F™ØŸ™ hÓ.Ü!,×!@Ñ!@ÀÓ!F™ðGð ˜C“< D¨C£K°F¸a³KØ!ŸZ™Z¨™]�FØ “{Ü&/×&AÑ&AÀ$Ç*Á*ÈQÁ-ÐQ[Ó&\™˜˜8Ùä&7×&@Ñ&@ÀÓ&C˜GÜ&7×&BÑ&BÀ7Ç9Á9Ó&M˜GØ+,¯6©6˜GœLØ$×0Ñ0×7Ñ7¸Ô:Ø)1¯©ò * Ø#(§:¡:°Ó#7Ø$,§N¡N×$9Ñ$9¸%Ô$@Ù$)ð*ð %×0Ñ0×7Ñ7¸¸	ÕBà" mÑ3˜FÜ-8×-BÑ-BØ +Ø(,¯
©
°1© Ø)/¨ØAEÇÂ T§Y¡Y°Ò%=ÐPRô	.˜Nð &×,Ñ,¨^Ô<ä"-×"7Ñ"7Ø Ø $§
¡
¨1¡¨vÐ6Ø!%§¡¨Q¡ÄÀDÇJÁJÃÐRSÒ@S±9ÐY[Ñ!\Ð ]Ø6:·i²i˜TŸY™Y¨Ò2ÀRô	#�Kð ×$Ñ$ [Ô1ä˜4Ÿ:™:“¨Ô*Ü#.×#8Ñ#8Ø!Ø$(§K¡K°¡N°YÑ$>ÀÇ
Á
È1ÁÐ#NØ$(§K¡KØ7;·y²y §¡¨VÒ!3Àbô	$˜ð "×(Ñ(¨Ö2ð ×$Ñ$ TÖ*ð × Ñ  Ö&ðgS	'ðj 	×Ñ˜Ô Ø�
‰
×Ñ˜)Ô$Ø�‰ÔØˆùòo as   ¦#TÁ
Tc                 óP   — | j                  «       g}t        j                  |«       y r
   )r0   r@   rÈ   )rB   r²   s     r   Úreplace_gemm_with_matmulz"ONNXModel.replace_gemm_with_matmul±  s   € Ø—j‘j“l�^ˆ
Ü×,Ñ,¨ZÕ8rD   c                 ó\  — | j                  «        |rCt        j                  j                  | j                  dt        |«      j                  dz   d¬«       | j                  j                  j                  D ]  }| j                  |d«       Œ t        j                  | j                  |«       y)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_datar1   r   r   r0   r+   rM   Ú
save_model)rB   Úoutput_pathÚuse_external_data_formatrO   s       r   Úsave_model_to_filezONNXModel.save_model_to_fileµ  s�   € ð 	×ÑÔÙ#Ü×%Ñ%×DÑDØ—
‘
Ø(,Ü˜kÓ*×/Ñ/°'Ñ9Ø"&ð	 Eô ð —J‘J×$Ñ$×0Ñ0ò 	*ˆDØ×Ñ˜T 5Õ)ð	*ä�‰˜Ÿ
™
 KÕ0rD   c                 óÒ   — t        |t        «      rt        |t        «      sJ ‚t        t        | j                  «      «      D ]$  }| j                  |   |k(  sŒ|| j                  |<   Œ& y r
   )Ú
isinstanceÚstrr±   rK   r   )r   Úold_input_nameÚnew_input_nameÚjs       r   Úreplace_node_inputzONNXModel.replace_node_inputÅ  sT   € ä˜.¬#Ô.´:¸nÌcÔ3RÐRÐRÜ”s˜4Ÿ:™:“Ó'ò 	/ˆAØ�z‰z˜!‰} Ó.Ø .�—
‘
˜1’ñ	/rD   c                 ó|   — | j                   j                  j                  D ]  }t        j	                  |||«       Œ y r
   )r1   r0   r   r@   rë   )rB   rè   ré   r   s       r   Úreplace_input_of_all_nodesz$ONNXModel.replace_input_of_all_nodesÌ  s5   € Ø—J‘J×$Ñ$×)Ñ)ò 	OˆDÜ×(Ñ(¨¨~¸~ÕNñ	OrD   c                 óš   — | j                   j                  j                  D ](  }|j                  |v sŒt        j                  |||«       Œ* y r
   )r1   r0   r   r   r@   rë   )rB   rè   ré   Únode_names_setr   s        r   Úreplace_input_of_nodesz ONNXModel.replace_input_of_nodesÐ  sA   € Ø—J‘J×$Ñ$×)Ñ)ò 	SˆDØ�y‰y˜NÒ*Ü×,Ñ,¨T°>À>ÕRñ	SrD   c                 óÒ   — t        |t        «      rt        |t        «      sJ ‚t        t        | j                  «      «      D ]$  }| j                  |   |k(  sŒ|| j                  |<   Œ& y r
   )ræ   rç   r±   rK   r   )r   Úold_output_nameÚnew_output_namerê   s       r   Úreplace_node_outputzONNXModel.replace_node_outputÕ  sV   € ä˜/¬3Ô/´J¸ÔPSÔ4TÐTÐTÜ”s˜4Ÿ;™;Ó'Ó(ò 	1ˆAØ�{‰{˜1‰~ Ó0Ø!0�—‘˜A’ñ	1rD   c                 ó|   — | j                   j                  j                  D ]  }t        j	                  |||«       Œ y r
   )r1   r0   r   r@   rô   )rB   rò   ró   r   s       r   Úreplace_output_of_all_nodesz%ONNXModel.replace_output_of_all_nodesÜ  s5   € Ø—J‘J×$Ñ$×)Ñ)ò 	RˆDÜ×)Ñ)¨$°ÀÕQñ	RrD   c                 óš   — | j                   j                  j                  D ](  }|j                  |v sŒt        j                  |||«       Œ* y r
   )r1   r0   r   r   r@   rô   )rB   rò   ró   rï   r   s        r   Úreplace_output_of_nodesz!ONNXModel.replace_output_of_nodesà  sA   € Ø—J‘J×$Ñ$×)Ñ)ò 	VˆDØ�y‰y˜NÒ*Ü×-Ñ-¨d°OÀ_ÕUñ	VrD   c                 ó¨  — | j                  «       }g }| j                  «       }|D ]T  }|j                  dk(  sŒ| j                  |j                  d   «      rŒ2|j                  d   |vsŒD|j                  |«       ŒV | j                  |«       g }| j                  «       D ]   }|j                  |vsŒ| j                  |j                  «      rŒ.|j                  |«       | j                  «       j                  D ]E  }|j                  |j                  k(  sŒ| j                  «       j                  j                  |«       ŒG Œ¢ | j                  |«       y )Nr|   r   )r�   rG   r'   Úis_graph_outputr   r$   r`   r+   r   r0   r   r,   rˆ   )rB   r�   Úunused_nodesrG   r   Úununsed_weightsÚwÚgraph_inputs           r   Úremove_unused_constantz ONNXModel.remove_unused_constantå  s#  € Ø"×6Ñ6Ó8Ðð ˆØ—
‘
“ˆØò 	*ˆDà—‘ 
Ó*Ø×,Ñ,¨T¯[©[¸©^Õ<Ø—K‘K ‘NÐ*=Ò=à×#Ñ# DÕ)ð	*ð 	×Ñ˜,Ô'àˆØ×!Ñ!Ó#ò 	?ˆAØ�v‰vÐ0Ò0¸×9MÑ9MÈaÏfÉfÕ9UØ×&Ñ& qÔ)à#'§:¡:£<×#5Ñ#5ò ?�KØ"×'Ñ'¨1¯6©6Ó1ØŸ
™
›×*Ñ*×1Ñ1°+Õ>ñ?ð		?ð 	× Ñ  Õ1rD   c                 óh   ‡— t        ˆfd„| j                  j                  j                  D «       «      S )Nc              3   ó<   •K  — | ]  }|j                   ‰k(  –— Œ y ­wr
   r   )r   r   rp   s     €r   r   z,ONNXModel.is_graph_output.<locals>.<genexpr>  s   øè ø€ ÒT°&�6—;‘; +Õ-ÑTùó   ƒ)Úanyr1   r0   r   )rB   rp   s    `r   rú   zONNXModel.is_graph_output   s$   ø€ ÜÓT¸D¿J¹J×<LÑ<L×<SÑ<SÔTÓTÐTrD   Úreturnc                 óh   ‡— t        ˆfd„| j                  j                  j                  D «       «      S )Nc              3   ó<   •K  — | ]  }|j                   ‰k(  –— Œ y ­wr
   r   )r   r   rr   s     €r   r   z+ONNXModel.is_graph_input.<locals>.<genexpr>  s   øè ø€ ÒQ°�5—:‘: Õ,ÑQùr  )r  r1   r0   r   )rB   rr   s    `r   Úis_graph_inputzONNXModel.is_graph_input  s$   ø€ ÜÓQ¸$¿*¹*×:JÑ:J×:PÑ:PÔQÓQÐQrD   c                 ó  — dgt        | j                  «       «      z  }i }g }t        | j                  «       «      D ]‚  \  }}t        d„ |j                  D «       «      ||<   ||   dk(  r#|j                  | j                  «       |   «       ŒP|j                  D ]$  }|sŒ||vr|g||<   Œ||   j                  |«       Œ& Œ„ | j                  «       D �cg c]  }|j                  ‘Œ }}| j                  j                  j                  D �	cg c]  }	|	j                  ‘Œ }
}	||
z   }|j                  «        d }|D ]O  }||k(  rŒ	|}||v sŒ||   D ]8  }||   dz
  ||<   ||   dk(  sŒ|j                  | j                  «       |   «       Œ: ŒQ d}t        |«      }||k  ri||   j                  D ]L  }||v sŒ||   D ]=  }||   dz
  ||<   ||   dk(  sŒ|j                  | j                  «       |   «       |dz   }Œ? ŒN |dz   }||k  rŒi|t        | j                  «       j                  «      k(  sJ d«       ‚| j                  «       j                  d«       | j                  «       j                  j                  |«       y c c}w c c}	w )Nr   c              3   ó&   K  — | ]	  }|sŒd –— Œ y­w)r   N© )r   Ú_s     r   r   z-ONNXModel.topological_sort.<locals>.<genexpr>  s   è ø€ Ò&B¨QÂ¤qÑ&Bùs   ‚Šr   zGraph is not a DAGr   )rK   rG   Ú	enumerateÚsumr   r$   r+   r   r1   r0   Úsortr   r   r(   r)   )rB   Ú
deps_countÚdeps_to_nodesÚsorted_nodesÚnode_idxr   r   rO   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ò 	?‰NˆH�dä#&Ñ&B°$·*±*Ô&BÓ#BˆJ�xÑ Ø˜(Ñ# qÒ(Ø×#Ñ# D§J¡J£L°Ñ$:Ô;Øà"Ÿj™jò ?�
Ù!ØØ ]Ñ2Ø19°
�M *Ò-à! *Ñ-×4Ñ4°XÕ>ñ?ð	?ð 48×3CÑ3CÓ3EÖF¨4˜TŸY›YÐFÐÐFØ59·Z±Z×5EÑ5E×5KÑ5KÖL¨E˜UŸZ›ZÐLÐÐLØ'Ð*;Ñ;ˆØ×ÑÔØˆØ%ò 		DˆJØ *Ò,Øà(ˆOØ˜]Ò*Ø -¨jÑ 9ò D�HØ+5°hÑ+?À!Ñ+C�J˜xÑ(Ø! (Ñ+¨qÓ0Ø$×+Ñ+¨D¯J©J«L¸Ñ,BÕCñDð		Dð ˆÜ�,Óˆà�cŠkØ& uÑ-×4Ñ4ò *�Ø˜]Ò*Ø$1°&Ñ$9ò *˜Ø/9¸(Ñ/CÀaÑ/G˜
 8Ñ,Ø% hÑ/°1Ó4Ø(×/Ñ/°·
±
³¸XÑ0FÔGØ"%¨¡'™Cñ	*ð*ð ˜A‘IˆEð �c‹kð ”c˜$Ÿ*™*›,×+Ñ+Ó,Ò,ÐBÐ.BÓBÐ,Ø�
‰
‹×Ñ Ô'Ø�
‰
‹×Ñ× Ñ  Õ.ùò? GùÚLs   ÃI:Ä	I?c                 óJ   — t        | j                  «       | j                  «      S r
   )r!   r0   r1   rF   s    r   Úclean_initializerszONNXModel.clean_initializers<  s   € Ü)¨$¯*©*«,¸¿
¹
ÓCÐCrD   c                 óö   — |j                   t        j                  j                  k(  rQ|j	                  d«      r@t        |j                  «      }t        d„ |D «       «      rt        d|j                  ›d�«      ‚|S )NÚraw_datac              3   ó,   K  — | ]  }|d z  d k(  –— Œ y­w)é   Nr
  )r   Úis     r   r   z(ONNXModel._check_init.<locals>.<genexpr>C  s   è ø€ Ò3¨A˜˜C™ CÕ'Ñ3ùs   ‚zInitializer z	 has nan.)
Ú	data_typer   ÚTensorProtoÚFLOAT8E4M3FNÚHasFieldrœ   r  r  rL   r   )rB   rO   ÚtestÚbs       r   rM   zONNXModel._check_init?  s_   € Ø�>‰>œT×-Ñ-×:Ñ:Ò:Ø�}‰}˜ZÔ(Ü˜Ÿ™Ó'�ÜÑ3°Ô3Ô3Ü$ |°D·I±I°=À	Ð%JÓKÐKØˆrD   c                 ój  — |j                   dk(  r£|j                  d   }| j                  |«      }|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 ú.)r'   r   rl   r  r   r  ÚFLOAT16ÚFLOATÚDOUBLEÚBFLOAT16ÚRuntimeError)rB   r   Ú
zero_pointrO   Údtypes        r   rb   zONNXModel._check_nodeG  sŸ   € ð �<‰<Ð-Ò-ØŸ™ A™ˆJØ×'Ñ'¨
Ó3ˆDØ—N‘NˆEØÜ× Ñ ×(Ñ(Ü× Ñ ×&Ñ&Ü× Ñ ×'Ñ'Ü× Ñ ×)Ñ)ð	ñ ô #Ð%`ÐafÐ`gÐghÐ#iÓjÐjØˆrD   r
   )F)7Ú__name__Ú
__module__Ú__qualname__r   rC   rG   r+   rP   r0   r.   rT   rZ   r]   r`   rc   rf   ri   rl   rn   rq   rç   rz   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  rM   rb   r
  rD   r   r@   r@   Y   sY  „ ð˜jó ò%ò,ò6ò ò%ò'òTò/ò#ò?ò ò:ò
òòð¨3ó ò òRòò1ò&ò	#ò#ó	óó*ò
òò"ò(	ð ñó ðð ñ[ó ð[òz9ó1ð  ñ/ó ð/òOòSð
 ñ1ó ð1òRòVò
2ò6UðR¨#ð R°$ó Rò
2/òhDóórD   r@   )Úpathlibr   r   Úonnx.helperÚhelperr%   Úonnx.numpy_helperÚnumpy_helperr~   Úonnx.onnx_pbr   Úquant_utilsr   r   r!   r@   r
  rD   r   ú<module>r:     s,   ðõ
 ã Ý !Ý -Ý #ç 9òG*÷Tò rD   