Ë
    cQêjë  ã                   óJ   — d Z ddlZddlmZmZ  G d„ dej
                  «      Zy)zDefine SpaceToDepth fusion.é    Né   )ÚfusionsÚ
onnx_modelc                   ó  ‡ — e Zd ZdZdej
                  fˆ fd„Zdej                  de	e
eej                     f   de	e
ej                  f   fd„Zdej                  de	e
eej                     f   de	e
ej                  f   fd„Zˆ xZS )	ÚFusionSpaceToDepthzFusion for SpaceToDepth.Úmodelc                 ó(   •— t         ‰| �  |dd«       y)zXInitialize.

        Args:
            model: An onnx_model.ONNXModel instance.
        ÚSpaceToDepthÚReshapeN)ÚsuperÚ__init__)Úselfr   Ú	__class__s     €ú‰/home/oem/CyberBrain26-unified/.venv/lib/python3.12/site-packages/onnxruntime/quantization/execution_providers/qnn/fusion_spacetodepth.pyr   zFusionSpaceToDepth.__init__   s   ø€ ô 	‰Ñ˜ °	Õ:ó    ÚnodeÚinput_name_to_nodesÚoutput_name_to_nodec           	      ó’  ‡ ‡— |}ˆfd„} ||d«      x}�7 ||d«      x}�, ||d«      x}�! ||d«      x}	� ||	d«      x}
� ||
d«      x}€yˆ fd„} ||j                   d   «      x}�\ ||j                  d   «      x}�E ||j                  d   «      x}�. ||	j                  d   «      x}� ||j                  d   «      x}€y‰ j                  |d«      }‰ j                  |d«      }‰ j                  |
d«      }t        |«      dk7  s8t        |«      d	k7  s*t        |«      dk7  st        |«      d
k7  st        |«      dk7  ry|\  }}}}|d   }|||||z  |||z  |gk7  sR|g d¢k7  sK|||||z  ||z  z  |dz  gk7  s6|g d¢k7  s/||||dz  ||z  ||z  gk7  s|g d¢k7  s|||dz  |z  ||z  ||z  gk7  ry‰ j                  j                  |||||	|
|g«       t        j                  j                  ‰ j                  ‰ j                  «       |j                   d   g|j                  d   g|¬«      }‰ j                  j                  |«       y)at  Fuse for early version of YOLO.

        Pattern:

                |     [N, C, H, W]
             Reshape
                |     [N, C, H/blk, blk, W/blk, blk]
            Transpose
                |     [N, C, H/blk, W/blk, blk, blk]
             Reshape
                |     [N, C, H/blk * W/blk, blk * blk]
            Transpose
                |     [N, C, blk * blk, H/blk * W/blk]
             Reshape
                |     [N, C, blk * blk, H/blk, W/blk]
            Transpose
                |     [N, blk * blk, C, H/blk, W/blk]
             Reshape
                |     [N, blk * blk * C, H/blk, W/blk]

        This sequence can be fused into a single SpaceToDepth with blocksize `blk`. Note that unlike DepthToSpace
        supporting DCR or CRD mode, SpaceToDepth only supports DCR mode in its latest opset version (13), which matches
        the pattern here.
        c                 ó˜   •— | j                   d   ‰vry‰| j                   d      }t        |«      dkD  s|d   j                  |k7  ry|d   S )zGet target child of given node.r   Né   )ÚoutputÚlenÚop_type)Úparent_nodeÚtarget_op_typeÚchildrenr   s      €r   Úget_target_childz7FusionSpaceToDepth._fuse_yolo.<locals>.get_target_child8   sY   ø€ à×!Ñ! !Ñ$Ð,?Ñ?Øà*¨;×+=Ñ+=¸aÑ+@ÑAˆHÜ�8‹}˜qÒ  H¨Q¡K×$7Ñ$7¸>Ò$IØà˜A‘;Ðr   Ú	Transposer   Fc                 ól   •— ‰j                   j                  | «      }|sy‰j                  |«      }|sy|S )z Get shape for given tensor name.N)r   Úget_tensor_typeÚtensor_shape_to_list)Útensor_nameÚtensor_typeÚtensor_shaper   s      €r   Úget_tensor_shapez7FusionSpaceToDepth._fuse_yolo.<locals>.get_tensor_shapeM   s9   ø€ àŸ*™*×4Ñ4°[ÓAˆKÙØà×4Ñ4°[ÓAˆLÙØàÐr   r   Úpermé   é   é   r   )r   r   é   r(   r   r*   r+   )r   r   r   r+   )r   r+   r   r   r(   )ÚnameÚinputsÚoutputsÚ	blocksizeT)Úinputr   Úget_node_attributer   Únodes_to_removeÚextendÚonnxÚhelperÚ	make_nodeÚfused_op_typeÚcreate_unique_node_nameÚnodes_to_addÚappend)r   r   r   r   Úreshape_node1r   Útranspose_node1Úreshape_node2Útranspose_node2Úreshape_node3Útranspose_node3Úreshape_node4r&   Úinput_shapeÚreshape_shape1Úreshape_shape2Úreshape_shape3Úreshape_shape4Útranspose_perm1Útranspose_perm2Útranspose_perm3ÚbatchÚchannelÚheightÚwidthr/   Ús2d_nodes   ` `                        r   Ú
_fuse_yolozFusionSpaceToDepth._fuse_yolo   sñ  ù€ ð< ˆô		ñ !1°ÀÓ LÐLˆ_ÐUÙ!1°/À9Ó!MÐM�ÐVÙ#3°MÀ;Ó#OÐO�ÐXÙ!1°/À9Ó!MÐM�ÐVÙ#3°MÀ;Ó#OÐO�ÐXÙ!1°/À9Ó!MÐM�ÐVàô
	 ñ -¨]×-@Ñ-@ÀÑ-CÓDÐDˆ[ÐMÙ"2°=×3GÑ3GÈÑ3JÓ"KÐK�ÐTÙ"2°=×3GÑ3GÈÑ3JÓ"KÐK�ÐTÙ"2°=×3GÑ3GÈÑ3JÓ"KÐK�ÐTÙ"2°=×3GÑ3GÈÑ3JÓ"KÐK�ÐTàà×1Ñ1°/À6ÓJˆØ×1Ñ1°/À6ÓJˆØ×1Ñ1°/À6ÓJˆô �Ó Ò!Ü�>Ó" aÒ'Ü�>Ó" aÒ'Ü�>Ó" aÒ'Ü�>Ó" aÒ'àð )4Ñ%ˆˆw˜ Ø" 1Ñ%ˆ	à˜u g¨v¸Ñ/BÀIÈuÐXaÑOaÐclÐmÒmØÒ"4Ò4Ø %¨°6¸YÑ3FÈ5ÐT]ÑK]Ñ2^Ð`iÐklÑ`lÐ!mÒmØ¢,Ò.Ø %¨°)¸Q±,ÀÈ)Ñ@SÐUZÐ^gÑUgÐ!hÒhØ¢/Ò1Ø %¨°A©¸Ñ)?ÀÈ9ÑATÐV[Ð_hÑVhÐ!iÒiàà×Ñ×#Ñ#àØØØØØØðô
	
ô —;‘;×(Ñ(Ø×ÑØ×-Ñ-Ó/Ø!×'Ñ'¨Ñ*Ð+Ø"×)Ñ)¨!Ñ,Ð-Øð )ó 
ˆð 	×Ñ× Ñ  Ô*àr   c                 ó*   — | j                  |||«       y)a\  Fuse a sequence of Reshape and Transpose nodes into a single SpaceToDepth node.

        Args:
            node: An onnx.NodeProto matching the specified search type (i.e., Reshape).
            input_name_to_nodes: A dict mapping tensor name to consumed nodes.
            output_name_to_node: A dict mapping tensor name to produced node.
        N)rO   )r   r   r   r   s       r   ÚfusezFusionSpaceToDepth.fuse•   s   € ð 	�‰˜Ð1Ð3FÕGr   )Ú__name__Ú
__module__Ú__qualname__Ú__doc__r   Ú	ONNXModelr   r4   Ú	NodeProtoÚdictÚstrÚlistrO   rQ   Ú__classcell__)r   s   @r   r   r      s­   ø„ Ù"ð;˜j×2Ñ2õ ;ð{à�n‰nð{ð " # t¨D¯N©NÑ';Ð";Ñ<ð{ð " # t§~¡~Ð"5Ñ6ó	{ðzHà�n‰nðHð " # t¨D¯N©NÑ';Ð";Ñ<ðHð " # t§~¡~Ð"5Ñ6÷	Hr   r   )rU   r4   Ú r   r   ÚFusionr   © r   r   ú<module>r_      s$   ðñ "ã ç #ôUH˜Ÿ™õ UHr   