
    fPi                         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dS )	    )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dS )DynamoOnnxHelperzK
    Helper class for processing ONNX models exported by Torch Dynamo.
    modelc                 .    t          |          | _        d S )N)r   r
   )selfr
   s     /home/jaya/work/projects/VOICE-AGENT/VIET/agent-env/lib/python3.11/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 ],}|j        |         |v r||j        |                  |j        |<   -t          t	          |j                            D ],}|j        |         |v r||j        |                  |j        |<   -| j         j         j        j        D ]}|j        |v r||j                 |_        | j         j         j        j        D ]}|j        |v r||j                 |_        dS )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>    J$*/ 	B 	BD3tz??++ @ @:a=L00$0A$?DJqM3t{++,, B B;q>\11%1$+a.%ADKNB  :+17 	B 	BK<//#/0@#A  J,29 	D 	DL L00$01B$C!	D 	Dr   	func_namec                 .   t                               d| d           g }g }g }g }| j        j        j        j        D ]^}|j        |k    rQ|                    |           |                    t          |j	                  t          |j
                  z              _d}| j        j        j        D ]r}|j        |k    re|                    t          |j                             |                    t          |j	                  t          |j
                  z              |}st          |          t          |          k    sJ |D ]+}| j        j        j        j                            |           ,|D ]+}| j        j        j        j                            |           ,|$| j        j        j                            |           i }	t          t          |                    D ]}
||
         }||
         }||k    r||	|<   |                     |	          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    	99999:::J$*/ 	M 	MD|y((&&t,,,&&tDJ'7'7$t{:K:K'KLLL!+ 	# 	#Av""##DLL111##DMMDNN$BCCC!"?##s<'8'88888# 	5 	5DJ"'..t4444  	5 	5DJ"'..t4444%J&--n===s?++,, 	$ 	$A"AQAAvv"#Q  ...r   input_id	output_idc                 b   i }g }| j         j         j        j        D ]P}|j                            |          dk    r0|j        |         ||j        |         <   |                    |           Q|D ]+}| j         j         j        j                            |           ,| 	                    |           dS )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     J$*/ 	- 	-D|  ++r1159[5KTZ12&&t,,,# 	5 	5DJ"'..t4444,'''''r   c                 h    t                               d           |                     ddd           dS )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   s5     	0111Y1-----r   c                 h    t                               d           |                     ddd           dS )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   s6     	0111-q!44444r   Tr   	data_typedimsvalsrawc                    |rt          j        |          }t          |t          j                  s)t          j        ||                                          }n'|                    |                                          }t          j        ||||d          }nt          j        ||||d          }| 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     	5i@@GdBJ// 7W555==??G,,4466'#  FF '#  F 	
""6***r      min_sizec           	         t                               d| d           | j                            d          }g }|D ]}| j                            |j        d                   }||j        |k     r5|j        D ]O}|j        dk    rB| 	                    |j        d         |j
        j        t          |j                  |            nP|                    |           | j                            |           dS )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   rS   constant_nodesr(   r   np_dataatts          r   !convert_constants_to_initializersz2DynamoOnnxHelper.convert_constants_to_initializers   s    	YxYYYZZZ88DD" 	) 	)Dj33DKNCCG ',"9"9 ~  8w&&((![^"%%/!'-00$	 )    E ' ""4(((( 	
00000r   c                     | j                                         D ]}|                    d           | j                                         D ]}|                    d           dS )z4
        Clear metadata fields in all nodes
        metadata_propsN)r
   graphs
ClearFieldnodes)r   r   r   s      r   clear_metadatazDynamoOnnxHelper.clear_metadata   sv     Z&&(( 	/ 	/E-....J$$&& 	. 	.DOO,----	. 	.r   c                 R   ddl m} | j        j                                        D ]\  }}|                                }t          |          dk    rR|d         j        dk    r@|d         }|j        	                    d          }|?|
                    |j                                                                                  }nQ|
                    |j                                                            |                                                    }|                    |j        |j        |                    |j                  |          }|j                            |j        d         |           || j        j        |<   |j                            |d	           dS )
z]
        Constant fold Transpose initializers without changing the initializer names
        r   )irrR   	TransposepermN)r   r\   typeconst_valueT)safe)
onnxscriptri   r   initializersitems	consumersr   r"   
attributesgetrQ   rm   numpy	transposeas_intsValuer   r\   
TensorTyperE   conveniencereplace_all_uses_withoutputsr'   )	r
   ri   r   initializer
user_nodestranspose_noderk   transposed_tensornew_initializers	            r   fold_transpose_initializersz,DynamoOnnxHelper.fold_transpose_initializers   s   
 	"!!!!!!&!9!?!?!A!A 	G 	GD+$..00J:!##
1(=(L(L!+A%044V<<<(*		+2I2O2O2Q2Q2[2[2]2](^(^%%(*		+2I2O2O2Q2Q2[2[\`\h\h\j\j2k2k(l(l%"$(($)+1'8'>?? 1	 #+ # # 44^5KA5NP_```1@(.$++N+FFF#	G 	Gr   )r   N)T)rR   )__name__
__module____qualname____doc__onnx
ModelProtor   dictr   strr0   intr6   r;   r?   r   r   boolrN   ra   rg   staticmethodr    r   r   r	   r	      s        &do & & & &D D$ D D D D&%/ %/ %/ %/ %/ %/N( ( ( (PT ( ( ( (. . . .5 5 5 5 C C x} TW ^b    41 1# 1d 1 1 1 1B. . . . G G G \G G Gr   r	   )collections.abcr   loggingr   typingr   ru   rH   r   r   
onnx_modelr   r   r    r	   r   r   r   <module>r      s   
 % $ $ $ $ $                                   	8		|G |G |G |G |G |G |G |G |G |Gr   