Ë
    �…j„O  ã                   óŠ   — d dl mZ d dlmZ d dlmZmZ d dlmZ  ee	«      Z
 G d„ de«      Z G d„ de«      Z G d	„ d
e«      Zy)é    )Ú	getLogger)ÚFusion)ÚTensorProtoÚhelper)Ú	OnnxModelc                   ó>   ‡ — e Zd Zddededefˆ fd„Zdedefd„Zˆ xZS )	ÚFusionLayerNormalizationÚmodelÚcheck_constant_and_dimensionÚforcec                 óD   •— t         ‰| �  |dd«       || _        || _        y ©NÚLayerNormalizationÚ
ReduceMean)ÚsuperÚ__init__r   r   )Úselfr
   r   r   Ú	__class__s       €új/root/aria/tools/markitdown-venv/lib/python3.12/site-packages/onnxruntime/transformers/fusion_layernorm.pyr   z!FusionLayerNormalization.__init__   s$   ø€ Ü‰Ñ˜Ð 4°lÔCØ,HˆÔ)Øˆ�
ó    Úinput_name_to_nodesÚoutput_name_to_nodec           
      óŽ	  — g }| j                   j                  ||«      }t        |«      dk(  st        |«      dkD  ry|j                  d   }|d   j                  dk7  s|d   j                  d   |k7  ryt        |«      dk(  r(|d   j                  dk7  s|d   j                  d   |k7  ryd}|D ]N  }| j                   j                  |d|d¬«      }	|	�|	} n)| j                   j                  |d	dg«      }
|
€ŒI|
d
   } n |€y| j                   j                  |g d¢g d¢fg d¢g d¢fg|«      \  }}}|€y|d
   }||vry|d   }| j                   j                  |«      \  }}|�
|dk  s|dkD  rt        j                  d|› �«       y|d   }| j                   j                  |d«      dk7  ry|j                  d   |vry||j                  d      }|D �]ò  }|j                  d	k(  r9|j                  |«       |j                  d   |vrŒ6||j                  d      d   }n|}|j                  dk7  rŒ^|j                  d   |vrŒp||j                  d      d   }|j                  dk7  rŒ•|j                  |«       |j                  |«       |j                  |dd
 «       |j                  |||g«       |j                  d	k7  r|n|}|j                  d| j                   j                  |j                  d   |«      z
     }| j                   r| j                   j#                  |dd«      s�ŒV|j                  d| j                   j                  |j                  d   |«      z
     }| j                   r| j                   j#                  |dd«      s�Œº|j                  d   }| j                   j%                  ||j                  ||«      s+| j&                  rd| _        n2t        j                  d«       �Œ| j*                  j                  |«       t-        j.                  d|j                  d   ||g|g| j                   j1                  dd¬«      ¬«      }|j2                  j                  t-        j4                  dt7        |«      «      g«       | j8                  j                  |«       | j:                  | j<                  |j>                  <   �Œõ y)aÕ  
        Fuse Layer Normalization subgraph into one node LayerNormalization:
              +----------------------+
              |                      |
              |                      v
          [Root] --> ReduceMean -->  Sub  --> Pow --> ReduceMean --> Add --> Sqrt --> Div --> Mul --> Add
                     (axis=2 or -1)  |      (Y=2)   (axis=2 or -1)  (B=E-6 or E-12)    ^
                                     |                                                 |
                                     +-------------------------------------------------+

         It also handles cases of duplicated sub nodes exported from older version of PyTorch:
              +----------------------+
              |                      v
              |           +-------> Sub-----------------------------------------------+
              |           |                                                           |
              |           |                                                           v
          [Root] --> ReduceMean -->  Sub  --> Pow --> ReduceMean --> Add --> Sqrt --> Div  --> Mul --> Add
              |                      ^
              |                      |
              +----------------------+
        r   é   NÚSubé   ÚDivF©Ú	recursiveÚCastéÿÿÿÿ©ÚSqrtÚAddr   ÚPowr   ©r   r   r   r   r   )r#   r$   r   r%   r    r   )r   r   r   r   r   r   ç-Cëâ6?úHskip SkipLayerNormalization fusion since epsilon value is not expected: é   ç       @ÚMulr$   úlayernorm weightúlayernorm biasTú4It is not safe to fuse LayerNormalization node. Skipr   Ú	LayerNorm©Úname_prefix©ÚinputsÚoutputsÚnameÚepsilon) r
   Úget_childrenÚlenÚinputÚop_typeÚfind_first_child_by_typeÚmatch_child_pathÚmatch_parent_pathsÚget_constant_inputÚloggerÚdebugÚfind_constant_inputÚoutputÚappendÚextendÚinput_indexr   Ú$is_constant_with_specified_dimensionÚis_safe_to_fuse_nodesr   Úprune_graphÚnodes_to_remover   Ú	make_nodeÚcreate_node_nameÚ	attributeÚmake_attributeÚfloatÚnodes_to_addÚthis_graph_nameÚnode_name_to_graph_namer5   )r   Únoder   r   Úsubgraph_nodesÚchildrenÚ
root_inputÚdiv_nodeÚchildÚ
div_node_1Ú
div_node_2Ú_path_idÚparent_nodesÚ_Úsub_nodeÚadd_eps_nodeÚir6   Úpow_nodeÚdiv_childrenÚ	temp_nodeÚmul_nodeÚlast_add_nodeÚnode_before_weightÚweight_inputÚ
bias_inputÚlayer_norm_outputÚnormalize_nodes                               r   ÚfusezFusionLayerNormalization.fuse   sã  € ð, ˆØ—:‘:×*Ñ*¨4Ð1DÓEˆÜˆx‹=˜AÒ¤ X£°Ò!2Øà—Z‘Z ‘]ˆ
à�A‰;×Ñ %Ò'¨8°A©;×+<Ñ+<¸QÑ+?À:Ò+MØäˆx‹=˜AÒØ˜‰{×"Ñ" eÒ+¨x¸©{×/@Ñ/@ÀÑ/CÀzÒ/QØàˆØò 	ˆEàŸ™×<Ñ<¸UÀEÐK^ÐjoÐ<ÓpˆJØÐ%Ø%�Ùð "ŸZ™Z×8Ñ8¸ÀÈÀÓP�
ØÑ)Ø)¨"™~�HÙð	ð ÐØà$(§J¡J×$AÑ$AØâ<ºoÐNÚDÒFXÐYðð  ó%
Ñ!ˆ�, ð ÐØà Ñ#ˆØ˜8Ñ#Øà# A‘ˆØ—Z‘Z×2Ñ2°<Ó@‰
ˆˆ7Øˆ?˜g¨šl¨g¸Ò.>Ü�L‰LÐcÐdkÐclÐmÔnØà ‘?ˆØ�:‰:×)Ñ)¨(°CÓ8¸AÒ=Øà�?‰?˜1ÑÐ%8Ñ8Øð +¨8¯?©?¸1Ñ+=Ñ>ˆØ%ó @	UˆIØ× Ñ  FÒ*à×%Ñ% iÔ0Ø×#Ñ# AÑ&Ð.AÑAØØ.¨y×/?Ñ/?ÀÑ/BÑCÀAÑF‘ð %�Ø×Ñ 5Ò(Øà�‰˜qÑ!Ð)<Ñ<ØØ/°·±ÀÑ0BÑCÀAÑFˆMØ×$Ñ$¨Ò-Øà×!Ñ! $Ô'Ø×!Ñ! (Ô+Ø×!Ñ! ,¨s°Ð"3Ô4à×!Ñ! =°(¸HÐ"EÔFà-6×->Ñ->À&Ò-H¡ÈiÐØ#Ÿ>™>¨!¨d¯j©j×.DÑ.DÐEW×E^ÑE^Ð_`ÑEaÐckÓ.lÑ*lÑmˆLØ×0Ò0¸¿¹×9hÑ9hØ˜aÐ!3ô:ñ à&×,Ñ,¨Q°·±×1GÑ1GÈÏÉÐXYÑHZÐ\iÓ1jÑ-jÑkˆJØ×0Ò0¸¿¹×9hÑ9hØ˜AÐ/ô:ñ à -× 4Ñ 4°QÑ 7ÐØ—:‘:×3Ñ3ØØ×$Ñ$Ø#Ø#ô	ð —:’:Ø'+�DÕ$ä—L‘LÐ!WÔXÙà×$Ñ$×+Ñ+¨NÔ;ä#×-Ñ-Ø$ØŸ
™
 1™ |°ZÐ@Ø*Ð+Ø—Z‘Z×0Ñ0Ð1EÐS^Ð0Ó_ô	ˆNð ×$Ñ$×+Ñ+¬V×-BÑ-BÀ9ÌeÐT[ËnÓ-]Ð,^Ô_Ø×Ñ×$Ñ$ ^Ô4Ø@D×@TÑ@TˆD×(Ñ(¨×)<Ñ)<Ó=ñA@	Ur   )TF)	Ú__name__Ú
__module__Ú__qualname__r   Úboolr   Údictrj   Ú__classcell__©r   s   @r   r	   r	      s7   ø„ ñ˜ið Àtð Ð[_õ ð
SU¨dð SUÈ÷ SUr   r	   c                   óR   ‡ — e Zd Zdefˆ fd„Zd„ Zd
dedee   fd„Z	de
de
fd	„Zˆ xZS )ÚFusionLayerNormalizationNCHWr
   c                 ó(   •— t         ‰| �  |dd«       y r   ©r   r   ©r   r
   r   s     €r   r   z%FusionLayerNormalizationNCHW.__init__«   s   ø€ Ü‰Ñ˜Ð 4°lÕCr   c                 óz  — | j                   j                  |«      }|€t        j                  |› d|› d�«       y t	        |j
                  «      dk7  s$|j
                  d   dk7  s|j
                  d   dk7  r(t        j                  |› d|› d|j
                  › �«       y |j                  |j
                  d   g«      S )Nú z is not initializer.r)   r   r   z* shall have 3 dimensions Cx1x1. Got shape r   )r
   Úget_constant_valuer?   r@   r8   ÚshapeÚreshape)r   Úoutput_nameÚdescriptionÚvalues       r   Úget_weight_or_biasz/FusionLayerNormalizationNCHW.get_weight_or_bias®   sª   € Ø—
‘
×-Ñ-¨kÓ:ˆØˆ=Ü�L‰L˜K˜=¨¨+¨Ð6JÐKÔLØäˆu�{‰{Ó˜qÒ  E§K¡K°¡N°aÒ$7¸5¿;¹;Àq¹>ÈQÒ;NÜ�L‰L˜K˜=¨¨+¨Ð6`Ðaf×alÑalÐ`mÐnÔoØà�}‰}˜eŸk™k¨!™nÐ-Ó.Ð.r   Ú
input_nameÚpermc                 óì   — | j                   j                  d«      }|€|dz   dz   |z   }t        j                  d|g|g|¬«      }|j                  j                  t        j                  d|«      g«       |S )z&Append a Transpose node after an inputÚ	TransposeÚ_outú-r2   r�   )r
   rK   r   rJ   rL   rD   rM   )r   r€   r�   r|   Ú	node_nameÚtranspose_nodes         r   Úcreate_transpose_nodez2FusionLayerNormalizationNCHW.create_transpose_nodeº   sw   € à—J‘J×/Ñ/°Ó<ˆ	àÐØ# fÑ,¨sÑ2°ZÑ?ˆKä×)Ñ)¨+¸z¸lÐU`ÐTaÐhqÔrˆØ× Ñ ×'Ñ'¬×)>Ñ)>¸vÀtÓ)LÐ(MÔNàÐr   r   r   c                 ó®
  — t        j                  |d«      }t        |t        «      r|dgk7  ryg }| j                  j                  ||«      }t        |«      dk7  ry|j                  d   }|d   j                  dk7  s|d   j                  d   |k7  ry|d   }| j                  j                  |d|d¬«      }	|	€y| j                  j                  |	g d	¢g d
¢|«      }
|
€y|
\  }}}}}||k7  ry| j                  j                  |«      \  }}|�
|dk  s|dkD  rt        j                  d|› �«       yt        j                  |d«      }t        |t        «      sJ ‚|dgk7  ry| j                  j                  |d«      dk7  ry||	j                  d      d   }|}|j                  dk7  ry||j                  d      d   }|j                  dk7  ry|j!                  |«       |j#                  |
«       |j#                  |||	g«       | j                  j%                  ||j                  ||«      st        j                  d«       y|j                  dk7  r|	n|}|j                  d| j                  j'                  |j                  d   |«      z
     }| j)                  |d«      }|€y|j                  d| j                  j'                  |j                  d   |«      z
     }| j)                  |d«      }|€yt+        j,                  |dz   t.        j0                  |j2                  |«      }t+        j,                  |dz   t.        j0                  |j2                  |«      }| j                  j5                  || j6                  «       | j                  j5                  || j6                  «       | j8                  j#                  |«       | j;                  |j                  d   g d¢«      }| j                  j=                  dd¬«      }| j;                  |dz   g d¢|j                  d   «      }t+        j>                  d|j                  d   |dz   |dz   g|dz   g|¬«      }|j@                  j#                  t+        jB                  dtE        |«      «      g«       | jF                  j!                  |«       | jF                  j!                  |«       | jF                  j!                  |«       | j6                  | jH                  |jJ                  <   | j6                  | jH                  |jJ                  <   | j6                  | jH                  |jJ                  <   d} | jM                  | «       y)a*  
        Fuse Layer Normalization subgraph into one node LayerNormalization:
              +----------------------+
              | NxCxHxW              |
              |                      v                                                     (Cx1x1)  (Cx1x1)
          [Root] --> ReduceMean -->  Sub --> Pow --> ReduceMean --> Add --> Sqrt --> Div --> Mul --> Add -->
                     (axes=1)        |      (Y=2)     (axes=1)     (E-6)             ^
                                     |                                               |
                                     +-----------------------------------------------+

        Fused subgraph:
                       (0,2,3,1)                            (0,3,1,2)
            [Root] --> Transpose --> LayerNormalization --> Transpose -->
        Úaxesr   Nr   r   r   Fr   r"   r&   r'   r(   r*   r+   r$   r.   r    r,   r-   Ú_NHWC)r   r   r)   r   r   r/   r0   Ú	_out_nhwc)r   r)   r   r   r2   r6   zLayerNormalization(NHWC))'r   Úget_node_attributeÚ
isinstanceÚlistr
   r7   r8   r9   r:   r;   Úmatch_parent_pathr>   r?   r@   rA   rB   rC   rD   rG   rE   r   r   Úmake_tensorr   ÚFLOATrz   Úadd_initializerrP   rI   rˆ   rK   rJ   rL   rM   rN   rO   rQ   r5   Úincrease_counter)!r   rR   r   r   rŠ   rS   rT   rU   ÚsubrV   r[   Ú
_sqrt_nodeÚsecond_add_nodeÚreduce_mean_noder`   r]   r_   r6   rb   rc   rd   re   rf   Úweightrg   ÚbiasÚweight_nhwcÚ	bias_nhwcÚtranspose_inputÚlayernorm_node_nameÚtranspose_outputri   Úcounter_names!                                    r   rj   z!FusionLayerNormalizationNCHW.fuseÆ   s  € ô ×+Ñ+¨D°&Ó9ˆÜ˜4¤Ô&¨4°A°3ª;ØàˆØ—:‘:×*Ñ*¨4Ð1DÓEˆÜˆx‹=˜AÒØà—Z‘Z ‘]ˆ
à�A‰;×Ñ %Ò'¨8°A©;×+<Ñ+<¸QÑ+?À:Ò+MØØ�q‰kˆà—:‘:×6Ñ6°s¸EÐCVÐbgÐ6ÓhˆØÐØà—z‘z×3Ñ3ØÚ7ÚØó	
ˆð ÐØàLXÑIˆ
�OÐ%5°xÀØ�(Š?Øà—Z‘Z×2Ñ2°?ÓC‰
ˆˆ7Øˆ?˜g¨šl¨g¸Ò.>Ü�L‰LÐcÐdkÐclÐmÔnØä×+Ñ+Ð,<¸fÓEˆÜ˜$¤Ô%Ð%Ð%Ø�A�3Š;Øà�:‰:×)Ñ)¨(°CÓ8¸AÒ=Øà'¨¯©¸Ñ(:Ñ;¸AÑ>ˆ	ØˆØ×Ñ˜uÒ$Øà+¨H¯O©O¸AÑ,>Ñ?ÀÑBˆØ× Ñ  EÒ)Øà×Ñ˜dÔ#Ø×Ñ˜lÔ+Ø×Ñ˜}¨h¸ÐAÔBà�z‰z×/Ñ/ØØ× Ñ ØØô	
ô �L‰LÐOÔPØà)2×):Ñ):¸fÒ)D™XÈ)ÐØ—~‘~ a¨$¯*©*×*@Ñ*@ÐAS×AZÑAZÐ[\ÑA]Ð_gÓ*hÑ&hÑiˆØ×(Ñ(¨Ð7IÓJˆØˆ>Øà"×(Ñ(¨¨T¯Z©Z×-CÑ-CÀHÇOÁOÐTUÑDVÐXeÓ-fÑ)fÑgˆ
Ø×&Ñ& zÐ3CÓDˆØˆ<Øä×(Ñ(¨¸Ñ)?Ä×ARÑARÐTZ×T`ÑT`ÐbhÓiˆä×&Ñ& z°GÑ';¼[×=NÑ=NÐPV×P\ÑP\Ð^dÓeˆ	Ø�
‰
×"Ñ" ;°×0DÑ0DÔEØ�
‰
×"Ñ" 9¨d×.BÑ.BÔCà×Ñ×#Ñ# NÔ3à×4Ñ4°T·Z±ZÀ±]ÂLÓQˆà"Ÿj™j×9Ñ9Ð:NÐ\gÐ9ÓhÐà×5Ñ5Ø +Ñ-ª|¸]×=QÑ=QÐRSÑ=Tó
Ðô  ×)Ñ)Ø Ø#×*Ñ*¨1Ñ-¨|¸gÑ/EÀzÐT[ÑG[Ð\Ø(¨;Ñ6Ð7Ø$ô	
ˆð 	× Ñ ×'Ñ'¬×)>Ñ)>¸yÌ%ÐPWË.Ó)YÐ(ZÔ[à×Ñ× Ñ  Ô1Ø×Ñ× Ñ  Ô0Ø×Ñ× Ñ Ð!1Ô2Ø=A×=QÑ=Qˆ×$Ñ$ _×%9Ñ%9Ñ:Ø<@×<PÑ<Pˆ×$Ñ$ ^×%8Ñ%8Ñ9Ø>B×>RÑ>Rˆ×$Ñ$Ð%5×%:Ñ%:Ñ;à1ˆØ×Ñ˜lÕ+r   )N)rk   rl   rm   r   r   r   Ústrr�   Úintrˆ   ro   rj   rp   rq   s   @r   rs   rs   ª   sC   ø„ ðD˜iõ Dò
/ñ
°ð 
¸4À¹9ó 
ð},¨dð },È÷ },r   rs   c                   ó4   ‡ — e Zd Zdefˆ fd„Zdedefd„Zˆ xZS )ÚFusionLayerNormalizationTFr
   c                 ó*   •— t         ‰| �  |ddd«       y )Nr   r$   ÚTFru   rv   s     €r   r   z#FusionLayerNormalizationTF.__init__G  s   ø€ Ü‰Ñ˜Ð 4°e¸TÕBr   r   r   c                 ó,  — g }| j                   j                  |g d¢g d¢fg d¢g d¢fg|«      \  }}}|€yt        |«      dk(  sJ ‚|d   dv r|d	   dv r|d
   dv st        j	                  d«       y|dd \  }}}	}
}}|dd \  }}}}d}t        |«      dk(  r|d   }|j
                  dk(  sJ ‚| j                   j                  |dd|«      }|€t        j	                  d«       y| j                   j                  |d|«      }|€|n| j                   j                  |d|«      }|€t        j	                  d«       y| j                   j                  |«      \  }}|�|dk  s|dkD  r|€t        j	                  d«       y|€L|j                  d   |j                  vs|j                  d   |j                  vrt        j	                  d«       y|�L|j                  d   |j                  vs|j                  d   |j                  vrt        j	                  d«       y|j                  d   |j                  d	   k7  rt        j	                  d«       y||||	|
|||||||g}|�J| j                   j                  |dd|«      }|€t        j	                  d«       y|j                  |||g«       | j                   j                  ||j                  | j                   j                  «       | j                   j                  «       «      st        j	                  d«       y| j                  j                  |«       |	j                  d	   }|j                  d   }t!        j"                  d|j                  d   ||g|j                  d   g| j                   j%                  dd¬«      ¬«      }|j&                  j                  t!        j(                  dt+        |«      «      g«       | j,                  j/                  |«       | j0                  | j2                  |j4                  <   y)aU  
         Layer Norm from Tensorflow model(using keras2onnx or tf2onnx):
          +------------------------------------+
          |                                    |
          |                                    |
        (Cast_1)                               |
          |                                    |
          |                                    v                                           (B)                             (B)             (A)
         Add --> (Cast_1) --> ReduceMean -->  Sub  --> Mul --> ReduceMean --> (Cast_3) --> Add --> Sqrt --> Reciprocol --> Mul --> Mul --> Sub --> Add
          |                       |                                                                                         |       ^              ^
          |                       |                                                                                         |       |              |
          |                       +--------------------------------------------------(Cast_2)-------------------------------|-------+              |
          |                                                                                                                 v                      |
          +---------------------------------------------------------------------------------------------------------------> Mul--------------------+
        )
r   r+   r+   Ú
Reciprocalr#   r$   r   r+   r   r   )
r   r   Nr   r   r   Nr   r   N)r   r+   r+   r¨   r#   r$   r    r   r+   r   r   )r   r   Nr   r   r   r   Nr   r   NNr)   r   )r   r   r   r   z=return indice is exepected in [0, 1], but got {return_indice}é   éüÿÿÿé   r    r+   zmul_node_3 not foundzroot node is nonegñhãˆµøä>zepsilon is not matchedz;reduce_mean_node_1 and mul_node_3 shall link from root nodez%mul_node_2 shall have two same inputszcast_node_2 not foundz$not safe to fuse layer normalizationr   r/   r0   r2   r6   )r
   r=   r8   r?   r@   r:   Úmatch_parentÚ
get_parentr>   r9   rD   rG   rB   r   r   rI   r   rJ   rK   rL   rM   rN   rO   rC   rP   rQ   r5   )r   rR   r   r   Úreturn_indicer\   r[   Ú
sub_node_0Ú
mul_node_0Ú
mul_node_1Úreciprocol_nodeÚ	sqrt_nodeÚ
add_node_0Úreduce_mean_node_0Ú
mul_node_2Ú
sub_node_1Úreduce_mean_node_1Úcast_node_3Ú
mul_node_3Únode_before_reduceÚ	root_noder_   r6   rS   Úcast_node_2rf   rg   Ú
fused_nodes                               r   rj   zFusionLayerNormalizationTF.fuseJ  sG  € ð  ˆØ)-¯©×)FÑ)FØòò <ðò ò ?ðð! ðB  óG$*
Ñ&ˆˆ<˜ðL ÐØä�=Ó! QÒ&Ð&Ð&Ø˜aÑ  FÑ*¨}¸QÑ/?À6Ñ/IÈmÐ\]ÑN^ÐbhÑNhÜ�L‰LÐXÔYØð ˜˜!Ðñ	
ØØØØØØàIUÐVXÐVYÐIZÑFÐ˜J¨
Ð4FàˆÜˆ|Ó Ò"Ø& q™/ˆKØ×&Ñ&¨&Ò0Ð0Ð0à—Z‘Z×,Ñ,¨T°5¸!Ð=PÓQˆ
ØÐÜ�L‰LÐ/Ô0Øà!ŸZ™Z×2Ñ2Ð3EÀqÐJ]Ó^Ðð Ð"ñ à—‘×&Ñ&Ð'9¸1Ð>QÓRð 	ð
 ÐÜ�L‰LÐ,Ô-Øà—Z‘Z×2Ñ2°:Ó>‰
ˆˆ7Øˆ?˜g¨šl¨w¸Ò/?ÀKÐDWÜ�L‰LÐ1Ô2ØàÐØ×$Ñ$ QÑ'¨z×/?Ñ/?Ñ?ÐCU×C[ÑC[Ð\]ÑC^Ðfp×fvÑfvÑCvä�L‰LÐVÔWØàÐ"Ø×$Ñ$ QÑ'¨z×/?Ñ/?Ñ?ÐCU×C[ÑC[Ð\]ÑC^Ðfp×fvÑfvÑCvä�L‰LÐVÔWØà×Ñ˜AÑ *×"2Ñ"2°1Ñ"5Ò5Ü�L‰LÐ@ÔAØð ØØØØØØØØØØØð
ˆð Ð"ØŸ*™*×1Ñ1°*¸fÀaÐI\Ó]ˆKØÐ"Ü—‘Ð4Ô5ØØ×!Ñ!Ð#5°{ÀKÐ"PÔQà�z‰z×/Ñ/ØØ�K‰KØ�J‰J×*Ñ*Ó,Ø�J‰J×*Ñ*Ó,ô	
ô �L‰LÐ?Ô@Øà×Ñ×#Ñ# NÔ3à!×'Ñ'¨Ñ*ˆØ×%Ñ% aÑ(ˆ
ô ×%Ñ%Ø Ø×$Ñ$ QÑ'¨°zÐBØ—[‘[ ‘^Ð$Ø—‘×,Ñ,Ð-AÈ{Ð,Ó[ô	
ˆ
ð 	×Ñ×#Ñ#¤V×%:Ñ%:¸9ÄeÈGÃnÓ%UÐ$VÔWØ×Ñ× Ñ  Ô,Ø8<×8LÑ8Lˆ×$Ñ$ Z§_¡_Ò5r   )rk   rl   rm   r   r   ro   rj   rp   rq   s   @r   r¤   r¤   F  s*   ø„ ðC˜iõ Cð_M¨dð _MÈ÷ _Mr   r¤   N)Úloggingr   Úfusion_baser   Úonnxr   r   Ú
onnx_modelr   rk   r?   r	   rs   r¤   © r   r   ú<module>rÄ      sM   ðõ
 å ß $Ý  á	�8Ó	€ôYU˜vô YUôxY, 6ô Y,ôxcM õ cMr   