
    Bvh                     t    d dl mZ d dlmZ d dlmZ d dlZd dlZd dlm	Z	 d dl
mZ  ee      Z G d d      Zy)	    )Sequence)	getLogger)AnyN)helper)	OnnxModelc                       e Zd ZdZdej
                  fdZdeddfdZde	ddfd	Z
de	d
ededdfdZddZddZdde	dedee   dedef
dZddeddfdZddZedd       Zy)DynamoOnnxHelperzK
    Helper class for processing ONNX models exported by Torch Dynamo.
    modelc                 $    t        |      | _        y )N)r   r
   )selfr
   s     U/RAG/venv/lib/python3.12/site-packages/onnxruntime/transformers/dynamo_onnx_helper.py__init__zDynamoOnnxHelper.__init__   s    u%
    edge_mappingreturnNc                    | j                   j                   j                  j                  D ]  }t        t	        |j
                              D ]3  }|j
                  |   |v s||j
                  |      |j
                  |<   5 t        t	        |j                              D ]3  }|j                  |   |v s||j                  |      |j                  |<   5  | j                   j                   j                  j
                  D ]%  }|j                  |v s||j                     |_        ' | j                   j                   j                  j                  D ]%  }|j                  |v s||j                     |_        ' y)zP
        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_edgesz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$01B1B$C! :r   	func_namec                    t         j                  d| d       g }g }g }g }| j                  j                  j                  j                  D ]]  }|j
                  |k(  s|j                  |       |j                  t        |j                        t        |j                        z          _ d}| j                  j                  j                  D ]r  }|j                  |k(  s|j                  t        |j                               |j                  t        |j                        t        |j                        z          |}t t        |      t        |      k(  sJ |D ];  }| j                  j                  j                  j                  j                  |       = |D ];  }| j                  j                  j                  j                  j                  |       = |/| j                  j                  j                  j                  |       i }	t        t        |            D ]  }
||
   }||
   }||k7  s||	|<    | j!                  |	      S )zH
        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_functionz 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QAAv"#Q	 -   ..r   input_id	output_idc                    i }g }| j                   j                   j                  j                  D ]Q  }|j                  j	                  |      dk7  s"|j
                  |   ||j                  |   <   |j                  |       S |D ];  }| j                   j                   j                  j                  j                  |       = | j                  |       y)z4
        Removes the function in the model.
        N)
r
   r   r   r"   findr   r   r#   r'   r   )r   r   r1   r2   r   r(   r   s          r   remove_functionz DynamoOnnxHelper.remove_functionS   s     JJ$$**//D||  +r159[[5KTZZ12&&t, 0 $DJJ""''..t4 $ 	,'r   c                 T    t         j                  d       | j                  ddd       y)z9
        Removes the dropout layer in the model.
        zRemoving dropout layer...Dropoutr   Nr    r!   r6   r   s    r   remove_dropout_layerz%DynamoOnnxHelper.remove_dropout_layerb   s#     	01Y1-r   c                 T    t         j                  d       | j                  ddd       y)z9
        Removes the LM head layer in the model.
        zRemoving LM head layer...Linear_lm_head   r   Nr9   r:   s    r   remove_lm_head_layerz%DynamoOnnxHelper.remove_lm_head_layeri   s$     	01-q!4r   r   	data_typedimsvalsrawc                    |rt        j                  |      }t        |t        j                        s&t        j
                  ||      j                         }n|j                  |      j                         }t        j                  ||||d      }nt        j                  ||||d      }| j                  j                  |       |S )N)dtypeT)r   r@   rA   rB   rC   F)r   tensor_dtype_to_np_dtype
isinstancenpndarrayarraytobytesastypemake_tensorr
   add_initializer)	r   r   r@   rA   rB   rC   np_typebytestensors	            r   rN   z DynamoOnnxHelper.add_initializerq   s    55i@GdBJJ/W5==?G,446''#F ''#F 	

""6*r   min_sizec           	          t         j                  d| d       | j                  j                  d      }g }|D ]  }| j                  j	                  |j
                  d         }||j                  |k  r=|j                  D ]\  }|j                  dk(  s| j                  |j
                  d   |j                  j                  t        |j                        |        n |j                  |        | j                  j                  |       y)zT
        Converts Constant ops of size [min_size] or higher to initializers
        z'Converting constants greater than size z to initializersConstantr   Nvalue)r   r@   rA   rB   )r    r!   r
   get_nodes_by_op_typeget_constant_valuer   size	attributer   rN   tr@   r%   shaper#   remove_nodes)r   rR   constant_nodesr(   r   np_dataatts          r   !convert_constants_to_initializersz2DynamoOnnxHelper.convert_constants_to_initializers   s     	>xjHXYZ88D"Djj33DKKNCG ',,"9 ~~88w&((![[^"%%%//!'--0$	 )   & ""4(' #, 	

0r   c                     | j                   j                         D ]  }|j                  d        | j                   j                         D ]  }|j                  d        y)z4
        Clear metadata fields in all nodes
        metadata_propsN)r
   graphs
ClearFieldnodes)r   r   r   s      r   clear_metadatazDynamoOnnxHelper.clear_metadata   sN     ZZ&&(E-. )JJ$$&DOO,- 'r   c                 R   ddl m} | j                  j                  j	                         D ]y  \  }}|j                         }t        |      dk(  s&|d   j                  dk(  s9|d   }|j                  j                  d      }|8|j                  |j                  j                         j                               }nF|j                  |j                  j                         j                  |j                                     }|j                  |j                   |j"                  |j%                  |j&                        |      }|j(                  j+                  |j,                  d   |       || j                  j                  |<   |j                  j/                  |d	       | y)
z]
        Constant fold Transpose initializers without changing the initializer names
        r   )ir   	TransposepermN)r   r[   typeconst_valueT)safe)
onnxscriptrh   r   initializersitems	consumersr   r"   
attributesgetrQ   rm   numpy	transposeas_intsValuer   r[   
TensorTyperE   conveniencereplace_all_uses_withoutputsr'   )	r
   rh   r   initializer
user_nodestranspose_noderk   transposed_tensornew_initializers	            r   fold_transpose_initializersz,DynamoOnnxHelper.fold_transpose_initializers   s]   
 	"!&!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   N)T)ri   )__name__
__module____qualname____doc__onnx
ModelProtor   dictr   strr0   intr6   r;   r?   r   r   boolrN   r`   rf   staticmethodr    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   ru   rH   r   r   
onnx_modelr   r   r    r	   r   r   r   <module>r      s4   
 %       	8	|G |Gr   