Ë
    øÿæié  ã                   ó¸   — d Z ddlZddlmZmZmZ ddlZddlmZm	Z	  G d„ d«      Z
dedej                  d	ed
eeeef      dej                  f
d„Zd„ Z e«        y)ao  
Specialization of einops for torch.

Unfortunately, torch's jit scripting mechanism isn't strong enough,
and to have scripting supported at least for layers,
a number of additional moves is needed.

Design of main operations (dynamic resolution by lookup) is unlikely
to be implemented by torch.jit.script,
but torch.compile seems to work with operations just fine.
é    N)ÚDictÚListÚTuple)ÚTransformRecipeÚ _reconstruct_from_shape_uncachedc                   ó  — e Zd ZdZedej                  dedee	   fd„«       Z
edee	   fd„«       Zedeej                     fd	„«       Zed
ee	   fd„«       Zede	dee	e	f   fd„«       Zed„ «       Zed„ «       Zedee	   fd„«       Zy)ÚTorchJitBackendz�
    Completely static backend that mimics part of normal backend functionality
    but restricted to be within torchscript.
    ÚxÚ	operationÚreduced_axesc                 ó0  — |dk(  r| j                  |¬«      S |dk(  r| j                  |¬«      S |dk(  r| j                  |¬«      S |dk(  r| j                  |¬«      S |dk(  r*t	        |«      d d d…   D ]  }| j                  |¬«      } Œ | S t        d|«      ‚)	NÚmin)ÚdimÚmaxÚsumÚmeanÚprodéÿÿÿÿzUnknown reduction )ÚaminÚamaxr   r   Úsortedr   ÚNotImplementedError)r
   r   r   Úis       úk/Volumes/fast/ai/experiments/voice-extract-mac/.venv/lib/python3.12/site-packages/einops/_torch_specific.pyÚreducezTorchJitBackend.reduce   s¨   € à˜ÒØ—6‘6˜l�6Ó+Ð+Ø˜%ÒØ—6‘6˜l�6Ó+Ð+Ø˜%ÒØ—5‘5˜\�5Ó*Ð*Ø˜&Ò Ø—6‘6˜l�6Ó+Ð+Ø˜&Ò Ü˜LÓ)©$¨B¨$Ô/�Ø—F‘F˜q�F“M‘ð 0àˆHä%Ð&:¸IÓFÐFó    Úaxesc                 ó$   — | j                  |«      S ©N)Úpermute)r
   r   s     r   Ú	transposezTorchJitBackend.transpose,   s   € à�y‰y˜‹Ðr   Útensorsc                 ó,   — t        j                  | «      S r   )ÚtorchÚstack)r"   s    r   Ústack_on_zeroth_dimensionz)TorchJitBackend.stack_on_zeroth_dimension0   s   € ä�{‰{˜7Ó#Ð#r   Úrepeatsc                 ó$   — | j                  |«      S r   )Úrepeat)r
   r'   s     r   ÚtilezTorchJitBackend.tile4   s   € à�x‰x˜Ó Ð r   Ún_axesÚpos2lenc                 ó–   — dg|z  }|j                  «       D ]   \  }}t        j                  | |«      } |||<   Œ" | j                  |«      S )Nr   )Úitemsr$   Ú	unsqueezeÚexpand)r
   r+   r,   r'   Úaxis_positionÚaxis_lengths         r   Úadd_axeszTorchJitBackend.add_axes8   sM   € à�$˜‘-ˆØ*1¯-©-®/Ñ&ˆM˜;Ü—‘  =Ó1ˆAØ%0ˆG�MÒ"ð +:ð �x‰x˜Ó Ð r   c                 ó–   — | j                   t        j                  t        j                  t        j                  t        j
                  fv S r   )Údtyper$   Úfloat16Úfloat32Úfloat64Úbfloat16©r
   s    r   Úis_float_typezTorchJitBackend.is_float_type@   s*   € à�w‰wœ5Ÿ=™=¬%¯-©-¼¿¹ÌÏÉÐWÐWÐWr   c                 ó   — | j                   S r   )Úshaper:   s    r   r=   zTorchJitBackend.shapeD   s   € à�w‰wˆr   r=   c                 ó$   — | j                  |«      S r   )Úreshape)r
   r=   s     r   r?   zTorchJitBackend.reshapeH   s   € à�y‰y˜ÓÐr   N)Ú__name__Ú
__module__Ú__qualname__Ú__doc__Ústaticmethodr$   ÚTensorÚstrr   Úintr   r!   r&   r*   r   r3   r;   r=   r?   © r   r   r	   r	      s  „ ñð
 ðG�%—,‘,ð G¨3ð G¸dÀ3¹iò Gó ðGð  ð˜4 ™9ò ó ðð ð$¨4°·±Ñ+=ò $ó ð$ð ð!˜˜c™ò !ó ð!ð ð!˜Cð !¨$¨s°C¨x©.ò !ó ð!ð ñXó ðXð ñó ðð ð ˜$˜s™)ò  ó ñ r   r	   ÚrecipeÚtensorÚreduction_typeÚ	axes_dimsÚreturnc                 óZ  — t         }t        | |j                  |«      |¬«      \  }}}}}	}
|�|j                  ||«      }|�|j	                  ||«      }t        |«      dkD  r|j                  |||¬«      }t        |«      dkD  r|j                  ||
|¬«      }|	�|j                  ||	«      }|S )N)rL   r   )r   r   )r+   r,   )r	   r   r=   r?   r!   Úlenr   r3   )rI   rJ   rK   rL   ÚbackendÚinit_shapesÚaxes_reorderingr   Ú
added_axesÚfinal_shapesÚn_axes_w_addeds              r   Úapply_for_scriptable_torchrV   N   sÅ   € ô €Gô 	)¨°·±¸vÓ1FÐR[Ô\ñØØØØØØàÐØ—‘ ¨Ó5ˆØÐ"Ø×"Ñ" 6¨?Ó;ˆÜ
ˆ<Ó˜1ÒØ—‘ °.È|�Ó\ˆÜ
ˆ:ƒ˜ÒØ×!Ñ! &°ÈÐ!ÓTˆØÐØ—‘ ¨Ó6ˆØ€Mr   c                  óŠ  — t        t        d«      rt        j                  d   dk  ry t        t        d«      rt        j                  dk\  ry 	 ddlm}  dd	l	m
}m}m}m} dd
lm}m}  | |«        | |«        | |«        | |«        | |«        | |«       day # t
        $ r t        j                  dt        d¬«       Y y w xY w)NÚ__version__r   Ú2z2.8)Úallow_in_graphzHallow_ops_in_compiled_graph failed to import torch: ensure pytorch >=2.0é   )Ú
stacklevel)ÚeinsumÚ	rearranger   r)   )ÚpackÚunpackT)Úhasattrr$   rX   Útorch._dynamorZ   ÚImportErrorÚwarningsÚwarnÚImportWarningÚeinopsr]   r^   r   r)   Úpackingr_   r`   Ú#_ops_were_registered_in_torchdynamo)rZ   r]   r^   r   r)   r_   r`   s          r   Úallow_ops_in_compiled_graphrj   g   s±   € ÜŒu�mÔ$¬×):Ñ):¸1Ñ)=ÀÒ)CàäŒu�mÔ$¬×):Ñ):¸eÒ)CàðÝ0÷ :Ó9ß%á�9ÔÙ�6ÔÙ�6ÔÙ�6ÔÙ�4ÔÙ�6Ôð +/Ñ'øô% ò Ü�‰ØVÔXeÐrsõ	
ñ 	ð	ús   ÁB Â%CÃC)rC   rd   Útypingr   r   r   r$   Úeinops.einopsr   r   r	   rE   rF   rG   rV   rj   rH   r   r   Ú<module>rm      s{   ðñ
ó ß $Ñ $ã ç K÷5 ñ 5 ðrØðØ%*§\¡\ðØCFðØSWÐX]Ð^aÐcfÐ^fÑXgÑShðà
‡\�\óò2/ñB Õ r   