
    g                      r    d dl mZ d dlmZ d dlmZ d dlmZ d dlm	Z	 d dl
mZ  ee      Z G d de      Zy	)
    )	getLogger)Dict)Fusion)FusionUtils)helper)	OnnxModelc                   4     e Zd Zdef fdZdedefdZ xZS )FusionQOrderedMatMulmodelc                 (    t         |   |dd       y )NQOrderedMatMulMatMul)super__init__)selfr   	__class__s     d/var/www/openai/venv/lib/python3.12/site-packages/onnxruntime/transformers/fusion_qordered_matmul.pyr   zFusionQOrderedMatMul.__init__   s     0(;    input_name_to_nodesoutput_name_to_nodec           	         | j                   j                  ||      }t        |      dk7  s|d   j                  dk7  ry |d   }d}| j                   j	                  |j
                  d         )| j                   j	                  |j
                  d         y | j                   j	                  |j
                  d         d}| j                   j                  ||      }t        |      dk7  ry |d   }d }	d }
|j                  dk(  rE|}	| j                   j                  |	|      }t        |      dk7  s|d   j                  dk7  ry |d   }
n|j                  dk(  r|}
ny t        j                  |
| j                         sy | j                   j                  |dgdgfg|      \  }}}d }d }|dk  r>| j                   j                  |g dg dfg|      \  }}}|dk  ry |d   }|d   }|d   }n|d   }t        j                  || j                         sy d }d	}| j                   j                  |g d
g dfg|      \  }}}|dk  r2| j                   j                  |dgdgfg|      \  }}}|dk  ry |d   }nd}|d   }| j                   j	                  |j
                  d         y t        j                  || j                   d      sy d }|	1| j                   j                  |	dgdgfg|      \  }}}|dk  ry |d   }|!t        j                  || j                         sy ||g}|	|j                  |	g       |j                  |       |j                  |
g       | j                   j                  ||
j                  ||      st        j                  d       y |7| j                   j                  ||j
                  d   |j
                  d          ||j                  d   n|j
                  d   |j
                  d   |j
                  d   |j
                  d   |
j
                  d   |j
                  |   g}|	<|j                  |j
                  d          |j                  |j
                  d          |r=| j                   j!                  |j
                  d         }t        j"                  |       t%        j&                  d||
j                  d   g| j                   j)                  dd            }|j*                  j                  t%        j,                  dd      g       |j*                  j                  t%        j,                  dd      g       |j*                  j                  t%        j,                  dd      g       d|_        | j0                  j                  |       | j2                  j                  |       | j4                  | j6                  |j8                  <   y )N   r   AddQuantizeLinearDequantizeLinear)Reshape	Transposer   r   )r   r   r   r      T)r   r   r   r   )r   r   r   r   F   z0It is not safe to fuse QOrderedMatMul node. Skipr   )name_prefix)inputsoutputsnameorder_Aorder_Border_Yzcom.microsoft)r   get_childrenlenop_typeget_constant_valueinputr   check_qdq_node_for_fusionmatch_parent_pathsextendis_safe_to_fuse_nodesoutputloggerdebugreplace_node_inputappendget_initializertranspose_2d_int8_tensorr   	make_nodecreate_node_name	attributemake_attributedomainnodes_to_removenodes_to_addthis_graph_namenode_name_to_graph_namer#   )r   noder   r   matmul_childrenbias_add_nodebias_add_node_indexbias_add_childrenbias_add_childresidual_add_nodedownstream_quantize_noderesidual_add_childrenfirst_path_idfirst_input_parent_nodes_reshape_node_0transpose_node_0dequantize_node_0dequantize_node_1is_weight_transpose_requiredweight_path_idweight_nodesresidual_add_dequantize_noderesidual_path_idresidual_input_parent_nodessubgraph_nodesfused_node_inputsweight_tensor
fused_nodes                                r   fusezFusionQOrderedMatMul.fuse   sA   **11$8KL 1$(:(B(Be(K'*  JJ))-*=*=a*@AI

--m.A.A!.DEM::(()<)<Q)?@H"# JJ33MCVW !Q&*1- !#' !!U* .$(JJ$;$;<MOb$c!()Q.2G2J2R2RVf2f'<Q'?$##'77'5$  445MtzzZ 6:ZZ5R5R!"QC()6
2/ 19=9V9VPR^_`#:6M3Q q 5a8N7: 8 ; 8 ; 445F

S !'+$*.***G*GUWcde+
'a A.2jj.K.K%&,-#/+NL! ! ,Q+0( ,Q ::(():)@)@)CDL 445F

TYZ (,$(?Czz?\?\!()A3/ $@<91  !#+Fq+I( (3K<a<a($**=
  .(!!#4"56l+789zz//4;;=PRe
 LLKL 'JJ))*:<L<R<RST<UWhWnWnopWqr )7(BN!!!$HYH_H_`aHb##A&##A&##A&$**1- 34
 ($$%A%G%G%JK$$%A%G%G%JK ( JJ667H7N7Nq7QRM00?%%$-44Q78,,-=K[,\	

 	##V%:%:9a%H$IJ##V%:%:9a%H$IJ##V%:%:9a%H$IJ+
##N3  ,8<8L8L$$Z__5r   )__name__
__module____qualname__r   r   r   rZ   __classcell__)r   s   @r   r
   r
      s(    <i <DMd DM DMr   r
   N)loggingr   typingr   fusion_baser   fusion_utilsr   onnxr   
onnx_modelr   r[   r1   r
    r   r   <module>rf      s3       $   	8	HM6 HMr   