Ë
    cQêjp  ã                  óF   — d dl mZ d dlZddlmZ ddlmZ  G d„ de«      Zy)	é    )ÚannotationsNé   )Ú	ONNXModelé   )ÚFusionc                  ó4   ‡ — e Zd Zdˆ fd„Z	 	 	 	 	 	 dd„Zˆ xZS )ÚFusionLayerNormalizationc                ó(   •— t         ‰| �  |dd«       y )NÚLayerNormalizationÚ
ReduceMean)ÚsuperÚ__init__)ÚselfÚmodelÚ	__class__s     €úv/home/oem/CyberBrain26-unified/.venv/lib/python3.12/site-packages/onnxruntime/quantization/fusions/fusion_layernorm.pyr   z!FusionLayerNormalization.__init__   s   ø€ Ü‰Ñ˜Ð 4°lÕCó    c           	     ó   — | 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 ]  }| j                  |d|d¬«      }|€Œ n |€y| j                  |g d	¢g d
¢fg d¢g d¢fg d¢g d
¢fg d¢g d¢fg|«      \  }}	}
|dk  ry|	d   }||vry|	d   }| j                  |«      \  }}|�
|dk  s|dkD  ry|	d   }|j                  dk(  r| j                  |d«      dk7  ry|j                  dk(  r |j                  d   |j                  d   k7  ry||j                  d      d   }|j                  dk7  ry||j                  d      d   }|j                  dk7  ry|g}|j                  |«       |j                  |	dd «       |j                  |||g«       | j                  ||j                  ||«      sy|j                  d| j                  |j                  d   |«      z
     }| j                  |d«      sy|j                  d| j                  |j                  d   |«      z
     }| j                  |d«      sy| j                  j                  |«       t        j                   j#                  d| j%                  «       |j                  d   ||g|j                  d   g¬«      }|j&                  j                  t        j                   j)                  dt+        |«      «      g«       | j,                  j/                  |«       y)a4  
        Interface function that tries to fuse a node sequence containing a ReduceMean node into a single
        LayerNormalization node.

              +----------------------+
              |                      |
              |                      v
          [Root] --> ReduceMean -->  Sub  --> Pow --> ReduceMean --> Add --> Sqrt --> Div --> Mul --> Add
                     (axis=2 or -1)  |      (Y=2)   (axis=2 or -1)  (E-6 or E-12 or 0) ^
                                     |                                                 |
                                     +-------------------------------------------------+

         Or, using Mul instead of Pow:

              +----------------------+
              |                      |
              |                      v
          [Root] --> ReduceMean -->  Sub  --> Mul --> ReduceMean --> Add --> Sqrt --> Div --> Mul --> Add
                     (axis=2 or -1)  |     (in0=in1)   (axis=2 or -1)  (E-6 or E-12 or 0) ^
                                     |                                                 |
                                     +-------------------------------------------------+

         It also handles cases of duplicated sub nodes exported from older version of PyTorch:

              +----------------------+
              |                      v
              |           +-------> Sub-----------------------------------------------+
              |           |                                                           |
              |           |                                                           v
          [Root] --> ReduceMean -->  Sub  --> (Pow or Mul) --> ReduceMean --> Add --> Sqrt --> Div  --> Mul --> Add
              |                      ^
              |                      |
              +----------------------+
        r   r   NÚSubr   ÚDivF)Ú	recursive)ÚSqrtÚAddr   ÚPowr   )r   r   r   r   r   )r   r   r   r   ÚCastr   )r   r   r   r   r   r   )r   r   r   ÚMulr   )r   r   r   r   r   r   éÿÿÿÿg-Cëâ6?é   r   g       @r   r   r   )ÚnameÚinputsÚoutputsÚepsilon)r   Úget_childrenÚlenÚinputÚop_typeÚfind_first_child_by_typeÚmatch_parent_pathsÚget_constant_inputÚfind_constant_inputÚoutputÚextendÚis_safe_to_fuse_nodesÚinput_indexÚis_constant_with_specified_rankÚnodes_to_removeÚonnxÚhelperÚ	make_nodeÚcreate_unique_node_nameÚ	attributeÚmake_attributeÚfloatÚnodes_to_addÚappend)r   Úreduce_mean_nodeÚinput_name_to_nodesÚoutput_name_to_nodeÚchildrenÚ
root_inputÚdiv_nodeÚchildÚpath_idÚparent_nodesÚ_Úsub_nodeÚsecond_add_nodeÚiÚ
add_weightÚpow_or_mul_nodeÚmul_nodeÚlast_add_nodeÚsubgraph_nodesÚweight_inputÚ
bias_inputÚnormalize_nodes                         r   ÚfusezFusionLayerNormalization.fuse   s½  € ðP —:‘:×*Ñ*Ð+;Ð=PÓQˆÜˆx‹=˜AÒ¤ X£°Ò!2Øà%×+Ñ+¨AÑ.ˆ
à�A‰;×Ñ %Ò'¨8°A©;×+<Ñ+<¸QÑ+?À:Ò+MØäˆx‹=˜AÒØ˜‰{×"Ñ" eÒ+¨x¸©{×/@Ñ/@ÀÑ/CÀzÒ/QØàˆØò 	ˆEØ×4Ñ4°U¸EÐCVÐbgÐ4ÓhˆHØÑ#Ùð	ð ÐØà#'×#:Ñ#:Øâ<ºoÐNÚDÒFXÐYÚ<ºoÐNÚDÒFXÐYð	ð  ó	$
Ñ ˆ�˜qð �QŠ;Øà Ñ#ˆØ˜8Ñ#Øà& q™/ˆØ×/Ñ/°Ó@‰ˆˆ:ØÐ ¨q¢°JÀÒ4Gàà& q™/ˆØ×"Ñ" eÒ+°×0HÑ0HÈÐZ]Ó0^ÐbcÒ0cØØ×$Ñ$¨Ò-°/×2GÑ2GÈÑ2JÈo×NcÑNcÐdeÑNfÒ2fØà& x§¡°qÑ'9Ñ:¸1Ñ=ˆØ×Ñ˜uÒ$Øà+¨H¯O©O¸AÑ,>Ñ?ÀÑBˆØ× Ñ  EÒ)Øà*Ð+ˆØ×Ñ˜hÔ'Ø×Ñ˜l¨3¨BÐ/Ô0à×Ñ˜}¨h¸ÐAÔBØ×)Ñ)ØØ× Ñ ØØô	
ð à—~‘~ a¨$×*:Ñ*:¸8¿?¹?È1Ñ;MÈxÓ*XÑ&XÑYˆØ×3Ñ3°LÀ!ÔDØà"×(Ñ(¨¨T×-=Ñ-=¸h¿o¹oÈaÑ>PÐR_Ó-`Ñ)`Ñaˆ
Ø×3Ñ3°JÀÔBØà×Ñ×#Ñ# NÔ3äŸ™×.Ñ.Ø Ø×-Ñ-Ó/Ø$×*Ñ*¨1Ñ-¨|¸ZÐHØ"×)Ñ)¨!Ñ,Ð-ð	 /ó 
ˆð 	× Ñ ×'Ñ'¬¯©×)CÑ)CÀIÌuÐU_ÓO`Ó)aÐ(bÔcØ×Ñ× Ñ  Õ0r   )r   r   )r:   zonnx.NodeProtor;   zdict[str, list[onnx.NodeProto]]r<   zdict[str, onnx.NodeProto])Ú__name__Ú
__module__Ú__qualname__r   rO   Ú__classcell__)r   s   @r   r	   r	      s.   ø„ õDð@1à(ð@1ð =ð@1ð 7÷	@1r   r	   )Ú
__future__r   r1   Ú
onnx_modelr   Úfusionr   r	   © r   r   ú<module>rX      s!   ðõ #ã å "Ý ôD1˜võ D1r   