§
    kŠtjÊU  ã                   ó˜   — d dl mZ d dl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 G d	„ d
e¦  «        ZdS )é    )Ú	getLoggerN)ÚFusion)ÚFusionUtils)Úhelper)Ú	OnnxModelc                   óD   ‡ — e Zd ZdZdedefˆ fd„Zd„ Zd„ Zd„ Z	d„ Z
ˆ xZS )	ÚFusionGptAttentionPastBasez3Base class for GPT Attention Fusion with past stateÚmodelÚ	num_headsc                 ó¦   •— t          ¦   «                              |dddgd¦  «         || _        t          |¦  «        | _        i | _        d | _        d S )NÚ	AttentionÚLayerNormalizationÚSkipLayerNormalizationz	with past)ÚsuperÚ__init__r   r   ÚutilsÚcasted_attention_maskÚmask_filter_value©Úselfr
   r   Ú	__class__s      €úk/var/www/html/CA-Chatbot/venv/lib/python3.11/site-packages/onnxruntime/transformers/fusion_gpt_attention.pyr   z#FusionGptAttentionPastBase.__init__   sU   ø€ Ý‰Œ×Ò˜ Ð.BÐD\Ð-]Ð_jÑkÔkÐkØ"ˆŒÝ  Ñ'Ô'ˆŒ
Ø%'ˆÔ"Ø!%ˆÔÐÐó    c                 óØ  — | j                              |d|¦  «        }|�|j        dk    rt                               d¦  «         d S | j                              |d¦  «        dk    rt                               d¦  «         d S |j        d         }| j                              |d|¦  «        }|r|j        dk    r|}nF| j                              |ddgddg¦  «        }|€t                               d¦  «         d S |d         }| j                              |d¦  «        dk    rt                               d	¦  «         d S |j        d         }	||	k    rt                               d
¦  «         d S |S )Nr   ÚGatherz,match_past_pattern_1: expect Gather for pasté   z9match_past_pattern_1: expect indices=1 for Gather of pastÚ	Transposez7match_past_pattern_1: failed match Transpose and Gatheréÿÿÿÿz;match_past_pattern_1: expect indices=0 for Gather k of pastz,match_past_pattern_1: expect past to be same)r
   Ú
get_parentÚop_typeÚloggerÚdebugÚfind_constant_inputÚinputÚmatch_parent_path)
r   Úconcat_kÚconcat_vÚoutput_name_to_nodeÚgatherÚpastÚparentÚgather_past_kÚpast_k_nodesÚpast_ks
             r   Úmatch_past_pattern_1z/FusionGptAttentionPastBase.match_past_pattern_1   sr  € ð& ”×&Ò& x°Ð4GÑHÔHˆØˆ>˜Vœ^¨xÒ7Ð7Ý�LŠLÐGÑHÔHÐHØ�4àŒ:×)Ò)¨&°!Ñ4Ô4¸Ò9Ð9Ý�LŠLÐTÑUÔUÐUØ�4ØŒ|˜AŒˆà”×&Ò& x°Ð4GÑHÔHˆØð 	-�f”n¨Ò0Ð0Ø"ˆMˆMàœ:×7Ò7¸À;ÐPXÐBYÐ\]Ð_`Ð[aÑbÔbˆLØÐ#Ý—’ÐVÑWÔWÐWØ�tØ(¨Ô,ˆMàŒ:×)Ò)¨-¸Ñ;Ô;¸qÒ@Ð@Ý�LŠLÐVÑWÔWÐWØ�4ØÔ$ QÔ'ˆØ�6Š>ˆ>Ý�LŠLÐGÑHÔHÐHØ�4àˆr   c                 óv  — | j                              |d|¦  «        }|�|j        dk    rt                               d¦  «         d S | j                              |d|¦  «        }|�|j        dk    rt                               d¦  «         d S | j                              ¦   «         }|dk     rht          j        |ddg¦  «        st                               d¦  «         d S t          j        |d	d
d
g¦  «        st                               d¦  «         d S ns| j         	                    |d
dg¦  «        st                               d¦  «         d S | j         	                    |d
d
d
g¦  «        st                               d¦  «         d S t          j        |ddd¬¦  «        st                               d¦  «         d S |j
        d         }| j                              |ddgddg¦  «        }|€t                               d¦  «         d S |d         j
        d         }	||	k    rt                               d¦  «         d S |S )Nr   ÚSqueezez:match_past_pattern_2: expect Squeeze as parent of concat_vÚSplitz0match_past_pattern_2: expect Split for past pathé   Úaxesz:match_past_pattern_2: axes != [0] for Squeeze in past pathÚsplitr   z<match_past_pattern_2: split != [1, 1] for Split in past pathÚaxis)Údefault_valuezKmatch_past_pattern_2: attribute axis of Split are not expected in past pathz7match_past_pattern_2: failed to match past_k_nodes pathr   z,match_past_pattern_2: expect past to be same)r
   r   r    r!   r"   Úget_opset_versionr   Úcheck_node_attributer   Úcheck_node_input_valuer$   r%   Úinfo)
r   r&   r'   r(   Úsqueezer5   Úopset_versionr*   r-   r.   s
             r   Úmatch_past_pattern_2z/FusionGptAttentionPastBase.match_past_pattern_2K   s<  € ð, ”*×'Ò'¨°!Ð5HÑIÔIˆØˆ?˜gœo°Ò:Ð:Ý�LŠLÐUÑVÔVÐVØ�4à”
×%Ò% g¨qÐ2EÑFÔFˆØˆ=˜EœM¨WÒ4Ð4Ý�LŠLÐKÑLÔLÐLØ�4àœ
×4Ò4Ñ6Ô6ˆØ˜2ÒÐÝÔ3°G¸VÀaÀSÑIÔIð Ý—’ÐYÑZÔZÐZØ�tåÔ3°E¸7ÀQÈÀFÑKÔKð Ý—’Ð[Ñ\Ô\Ð\Ø�tðð ”:×4Ò4°W¸aÀ!ÀÑEÔEð Ý—’ÐYÑZÔZÐZØ�tà”:×4Ò4°U¸AÀÀ1¸vÑFÔFð Ý—’Ð[Ñ\Ô\Ð\Ø�tåÔ/°°v¸qÐPQÐRÑRÔRð 	Ý�LŠLÐfÑgÔgÐgØ�4ØŒ{˜1Œ~ˆà”z×3Ò3°H¸yÈ'Ð>RÐUVÐXYÐTZÑ[Ô[ˆØÐÝ�LŠLÐRÑSÔSÐSØ�4Ø˜bÔ!Ô'¨Ô*ˆà�6Š>ˆ>Ý�KŠKÐFÑGÔGÐGØ�4àˆr   c                 ó  — | j                              |d|d¬¦  «        }|st                               d¦  «         d S | j                              |d|d¬¦  «        }|st                               d¦  «         d S |j        d         }|S )NÚ	UnsqueezeF)Ú	recursivezexpect unsqueeze for presentÚConcatzexpect concat for presentr   )r
   Úfind_first_child_by_typer!   r;   Úoutput)r   r'   Úinput_name_to_nodesÚunsqueeze_present_vÚconcat_presentÚpresents         r   Úmatch_presentz(FusionGptAttentionPastBase.match_presentŽ   s¦   € Ø"œj×AÒAØ�kÐ#6À%ð Bñ 
ô 
Ðð #ð 	Ý�KŠKÐ6Ñ7Ô7Ð7Ø�4Øœ×<Ò<Ø Ð+>È%ð =ñ 
ô 
ˆð ð 	Ý�KŠKÐ3Ñ4Ô4Ð4Ø�4à Ô'¨Ô*ˆØˆr   c                 ó  — || j         v r| j         |         }ni| j                             |¦  «        r(| j                             |¦  «        \  }}|| j         |<   n'| j                             |¦  «        \  }}|| j         |<   |S ©N)r   r
   Úfind_graph_inputr   Úcast_graph_input_to_int32Úcast_input_to_int32)r   Ú
input_nameÚattention_mask_input_nameÚcastedÚ	cast_nodes        r   Úcast_attention_maskz.FusionGptAttentionPastBase.cast_attention_maskŸ   s•   € Ø˜Ô3Ð3Ð3Ø(,Ô(BÀ:Ô(NÐ%Ð%ØŒZ×(Ò(¨Ñ4Ô4ð 	OØ04´
×0TÒ0TÐU_Ñ0`Ô0`Ñ-ˆFÐ-Ø5NˆDÔ& zÑ2Ð2à37´:×3QÒ3QÐR\Ñ3]Ô3]Ñ0Ð% yØ5NˆDÔ& zÑ2Ø(Ð(r   )Ú__name__Ú
__module__Ú__qualname__Ú__doc__r   Úintr   r/   r>   rI   rS   Ú__classcell__©r   s   @r   r	   r	      s’   ø€ € € € € Ø=Ð=ð&˜ið &°Cð &ð &ð &ð &ð &ð &ð/ð /ð /ðbAð Að AðFð ð ð"	)ð 	)ð 	)ð 	)ð 	)ð 	)ð 	)r   r	   c                   ó8   ‡ — e Zd ZdZdedefˆ fd„Zd„ Zd„ Zˆ xZ	S )ÚFusionGptAttentionzP
    Fuse GPT-2 Attention with past state subgraph into one Attention node.
    r
   r   c                 óL   •— t          ¦   «                              ||¦  «         d S rK   )r   r   r   s      €r   r   zFusionGptAttention.__init__°   s#   ø€ Ý‰Œ×Ò˜ 	Ñ*Ô*Ð*Ð*Ð*r   c
                 ó  — | j                              d¦  «        }
t          j        d|||||g|
dz   |g|
¬¦  «        }d|_        |j                             t          j        d| j        ¦  «        t          j        d|	rdnd	¦  «        g¦  «         | j	        �@|j                             t          j        d
t          | j	        ¦  «        ¦  «        g¦  «         t          j        d|
dz   |j        d         g|
dz   g|
dz   ¬¦  «        }t          j        d|
dz   |j        d         g|g|
dz   ¬¦  «        }| j                             |||g¦  «         | j        | j        |j        <   | j        | j        |j        <   | j        | j        |j        <   d S )NÚGptAttentionr   Ú_output)ÚinputsÚoutputsÚnamezcom.microsoftr   Úunidirectionalr   r   r   ÚMatMulÚ_matmul_outputÚ_matmulÚAddé   Ú_add)r
   Úcreate_node_namer   Ú	make_nodeÚdomainÚ	attributeÚextendÚmake_attributer   r   Úfloatr$   Únodes_to_addÚthis_graph_nameÚnode_name_to_graph_namerc   )r   Ú	fc_weightÚfc_biasÚgemm_qkvr*   rH   r$   rD   ÚmaskÚis_unidirectionalÚattention_node_nameÚattention_nodeÚmatmul_nodeÚadd_nodes                 r   Úcreate_attention_nodez(FusionGptAttention.create_attention_node³   sÈ  € ð #œj×9Ò9¸.ÑIÔIÐÝÔ)ØØ˜9 g¨t°TÐ:Ø(¨9Ñ4°gÐ>Ø$ð	
ñ 
ô 
ˆð !0ˆÔØÔ ×'Ò'åÔ% k°4´>ÑBÔBÝÔ%Ð&6Ð=NÐ8U¸¸ÐTUÑVÔVðñ	
ô 	
ð 	
ð Ô!Ð-ØÔ$×+Ò+­VÔ-BÐCVÕX]Ð^bÔ^tÑXuÔXuÑ-vÔ-vÐ,wÑxÔxÐxåÔ&ØØ'¨)Ñ3°X´^ÀAÔ5FÐGØ(Ð+;Ñ;Ð<Ø$ yÑ0ð	
ñ 
ô 
ˆõ Ô#ØØ'Ð*:Ñ:¸H¼NÈ1Ô<MÐNØ�HØ$ vÑ-ð	
ñ 
ô 
ˆð 	Ô× Ò  .°+¸xÐ!HÑIÔIÐIØ<@Ô<PˆÔ$ ^Ô%8Ñ9Ø9=Ô9MˆÔ$ [Ô%5Ñ6Ø6:Ô6JˆÔ$ X¤]Ñ3Ð3Ð3r   c                 ó$  — d }d }g }|j         dk    }d }|s$| j                             |g d¢g d¢||¬¦  «        }n#| j                             |g d¢g d¢||¬¦  «        }|€d S d }	|s!|\  }
}}}}}}|
j        d|d         z
           }	n	|\  }}}}}}| j                             |g d	¢g d
¢¦  «        }|€t                               d¦  «         d S |\  }}}}| j                             |g d¢g d¢|¦  «        }|€!| j                             |g d¢g d¢|¦  «        }|€¬| j                             |g d¢g d¢|¦  «        }|€!| j                             |g d¢g d¢|¦  «        }|€t                               d¦  «         d S |d         j        d         }| j                             |d         ¦  «        \  }}|d         j        |         }n&|d         j        d         }|d         j        d         }|d         }|	�%|	|j        vrt                               d¦  «         d S d}d }d }d }| j                             |g d¢g d¢¦  «        } | �Ï| \  }!}"}#}$}%| j                             |"g d¢g d¢¦  «        }&|&€t                               d¦  «         d S |&d         }'|&d         }|$|'k    rt                               d¦  «         d S t          |&¦  «        dk    rB|&d         j         dk    r1| j                             |&d         ¦  «        \  }}(|(dk    r|( | _        �nï| j         	                    |g d ¢g d!¢fg d"¢g d#¢fg|¦  «        \  }} }| €t                               d$¦  «         d S | d%         })| d&         }$| d         }%|dk    r¯| d         }*| j         	                    |*g d'¢g d(¢fg d)¢g d*¢fg d+¢g d,¢fg|¦  «        \  }}}|€t                               d-¦  «         d S t          |¦  «        dk    rA|d         j         dk    r0| j                             |d         ¦  «        \  }}(|(dk    r|(| _        | j         	                    |)g d.¢g d/¢fg d0¢g d1¢fg|¦  «        \  }}&}|&€t                               d2¦  «         d S |&|dk    rdnd         }| j         
                    |&d         d|¦  «        }+|+j         d3k    r%|+}'|$|'k    rt                               d¦  «         d S n(|+j         d4k    r|+}nt                               d2¦  «         | j                             |j        d         ¦  «        },t          |,t          j        ¦  «        rGt          |,j        ¦  «        d5k    r/|,j        d d…         d6k    r|,j        d         |,j        d         k    st                               d7¦  «         d S t          j        |,t          j        |,¦  «        ¦  «        rd8}nUt          j        |,t          j        t          j        |,¦  «        ¦  «        ¦  «        st                               d9¦  «         d S | j                             |%g d:¢g d;¢¦  «        }-|-€t                               d<¦  «         d S |-\  }.}/}0||0k    rt                               d=¦  «         d S | j                             |%g d	¢g d
¢¦  «        }1|1€G| j                             |%g d>¢g d?¢¦  «        }1|1€t                               d@¦  «         d S |1\  }}2}3}4}5n|1\  }2}3}4}5||5k    rt                               dA¦  «         d S |r"|2|k    rt                               dB¦  «         d S dC}6|�(|d         j        d         }7|                      |7¦  «        }6|                      |2||¦  «        p|                      |2||¦  «        }|€t                               dD¦  «         d S | j                             |¦  «        st                               dE¦  «         |                      ||¦  «        }|€t                               dF¦  «         d S | j                             |¦  «        st                               dG¦  «         d S |                      ||||||j        d         |j        d         |6|¦	  «	         d| _        d S )HNr   )rh   ÚReshapeÚGemmr€   r€   r   re   )r   Nr   r   r   r   r   )r(   Úreturn_indice)r€   r�   r€   r€   r   re   )Nr   r   r   r   r   r   r   )rB   r   r€   r2   )r   r   r   r   z&fuse_attention: failed to match v path)r€   r�   r€   r   )r   r   r   r   )r€   r�   r€   r   )rh   re   r   )r   Nr   )rh   re   r   z'fuse_attention: failed to match fc pathri   r   zCUpstream Add and (Skip)LayerNormalization shall have one same inputT)ÚSoftmaxÚSubÚMulÚDivre   )r   r   r   r   r   )
r…   r„   ÚSlicer‡   r@   r„   r1   r‡   ÚShaper†   )
r   r   r   r   r   r   r   r   r   r   z8fuse_attention: failed to match unidirectional mask pathé   z-fuse_attention: skip since div_qk != div_maskr…   iðØÿÿ)rƒ   ÚWherer†   re   )r   r   r   r   )rƒ   rh   rŠ   r†   re   )r   r   Nr   r   z(fuse_attention: failed to match qk nodeséýÿÿÿéþÿÿÿ)r…   r„   ÚCastr@   r@   r€   )Nr   r   r   r   r   )r…   r„   r@   r@   r€   )Nr   r   r   r   )r…   r„   r@   r@   )Nr   r   r   z9fuse_attention: failed to match input attention mask path)r�   r‡   r‡   r@   r„   r1   r‡   rˆ   )r   r   r   r   r   r   r   r   )r‡   r‡   r@   r„   r1   r‡   rˆ   )r   r   r   r   r   r   r   z)fuse_attention: failed to match mask pathr†   rB   é   )r   r   z4fuse_attention: skip since mask shape is not 1x1xWxWFzDfuse_attention: skip since mask is neither lower triangular nor ones)r   r€   r2   )r   r   r   z&fuse_attention: failed to match q pathz.fuse_attention: skip since split_fc != split_q)r   rB   r   r€   r2   )r   r   r   r   r   z&fuse_attention: failed to match k pathz.fuse_attention: skip since split_fc != split_kz8fuse_attention: skip since concat_k != concat_k_to_matchÚ z)fuse_attention: failed to match past pathzpast is not graph input.z,fuse_attention: failed to match present pathz!expect present to be graph output)r    r
   r%   r$   r!   r"   Úget_constant_inputÚlenr   Úmatch_parent_pathsr   Úget_constant_valueÚ
isinstanceÚnpÚndarrayÚshapeÚallcloseÚ	ones_likeÚtrilrS   r/   r>   r;   rL   rI   Úfind_graph_outputr~   rD   Úprune_graph)8r   Únormalize_noderE   r(   r*   rH   r‚   Úis_normalize_node_skiplayernormÚ	qkv_nodesÚanother_inputÚadd_qkvÚreshape_qkvrw   Ú	reshape_1Ú	reshape_2Útranspose_qkvÚ
matmul_qkvÚv_nodesr'   Útranspose_vÚ	reshape_vÚsplit_fcÚfc_nodesru   ÚiÚ_rv   Úlayernorm_before_attentionry   Ú
slice_maskÚinput_mask_nodesÚconcat_k_to_matchÚqk_nodesÚ
softmax_qkÚsub_qkÚmul_qkÚdiv_qkÚ	matmul_qkÚ
mask_nodesÚdiv_maskÚmul_valÚwhere_qkÚadd_qkÚdiv_or_concatÚ	mask_dataÚq_nodesÚtranspose_qÚ	reshape_qÚsplit_qÚk_nodesr&   Útranspose_kÚ	reshape_kÚsplit_krP   rO   s8                                                           r   ÚfusezFusionGptAttention.fuseã   s†
  € ØˆØˆØˆà*8Ô*@ÐD\Ò*\Ð'Øˆ	à.ð 	Øœ
×4Ò4ØØWÐWÐWØ(Ð(Ð(Ø$7Ø+ð 5ñ ô ˆIˆIð œ
×4Ò4ØØPÐPÐPØ%Ð%Ð%Ø$7Ø+ð 5ñ ô ˆIð ÐØˆFàˆØ.ð 	ð ñØØØØØØØð $œM¨!¨m¸AÔ.>Ñ*>Ô?ˆMˆMð ñØØØØØØð ”*×.Ò.¨zÐ;fÐ;fÐ;fÐhtÐhtÐhtÑuÔuˆØˆ?Ý�LŠLÐAÑBÔBÐBØˆFØ7>Ñ4ˆ�; 	¨8ð ”:×/Ò/ØØ@Ð@Ð@ØˆLˆLØñ	
ô 
ˆð ÐØ”z×3Ò3ØØHÐHÐHØ��Ø#ñ	ô ˆHð Ðà”z×3Ò3ØØ7Ð7Ð7Ø��Ø#ñ	ô ˆHð ÐØœ:×7Ò7ØØ?Ð?Ð?Ø �L�LØ'ñ	ô �ð ÐÝ—’ÐFÑGÔGÐGØ�à  œÔ)¨!Ô,ˆIØ”:×0Ò0°¸!´Ñ=Ô=‰DˆAˆqØ˜q”kÔ'¨Ô*ˆGˆGà  œÔ)¨!Ô,ˆIØ˜q”kÔ'¨Ô*ˆGà%-¨b¤\Ð"ð Ð$¨Ð>XÔ>^Ð)^Ð)^Ý�LŠLÐ^Ñ_Ô_Ð_ØˆFà ÐØˆ
ØÐØ ÐØ”:×/Ò/°
Ð<fÐ<fÐ<fÐhwÐhwÐhwÑxÔxˆØÐØ>FÑ;ˆZ˜ ¨°Øœ×5Ò5Øðð ð ð /Ð.Ð.ñô ˆJð  Ð!Ý—’ÐWÑXÔXÐXØ�Ø! "”~ˆHØ# AœˆJà˜Ò!Ð!Ý—’ÐLÑMÔMÐMØ�å�:‰Œ Ò"Ð" z°!¤}Ô'<ÀÒ'EÐ'EØ!œZ×:Ò:¸:Àa¼=ÑIÔI‘
��7Ø˜fÒ$Ð$Ø.5¨X�DÔ*ùð "œZ×:Ò:Øà:Ð:Ð:¸L¸L¸LÐIØAÐAÐAÐCUÐCUÐCUÐVðð $ñô ‰NˆAˆx˜ð ÐÝ—’ÐGÑHÔHÐHØ�à ”|ˆHØ˜b”\ˆFØ  œˆIà�AŠvˆvØ! !œ�Ø)-¬×)FÒ)FØð XÐWÐWØ1Ð1Ð1ðð
 PÐOÐOØ.Ð.Ð.ðð
 EÐDÐDØ+˜O˜Oððð (ñ!*ô *Ñ&�Ð# Qð$ $Ð+Ý—L’LÐ!\Ñ]Ô]Ð]Ø�FÝÐ'Ñ(Ô(¨1Ò,Ð,Ð1AÀ!Ô1DÔ1LÐPUÒ1UÐ1UØ!%¤×!>Ò!>Ð?OÐPQÔ?RÑ!SÔ!S‘J�A�wØ &Ò(Ð(Ø18˜Ô.à#œz×<Ò<Øð dÐcÐcØ0Ð0Ð0ðð \Ð[Ð[Ø-Ð-Ð-ðð
ð $ñ ô  ÑˆAˆz˜1ð Ð!å—’ÐHÑIÔIÐIØ�à#¨¨aª¨ A A°QÔ7ˆJà œJ×1Ò1°*¸R´.À!ÐEXÑYÔYˆMØÔ$¨Ò-Ð-Ø(�Ø˜XÒ%Ð%Ý—L’LÐ!PÑQÔQÐQØ�Fð &ð Ô&¨(Ò2Ð2Ø$1Ð!Ð!å—’ÐHÑIÔIÐIð ”J×1Ò1°*Ô2BÀ1Ô2EÑFÔFˆ	å�y¥"¤*Ñ-Ô-ð	å�I”OÑ$Ô$¨Ò)Ð)Ø”   Ô# vÒ-Ð-Ø” Ô" i¤o°aÔ&8Ò8Ð8å�LŠLÐOÑPÔPÐPØˆFåŒ;�y¥"¤,¨yÑ"9Ô"9Ñ:Ô:ð 	Ø %ÐÐÝ”˜Y­¬µ´¸YÑ0GÔ0GÑ(HÔ(HÑIÔIð 	Ý�LŠLÐ_Ñ`Ô`Ð`ØˆFà”*×.Ò.¨yÐ:[Ð:[Ð:[Ð]fÐ]fÐ]fÑgÔgˆØˆ?Ý�LŠLÐAÑBÔBÐBØˆFØ,3Ñ)ˆ�i Ø�wÒÐÝ�LŠLÐIÑJÔJÐJØˆFà”*×.Ò.¨yÐ:eÐ:eÐ:eÐgsÐgsÐgsÑtÔtˆØˆ?à”j×2Ò2ØØHÐHÐHØ��ñô ˆGð
 ˆÝ—’ÐEÑFÔFÐFØ�àAHÑ>��H˜k¨9°g°gà:AÑ7ˆX�{ I¨wØ�wÒÐÝ�LŠLÐIÑJÔJÐJØˆFàð 	 Ð->Ò!>Ð!>Ý�LŠLÐSÑTÔTÐTØˆFà$&Ð!ØÐ'Ø)¨"Ô-Ô3°AÔ6ˆJØ(,×(@Ò(@ÀÑ(LÔ(LÐ%ð ×(Ò(¨°8Ð=PÑQÔQð 
ÐUY×UnÒUnØ�hÐ 3ñV
ô V
ˆð ˆ<Ý�KŠKÐCÑDÔDÐDØˆFØŒz×*Ò*¨4Ñ0Ô0ð 	5Ý�LŠLÐ3Ñ4Ô4Ð4ð ×$Ò$ XÐ/BÑCÔCˆØˆ?Ý�KŠKÐFÑGÔGÐGØˆFØŒz×+Ò+¨GÑ4Ô4ð 	Ý�KŠKÐ;Ñ<Ô<Ð<ØˆFà×"Ò"ØØØØØØ&Ô-¨aÔ0ØÔ˜qÔ!Ø%Øñ
	
ô 
	
ð 
	
ð  ˆÔÐÐr   )
rT   rU   rV   rW   r   rX   r   r~   rÇ   rY   rZ   s   @r   r\   r\   «   s~   ø€ € € € € ðð ð+˜ið +°Cð +ð +ð +ð +ð +ð +ð.Kð .Kð .Kð` ð  ð  ð  ð  ð  ð  r   r\   )Úloggingr   Únumpyr•   Úfusion_baser   Úfusion_utilsr   Úonnxr   Ú
onnx_modelr   rT   r!   r	   r\   © r   r   ú<module>rÏ      sî   ðð
 Ð Ð Ð Ð Ð à Ð Ð Ð Ø Ð Ð Ð Ð Ð Ø $Ð $Ð $Ð $Ð $Ð $Ø Ð Ð Ð Ð Ð Ø  Ð  Ð  Ð  Ð  Ð  à	ˆ�8Ñ	Ô	€ðX)ð X)ð X)ð X)ð X) ñ X)ô X)ð X)ðvw ð w ð w ð w ð w Ð3ñ w ô w ð w ð w ð w r   