U
    T?h=                     @   s   d dl 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
 d dlmZ d dlmZ d d	lmZ e eZG d
d de
ZG dd deZdS )    N)Optional)AttentionMask)FusionBartAttention)FusionOptions)FusionReshape)numpy_helper)	OnnxModel)BertOnnxModelc                       s*   e Zd Zed fddZdd Z  ZS )FusionBartReshape)modelc                    s   t  | d S N)super__init__)selfr   	__class__ Z/var/www/html/venv/lib/python3.8/site-packages/onnxruntime/transformers/onnx_model_bart.pyr      s    zFusionBartReshape.__init__c                 C   sp  |j d |krd S ||j d  }|jdks8t|j dkr<d S | j|dddgdddg|}|d krfd S |\}}}g }	| j|j d }
|
dkr|	d | j|dddgdddg|}|d kr(| j|j d }| j|j d }| j|j d	 }|d ks|d ks|d krd S t	|}t	|}t	|}t|dks`t|dks`t|dkrdd S |d d
kr|d dkr|d dksd S |	
| |	
| |	
| | j|ddgddg|}| j|dgdg|}|d k	r|}n|d k	r |}nd S |d
 }|j d }| |	|| nD|\}}}| j|j d }
|
dkrX|	d | j|j d }| j|j d	 }|d ks|d krd S t	|}t	|}t|dkst|dkrd S |d dkr|d dksd S |	
| |	
| | j|dddgdddg|}|d kr(d S |d
 }|j d }|j d |ksZ|j d |kr^d S | |	|| d S )N   ZConcat   Z	UnsqueezeZGatherZShaper         AddZMatMulZMul)inputZop_typelenr   Zmatch_parent_pathZget_constant_valueappendZget_initializerr   Zto_arrayextendZreplace_reshape_node)r   Zreshape_nodeZinput_name_to_nodesZoutput_name_to_nodeZconcat_nodeZpath0_Zgather_0Zshape_0shapeZgather_valueZpath1Zinput_1_protoZinput_2_protoZinput_3_protoZinput_1Zinput_2Zinput_3Zgemm_path_with_biasZgemm_path_no_biasZ	gemm_pathZ
top_matmulZ
root_inputZgather_1Zshape_1r   r   r   fuse   s    





**


   









   

 zFusionBartReshape.fuse)__name__
__module____qualname__r   r   r    __classcell__r   r   r   r   r
      s   r
   c                       sH   e Zd Zd fdd	Zdee ed fddZd	d
 Zdd Z	  Z
S )BartOnnxModelhfc                    s>   t  ||| t| | _t| | j| j| j| _t| | _	d S r   )
r   r   r   Zattention_maskr   hidden_size	num_headsattention_fusionr
   bart_reshape_fusion_preprocess)r   r   r(   r'   Z
model_implr   r   r   r   |   s    
zBartOnnxModel.__init__NF)optionsadd_dynamic_axesc                    s>   |d krdn|j | j_ |d kr"dn|j| j_t || d S )NF)Zuse_multi_head_attentionr)   Z!disable_multi_head_attention_biasr   optimize)r   r+   r,   r   r   r   r-      s    zBartOnnxModel.optimizec                 C   s   | j   d S r   )r)   applyr   r   r   r   fuse_attention   s    zBartOnnxModel.fuse_attentionc                 C   s   |    | j  d S r   )Zadjust_reshape_and_expandr*   r.   r/   r   r   r   
preprocess   s    zBartOnnxModel.preprocess)r&   )NF)r!   r"   r#   r   r   r   boolr-   r0   r1   r$   r   r   r   r   r%   {   s   r%   )loggingtypingr   Zfusion_attentionr   Zfusion_bart_attentionr   Zfusion_optionsr   Zfusion_reshaper   Zonnxr   Z
onnx_modelr   Zonnx_model_bertr	   	getLoggerr!   loggerr
   r%   r   r   r   r   <module>   s   
h