o
    i                     @   sf   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 dZdS )	    )Sequence)	getLogger)AnyN)helper)	OnnxModelc                   @   s   e Zd ZdZdejfddZdeddfdd	Zd
e	ddfddZ
d
e	dededdfddZd%ddZd%ddZd&de	dedee dedef
ddZd'deddfdd Zd%d!d"Zed%d#d$ZdS )(DynamoOnnxHelperzK
    Helper class for processing ONNX models exported by Torch Dynamo.
    modelc                 C   s   t || _d S )N)r   r   )selfr    r
   e/home/kim/smarthome/.venv/lib/python3.10/site-packages/onnxruntime/transformers/dynamo_onnx_helper.py__init__   s   zDynamoOnnxHelper.__init__edge_mappingreturnNc                 C   s   | j j jjD ]8}tt|jD ]}|j| |v r"||j|  |j|< qtt|jD ]}|j| |v r=||j|  |j|< q*q| j j jjD ]}|j|v rR||j |_qE| j j jjD ]}|j|v rf||j |_qYd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   iZgraph_inputZgraph_outputr
   r
   r   update_edges   s&   

zDynamoOnnxHelper.update_edges	func_namec                 C   sR  t d| d g }g }g }g }| jjjjD ]}|j|kr0|| |t|j	t|j
  qd}| jjjD ]}|j|krV|t|j |t|j	t|j
  |}q8t|t|ksaJ |D ]}| jjjj| qc|D ]}| jjjj| qq|dur| jjj| i }	tt|D ]}
||
 }||
 }||kr||	|< q| |	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   Z	functionsr   r   remover   r   )r	   r   nodes_to_removeZnodes_to_addZedges_to_removeZedges_to_addr   Zfunc_to_removefr   r   kvr
   r
   r   unroll_function,   s@   



z DynamoOnnxHelper.unroll_functioninput_id	output_idc                 C   sr   i }g }| j j jjD ]}|j|dkr#|j| ||j| < || q
|D ]}| j j jj| q&| 	| dS )z4
        Removes the function in the model.
        N)
r   r   r   r   findr   r   r   r   r   )r	   r   r%   r&   r   r    r   r
   r
   r   remove_functionS   s   
z DynamoOnnxHelper.remove_functionc                 C   s   t d | ddd dS )z9
        Removes the dropout layer in the model.
        zRemoving dropout layer...ZDropoutr   Nr   r   r)   r	   r
   r
   r   remove_dropout_layerb   s   
z%DynamoOnnxHelper.remove_dropout_layerc                 C   s   t d | ddd dS )z9
        Removes the LM head layer in the model.
        zRemoving LM head layer...ZLinear_lm_head   r   Nr*   r+   r
   r
   r   remove_lm_head_layeri   s   
z%DynamoOnnxHelper.remove_lm_head_layerTr   	data_typedimsvalsrawc           	      C   sv   |r)t |}t|tjstj||d }n|| }t j||||dd}n
t j||||dd}| j	
| |S )N)dtypeT)r   r/   r0   r1   r2   F)r   Ztensor_dtype_to_np_dtype
isinstancenpZndarrayarraytobytesZastypeZmake_tensorr   add_initializer)	r	   r   r/   r0   r1   r2   Znp_typebytestensorr
   r
   r   r8   q   s*   
z DynamoOnnxHelper.add_initializer   min_sizec                 C   s   t d| d | jd}g }|D ]8}| j|jd }|du s'|j|k r(q|jD ]}|jdkrE| j	|jd |j
jt|j|d  nq+|| q| 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/   r0   r1   )r   r   r   Zget_nodes_by_op_typeZget_constant_valuer   size	attributer   r8   tr/   r   shaper   Zremove_nodes)r	   r<   Zconstant_nodesr    r   Znp_dataZattr
   r
   r   !convert_constants_to_initializers   s&   

	z2DynamoOnnxHelper.convert_constants_to_initializersc                 C   s8   | j  D ]}|d q| j  D ]}|d qdS )z4
        Clear metadata fields in all nodes
        Zmetadata_propsN)r   ZgraphsZ
ClearFieldnodes)r	   r   r   r
   r
   r   clear_metadata   s
   zDynamoOnnxHelper.clear_metadatac           	      C   s   ddl m} | jj D ]b\}}| }t|dkrn|d jdkrn|d }|j	d}|du r:|
|j  }n|
|j | }|j|j|j||j|d}|j|jd | || jj|< |jj|dd	 qdS )
z]
        Constant fold Transpose initializers without changing the initializer names
        r   )irr;   Z	TransposepermN)r   rB   typeconst_valueT)safe)Z
onnxscriptrF   r   ZinitializersitemsZ	consumersr   r   
attributesgetr:   rI   numpyZ	transposeZas_intsValuer   rB   Z
TensorTyper3   ZconvenienceZreplace_all_uses_withZoutputsr   )	r   rF   r   ZinitializerZ
user_nodesZtranspose_noderG   Ztransposed_tensorZnew_initializerr
   r
   r   fold_transpose_initializers   s(   
z,DynamoOnnxHelper.fold_transpose_initializers)r   N)T)r;   )__name__
__module____qualname____doc__onnxZ
ModelProtor   dictr   strr$   intr)   r,   r.   r   r   boolr8   rC   rE   staticmethodrP   r
   r
   r
   r   r      s    '

$
!	r   )collections.abcr   loggingr   typingr   rN   r5   rU   r   Z
onnx_modelr   rQ   r   r   r
   r
   r
   r   <module>   s   