
    h                     t    S SK Jr  S SKJr  S SKJr  S SKrS SKrS SKJ	r	  S SK
Jr  \" \5      r " S S5      rg)	    )Sequence)	getLogger)AnyN)helper)	OnnxModelc                       \ rS rSrSrS\R                  4S jrS\SS4S jr	S	\
SS4S
 jrS	\
S\S\SS4S jrSS jrSS jrSS\
S\S\\   S\S\4
S jjrSS\SS4S jjrSS jr\SS j5       rSrg)DynamoOnnxHelper   zC
Helper class for processing ONNX models exported by Torch Dynamo.
modelc                 $    [        U5      U l        g )N)r   r   )selfr   s     e/var/www/fran/franai/venv/lib/python3.13/site-packages/onnxruntime/transformers/dynamo_onnx_helper.py__init__DynamoOnnxHelper.__init__   s    u%
    edge_mappingreturnNc                    U R                   R                   R                  R                   H  n[        [	        UR
                  5      5       H6  nUR
                  U   U;   d  M  XR
                  U      UR
                  U'   M8     [        [	        UR                  5      5       H6  nUR                  U   U;   d  M  XR                  U      UR                  U'   M8     M     U R                   R                   R                  R
                   H(  nUR                  U;   d  M  XR                     Ul        M*     U R                   R                   R                  R                   H(  nUR                  U;   d  M  XR                     Ul        M*     g)z@
Updates the edges in the model according to the given mapping.
N)r   graphnoderangeleninputoutputname)r   r   r   igraph_inputgraph_outputs         r   update_edgesDynamoOnnxHelper.update_edges   s'    JJ$$**//D3tzz?+::a=L0$0A$?DJJqM , 3t{{+,;;q>\1%1++a.%ADKKN -	 0  ::++1177K</#/0@0@#A  8 !JJ,,2299L  L0$01B1B$C! :r   	func_namec                    [         R                  SU S35        / n/ n/ n/ nU R                  R                  R                  R                   H`  nUR
                  U:X  d  M  UR                  U5        UR                  [        UR                  5      [        UR                  5      -   5        Mb     SnU R                  R                  R                   Hu  nUR                  U:X  d  M  UR                  [        UR                  5      5        UR                  [        UR                  5      [        UR                  5      -   5        UnMw     [        U5      [        U5      :X  d   eU H<  nU R                  R                  R                  R                  R                  U5        M>     U H<  nU R                  R                  R                  R                  R                  U5        M>     Ub/  U R                  R                  R                  R                  U5        0 n	[        [        U5      5       H  n
XJ   nXZ   nX:w  d  M  XU'   M     U R!                  U	5      $ )z8
Unrolls the function with the given name in the model.
zUnrolling function z...N)loggerdebugr   r   r   op_typeappendextendlistr   r   	functionsr   r   remover   r   )r   r!   nodes_to_removenodes_to_addedges_to_removeedges_to_addr   func_to_removefr   r   kvs                r   unroll_function DynamoOnnxHelper.unroll_function,   s    	*9+S9:JJ$$**//D||y(&&t,&&tDJJ'7$t{{:K'KL 0
 !!++Avv"##DL1##DMDN$BC!"	 , ?#s<'8888#DJJ""''..t4 $ DJJ""''..t4 !%JJ&&--n=s?+,A"AAv"#Q	 -   ..r   input_id	output_idc                    0 n/ nU R                   R                   R                  R                   HS  nUR                  R	                  U5      S:w  d  M$  UR
                  U   XFR                  U   '   UR                  U5        MU     U H<  nU R                   R                   R                  R                  R                  U5        M>     U R                  U5        g)z$
Removes the function in the model.
N)
r   r   r   r%   findr   r   r&   r*   r   )r   r!   r5   r6   r   r+   r   s          r   remove_function DynamoOnnxHelper.remove_functionS   s     JJ$$**//D||  +r159[[5KZZ12&&t, 0 $DJJ""''..t4 $ 	,'r   c                 T    [         R                  S5        U R                  SSS5        g)z)
Removes the dropout layer in the model.
zRemoving dropout layer...Dropoutr   Nr#   r$   r:   r   s    r   remove_dropout_layer%DynamoOnnxHelper.remove_dropout_layerb   s#     	01Y1-r   c                 T    [         R                  S5        U R                  SSS5        g)z)
Removes the LM head layer in the model.
zRemoving LM head layer...Linear_lm_head   r   Nr>   r?   s    r   remove_lm_head_layer%DynamoOnnxHelper.remove_lm_head_layeri   s$     	01-q!4r   r   	data_typedimsvalsrawc                    U(       a  [         R                  " U5      n[        U[        R                  5      (       d#  [        R
                  " XFS9R                  5       nOUR                  U5      R                  5       n[         R                  " UUUUSS9nO[         R                  " UUUUSS9nU R                  R                  U5        U$ )N)dtypeT)r   rG   rH   rI   rJ   F)r   tensor_dtype_to_np_dtype
isinstancenpndarrayarraytobytesastypemake_tensorr   add_initializer)	r   r   rG   rH   rI   rJ   np_typebytestensors	            r   rU    DynamoOnnxHelper.add_initializerq   s    55i@GdBJJ//5==?G,446''#F ''#F 	

""6*r   min_sizec           	      *   [         R                  SU S35        U R                  R                  S5      n/ nU H  nU R                  R	                  UR
                  S   5      nUb  UR                  U:  a  M@  UR                   H[  nUR                  S:X  d  M  U R                  UR
                  S   UR                  R                  [        UR                  5      US9    O   UR                  U5        M     U R                  R                  U5        g)zD
Converts Constant ops of size [min_size] or higher to initializers
z'Converting constants greater than size z to initializersConstantr   Nvalue)r   rG   rH   rI   )r#   r$   r   get_nodes_by_op_typeget_constant_valuer   size	attributer   rU   trG   r(   shaper&   remove_nodes)r   rZ   constant_nodesr+   r   np_dataatts          r   !convert_constants_to_initializers2DynamoOnnxHelper.convert_constants_to_initializers   s     	>xjHXYZ88D"Djj33DKKNCG ',,"9 ~~88w&((![[^"%%%//!'--0$	 )   & ""4(' #, 	

0r   c                     U R                   R                  5        H  nUR                  S5        M     U R                   R                  5        H  nUR                  S5        M     g)z$
Clear metadata fields in all nodes
metadata_propsN)r   graphs
ClearFieldnodes)r   r   r   s      r   clear_metadataDynamoOnnxHelper.clear_metadata   sN     ZZ&&(E-. )JJ$$&DOO,- 'r   c                 P   SSK Jn  U R                  R                  R	                  5        GHw  u  p#UR                  5       n[        U5      S:X  d  M'  US   R                  S:X  d  M<  US   nUR                  R                  S5      nUc8  UR                  UR                  R                  5       R                  5       5      nOFUR                  UR                  R                  5       R                  UR                  5       5      5      nUR                  UR                   UR"                  UR%                  UR&                  5      US9nUR(                  R+                  UR,                  S   U5        XR                  R                  U'   UR                  R/                  USS	9  GMz     g)
zM
Constant fold Transpose initializers without changing the initializer names
r   )ir   	TransposepermN)r   rc   typeconst_valueT)safe)
onnxscriptrr   r   initializersitems	consumersr   r%   
attributesgetrX   rw   numpy	transposeas_intsValuer   rc   
TensorTyperL   conveniencereplace_all_uses_withoutputsr*   )	r   rr   r   initializer
user_nodestranspose_noderu   transposed_tensornew_initializers	            r   fold_transpose_initializers,DynamoOnnxHelper.fold_transpose_initializers   sY   
 	"!&!9!9!?!?!AD$..0J:!#
1(=(=(L!+A%0044V<<(*		+2I2I2O2O2Q2[2[2](^%(*		+2I2I2O2O2Q2[2[\`\h\h\j2k(l%"$(($))+11'8'>'>? 1	 #+ # 44^5K5KA5NP_`1@((.$$++N+F# "Br   )r   )r   N)T)rs   )__name__
__module____qualname____firstlineno____doc__onnx
ModelProtor   dictr   strr3   intr:   r@   rE   r   r   boolrU   rh   ro   staticmethodr   __static_attributes__ r   r   r	   r	      s    &doo &D D$ D&%/ %/ %/N( ( ( (PT (.5C C x} TW ^b 41# 1d 1B. G Gr   r	   )collections.abcr   loggingr   typingr   r   rO   r   r   
onnx_modelr   r   r#   r	   r   r   r   <module>r      s4   
 %       	8	|G |Gr   