§
    kŠtj�4  ã                   óš   — d dl Z d dlmZ d dlZd dlmZmZ d„ Z G d„ d¦  «        Zd„ Zd„ Z	d	„ Z
d
„ Zd„ Zd„ Zedk    r e¦   «          dS dS )é    N)ÚArgumentParser)ÚTensorProtoÚhelperc                 ó8  — dgt          | j        ¦  «        z  }i }g }t          | j        ¦  «        D ]ƒ\  }}t          d„ |j        D ¦   «         ¦  «        ||<   ||         dk    r!|                     | j        |         ¦  «         ŒS|j        D ](}||vr|g||<   Œ||                              |¦  «         Œ)Œ„d„ | j        D ¦   «         }d„ | j        D ¦   «         }||z   }	|	                     ¦   «          d }
|	D ]T}|
|k    rŒ	|}
||v rE||         D ]<}||         dz
  ||<   ||         dk    r |                     | j        |         ¦  «         Œ=ŒUd}t          |¦  «        }||k     ri||         j        D ]P}||v rJ||         D ]A}||         dz
  ||<   ||         dk    r%|                     | j        |         ¦  «         |dz   }ŒBŒQ|dz   }||k     °i|t          | j        ¦  «        k    s
J d¦   «         ‚|  	                    d¦  «         | j         
                    |¦  «         d S )Nr   c              3   ó   K  — | ]}|¯d V — Œ	dS )é   N© )Ú.0Ú_s     úb/var/www/html/CA-Chatbot/venv/lib/python3.11/site-packages/onnxruntime/tools/qnn/add_trans_cast.pyú	<genexpr>z)graph_topological_sort.<locals>.<genexpr>   s'   è è € Ð">Ð">¨¸AÐ"> 1Ð">Ð">Ð">Ð">Ð">Ð">ó    c                 ó   — g | ]	}|j         ‘Œ
S r	   ©Úname)r
   Úinits     r   ú
<listcomp>z*graph_topological_sort.<locals>.<listcomp>   s   € ÐAÐAÐA t˜œÐAÐAÐAr   c                 ó   — g | ]	}|j         ‘Œ
S r	   r   )r
   Úinputs     r   r   z*graph_topological_sort.<locals>.<listcomp>    s   € Ð=Ð=Ð=¨˜œÐ=Ð=Ð=r   r   zGraph is not a DAGÚnode)Úlenr   Ú	enumerateÚsumr   ÚappendÚinitializerÚsortÚoutputÚ
ClearFieldÚextend)ÚgraphÚ
deps_countÚdeps_to_nodesÚsorted_nodesÚnode_idxr   Ú
input_nameÚinitializer_namesÚgraph_input_namesÚinput_namesÚprev_input_nameÚstartÚendr   s                 r   Úgraph_topological_sortr,      s±  € Ø�•s˜5œ:‘”Ñ&€JØ€MØ€LÝ# E¤JÑ/Ô/ð ;ð ;‰ˆ�$å"Ð">Ð">¨d¬jÐ">Ñ">Ô">Ñ>Ô>ˆ
�8ÑØ�hÔ 1Ò$Ð$Ø×Ò ¤
¨8Ô 4Ñ5Ô5Ð5Øàœ*ð 	;ð 	;ˆJØ Ð.Ð.Ø-5¨J�˜jÑ)Ð)à˜jÔ)×0Ò0°Ñ:Ô:Ð:Ð:ð		;ð BÐA¨uÔ/@ÐAÑAÔAÐØ=Ð=°´Ð=Ñ=Ô=ÐØ#Ð&7Ñ7€KØ×ÒÑÔÐØ€OØ!ð 	>ð 	>ˆ
Ø˜jÒ(Ð(Øà$ˆØ˜Ð&Ð&Ø)¨*Ô5ð >ð >�Ø'1°(Ô';¸aÑ'?�
˜8Ñ$Ø˜hÔ'¨1Ò,Ð,Ø ×'Ò'¨¬
°8Ô(<Ñ=Ô=Ð=øøà€EÝ
ˆlÑ
Ô
€Cà
�#Š+ˆ+Ø" 5Ô)Ô0ð 	&ð 	&ˆFØ˜Ð&Ð&Ø -¨fÔ 5ð &ð &�HØ+5°hÔ+?À!Ñ+C�J˜xÑ(Ø! (Ô+¨qÒ0Ð0Ø$×+Ò+¨E¬J°xÔ,@ÑAÔAÐAØ! A™g˜øøØ˜‘	ˆð �#Š+ˆ+ð •#�e”j‘/”/Ò!Ð!Ð!Ð#7Ñ!Ô!Ð!Ø	×Ò�VÑÔÐØ	„J×Ò�lÑ#Ô#Ð#Ð#Ð#r   c                   ó   — e Zd Zd„ ZdS )ÚQnnTensorStructc                 óD   — d| _         t          j        | _        g | _        d S )NÚ )r   r   ÚFLOATÚonnx_data_typeÚdim)Úselfs    r   Ú__init__zQnnTensorStruct.__init__B   s   € ØˆŒ	Ý)Ô/ˆÔØˆŒˆˆr   N)Ú__name__Ú
__module__Ú__qualname__r5   r	   r   r   r.   r.   A   s#   € € € € € ðð ð ð ð r   r.   c                 óî  — | dk    s| dk    rt           j        S | dk    s| dk    rt           j        S | dk    s| dk    rt           j        S | dk    rt           j        S | dk    s| d	k    rt           j        S | d
k    s| dk    rt           j        S | dk    s| dk    rt           j        S | dk    rt           j        S | dk    rt           j	        S | dk    rt           j
        S | dk    rt           j        S t           j        S )Ni  i  i  i  i2  i2  id  i  é   i  é   i2  é2   éd   i  i2  i  )r   ÚUINT8ÚUINT16ÚUINT32ÚUINT64ÚINT8ÚINT16ÚINT32ÚINT64ÚFLOAT16r1   ÚBOOLÚ	UNDEFINED)Úqnn_data_types    r   Úqnn_data_type_to_onnx_data_typerJ   H   s#  € à˜ÒÐ -°6Ò"9Ð"9ÝÔ Ð à	˜&Ò	 Ð	  M°VÒ$;Ð$;ÝÔ!Ð!à	˜&Ò	 Ð	  M°VÒ$;Ð$;ÝÔ!Ð!à	˜&Ò	 Ð	 ÝÔ!Ð!à	˜&Ò	 Ð	  M°VÒ$;Ð$;ÝÔÐà	˜&Ò	 Ð	  M°VÒ$;Ð$;ÝÔ Ð à	˜&Ò	 Ð	  M°VÒ$;Ð$;ÝÔ Ð à	˜&Ò	 Ð	 ÝÔ Ð à	˜&Ò	 Ð	 ÝÔ"Ð"à	˜&Ò	 Ð	 ÝÔ Ð à	˜&Ò	 Ð	 ÝÔÐåÔ$Ð$r   c                 ó&  — t          | ¦  «        5 }t          j        |¦  «        }d|v s
J d¦   «         ‚d|d         v s
J d¦   «         ‚|d         d                              ¦   «         D ]t\  }}d|v rd|v rd|v s
J d¦   «         ‚|d         d	k    s|d         d
k    rAt	          ¦   «         }||_        t          |d         ¦  «        |_        |d         |_        |||<   Œu	 d d d ¦  «         n# 1 swxY w Y   t          |¦  «        d
k    s
J d¦   «         ‚d S )Nr    z4QNN converted json file not valid. Can't find graph.Útensorsz6QNN converted json file not valid. Can't find tensors.ÚtypeÚ	data_typeÚdimszDQNN converted json file not valid. Can't find some keys from tensorsr   r   zJConverted QNN model not valid. It should have at least 1 input & 1 output.)
ÚopenÚjsonÚloadÚitemsr.   r   rJ   r2   r3   r   )Úqnn_json_file_pathÚqnn_input_output_tensor_dicÚqnn_json_fileÚqnn_jsonÚqnn_tensor_nameÚqnn_tensor_attributeÚ
qnn_tensors          r   Úparse_qnn_json_filer[   n   s¸  € Ý	Ð Ñ	!Ô	!ð J ]Ý”9˜]Ñ+Ô+ˆØ˜(Ð"Ð"Ð"Ð$ZÑ"Ô"Ð"Ø˜H WÔ-Ð-Ð-Ð-Ð/gÑ-Ô-Ð-Ø5=¸gÔ5FÀyÔ5Q×5WÒ5WÑ5YÔ5Yð 	Jð 	JÑ1ˆOÐ1ð Ð.Ð.Ð.ØÐ#7Ð7Ð7ØÐ2Ð2Ð2Ð2ØUñ 3Ô2ð3ð $ FÔ+¨qÒ0Ð0Ð4HÈÔ4PÐTUÒ4UÐ4UÝ,Ñ.Ô.�
Ø"1�
”Ý,KÐL`ÐalÔLmÑ,nÔ,n�
Ô)Ø!5°fÔ!=�
”Ø?IÐ+¨OÑ<øð	Jð	Jð Jð Jñ Jô Jð Jð Jð Jð Jð Jð Jøøøð Jð Jð Jð Jõ$ Ð*Ñ+Ô+¨aÒ/Ð/Ð/ØTñ 0Ô/Ð/Ð/Ð/s   �CC)Ã)C-Ã0C-c                 óÆ   ‡ ‡— t          ‰ ¦  «        t          ‰¦  «        k    s
J d¦   «         ‚t          ˆ ˆfd„t          t          ‰ ¦  «        ¦  «        D ¦   «         ¦  «        S )Nz,Onnx shape and Qnn shape has different rank.c              3   óF   •K  — | ]}‰|         j         ‰|         k    V — Œd S )N)Ú	dim_value)r
   ÚiÚ	onnx_dimsÚqnn_dimss     €€r   r   z4compare_onnx_shape_with_qnn_shape.<locals>.<genexpr>ˆ   s3   øè è € ÐTÐT¸ˆy˜Œ|Ô%¨°!¬Ò4ÐTÐTÐTÐTÐTÐTr   )r   ÚallÚrange)r`   ra   s   ``r   Ú!compare_onnx_shape_with_qnn_shaperd   †   s^   øø€ Ýˆy‰>Œ>�S ™]œ]Ò*Ð*Ð*Ð,ZÑ*Ô*Ð*ÝÐTÐTÐTÐTÐT½eÅCÈ	ÁNÄNÑ>SÔ>SÐTÑTÔTÑTÔTÐTr   c                 óÚ   — | dk    s
J d¦   «         ‚g }|                      d¦  «         |                      | dz
  ¦  «         t          d| dz
  ¦  «        D ]}|                      |¦  «         Œ|S ©Né   z,Shape rank should >2 for the Transpose node.r   r   ©r   rc   ©ÚrankÚpermr_   s      r   Úgen_to_channel_first_permrl   ‹   ss   € Ø�!Š8ˆ8ˆ8ÐC‰8Œ8ˆ8Ø€DØ‡K‚K��N„N€NØ‡K‚K��q‘ÑÔÐÝ�1�d˜Q‘hÑÔð ð ˆØ�Š�A‰Œˆˆà€Kr   c                 óÎ   — | dk    s
J d¦   «         ‚g }|                      d¦  «         t          d| ¦  «        D ]}|                      |¦  «         Œ|                      d¦  «         |S rf   rh   ri   s      r   Úgen_to_channel_last_permrn   –   sf   € Ø�!Š8ˆ8ˆ8ÐC‰8Œ8ˆ8Ø€DØ‡K‚K��N„N€NÝ�1�d‰^Œ^ð ð ˆØ�Š�A‰ŒˆˆØ‡K‚K��N„N€Nà€Kr   c                  óâ	  — t          d¦  «        } |                      ddddt          ¬¦  «         |                      ddd	dt          ¬¦  «         |                      ¦   «         }i }t	          |j        |¦  «         t          j        |j        ¦  «        }g }i }|j	        j
        D �]¸}|j        |v �r“|j        }||j                 }|j        j        j        |j        k    ri|}	|	d
z   }
t!          j        d|
|	g|
g|j        j        j        ¬¦  «        }|j        |j        j        _        |                     |g¦  «         |
}|
||j        <   t'          |j        j        j        j        |j        ¦  «        sÑt-          t/          |j        j        j        j        ¦  «        ¦  «        }|}|dz   }t!          j        d||g|g|¬¦  «        }|                     |g¦  «         |||j        <   t1          t/          |j        j        j        j        ¦  «        ¦  «        D ].}|j        |         |j        j        j        j        |         _        Œ/�Œ t5          d|j        z   dz   ¦  «        ‚|j	        j        D �]¹}|j        |v �r”|j        }||j                 }|j        j        j        |j        k    r_|}
|
d
z   }	t!          j        d|	|	g|
g|j        ¬¦  «        }|j        |j        j        _        |                     |g¦  «         |	}|	||j        <   t'          |j        j        j        j        |j        ¦  «        sÜt9          t/          |j        j        j        j        ¦  «        ¦  «        }|}|dz   }t!          j        d||g|g|¬¦  «        }|                     |g¦  «         |||j        <   t1          t/          |j        j        j        j        ¦  «        ¦  «        D ]9}||j                 j        |         |j        j        j        j        |         _        Œ:�Œ¡t5          d|j        z   dz   ¦  «        ‚|j	        j        D ]^}t=          |j
        ¦  «        D ]\  }}||v r||         |j
        |<   Œt=          |j        ¦  «        D ]\  }}||v r||         |j        |<   ŒŒ_|j	        j                             |¦  «         t?          |j	        ¦  «         t          j         ||j         !                    dd¦  «        ¦  «         d S )NzbInsert Cast, Transpose nodes into Onnx model to make it aligned with QNN generated context binary.z-mz--onnx_modelz"Required. Path to Onnx model file.T)ÚhelpÚrequiredrM   z-qz
--qnn_jsonz4Required. Path to Qnn converted model_net.json file.Ú	_qnn_castÚCast)r   ÚinputsÚoutputsÚtoÚ
_qnn_transÚ	Transpose)r   rt   ru   rk   zError: Onnx model input: z  not exist from QNN model input.zError: Onnx model output: z! not exist from QNN model output.z.onnxz_add_trans.onnx)"r   Úadd_argumentÚstrÚ
parse_argsr[   rW   ÚonnxrR   Ú
onnx_modelr    r   r   rM   Útensor_typeÚ	elem_typer2   r   Ú	make_noder   rd   Úshaper3   rl   r   rc   r^   ÚAssertionErrorr   rn   r   r   r,   ÚsaveÚreplace)ÚparserÚargsrU   ÚmodelÚnodes_to_addÚgraph_input_output_name_dicÚgraph_inputÚinput_name_fater_node_insertÚqnn_input_tensorÚcast_input_nameÚcast_output_nameÚinput_cast_nodeÚtranspose_permÚtranspose_input_nameÚtranspose_output_nameÚinput_transpose_noder_   Úgraph_outputÚoutput_name_after_node_insertÚqnn_output_tensorÚoutput_cast_nodeÚoutput_transpose_noder   Únode_input_indexÚ
node_inputÚnode_output_indexÚnode_outputs                              r   Úmainr�   ¥   s’  € ÝØlñô €Fð ×Ò˜˜nÐ3WÐbfÕmpÐÑqÔqÐqØ
×ÒØˆlÐ!WÐbfÕmpð ñ ô ð ð ×ÒÑÔ€Dð #%ÐÝ˜œÐ'BÑCÔCÐCåŒI�d”oÑ&Ô&€Eà€Là"$ÐØ”{Ô(ð )vñ )vˆØÔÐ:Ð:Ñ:Ø+6Ô+;Ð(Ø:¸;Ô;KÔLÐàÔÔ+Ô5Ð9IÔ9XÒXÐXà">�Ø#2°[Ñ#@Ð Ý"(Ô"2ØØ)Ø+Ð,Ø-Ð.Ø"Ô'Ô3Ô=ð#ñ #ô #�ð :JÔ9X�Ô Ô,Ô6Ø×#Ò# _Ð$5Ñ6Ô6Ð6Ø/?Ð,Ø@PÐ+¨KÔ,<Ñ=å4°[Ô5EÔ5QÔ5WÔ5[Ð]mÔ]qÑrÔrð bå!:½3¸{Ô?OÔ?[Ô?aÔ?eÑ;fÔ;fÑ!gÔ!g�Ø'CÐ$Ø(<¸|Ñ(KÐ%Ý'-Ô'7ØØ.Ø0Ð1Ø2Ð3Ø'ð(ñ (ô (Ð$ð ×#Ò#Ð%9Ð$:Ñ;Ô;Ð;Ø@UÐ+¨KÔ,<Ñ=õ �s ;Ô#3Ô#?Ô#EÔ#IÑJÔJÑKÔKð bð b�AØJZÔJ^Ð_`ÔJa�KÔ$Ô0Ô6Ô:¸1Ô=ÔGÐGùå Ð!<¸{Ô?OÑ!OÐRtÑ!tÑuÔuÐuàœÔ*ð +yñ +yˆØÔÐ ;Ð;Ñ;Ø,8Ô,=Ð)à ;¸LÔ<MÔ NÐØÔ Ô,Ô6Ð:KÔ:ZÒZÐZà#@Ð Ø"2°[Ñ"@�Ý#)Ô#3ØØ(Ø+Ð,Ø-Ð.Ø(Ô7ð$ñ $ô $Ð ð ;LÔ:Z�Ô!Ô-Ô7Ø×#Ò#Ð%5Ð$6Ñ7Ô7Ð7Ø0?Ð-ØAPÐ+¨LÔ,=Ñ>å4°\Ô5FÔ5RÔ5XÔ5\Ð^oÔ^sÑtÔtð å!9½#¸lÔ>OÔ>[Ô>aÔ>eÑ:fÔ:fÑ!gÔ!g�Ø(EÐ%Ø'<¸|Ñ'KÐ$Ý(.Ô(8ØØ-Ø0Ð1Ø2Ð3Ø'ð)ñ )ô )Ð%ð ×#Ò#Ð%:Ð$;Ñ<Ô<Ð<ØAUÐ+¨LÔ,=Ñ>õ �s <Ô#4Ô#@Ô#FÔ#JÑKÔKÑLÔLð ð �AØKfØ$Ô)ôLä˜!ôL�LÔ%Ô1Ô7Ô;¸AÔ>ÔHÐHùõ !Ð!=ÀÔ@QÑ!QÐTwÑ!wÑxÔxÐxà”Ô ð 	Zð 	ZˆÝ,5°d´jÑ,AÔ,Að 	Wð 	WÑ(Ð˜jàÐ8Ð8Ð8Ø/JÈ:Ô/V�”
Ð+Ñ,øå.7¸¼Ñ.DÔ.Dð 	Zð 	ZÑ*Ð˜{àÐ9Ð9Ð9Ø1LÈ[Ô1Y�”Ð-Ñ.øð	Zð
 
„KÔ×Ò˜LÑ)Ô)Ð)Ý˜5œ;Ñ'Ô'Ð'õ 	„Iˆe�T”_×,Ò,¨WÐ6GÑHÔHÑIÔIÐIÐIÐIr   Ú__main__)rQ   Úargparser   r|   r   r   r,   r.   rJ   r[   rd   rl   rn   r�   r6   r	   r   r   ú<module>r       s  ðð €€€Ø #Ð #Ð #Ð #Ð #Ð #à €€€Ø $Ð $Ð $Ð $Ð $Ð $Ð $Ð $ð1$ð 1$ð 1$ðhð ð ð ð ñ ô ð ð#%ð #%ð #%ðLð ð ð0Uð Uð Uð
ð ð ðð ð ð{Jð {Jð {Jð| ˆzÒÐØ€D�F„F€F€F€Fð Ðr   