§
    kŠtjB^  ã                   ó„   — d dl mZ d dlZd dlmZ d dlmZ d dlm	Z	m
Z
mZ d dlmZ  ee¦  «        Z G d„ de¦  «        ZdS )	é    )Ú	getLoggerN)ÚFusion)ÚFusionUtils)Ú	NodeProtoÚhelperÚnumpy_helper)Ú	OnnxModelc                   ó  ‡ — e Zd ZdZdefˆ fd„Zdededz  fd„Zdede	dz  fd„Z
d	ed
ede	fd„Zdede	fd„Zd	ede	fd„Zdedede	fd„Zdededefd„Zdedefd„Zdedefd„Z	 ddedededede	dedz  defd„Zd„ Zˆ xZS ) ÚFusionMultiHeadAttentionDiTu‰  
    Fuse MultiHeadAttention for Diffusion Transformer (DiT) models like F5-TTS.

    Recognizes attention patterns where Q, K, V are pre-computed (e.g., after RoPE)
    and K is pre-transposed, with optional Cast nodes for mixed-precision (FP16) inference
    and a custom scalar scale factor before Softmax.

    Supported patterns (anchored at Softmax):

        MatMul(Q, K^T) â†’ [Cast(FP16â†’FP32)] â†’ Mul(scale) â†’ Softmax â†’ [Cast(FP32â†’FP16)] â†’ MatMul(attn, V)
            â†’ Transpose(perm=0,2,1,3) â†’ Reshape â†’ output

    Where:
        - Q is in BNSH format (post-RoPE or post-projection)
        - K is pre-transposed to BNHS format (via Transpose(perm=0,1,3,2) or natively)
        - V is in BNSH format
        - Scale is an arbitrary scalar constant (e.g., 100.0 for DiT, or 1/sqrt(d_k))
        - Cast nodes are optional (present in FP16 models for FP32 Softmax stability)
    Úmodelc                 óR   •— t          ¦   «                              |ddg¬¦  «         d S )NÚMultiHeadAttentionÚSoftmax)Úfused_op_typeÚsearch_op_types)ÚsuperÚ__init__)Úselfr   Ú	__class__s     €úe/var/www/html/CA-Chatbot/venv/lib/python3.11/site-packages/onnxruntime/transformers/fusion_mha_dit.pyr   z$FusionMultiHeadAttentionDiT.__init__%   s-   ø€ Ý‰Œ×Ò˜Ð.BÐU^ÐT_ÐÑ`Ô`Ð`Ð`Ð`ó    Úmul_nodeÚreturnNc                 ód  — t          d¦  «        D ]Ÿ}| j                             |j        |         ¦  «        }|�vt	          |t
          j        ¦  «        r/|j        dk    r#t          | 	                    ¦   «         ¦  «        c S Œrt	          |t          t          f¦  «        rt          |¦  «        c S Œ dS )zÁExtract the scalar scale constant from a Mul node.

        The scale can be in either input[0] or input[1].

        Returns:
            float: the scale value, or None if not found.
        é   Né   )Úranger   Úget_constant_valueÚinputÚ
isinstanceÚnpÚndarrayÚsizeÚfloatÚitemÚint)r   r   ÚiÚvalues       r   Úget_scale_from_mulz.FusionMultiHeadAttentionDiT.get_scale_from_mul(   s©   € õ �q‘”ð 	(ð 	(ˆAØ”J×1Ò1°(´.ÀÔ2CÑDÔDˆEØÐ Ý˜e¥R¤ZÑ0Ô0ð (Ø”z Q’�Ý$ U§Z¢Z¡\¤\Ñ2Ô2Ð2Ð2Ð2ð 'å ­­U |Ñ4Ô4ð (Ý  ™<œ<Ð'Ð'Ð'øØˆtr   c                 ó\  — ddg}t          d¦  «        D ]s}| j                             |j        |         ¦  «        }|�Jt	          |t
          j        ¦  «        r|j        dk    ||<   ŒRt	          |t          t          f¦  «        rd||<   Œt|d         r
|d         sdS |d         r
|d         sdS dS )z¬Determine which input of Mul is the data (non-constant) input.

        Returns:
            int: the input index (0 or 1) of the data input, or None if ambiguous.
        Fr   Nr   Tr   )
r   r   r   r   r    r!   r"   r#   r&   r$   )r   r   Úis_scalar_constantr'   r(   s        r   Úget_data_input_of_mulz1FusionMultiHeadAttentionDiT.get_data_input_of_mul:   sÒ   € ð $ U˜^ÐÝ�q‘”ð 	1ð 	1ˆAØ”J×1Ò1°(´.ÀÔ2CÑDÔDˆEØÐ Ý˜e¥R¤ZÑ0Ô0ð 1Ø,1¬J¸!ªOÐ& qÑ)Ð)Ý ­­U |Ñ4Ô4ð 1Ø,0Ð& qÑ)øà˜aÔ ð 	Ð);¸AÔ)>ð 	Ø�1Ø˜aÔ ð 	Ð);¸AÔ)>ð 	Ø�1Øˆtr   Útensor_nameÚoutput_name_to_nodec                 ól  — ||vrdS ||         }d}d}|�Ÿ||k     r™|j         dk    r]t          j        |d¦  «        }|g d¢k    r@|j        d         |v r0||j        d                  }|                      |¦  «        }|dk    r|S n1|j        d         |v r||j        d                  }nn|dz  }|�||k     °™dS )u‡  Detect num_heads by walking upstream from a BNSH tensor looking for a Reshape node.

        Typical upstream patterns:
            Reshape(shape=[B, S, N, H]) â†’ Transpose(perm=0,2,1,3) â†’ ... â†’ tensor_BNSH
            Reshape(shape=Concat(..., N, H)) â†’ Transpose(perm=0,2,1,3) â†’ ... â†’ tensor_BNSH

        Returns:
            int: number of heads, or 0 if not detected.
        r   é
   NÚ	TransposeÚperm©r   r   r   é   r   )Úop_typer	   Úget_node_attributer   Ú_get_num_heads_from_reshape)	r   r-   r.   ÚcurrentÚdepthÚ	max_depthr2   ÚparentÚ	num_headss	            r   Údetect_num_headsz,FusionMultiHeadAttentionDiT.detect_num_headsO   sÿ   € ð Ð1Ð1Ð1Ø�1ð & kÔ2ˆØˆØˆ	àÐ! e¨iÒ&7Ð&7ØŒ +Ò-Ð-Ý Ô3°G¸VÑDÔD�Ø˜<˜<˜<Ò'Ð'à”} QÔ'Ð+>Ð>Ð>Ø!4°W´]À1Ô5EÔ!F˜Ø$(×$DÒ$DÀVÑ$LÔ$L˜	Ø$ qš=˜=Ø#,Ð,àð Œ}˜QÔÐ#6Ð6Ð6Ø-¨g¬m¸AÔ.>Ô?��àØ�Q‰JˆEð% Ð! e¨iÒ&7Ð&7ð( ˆqr   Únodec                 ó  ‡— ‰j         dk    rdS t          ‰j        ¦  «        dk    ra| j                             ‰j        d         ¦  «        }|�:t          |t          j        ¦  «        r |j        dk    rt          |d         ¦  «        S t          ‰j        ¦  «        dk    rê‰j        d         d„ | j         
                    d¦  «        D ¦   «         v r¹ˆfd	„| j         
                    d¦  «        D ¦   «         }|r‘t          |d         j        ¦  «        dk    rs| j                             |d         j        d         ¦  «        }|�Ft          |t          j        ¦  «        r,|j        dk    r!t          |                     ¦   «         ¦  «        S dS )
zèExtract num_heads from a Reshape node's shape parameter.

        Handles:
            - Static shape constant: [B, S, num_heads, head_dim]
            - Concat-based shape: Concat([B_dim], [S_dim], [num_heads], [head_dim])
        ÚReshaper   r   r   Né   c                 ó(   — h | ]}|j         d          ’ŒS )r   )Úoutput)Ú.0Úns     r   ú	<setcomp>zJFusionMultiHeadAttentionDiT._get_num_heads_from_reshape.<locals>.<setcomp>ˆ   s   € Ð5uÐ5uÐ5uÀa°a´h¸q´kÐ5uÐ5uÐ5ur   ÚConcatc                 óL   •— g | ] }|j         d          ‰j        d         k    ¯|‘Œ!S )r   r   )rC   r   )rD   rE   r>   s     €r   ú
<listcomp>zKFusionMultiHeadAttentionDiT._get_num_heads_from_reshape.<locals>.<listcomp>‰   s7   ø€ ÐqÐqÐq !ÐTUÔT\Ð]^ÔT_ÐcgÔcmÐnoÔcpÒTpÐTp˜AÐTpÐTpÐTpr   )r5   Úlenr   r   r   r    r!   r"   r#   r&   Úget_nodes_by_op_typer%   )r   r>   Úshape_valueÚconcat_nodesr(   s    `   r   r7   z7FusionMultiHeadAttentionDiT._get_num_heads_from_reshapew   sn  ø€ ð Œ<˜9Ò$Ð$Ø�1õ ˆtŒz‰?Œ?˜aÒÐØœ*×7Ò7¸¼
À1¼ÑFÔFˆKØÐ&­:°kÅ2Ä:Ñ+NÔ+NÐ&ÐS^ÔScÐghÒShÐShÝ˜; qœ>Ñ*Ô*Ð*õ ˆtŒz‰?Œ?˜aÒÐ D¤J¨q¤MÐ5uÐ5uÈ4Ì:×KjÒKjÐksÑKtÔKtÐ5uÑ5uÔ5uÐ$uÐ$uØqÐqÐqÐq t¤z×'FÒ'FÀxÑ'PÔ'PÐqÑqÔqˆLØð 1¥ L°¤OÔ$9Ñ :Ô :¸aÒ ?Ð ?Øœ
×5Ò5°lÀ1´oÔ6KÈAÔ6NÑOÔO�ØÐ$Ý! %­¬Ñ4Ô4ð 1¸¼Àqº¸Ý" 5§:¢:¡<¤<Ñ0Ô0Ð0àˆqr   c                 óÆ  — | j         j         j        j        D ]Y}|j        |k    rL|j        j        j        }|r9t          |j        ¦  «        dk    r!|j        d         }|j	        dk    r	|j	        c S ŒZ| j         j         j        j
        D ]Y}|j        |k    rL|j        j        j        }|r9t          |j        ¦  «        dk    r!|j        d         }|j	        dk    r	|j	        c S ŒZdS )z�Try to detect num_heads from a BNSH tensor's shape in graph inputs or value_info.

        For BNSH tensors, the N dimension (index 1) is num_heads.
        rA   r   r   )r   Úgraphr   ÚnameÚtypeÚtensor_typeÚshaperJ   ÚdimÚ	dim_valueÚ
value_info)r   r-   ÚinprS   Údim_nÚvis         r   Ú!detect_num_heads_from_input_shapez=FusionMultiHeadAttentionDiT.detect_num_heads_from_input_shape’   sõ   € ð ”:Ô#Ô)Ô/ð 	/ð 	/ˆCØŒx˜;Ò&Ð&ØœÔ,Ô2�Øð /�S ¤™^œ^¨qÒ0Ð0Ø!œI aœL�EØ”¨Ò*Ð*Ø$œÐ.Ð.Ð.øð ”*Ô"Ô(Ô3ð 	/ð 	/ˆBØŒw˜+Ò%Ð%ØœÔ+Ô1�Øð /�S ¤™^œ^¨qÒ0Ð0Ø!œI aœL�EØ”¨Ò*Ð*Ø$œÐ.Ð.Ð.øØˆqr   Úreshape_outÚtranspose_outc                 óB   — |                       |j        d         ¦  «        S )z›Try to detect num_heads from the output Transpose's input shape.

        The Transpose converts BNSH -> BSNH. The N dimension gives us num_heads.
        r   )rZ   r   )r   r[   r\   s      r   Údetect_num_heads_from_outputz8FusionMultiHeadAttentionDiT.detect_num_heads_from_outputª   s    € ð
 ×5Ò5°mÔ6IÈ!Ô6LÑMÔMÐMr   Ú
input_nameÚoutput_namec                 óœ  — d}| j                              |¦  «        }|€Lt          j        t	          j        g d¢d¬¦  «        |¬¦  «        }| j                              || j        ¦  «         t          j	        d||g|g| j          
                    d¦  «        ¬¦  «        }| j                             |¦  «         | j        | j        |j        <   |S )	a  Add a Reshape node to convert 4D BxSxNxH to 3D BxSxD.

        Args:
            input_name: input name for the 4D tensor of shape BxSxNxH.
            output_name: output name for the 3D tensor of shape BxSxD.

        Returns:
            str: the output name.
        Úbsnh_to_bsd_reshape_dimsN)r   r   éÿÿÿÿÚint64)Údtype)rP   r@   ©ÚinputsÚoutputsrP   )r   Úget_initializerr   Ú
from_arrayr!   ÚarrayÚadd_initializerÚthis_graph_namer   Ú	make_nodeÚcreate_node_nameÚnodes_to_addÚappendÚnode_name_to_graph_namerP   )r   r_   r`   Únew_dims_nameÚnew_dimsÚreshape_nodes         r   Úreshape_to_3dz)FusionMultiHeadAttentionDiT.reshape_to_3d±   sÔ   € ð 3ˆØ”:×-Ò-¨mÑ<Ô<ˆØÐÝ#Ô.­r¬x¸
¸
¸
È'Ð/RÑ/RÔ/RÐYfÐgÑgÔgˆHØŒJ×&Ò& x°Ô1EÑFÔFÐFÝÔ'ØØ Ð.Ø �MØ”×,Ò,¨YÑ7Ô7ð	
ñ 
ô 
ˆð 	Ô× Ò  Ñ.Ô.Ð.Ø:>Ô:NˆÔ$ \Ô%6Ñ7ØÐr   c           	      óÚ   — |dz   }t          j        d|g|g| j                             dd¬¦  «        g d¢¬¦  «        }| j                             |¦  «         | j        | j        |j        <   |S )z4Add a Transpose node to convert BNSH to BSNH format.Ú_BSNHr1   ÚTranspose_BNSH_to_BSNH©Úname_prefixr3   ©rP   r2   ©	r   rn   r   ro   rp   rq   rm   rr   rP   ©r   r_   r`   Útranspose_nodes       r   Útranspose_bnsh_to_bsnhz2FusionMultiHeadAttentionDiT.transpose_bnsh_to_bsnhÊ   ó‚   € à  7Ñ*ˆÝÔ)ØØˆLØˆMØ”×,Ò,¨[ÐF^Ð,Ñ_Ô_Ø��ð
ñ 
ô 
ˆð 	Ô× Ò  Ñ0Ô0Ð0Ø<@Ô<PˆÔ$ ^Ô%8Ñ9ØÐr   c           	      óÚ   — |dz   }t          j        d|g|g| j                             dd¬¦  «        g d¢¬¦  «        }| j                             |¦  «         | j        | j        |j        <   |S )z4Add a Transpose node to convert BNHS to BNSH format.Ú_BNSHr1   ÚTranspose_BNHS_to_BNSHrz   ©r   r   r4   r   r|   r}   r~   s       r   Útranspose_bnhs_to_bnshz2FusionMultiHeadAttentionDiT.transpose_bnhs_to_bnshØ   r�   r   ÚqÚkÚvrC   r<   Úscalec                 óP  — |dk    sJ ‚|||g}|g}t          j        d||| j                             d¦  «        ¬¦  «        }	d|	_        |	j                             t          j        d|¦  «        g¦  «         |�.|	j                             t          j        d|¦  «        g¦  «         |	S )a³  Create a MultiHeadAttention node.

        Args:
            q: name of query input (BSD format, 3D).
            k: name of key input (BNSH format, 4D).
            v: name of value input (BNSH format, 4D).
            output: output name of MHA.
            num_heads: number of attention heads.
            scale: optional custom scale factor for attention logits.

        Returns:
            NodeProto: the node created.
        r   r   rf   zcom.microsoftr<   NrŠ   )r   rn   r   ro   ÚdomainÚ	attributeÚextendÚmake_attribute)
r   r‡   rˆ   r‰   rC   r<   rŠ   Ú
mha_inputsÚmha_outputsÚmha_nodes
             r   Úcreate_multihead_attention_nodez;FusionMultiHeadAttentionDiT.create_multihead_attention_nodeæ   s¹   € ð, ˜1Š}ˆ}ˆ}ˆ}à˜˜A�Yˆ
Ø�hˆåÔ#Ø ØØØ”×,Ò,Ð-AÑBÔBð	
ñ 
ô 
ˆð *ˆŒØÔ×!Ò!¥6Ô#8¸ÀiÑ#PÔ#PÐ"QÑRÔRÐRàÐØÔ×%Ò%¥vÔ'<¸WÀeÑ'LÔ'LÐ&MÑNÔNÐNàˆr   c                 óZ  — |j         dk    sJ ‚|}| j                             |j        d         ¦  «        rd S t	          j        |d¦  «        }|�|dvrd S |€| j                             ¦   «         dk     rd S d }| j                             |g d¢g d¢|¦  «        }|�|\  }}}	}
n+| j                             |g d¢g d	¢|¦  «        }|€d S |\  }}	}
t          j	        |	d
g d¢¦  «        sd S d }| j         
                    |g d¢g d¢¦  «        }|�|\  }}}n)| j         
                    |ddgdd g¦  «        }|€d S |\  }}|                      |¦  «        }|€t                               d¦  «         d S |                      |¦  «        }|€d S |r|j        d         n|j        d         }|j        |         |k    r]|r/| j         
                    |g d¢dd|z
  dg¦  «        }|€d S |\  }}}n,| j         
                    |ddgdd|z
  g¦  «        }|€d S |\  }}|j        d         }|j        d         }|j        d         }d}|�&||v r"||         }|j         dk    r|j        d         }d}| j                             |dd|¬¦  «        }|�&t          j	        |d
g d¢¦  «        r|j        d         }n|                      |¦  «        }d}|}||v r"||         }|j         dk    r|j        d         }d}| j                             |¦  «        }| j                             |¦  «        }| j                             |¦  «        }|�&|�$||k    rt                               d||¦  «         d S |�&|�$||k    rt                               d||¦  «         d S |€|�$|s"|�|€t                               d||¦  «         d S |r(|�&|�$||k    rt                               d||¦  «         d S |                      ||¦  «        } | dk    r|                      ||¦  «        } | dk    r|                      |¦  «        } | dk    r|                      |¦  «        } | dk    r|                      |
|	¦  «        } | dk    rt                               d¦  «         d S |                      |¦  «        }!|                      |!|!dz   ¦  «        }"|j        d         |j        d         |j        d         g}#|� |#                     |j        d         ¦  «         |� |#                     |j        d         ¦  «         |#D ]=}$|$|v r7t3          ||$         ¦  «        dk    rt                               d|$¦  «          d S Œ>|                      |"|||
j        d         | |¬¦  «        }%| j                             |%¦  «         | j        | j        |%j        <   ||	|
g}&|�|&                     |¦  «         | j                             |&|
j        d         g||¦  «        st                               d ¦  «         d S | j          !                    |&¦  «         d| _"        d S )!Nr   r   Úaxis)rc   r4   é   )ÚCastÚMatMulr1   r@   )©r   r   r™   r™   r™   )r˜   r1   r@   )r™   r™   r™   r2   r3   )ÚMulr—   r˜   )r   Nr   rš   r˜   z9fuse_dit_attention: failed to extract scale from Mul noder   Fr—   Tr1   )Úinput_indexr.   r…   zBfuse_dit_attention: Q/V element type mismatch (%s vs %s), skippingzBfuse_dit_attention: Q/K element type mismatch (%s vs %s), skippingzlfuse_dit_attention: cast nodes present, V not traced through Cast, types unverifiable (q=%s, v=%s), skippingzLfuse_dit_attention: K Cast source dtype mismatch with Q (%s vs %s), skippingz.fuse_dit_attention: failed to detect num_headsÚ_BSDzDfuse_dit_attention: intermediate %s has multiple consumers, skipping)r‡   rˆ   r‰   rC   r<   rŠ   zFfuse_dit_attention: downstream nodes have external consumers, skipping)#r5   r   Úfind_graph_outputrC   r	   r6   Úget_opset_versionÚmatch_child_pathr   Úcheck_node_attributeÚmatch_parent_pathr)   ÚloggerÚdebugr,   r   Úmatch_parentr†   Ú	get_dtyper=   rZ   r^   r€   rv   rq   rJ   r“   rp   rm   rr   rP   Úis_safe_to_fuse_nodesÚnodes_to_removerŽ   Úprune_graph)'r   r>   Úinput_name_to_nodesr.   Úsoftmaxr•   Úcast_after_softmaxÚchild_nodesÚ	matmul_svr\   r[   Úcast_before_softmaxÚparent_nodesÚ	mul_scaleÚ	matmul_qkrŠ   Údata_input_idxÚexpected_data_sourceÚparent_nodes_altÚq_bnshÚk_transposed_inputÚv_bnshÚv_traced_through_castÚ
v_producerÚk_transpose_nodeÚk_bnshÚk_traced_through_castÚk_bnsh_for_dtypeÚ
k_producerÚq_dtypeÚk_dtypeÚv_dtyper<   Úq_bsnhÚq_bsdÚintermediate_outputsr-   r’   r§   s'                                          r   Úfusez FusionMultiHeadAttentionDiT.fuse  sñ  € ØŒ|˜yÒ(Ð(Ð(Ð(Øˆð Œ:×'Ò'¨¬°qÔ(9Ñ:Ô:ð 	ØˆFõ Ô+¨G°VÑ<Ô<ˆØÐ ¨GÐ 3Ð 3ØˆFØˆ<˜DœJ×8Ò8Ñ:Ô:¸RÒ?Ð?ØˆFð
 "Ðð ”j×1Ò1ØØ6Ð6Ð6Ø,Ð,Ð,Øñ	
ô 
ˆð Ð"ØHSÑEÐ 	¨=¸+¸+ð œ*×5Ò5ØØ2Ð2Ð2Ø(Ð(Ð(Ø#ñ	ô ˆKð Ð"Ø�Ø4?Ñ1ˆI�} kõ Ô/°¸vÀ|À|À|ÑTÔTð 	ØˆFð
 #Ðð ”z×3Ò3ØØ%Ð%Ð%ØˆLˆLñ
ô 
ˆð
 Ð#Ø8DÑ5ˆIÐ*¨I¨Ið  œ:×7Ò7ØØ˜Ð!Ø�D�	ñô ˆLð
 Ð#Ø�Ø#/Ñ ˆI�yð
 ×'Ò'¨	Ñ2Ô2ˆØˆ=Ý�LŠLÐTÑUÔUÐUØˆFð ×3Ò3°IÑ>Ô>ˆØÐ!ØˆFð ATÐlÐ2Ô9¸!Ô<Ð<ÐYbÔYiÐjkÔYlÐØŒ?˜>Ô*Ð.BÒBÐBà"ð 8Ø#'¤:×#?Ò#?ØØ-Ð-Ð-Ø˜˜NÑ*¨AÐ.ñ$ô $Ð ð
 $Ð+Ø�FØ<LÑ9�	Ð.°	°	à#'¤:×#?Ò#?ØØ˜HÐ%Ø˜˜NÑ*Ð+ñ$ô $Ð ð
 $Ð+Ø�FØ'7Ñ$�	˜9ð
 ” Ô#ˆØ&œ_¨QÔ/ÐØ” Ô#ˆð !&ÐØÐ)¨fÐ8KÐ.KÐ.KØ,¨VÔ4ˆJØÔ! VÒ+Ð+Ø#Ô)¨!Ô,�Ø(,Ð%ð  œ:×2Ò2Ø�{°ÐGZð 3ñ 
ô 
Ðð Ð'­KÔ,LÐM]Ð_eÐgsÐgsÐgsÑ,tÔ,tÐ'Ø%Ô+¨AÔ.ˆFˆFð ×0Ò0Ð1CÑDÔDˆFð !&ÐØ!ÐØÐ2Ð2Ð2Ø,Ð-=Ô>ˆJØÔ! VÒ+Ð+Ø#-Ô#3°AÔ#6Ð Ø(,Ð%ð ”*×&Ò& vÑ.Ô.ˆØ”*×&Ò&Ð'7Ñ8Ô8ˆØ”*×&Ò& vÑ.Ô.ˆØÐ 7Ð#6¸7ÀgÒ;MÐ;MÝ�LŠLÐ]Ð_fÐhoÑpÔpÐpØˆFØÐ 7Ð#6¸7ÀgÒ;MÐ;MÝ�LŠLÐ]Ð_fÐhoÑpÔpÐpØˆFð  Ð+Ð/AÐ/MÐWlÐ/MØˆ ' /Ý—’ð@àØñ	ô ð ð �ð !ð 	 WÐ%8¸WÐ=PÐU\Ð`gÒUgÐUgÝ�LŠLØ^ØØñô ð ð
 ˆFð
 ×)Ò)¨&Ð2EÑFÔFˆ	Ø˜Š>ˆ>à×-Ò-¨fÐ6IÑJÔJˆIØ˜Š>ˆ>à×>Ò>¸vÑFÔFˆIØ˜Š>ˆ>Ø×>Ò>¸vÑFÔFˆIØ˜Š>ˆ>à×9Ò9¸+À}ÑUÔUˆIØ˜Š>ˆ>Ý�LŠLÐIÑJÔJÐJØˆFð
 ×,Ò,¨VÑ4Ô4ˆØ×"Ò" 6¨6°F©?Ñ;Ô;ˆð !*Ô 0°Ô 3°YÔ5EÀaÔ5HÈ'Ì.ÐYZÔJ[Ð\ÐØÐ*Ø ×'Ò'Ð(;Ô(BÀ1Ô(EÑFÔFÐFØÐ)Ø ×'Ò'Ð(:Ô(AÀ!Ô(DÑEÔEÐEØ/ð 	ð 	ˆKØÐ1Ð1Ð1µcÐ:MÈkÔ:ZÑ6[Ô6[Ð^_Ò6_Ð6_Ý—’ÐcÐepÑqÔqÐqØ��øð
 ×7Ò7ØØØØÔ% aÔ(ØØð 8ñ 
ô 
ˆð 	Ô× Ò  Ñ*Ô*Ð*Ø6:Ô6JˆÔ$ X¤]Ñ3ð % m°[ÐAˆØÐ)Ø×"Ò"Ð#5Ñ6Ô6Ð6ð
 Œz×/Ò/Ø˜kÔ0°Ô3Ð4Ð6IÐK^ñ
ô 
ð 	õ �LŠLÐaÑbÔbÐbØˆFàÔ×#Ò# OÑ4Ô4Ð4ð  ˆÔÐÐr   )N)Ú__name__Ú
__module__Ú__qualname__Ú__doc__r	   r   r   r$   r)   r&   r,   ÚstrÚdictr=   r7   rZ   r^   rv   r€   r†   r“   rÅ   Ú__classcell__)r   s   @r   r   r      s+  ø€ € € € € ðð ð(a˜ið að að að að að að¨9ð ¸À¹ð ð ð ð ð$¨ið ¸CÀ$¹Jð ð ð ð ð*&¨Cð &Àdð &Èsð &ð &ð &ð &ðP°	ð ¸cð ð ð ð ð6¸Sð ÀSð ð ð ð ð0N¸	ð NÐR[ð NÐ`cð Nð Nð Nð Nð¨ð ¸#ð À#ð ð ð ð ð2°ð ¸ð ð ð ð ð°ð ¸ð ð ð ð ð* #ð(ð (àð(ð ð(ð ð	(ð
 ð(ð ð(ð �t‰|ð(ð 
ð(ð (ð (ð (ðTE ð E ð E ð E ð E ð E ð E r   r   )Úloggingr   Únumpyr!   Úfusion_baser   Úfusion_utilsr   Úonnxr   r   r   Ú
onnx_modelr	   rÆ   r¢   r   © r   r   ú<module>rÔ      sÆ   ðð
 Ð Ð Ð Ð Ð à Ð Ð Ð Ø Ð Ð Ð Ð Ð Ø $Ð $Ð $Ð $Ð $Ð $Ø 0Ð 0Ð 0Ð 0Ð 0Ð 0Ð 0Ð 0Ð 0Ð 0Ø  Ð  Ð  Ð  Ð  Ð  à	ˆ�8Ñ	Ô	€ðE ð E ð E ð E ð E  &ñ E ô E ð E ð E ð E r   