Ë
    g^(h˜  ã                  óä   — d dl mZ d dlZd dlmZmZmZ d dlZd dlm	Z
 ddlmZmZmZmZmZ erd dlmZ dgZe
j(                  Z ej*                  d	«      	 	 	 	 	 	 	 	 dd
„«       Z	 	 	 	 	 	 	 	 dd„Zy)é    )ÚannotationsN)ÚCallableÚTYPE_CHECKINGÚUnion)Údimé   )Ú	_ellipsisÚAnonymousAxisÚcomma_separateÚparse_patternÚvalidate_rearrange_expressions)ÚSequenceÚ	rearrangeé   c                ól  ‡‡‡— t        ||«      \  }}t        |||«       t        d„ |j                  D «       «      }|j                  rO| t        |j                  «      dz
  z
  }t        |j                  «      dz
  }||z   x}| kD  rUt        d|› d| › d�«      ‚d}t        |j                  «      }t        |j                  «      x}| k7  rt        d|› d| › d�«      ‚||z   |z   }	|	dk(  rd„ S t        d	„ t        |	«      D «       «      Ši Šg }
dŠ|j                  D ]»  }t        |t        «      rf|D ]"  }t        |t        «      sJ ‚‰‰   f‰|<   ‰dz  ŠŒ$ |rŒ=t        d
«      }‰‰   f‰|<   |
j                  |«       |j                  |«       ‰dz  ŠŒy|t        k(  r-t        }t        ˆˆfd„t        |«      D «       «      ‰|<   ‰|z  ŠŒ¯t        d|› �«      ‚ 	 	 	 	 dˆfd„} ||j                  «      } ||j                  «      }t        ˆfd„|
D «       «      }t        ˆfd„|j!                  «       D «       «      }d}d|› dt#        ‰«      › d|	› d�|rdj%                  d„ |D «       «      ndz   dt#        |«      › dt#        |«      › d�z   |rdt#        |g«      › d�ndz   }t'        |«       t)        «       |   S )az  Translate an `einops`-style pattern into a callable that performs the rearrange using first-class dimensions.

    Since the an equivalent result is computed for tensors with the same number of dimensions, with the same pattern and
    specified axes lengths, this function can be memoized.

    Args:
        tensor_ndim (int): the number of dimensions in the tensor to rearrange
        pattern (str): the `einops`-style rearrangement pattern
        axes_lengths (int): any additional length specifications for dimensions

    Returns:
        Callable[[torch.Tensor], torch.Tensor]: a callable that performs the rearrangement
    c              3  ó"   K  — | ]  }| –— Œ	 y ­w©N© )Ú.0r   s     úX/var/www/skyplay_api_hub/venv/lib/python3.12/site-packages/functorch/einops/rearrange.pyú	<genexpr>z-_create_rearrange_callable.<locals>.<genexpr>.   s   è ø€ Ò: #˜#”gÑ:ùs   ‚r   z!Number of dimensions in pattern (zH) must be less than or equal to the number of dimensions in the tensor (ú)r   z;) must be equal to the number of dimensions in the tensor (c                ó   — | S r   r   )Útensors    r   ú<lambda>z,_create_rearrange_callable.<locals>.<lambda>E   s   € ˜f€ ó    c              3  ó&   K  — | ]	  }d |› �–— Œ y­w)ÚdNr   )r   Úis     r   r   z-_create_rearrange_callable.<locals>.<genexpr>G   s   è ø€ Ò-M¸!°°!°¬gÑ-Mùs   ‚Ú1c              3  ó.   •K  — | ]  }‰‰|z      –— Œ y ­wr   r   )r   ÚjÚdims_iÚfirst_class_dimss     €€r   r   z-_create_rearrange_callable.<locals>.<genexpr>]   s    øè ø€ ò 3Ø12Ð  ¨!¡Õ,ñ3ùó   ƒúUnexpected dimension: c                óà   •— g }| D ]e  }t        |t        «      r$|j                  t        ˆfd„|D «       «      «       Œ7|t        k(  r|j                  ‰t           «       ŒYt        d|› �«      ‚ |S )z|Convert a `ParsedExpression.composition` into a `Tensor.__getitem__` index of strings representing first
        class dims.c              3  ó6   •K  — | ]  }‰|   D ]  }|–— Œ Œ y ­wr   r   )r   Ú
identifierr   Úidentifier_dim_maps      €r   r   zJ_create_rearrange_callable.<locals>.composition_to_dims.<locals>.<genexpr>m   s3   øè ø€ ò à&Ø#5°jÑ#Aòð  ô ðØñùs   ƒr&   )Ú
isinstanceÚlistÚappendÚtupler	   ÚextendÚ
ValueError)ÚcompositionÚdim_compositionÚ	dimensionr*   s      €r   Úcomposition_to_dimsz7_create_rearrange_callable.<locals>.composition_to_dimsd   s‚   ø€ ð
 >@ˆØ$ò 	GˆIÜ˜)¤TÔ*Ø×&Ñ&Üó à*3ôó õð œiÒ'Ø×&Ñ&Ð'9¼)Ñ'DÕEä Ð#9¸)¸Ð!EÓFÐFð	Gð Ðr   c              3  ó.   •K  — | ]  }‰|   d    –— Œ y­w©r   Nr   )r   Úaxisr*   s     €r   r   z-_create_rearrange_callable.<locals>.<genexpr>{   s   øè ø€ ÒH°dÐ(¨Ñ.¨qÕ1ÑHùr%   c              3  ó8   •K  — | ]  \  }}‰|   d    |f–— Œ y­wr6   r   )r   r7   Úlengthr*   s      €r   r   z-_create_rearrange_callable.<locals>.<genexpr>|   s*   øè ø€ ò Ù2>°$¸Ð	˜DÑ	! !Ñ	$ fÔ-ñùs   ƒÚdo_rearrangezdef z(tensor):
    z = dims(z)
Ú c              3  ó4   K  — | ]  \  }}d |› d|› d�–— Œ y­w)z    z.size = ú
Nr   )r   r   r9   s      r   r   z-_create_rearrange_callable.<locals>.<genexpr>‡   s(   è ø€ ò Ù3@°C¸�$�s�e˜8 F 8¨2Ô.ñùs   ‚z    tensor = tensor[z].order(z    return tensor.sum(z, keepdim=False)
z    return tensor
)r1   z5Sequence[Union[list[Union[str, AnonymousAxis]], str]]Úreturnz!list[Union[str, tuple[str, ...]]])r   r   Úsumr1   Úhas_ellipsisÚlenÚidentifiersr0   r.   Úranger+   r,   Ústrr
   r-   r	   Úitemsr   ÚjoinÚexecÚlocals)Útensor_ndimÚpatternÚaxes_lengthsÚleftÚrightÚn_anon_dimsÚn_ellipsis_dimsÚn_named_dimsÚpattern_ndimÚn_dimsÚ	anon_axesr3   r)   Ú	anon_axisr4   Ú	left_dimsÚ
right_dimsÚ	anon_dimsÚspecified_lengthsÚcustom_rearrange_callable_nameÚcustom_rearrange_callable_coder#   r$   r*   s                        @@@r   Ú_create_rearrange_callabler[      s`  ú€ ô"   ¨Ó6�K€Dˆ%Ü" 4¨°Ô=äÑ:¨×)9Ñ)9Ô:Ó:€KØ×ÒØ%¬¨T×-=Ñ-=Ó)>ÀÑ)BÑCˆÜ˜4×+Ñ+Ó,¨qÑ0ˆà'¨,Ñ6Ð6ˆL¸+ÒEÜØ3°L°>ð B-Ø-8¨M¸ð<óð ð
 ˆÜ˜4×+Ñ+Ó,ˆä × 0Ñ 0Ó1Ð1ˆL°kÒAÜØ3°L°>ð BØ*˜m¨1ð.óð ð ˜OÑ+¨kÑ9€Fà�‚{á$Ð$ä(-Ñ-M¼uÀV»}Ô-MÓ(MÐØKMÐØ%'€Ið €FØ×%Ñ%ò Cˆ	Ü�i¤Ô&Ø'ò �
ä! *¬cÔ2Ð2Ð2Ø2BÀ6Ñ2JÐ1LÐ" :Ñ.Ø˜!‘‘ð	ò
 ä)¨#Ó.�	Ø1AÀ&Ñ1IÐ0KÐ" 9Ñ-Ø× Ñ  Ô+Ø× Ñ  Ô+Ø˜!‘‘Øœ)Ò#Ü"ˆJÜ-2ô 3Ü6;¸OÓ6Lô3ó .Ð˜zÑ*ð �oÑ%‰FäÐ5°i°[ÐAÓBÐBð+Cð.ØJðà	*õñ* $ D×$4Ñ$4Ó5€IÙ$ U×%6Ñ%6Ó7€JÜÓH¸iÔHÓH€IÜó ØBN×BTÑBTÓBVôó Ðð &4Ð"ð Ð1Ð2ð 3Ü!Ð"2Ó3Ð4°H¸V¸HÀCðIñ !ð �G‰Gñ ØDUôô ð ñ
	
ð !¤°	Ó!:Ð ;¸8ÄNÐS]ÓD^ÐC_Ð_bÐ
cñ	dñ ð %¤^°Y°KÓ%@Ð$AÐASÑTà&ñ	
ð #ô( 	Ð	'Ô(Ü‹8Ð2Ñ3Ð3r   c                óž   — t        | t        j                  «      st        j                  | «      } t	        | j
                  |fi |¤Ž} || «      S )aº  A native implementation of `einops.rearrange`, a reader-friendly smart element reordering for multidimensional
    tensors. This operation includes functionality of transpose (axes permutation), reshape (view), squeeze, unsqueeze,
    stack, concatenate and other operations.

    See: https://einops.rocks/api/rearrange/

    Args:
        tensor (Tensor or sequence of Tensor): the tensor(s) to rearrange
        pattern (str): the rearrangement pattern
        axes_lengths (int): any additional length specifications for dimensions

    Returns:
        Tensor: the rearranged tensor

    Examples:
        >>> # suppose we have a set of 32 images in "h w c" format (height-width-channel)
        >>> images = torch.randn((32, 30, 40, 3))

        >>> # stack along first (batch) axis, output is a single array
        >>> rearrange(images, "b h w c -> b h w c").shape
        torch.Size([32, 30, 40, 3])

        >>> # concatenate images along height (vertical axis), 960 = 32 * 30
        >>> rearrange(images, "b h w c -> (b h) w c").shape
        torch.Size([960, 40, 3])

        >>> # concatenated images along horizontal axis, 1280 = 32 * 40
        >>> rearrange(images, "b h w c -> h (b w) c").shape
        torch.Size([30, 1280, 3])

        >>> # reordered axes to "b c h w" format for deep learning
        >>> rearrange(images, "b h w c -> b c h w").shape
        torch.Size([32, 3, 30, 40])

        >>> # flattened each image into a vector, 3600 = 30 * 40 * 3
        >>> rearrange(images, "b h w c -> b (c h w)").shape
        torch.Size([32, 3600])

        >>> # split each image into 4 smaller (top-left, top-right, bottom-left, bottom-right), 128 = 32 * 2 * 2
        >>> rearrange(images, "b (h1 h) (w1 w) c -> (b h1 w1) h w c", h1=2, w1=2).shape
        torch.Size([128, 15, 20, 3])

        >>> # space-to-depth operation
        >>> rearrange(images, "b (h h1) (w w1) c -> b h w (c h1 w1)", h1=2, w1=2).shape
        torch.Size([32, 15, 20, 12])
    )r+   ÚtorchÚTensorÚstackr[   Úndim)r   rJ   rK   Úrearrange_callables       r   r   r   ™   sJ   € ôf �fœeŸl™lÔ+Ü—‘˜VÓ$ˆä3Ø�‰�WñØ ,ñÐñ ˜fÓ%Ð%r   )rI   ÚintrJ   rD   rK   rb   r>   z&Callable[[torch.Tensor], torch.Tensor])r   zAUnion[torch.Tensor, list[torch.Tensor], tuple[torch.Tensor, ...]]rJ   rD   rK   rb   r>   ztorch.Tensor)Ú
__future__r   Ú	functoolsÚtypingr   r   r   r]   Úfunctorch._Cr   Ú_CÚ_parsingr	   r
   r   r   r   Úcollections.abcr   Ú__all__ÚdimsÚ	lru_cacher[   r   r   r   r   ú<module>rm      sª   ðÝ "ã ß 1Ñ 1ã Ý "÷õ ñ Ý(àˆ-€à	‡w�w€ð €×Ñ�SÓð{4Øð{4Ø"ð{4Ø47ð{4à+ò{4ó ð{4ð|:&ØMð:&àð:&ð ð:&ð ô	:&r   