
    '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prodzUnknown reduction )aminamaxr   r   sortedr   NotImplementedError)r
   r   r   is       P/var/www/stems/demucs_env/lib/python3.12/site-packages/einops/_torch_specific.pyreducezTorchJitBackend.reduce   s    66l6++%66l6++%55\5**& 66l6++& L)$B$/ "FFqFM"H%&:IFF    axesc                 $    | j                  |      S N)permute)r
   r   s     r   	transposezTorchJitBackend.transpose,   s    yy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    xx  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   sR    $-*1--/ 	1&M;=1A%0GM"	1 xx  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*    ww5==%--WWWr   c                     | j                   S r   )shaper:   s    r   r=   zTorchJitBackend.shapeD   s    wwr   r=   c                 $    | j                  |      S r   )reshape)r
   r=   s     r   r?   zTorchJitBackend.reshapeH   s    yy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d3i G G  49   $4+= $ $ !c ! ! !C !$sCx. ! ! 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 	)v1FR[\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    um$):):1)=)Cum$):):e)C0 :9%966646 +/'%  VXers	
 		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SWX]^acf^fXgSh
\\2/B  r   