
    ]i X                     n   % S r SSKrSr0 r\\S'   0 r\\S'   SrS$S jr " S	 S5      r	 " S
 S5      r
 " S S\	5      r " S S\5      r " S S\	5      r " S S\	5      r " S S5      r " S S\	5      r " S S\	5      r " S S\	5      r " S S\	5      r " S S\	5      r " S  S!\	5      r " S" S#\	5      rg)%ac  
Backends in `einops` are organized to meet the following requirements
- backends are not imported unless those are actually needed, because
    - backends may not be installed
    - importing all available backends will drive to significant memory footprint
    - backends may be present but installed with errors (but never used),
      importing may drive to crashes
- backend should be either symbolic or imperative
    - this determines which methods (from_numpy/to_numpy or create_symbol/eval_symbol) should be defined
- if backend can't provide symbols for shape dimensions, UnknownSize objects are used
    NzAlex Rogozhnikov_loaded_backends_type2backendFAbstractBackendc                 \   [        U 5      n[        R                  US5      nUb  U$ [        [        R                  5       5      nU H(  u  pEUR                  U 5      (       d  M  U[        U'   Us  $    / n[        R                  5       nU(       a<  UR                  5       nXuR                  5       -  nUR                  U5        U(       a  M<  U VV	s/ s H  u  pUPM	     n
nn	U H  n[        (       a  [        SU5        UR                  U
;  d  M,  UR                  [        R                  ;   d  ML  [        (       a  [        SUR                  5        U" 5       nU[        UR                  '   UR                  U 5      (       d  M  U[        U'   Us  $    [!        S[        U 5       35      es  sn	nf )z
Takes a correct backend (e.g. numpy backend if tensor is numpy.ndarray) for a tensor.
If needed, imports package and creates backend
NzTesting for subclass of zImported backend for zTensor type unknown to einops )typer   getlistr   itemsis_appropriate_typer   __subclasses__popappend_debug_importingprintframework_namesysmodulesRuntimeError)tensor_type_resultpreviously_loaded_backends_framework_namebackendbackend_subclassesbackendsx_prev_backend_namesBackendSubclasss               M/mnt/rpi/tmp/demucs-venv-sys/lib/python3.13/site-packages/einops/_backends.pyget_backendr"      s}   
 LEt,G!%&6&<&<&>!?$> &&v..#*M% N %? --/H
,,.**,,!!'* ( )CC(B!(BC-,o>))1CC--<##1?3Q3QR)+;B !7!78..v66+2M%("N . 7V~F
GG Ds   F(c                       \ rS rSr% Sr\\S'   S rS rS r	S r
S rS	 rS
 rS rS rS rS\4S jrS rS rS rS\4S jrS rS rS rS rSrg)r   A   zJBase backend class, major part of methods are only for debugging purposes.r   c                     [        5       e)z4helper method should recognize tensors it can handleNotImplementedErrorselfr   s     r!   r   #AbstractBackend.is_appropriate_typeF       !##    c                     [        S5      eNz.framework doesn't support imperative executionr&   r)   r   s     r!   
from_numpyAbstractBackend.from_numpyJ       !"RSSr,   c                     [        S5      er.   r&   r/   s     r!   to_numpyAbstractBackend.to_numpyM   r2   r,   c                     [        S5      eNz/framework doesn't support symbolic computationsr&   r)   shapes     r!   create_symbolAbstractBackend.create_symbolP   s    !"STTr,   c                     [        S5      er7   r&   r)   symbolsymbol_value_pairss      r!   eval_symbolAbstractBackend.eval_symbolS   s    !"STTr,   c                     [        S5      e)Nz"framework doesn't implement aranger&   r)   startstops      r!   arangeAbstractBackend.arangeW   s    !"FGGr,   c                     UR                   $ )zashape should return a tuple with integers or "shape symbols" (which will evaluate to actual size)r9   r/   s     r!   r9   AbstractBackend.shape[   s    wwr,   c                 $    UR                  U5      $ Nreshaper)   r   r9   s      r!   rN   AbstractBackend.reshape_       yyr,   c                 $    UR                  U5      $ rL   	transposer)   r   axess      r!   rT   AbstractBackend.transposeb       {{4  r,   c                      [        X5      " US9$ Naxis)getattrr)   r   	operationrV   s       r!   reduceAbstractBackend.reducee   s    q$$//r,   tensorsc                     [        5       erL   r&   r)   rb   s     r!   stack_on_zeroth_dimension)AbstractBackend.stack_on_zeroth_dimensionh       !##r,   c                     [        5       erL   r&   r)   r   new_positions      r!   add_axisAbstractBackend.add_axisk   rg   r,   c                     S/U-  nUR                  5        H  u  pVU R                  X5      nXdU'   M     U R                  U[        U5      5      $ )N   )r
   rk   tiletupler)   r   n_axespos2lenrepeatsaxis_positionaxis_lengths          r!   add_axesAbstractBackend.add_axesn   sM    #,*1--/&Ma/A%0M" +: yyE'N++r,   c                     [        5       e)z!repeats - same lengths as x.shaper&   r)   r   rt   s      r!   ro   AbstractBackend.tileu   r+   r,   r\   c                     [        5       e)zrconcatenates tensors along axis.
Assume identical across tensors: devices, dtypes and shapes except selected axis.r&   r)   rb   r\   s      r!   concatAbstractBackend.concaty        "##r,   c                     [        5       erL   r&   r/   s     r!   is_float_typeAbstractBackend.is_float_type~   r   r,   c                     [        S5      e)Nzbackend does not provide layersr&   r)   s    r!   layersAbstractBackend.layers       !"CDDr,   c                 "    SU R                    S3$ )Nz<einops backend for >)r   r   s    r!   __repr__AbstractBackend.__repr__   s    %d&9&9%:!<<r,   c                     [        S5      e)Nzbackend does not support einsumr&   r)   patternr   s      r!   einsumAbstractBackend.einsum   r   r,    N)__name__
__module____qualname____firstlineno____doc__str__annotations__r   r0   r4   r:   r@   rF   r9   rN   rT   r`   r	   re   rk   rw   ro   intr~   r   r   r   r   __static_attributes__r   r,   r!   r   r   A   s    T$TTUUH !0$ $$,$$C $
$
E=Er,   c                   6    \ rS rSrSrS rS rS rS rS r	Sr
g	)
UnknownSize   zUpseudo-symbol for symbolic frameworks which do not provide symbols for shape elementsc                     U $ rL   r   r)   others     r!   __floordiv__UnknownSize.__floordiv__       r,   c                     gNTr   r   s     r!   __eq__UnknownSize.__eq__   s    r,   c                     U $ rL   r   r   s     r!   __mul__UnknownSize.__mul__   r   r,   c                     U $ rL   r   r   s     r!   __rmul__UnknownSize.__rmul__   r   r,   c                     [        S 5      $ rL   )hashr   s    r!   __hash__UnknownSize.__hash__   s    Dzr,   r   N)r   r   r   r   r   r   r   r   r   r   r   r   r,   r!   r   r      s    _r,   r   c                   j    \ rS rSrSrS rS rS rS rS r	S\
4S	 jrS
 rS\4S jrS rS rS rSrg)NumpyBackend   numpyc                     SS K nXl        g Nr   )r   np)r)   r   s     r!   __init__NumpyBackend.__init__   s
    r,   c                 @    [        XR                  R                  5      $ rL   )
isinstancer   ndarrayr(   s     r!   r    NumpyBackend.is_appropriate_type   s    &''//22r,   c                     U$ rL   r   r/   s     r!   r0   NumpyBackend.from_numpy       r,   c                     U$ rL   r   r/   s     r!   r4   NumpyBackend.to_numpy   r   r,   c                 8    U R                   R                  X5      $ rL   )r   rF   rC   s      r!   rF   NumpyBackend.arange       ww~~e**r,   rb   c                 8    U R                   R                  U5      $ rL   )r   stackrd   s     r!   re   &NumpyBackend.stack_on_zeroth_dimension       ww}}W%%r,   c                 8    U R                   R                  X5      $ rL   )r   ro   rz   s      r!   ro   NumpyBackend.tile       ww||A''r,   r\   c                 4    U R                   R                  XS9$ rZ   )r   concatenater}   s      r!   r~   NumpyBackend.concat       ww""7"66r,   c                      UR                   S;   $ N)float16float32float64float128bfloat16dtyper/   s     r!   r   NumpyBackend.is_float_type       wwSSSr,   c                 8    U R                   R                  X5      $ rL   )r   expand_dimsri   s      r!   rk   NumpyBackend.add_axis       ww""133r,   c                 <    U R                   R                  " U/UQ76 $ rL   )r   r   r   s      r!   r   NumpyBackend.einsum       ww~~g***r,   )r   N)r   r   r   r   r   r   r   r0   r4   rF   r	   re   ro   r   r~   r   rk   r   r   r   r,   r!   r   r      sM    N
3+& &(7C 7T4+r,   r   c                   8   ^  \ rS rSrSrU 4S jrS rS rSrU =r	$ )
JaxBackend   jaxc                 n   > [         TU ]  5         U R                  U l        SS KnUR
                  U l        g r   )superr   r   onp	jax.numpyr   )r)   r   	__class__s     r!   r   JaxBackend.__init__   s'    77))r,   c                 8    U R                   R                  U5      $ rL   )r   asarrayr/   s     r!   r0   JaxBackend.from_numpy   s    wwq!!r,   c                 8    U R                   R                  U5      $ rL   )r   r   r/   s     r!   r4   JaxBackend.to_numpy   s    xx""r,   )r   r   )
r   r   r   r   r   r   r0   r4   r   __classcell__r   s   @r!   r   r      s    N"# #r,   r   c                       \ rS rSrSrS rS rS rS rS r	S r
S	 rS
\4S jrS rS rS\4S jrS rS rS rS rSrg)TorchBackend   torchc                 $    SS K nXl         SSKJn  g )Nr   rn   )_torch_specific)r    r   )r)   r   r   s      r!   r   TorchBackend.__init__   s    
%r,   c                 @    [        XR                  R                  5      $ rL   )r   r   Tensorr(   s     r!   r    TorchBackend.is_appropriate_type   s    &**"3"344r,   c                 v    U R                   R                  U5      nU R                  U5      (       a  SUl        U$ r   )r   r0   r   requires_gradr)   r   variables      r!   r0   TorchBackend.from_numpy   s4    ::((+h''%)H"r,   c                 Z    UR                  5       R                  5       R                  5       $ rL   detachcpur   r/   s     r!   r4   TorchBackend.to_numpy       xxz~~%%''r,   c                 ^    U R                   R                  XU R                   R                  S9$ Nr   )r   rF   int64rC   s      r!   rF   TorchBackend.arange   s&    zz  DJJ4D4D EEr,   c                     US:X  a  UR                  US9$ US:X  a  UR                  US9$ US:X  a  UR                  US9$ US:X  a  UR                  US9$ US;   a)  [	        U5      S S S2    H  n[        X5      " US9nM     U$ [        SU5      e)	Nmindimmaxsummean)anyallprodUnknown reduction )aminamaxr  r  sortedr]   r'   )r)   r   r_   reduced_axesis        r!   r`   TorchBackend.reduce   s    66l6++%66l6++%55\5**& 66l6++00L)$B$/A)a0 0H%&:IFFr,   c                 $    UR                  U5      $ rL   permuterU   s      r!   rT   TorchBackend.transpose      yyr,   rb   c                 8    U R                   R                  U5      $ rL   )r   r   rd   s     r!   re   &TorchBackend.stack_on_zeroth_dimension  s    zz((r,   c                     S/U-  nUR                  5        H  u  pVU R                  X5      nXdU'   M     UR                  U5      $ Nr  r
   rk   expandrq   s          r!   rw   TorchBackend.add_axes
  G    $-*1--/&Ma/A%0M" +: xx  r,   c                 $    UR                  U5      $ rL   repeatrz   s      r!   ro   TorchBackend.tile      xx  r,   r\   c                 4    U R                   R                  XS9$ Nr  )r   catr}   s      r!   r~   TorchBackend.concat  s    zz~~g~00r,   c                 8    U R                   R                  X5      $ rL   )r   	unsqueezeri   s      r!   rk   TorchBackend.add_axis  s    zz##A44r,   c                     UR                   U R                  R                  U R                  R                  U R                  R                  U R                  R
                  4;   $ rL   )r   r   r   r   r   r   r/   s     r!   r   TorchBackend.is_float_type  sE    ww4::--tzz/A/A4::CUCUW[WaWaWjWjkkkr,   c                     SSK Jn  U$ )Nrn   r   )r   r   )r)   r   s     r!   r   TorchBackend.layers  
    !r,   c                 <    U R                   R                  " U/UQ76 $ rL   )r   r   r   s      r!   r   TorchBackend.einsum"  s    zz  -1--r,   r>  Nr   r   r   r   r   r   r   r0   r4   rF   r`   rT   r	   re   rw   ro   r   r~   rk   r   r   r   r   r   r,   r!   r   r      sc    N&5(FG") )!!1C 15l
.r,   r   c                   j    \ rS rSrSrS rS rS rS rS r	S\
4S	 jrS
 rS\4S jrS rS rS rSrg)CupyBackendi&  cupyc                     SS K nXl         g r   rF  )r)   rF  s     r!   r   CupyBackend.__init__)  s
    	r,   c                 @    [        XR                  R                  5      $ rL   )r   rF  r   r(   s     r!   r   CupyBackend.is_appropriate_type.  s    &))"3"344r,   c                 8    U R                   R                  U5      $ rL   )rF  r   r/   s     r!   r0   CupyBackend.from_numpy1      yy  ##r,   c                 8    U R                   R                  U5      $ rL   )rF  asnumpyr/   s     r!   r4   CupyBackend.to_numpy4  rN  r,   c                 8    U R                   R                  X5      $ rL   )rF  rF   rC   s      r!   rF   CupyBackend.arange7  s    yy,,r,   rb   c                 8    U R                   R                  U5      $ rL   )rF  r   rd   s     r!   re   %CupyBackend.stack_on_zeroth_dimension:      yyw''r,   c                 8    U R                   R                  X5      $ rL   )rF  ro   rz   s      r!   ro   CupyBackend.tile=  s    yy~~a))r,   r\   c                 4    U R                   R                  XS9$ rZ   )rF  r   r}   s      r!   r~   CupyBackend.concat@  s    yy$$W$88r,   c                 8    U R                   R                  X5      $ rL   )rF  r   ri   s      r!   rk   CupyBackend.add_axisC  s    yy$$Q55r,   c                      UR                   S;   $ r   r   r/   s     r!   r   CupyBackend.is_float_typeF  r   r,   c                 <    U R                   R                  " U/UQ76 $ rL   )rF  r   r   s      r!   r   CupyBackend.einsumI      yy,!,,r,   rH  N)r   r   r   r   r   r   r   r0   r4   rF   r	   re   ro   r   r~   rk   r   r   r   r   r,   r!   rE  rE  &  sM    N
5$$-( (*9C 96T-r,   rE  c                   8    \ rS rSrSrS\4S jrS rS rS r	Sr
g	)
HashableTupleiM  z.Overcomes non-hashability of symbolic elementselementsc                     Xl         g rL   rd  )r)   rd  s     r!   r   HashableTuple.__init__P  s     r,   c              #   8   #    U R                    S h  vN   g  N7frL   rf  r   s    r!   __iter__HashableTuple.__iter__S  s     ==  s   c                 ,    [        U R                  5      $ rL   )lenrd  r   s    r!   __len__HashableTuple.__len__V  s    4==!!r,   c                      U R                   U   $ rL   rf  )r)   items     r!   __getitem__HashableTuple.__getitem__Y  s    }}T""r,   rf  N)r   r   r   r   r   rp   r   ri  rm  rq  r   r   r,   r!   rc  rc  M  s     8! !!"#r,   rc  c                       \ rS rSrSrS rS rS rS rS r	S r
S	 rS
 rS rS\4S jrS rS\4S jrS rS rS rS rSrg)TensorflowBackendi_  
tensorflowc                     SS K nXl        g r   )ru  tfr)   ru  s     r!   r   TensorflowBackend.__init__b  s
    r,   c                 l    [        XR                  R                  U R                  R                  45      $ rL   )r   rw  r   Variabler(   s     r!   r   %TensorflowBackend.is_appropriate_typeg  s$    &77>>4773C3C"DEEr,   c                 z    U R                   R                  5       (       d   eU R                   R                  U5      $ rL   )rw  executing_eagerlyconvert_to_tensorr/   s     r!   r0   TensorflowBackend.from_numpyj  s0    ww((****ww((++r,   c                 d    U R                   R                  5       (       d   eUR                  5       $ rL   )rw  r~  r   r/   s     r!   r4   TensorflowBackend.to_numpyn  s'    ww((****wwyr,   c                 8    U R                   R                  X5      $ rL   )rw  rangerC   s      r!   rF   TensorflowBackend.aranger  s    ww}}U))r,   c                    U R                   R                  5       (       a  [        S UR                   5       5      $ UR                  R	                  5       nU R                   R                  U5      n[        [        U5       VVs/ s H  u  pEU=(       d    X4   PM     snn5      n [        U5        U$ s  snnf ! [         a    [        U5      s $ f = f)Nc              3   P   #    U  H  oc
  [        5       O
[        U5      v   M     g 7frL   )r   r   ).0ds     r!   	<genexpr>*TensorflowBackend.shape.<locals>.<genexpr>w  s     QA)Q?s   $&)	rw  r~  rp   r9   as_list	enumerater   BaseExceptionrc  )r)   r   static_shapetf_shaper  sr9   s          r!   r9   TensorflowBackend.shapeu  s    77$$&&QQQQ77??,Lww}}Q'HIl<ST<S&#1--<STUE,U U ! ,$U++,s   B3
&B9 9CCc                 <    [        U R                  SU-   5      " XS9$ )Nreduce_r[   )r]   rw  r^   s       r!   r`   TensorflowBackend.reduce  s    tww	I 56qDDr,   c                 8    U R                   R                  X5      $ rL   )rw  rN   rO   s      r!   rN   TensorflowBackend.reshape  s    wwq((r,   c                 8    U R                   R                  X5      $ rL   )rw  rT   rU   s      r!   rT   TensorflowBackend.transpose  s    ww  ))r,   rb   c                 8    U R                   R                  U5      $ rL   )rw  r   rd   s     r!   re   +TensorflowBackend.stack_on_zeroth_dimension  r   r,   c                 8    U R                   R                  X5      $ rL   )rw  ro   rz   s      r!   ro   TensorflowBackend.tile  r   r,   r\   c                 4    U R                   R                  XS9$ rZ   )rw  r~   r}   s      r!   r~   TensorflowBackend.concat  s    ww~~g~11r,   c                 8    U R                   R                  X5      $ rL   )rw  r   ri   s      r!   rk   TensorflowBackend.add_axis  r   r,   c                      UR                   S;   $ r   r   r/   s     r!   r   TensorflowBackend.is_float_type  r   r,   c                     SSK Jn  U$ )Nrn   )ru  )r   ru  rx  s     r!   r   TensorflowBackend.layers  s    &r,   c                 <    U R                   R                  " U/UQ76 $ rL   )rw  r   r   s      r!   r   TensorflowBackend.einsum  r   r,   )rw  N)r   r   r   r   r   r   r   r0   r4   rF   r9   r`   rN   rT   r	   re   ro   r   r~   rk   r   r   r   r   r   r,   r!   rt  rt  _  sh    !N
F,*,E)*& &(2C 24T
+r,   rt  c                       \ rS rSrSrS rS rS rS rS r	S r
S	 rS
 rS rS\4S jrS rS\4S jrS rS rS rSrg)TFKerasBackendi  ztensorflow.kerasc                 p    SS K nXl        UR                  U l        UR                  R                  U l        g r   )ru  rw  kerasr   K)r)   rw  s     r!   r   TFKerasBackend.__init__  s&    XX
!!r,   c                 |    U R                   R                  U5      =(       a    U R                  R                  U5      $ rL   )rw  	is_tensorr  is_keras_tensorr(   s     r!   r   "TFKerasBackend.is_appropriate_type  s+    ww  (KTVV-C-CF-KKr,   c                 4    U R                   R                  US9$ )N)batch_shape)r  Inputr8   s     r!   r:   TFKerasBackend.create_symbol  s    zzE22r,   c                     U R                   R                  R                  U VVs/ s H  u  p4UPM	     snnU5      nUR                  U VVs/ s H  u  pFUPM	     snn5      $ s  snnf s  snnf rL   )r  modelsModelpredict_on_batch)r)   r>   r?   varr   modelvals          r!   r@   TFKerasBackend.eval_symbol  sa    

!!''=O(P=O#=O(PRXY%%;M&N;Mxs;M&NOO )Q&Ns   A"
A(
c                 8    U R                   R                  X5      $ rL   )r  rF   rC   s      r!   rF   TFKerasBackend.arange  s    vv}}U))r,   c                 `    U R                   R                  U5      n[        [        U5      5      $ rL   )r  r9   rc  rp   rO   s      r!   r9   TFKerasBackend.shape  s"    QU5\**r,   c                 6    [        U R                  U5      " XS9$ rZ   )r]   r  r^   s       r!   r`   TFKerasBackend.reduce  s    tvvy)!77r,   c                 8    U R                   R                  X5      $ rL   )r  rN   rO   s      r!   rN   TFKerasBackend.reshape  s    vv~~a''r,   c                 8    U R                   R                  X5      $ rL   )r  permute_dimensionsrU   s      r!   rT   TFKerasBackend.transpose  s    vv((11r,   rb   c                 8    U R                   R                  U5      $ rL   )r  r   rd   s     r!   re   (TFKerasBackend.stack_on_zeroth_dimension  s    vv||G$$r,   c                 8    U R                   R                  X5      $ rL   )r  ro   rz   s      r!   ro   TFKerasBackend.tile  s    vv{{1&&r,   r\   c                 4    U R                   R                  XS9$ rZ   )r  r   r}   s      r!   r~   TFKerasBackend.concat  s    vv!!'!55r,   c                 8    U R                   R                  X5      $ rL   )r  r   ri   s      r!   rk   TFKerasBackend.add_axis  s    vv!!!22r,   c                 >    SU R                   R                  U5      ;   $ )Nfloat)r  r   r/   s     r!   r   TFKerasBackend.is_float_type  s    $&&,,q/))r,   c                     SSK Jn  U$ )Nrn   )r  )r   r  )r)   r  s     r!   r   TFKerasBackend.layers  r@  r,   )r  r  rw  N)r   r   r   r   r   r   r   r:   r@   rF   r9   r`   rN   rT   r	   re   ro   r   r~   rk   r   r   r   r   r,   r!   r  r    sb    'N"L3P*+8(2% %'6C 63*r,   r  c                       \ rS rSrSrS rS rS rS rS r	S r
S	 rS
\4S jrS rS rS\4S jrS rS rS rS rSrg)OneFlowBackendi  oneflowc                     SS K nXl        g r   )r  flow)r)   r  s     r!   r   OneFlowBackend.__init__  s
    	r,   c                 @    [        XR                  R                  5      $ rL   )r   r  r   r(   s     r!   r   "OneFlowBackend.is_appropriate_type  s    &))"2"233r,   c                 v    U R                   R                  U5      nU R                  U5      (       a  SUl        U$ r   )r  r0   r   r  r  s      r!   r0   OneFlowBackend.from_numpy  s4    99''*h''%)H"r,   c                 Z    UR                  5       R                  5       R                  5       $ rL   r  r/   s     r!   r4   OneFlowBackend.to_numpy  r  r,   c                 ^    U R                   R                  XU R                   R                  S9$ r  )r  rF   r  rC   s      r!   rF   OneFlowBackend.arange  s$    yy499??CCr,   c                     [        USS9 HV  nUS:X  a  UR                  US9u  pM  US:X  a  UR                  US9u  pM5  US;   a  [        X5      " US9nML  [	        SU5      e   U$ )NTreverser  r  r  )r  r  r  r  r  r  )r  r  r  r]   r'   )r)   r   r_   r  r\   r   s         r!   r`   OneFlowBackend.reduce  sv    <6DE!uuu1e#uuu1CCA)d3)*>	JJ 7 r,   c                 $    UR                  U5      $ rL   r#  rU   s      r!   rT   OneFlowBackend.transpose  r&  r,   rb   c                 8    U R                   R                  U5      $ rL   )r  r   rd   s     r!   re   (OneFlowBackend.stack_on_zeroth_dimension  rV  r,   c                     S/U-  nUR                  5        H  u  pVU R                  X5      nXdU'   M     UR                  " U6 $ r*  r+  rq   s          r!   rw   OneFlowBackend.add_axes  sG    $-*1--/&Ma/A%0M" +: xx!!r,   c                 $    UR                  U5      $ rL   r0  rz   s      r!   ro   OneFlowBackend.tile  r3  r,   r\   c                 4    U R                   R                  XS9$ r5  )r  r~   r}   s      r!   r~   OneFlowBackend.concat  s    yy22r,   c                 8    U R                   R                  X5      $ rL   )r  r9  ri   s      r!   rk   OneFlowBackend.add_axis  s    yy""133r,   c                     UR                   U R                  R                  U R                  R                  U R                  R                  4;   $ rL   )r   r  r   r   r   r/   s     r!   r   OneFlowBackend.is_float_type  s6    ww499,,dii.?.?ARARSSSr,   c                     SSK Jn  U$ )Nrn   )r  )r   r  )r)   r  s     r!   r   OneFlowBackend.layers  s
    #r,   c                 <    U R                   R                  " U/UQ76 $ rL   )r  r   r   s      r!   r   OneFlowBackend.einsum   ra  r,   )r  NrC  r   r,   r!   r  r    sb    N
4(D
( ("!3C 34T
-r,   r  c                      ^  \ rS rSrSrS rS rS rS rS r	U 4S jr
S	 rS
 rS\4S jrS rS rS\4S jrS rS rS rS rS rSrU =r$ )PaddleBackendi$  paddlec                     SS K nXl         g r   r  r)   r  s     r!   r   PaddleBackend.__init__'  s
    r,   c                 8    U R                   R                  U5      $ rL   )r  r  r(   s     r!   r   !PaddleBackend.is_appropriate_type,  s    {{$$V,,r,   c                 J    U R                   R                  U5      nSUl        U$ )NF)r  	to_tensorstop_gradient)r)   r   r   s      r!   r0   PaddleBackend.from_numpy/  s#    &&q)$r,   c                 >    UR                  5       R                  5       $ rL   )r  r   r/   s     r!   r4   PaddleBackend.to_numpy4  s    xxz!!r,   c                 ^    U R                   R                  XU R                   R                  S9$ r  )r  rF   r  rC   s      r!   rF   PaddleBackend.arange7  s&    {{!!%T[[5F5F!GGr,   c                    > [        U5      UR                  :X  a  [        TU ]  XU5      R	                  S5      $ [        TU ]  XU5      $ r   )rl  ndimr   r`   squeeze)r)   r   r_   rV   r   s       r!   r`   PaddleBackend.reduce:  s@    t97>!5==a@@7>!55r,   c                 $    UR                  U5      $ rL   rS   rU   s      r!   rT   PaddleBackend.transposeA  rX   r,   c                     S/U-  nUR                  5        H  u  pVU R                  X5      nXdU'   M     UR                  U5      $ r*  r+  rq   s          r!   rw   PaddleBackend.add_axesD  r.  r,   rb   c                 8    U R                   R                  U5      $ rL   )r  r   rd   s     r!   re   'PaddleBackend.stack_on_zeroth_dimensionK  s    {{  ))r,   c                 $    UR                  U5      $ rL   rM   rO   s      r!   rN   PaddleBackend.reshapeN  rQ   r,   c                 $    UR                  U5      $ rL   )ro   rz   s      r!   ro   PaddleBackend.tileQ  s    vvgr,   r\   c                 4    U R                   R                  XS9$ rZ   )r  r~   r}   s      r!   r~   PaddleBackend.concatT  s    {{!!'!55r,   c                 $    UR                  U5      $ rL   r9  ri   s      r!   rk   PaddleBackend.add_axisW      {{<((r,   c                     UR                   U R                  R                  U R                  R                  U R                  R                  4;   $ rL   )r   r  r   r   r   r/   s     r!   r   PaddleBackend.is_float_typeZ  s6    ww4;;..0C0CT[[EXEXYYYr,   c                     SSK Jn  U$ )Nrn   r  )r   r  r  s     r!   r   PaddleBackend.layers]  s
    "r,   c                 <    U R                   R                  " U/UQ76 $ rL   )r  r   r   s      r!   r   PaddleBackend.einsumb  s    {{!!'.A..r,   c                 ,    [        UR                  5      $ rL   )rp   r9   r/   s     r!   r9   PaddleBackend.shapee  s    QWW~r,   r  )r   r   r   r   r   r   r   r0   r4   rF   r`   rT   rw   r	   re   rN   ro   r   r~   rk   r   r   r   r9   r   r   r   s   @r!   r  r  $  sr    N
-
"H6!!* * 6C 6)Z
/ r,   r  c                       \ rS rSrSrS rS rS rS rS r	S r
S	 rS
 rS rS\4S jrS rS rS\4S jrS rS rSrg)TinygradBackendii  tinygradc                     SS K nXl         g r   r)  )r)   r)  s     r!   r   TinygradBackend.__init__l  s
     r,   c                 @    [        XR                  R                  5      $ rL   )r   r)  r   r(   s     r!   r   #TinygradBackend.is_appropriate_typeq  s    &--"6"677r,   c                 8    U R                   R                  U5      $ rL   )r)  r   r/   s     r!   r0   TinygradBackend.from_numpyt  s    }}##A&&r,   c                 "    UR                  5       $ rL   )r   r/   s     r!   r4   TinygradBackend.to_numpyw  s    wwyr,   c                 L    U R                   R                  R                  X5      $ rL   )r)  r   rF   rC   s      r!   rF   TinygradBackend.arangez  s    }}##**577r,   c                     UR                   $ rL   rI   r/   s     r!   r9   TinygradBackend.shape}  s    wwr,   c                 $    UR                  U5      $ rL   rM   rO   s      r!   rN   TinygradBackend.reshape  rQ   r,   c                 $    UR                  U5      $ rL   r#  rU   s      r!   rT   TinygradBackend.transpose  r&  r,   c                 F    [        USS9 H  n[        X5      " US9nM     U$ )NTr  r[   )r  r]   )r)   r   r_   rV   r\   s        r!   r`   TinygradBackend.reduce  s'    4.D%40A /r,   rb   c                 L    U R                   R                  R                  U5      $ rL   )r)  r   r   rd   s     r!   re   )TinygradBackend.stack_on_zeroth_dimension  s    }}##))'22r,   c                 $    UR                  U5      $ rL   r  ri   s      r!   rk   TinygradBackend.add_axis  r  r,   c                 $    UR                  U5      $ rL   r0  rz   s      r!   ro   TinygradBackend.tile  r3  r,   r\   c                 Z    [        U5      S:  a  US   R                  " USS  SU06$ US   $ )Nrn   r   r  )rl  r6  r}   s      r!   r~   TinygradBackend.concat  s5    9<W9Iwqz~~wqr{55YwWXzYr,   c                 `    U R                   R                  R                  UR                  5      $ rL   )r)  dtypesis_floatr   r/   s     r!   r   TinygradBackend.is_float_type  s!    }}##,,QWW55r,   c                 P    U R                   R                  R                  " U/UQ76 $ rL   )r)  r   r   r   s      r!   r   TinygradBackend.einsum  s"    }}##**77Q77r,   r+  N)r   r   r   r   r   r   r   r0   r4   rF   r9   rN   rT   r`   r	   re   rk   ro   r   r~   r   r   r   r   r,   r!   r(  r(  i  sb    N!
8'8 
3 3)!ZC Z68r,   r(  c                   |    \ rS rSrSrS rS rS rS rS r	S r
S	 rS
 rS rS\4S jrS rS\4S jrS rS rSrg)PyTensorBackendi  pytensorc                     SSK Jn  Xl        g )Nr   )r   )rM  r   ptr(   s     r!   r   PyTensorBackend.__init__  s
    #r,   c                 @    [        XR                  R                  5      $ rL   )r   rO  TensorVariabler(   s     r!   r   #PyTensorBackend.is_appropriate_type  s    &''"8"899r,   c                 \    UR                   U R                  R                  R                  ;   $ rL   )r   rO  r   float_dtypesr/   s     r!   r   PyTensorBackend.is_float_type  s    ww$'',,3333r,   c                 8    U R                   R                  U5      $ rL   )rO  	as_tensorr/   s     r!   r0   PyTensorBackend.from_numpy  s    ww  ##r,   c                 "    UR                  5       $ rL   )evalr/   s     r!   r4   PyTensorBackend.to_numpy  s    vvxr,   c                 r    [        U[        [        -  5      (       d  U4nU R                  R	                  US9$ )NrI   )r   rp   r	   rO  r   r8   s     r!   r:   PyTensorBackend.create_symbol  s/    %..HEww~~E~**r,   c                 6    UR                  [        U5      5      $ rL   )r[  dictr=   s      r!   r@   PyTensorBackend.eval_symbol  s    {{4 2344r,   c                 8    U R                   R                  X5      $ rL   )rO  rF   rC   s      r!   rF   PyTensorBackend.arange  r   r,   c                 v    [        S [        UR                  R                  UR                  5       5       5      $ )Nc              3   4   #    U  H  u  pUb  UOUv   M     g 7frL   r   )r  
static_dimsymbolic_dims      r!   r  (PyTensorBackend.shape.<locals>.<genexpr>  s$      
,F(
 %0JlB,Fs   )rp   zipr   r9   r/   s     r!   r9   PyTensorBackend.shape  s/     
,/agg,F
 
 	
r,   rb   c                 8    U R                   R                  U5      $ rL   )rO  r   rd   s     r!   re   )PyTensorBackend.stack_on_zeroth_dimension  r   r,   c                 8    U R                   R                  X5      $ rL   )rO  ro   rz   s      r!   ro   PyTensorBackend.tile  r   r,   r\   c                 4    U R                   R                  XS9$ rZ   )rO  r   r}   s      r!   r~   PyTensorBackend.concat  r   r,   c                 8    U R                   R                  X5      $ rL   )rO  r   ri   s      r!   rk   PyTensorBackend.add_axis  r   r,   c                 <    U R                   R                  " U/UQ76 $ rL   )rO  r   r   s      r!   r   PyTensorBackend.einsum  r   r,   )rO  N)r   r   r   r   r   r   r   r   r0   r4   r:   r@   rF   r9   r	   re   ro   r   r~   rk   r   r   r   r,   r!   rL  rL    s[    N
:4$+
5+
& &(7C 74+r,   rL  c                   j    \ rS rSrSrS rS rS rS rS r	S\
4S	 jrS
 rS rS\4S jrS rS rSrg)
MLXBackendi  mlxc                 0    SS K Jn  SS KnXl        X l        g r   )mlx.corecorer   mxr   )r)   r{  r   s      r!   r   MLXBackend.__init__  s    r,   c                 @    [        XR                  R                  5      $ rL   )r   r{  arrayr(   s     r!   r   MLXBackend.is_appropriate_type  s    &''--00r,   c                 8    U R                   R                  U5      $ rL   )r{  r~  r/   s     r!   r0   MLXBackend.from_numpy  s    ww}}Qr,   c                     UR                   U R                  R                  :X  a%  UR                  U R                  R                  5      nU R
                  R                  U5      $ rL   )r   r{  r   astyper   r   r~  r/   s     r!   r4   MLXBackend.to_numpy  sA    77dgg&&&)Aww}}Qr,   c                 8    U R                   R                  X5      $ rL   )r{  rF   rC   s      r!   rF   MLXBackend.arange  r   r,   rb   c                 8    U R                   R                  U5      $ rL   )r{  r   rd   s     r!   re   $MLXBackend.stack_on_zeroth_dimension  r   r,   c                 8    U R                   R                  X5      $ rL   )r{  r   ri   s      r!   rw   MLXBackend.add_axes  r   r,   c                 8    U R                   R                  X5      $ rL   )r{  ro   rz   s      r!   ro   MLXBackend.tile  r   r,   r\   c                 4    U R                   R                  XS9$ rZ   )r{  r   r}   s      r!   r~   MLXBackend.concat  r   r,   c                 v    U R                   R                  UR                  U R                   R                  5      $ rL   )r{  
issubdtyper   floatingr/   s     r!   r   MLXBackend.is_float_type  s'    ww!!!''477+;+;<<r,   c                 <    U R                   R                  " U/UQ76 $ rL   )r{  r   r   s      r!   r   MLXBackend.einsum  r   r,   )r{  r   N)r   r   r   r   r   r   r   r0   r4   rF   r	   re   rw   ro   r   r~   r   r   r   r   r,   r!   rv  rv    sL    N1  
+& &4(7C 7=+r,   rv  )returnr   )r   r   
__author__r   r`  r   r   r   r"   r   r   r   r   r   rE  rc  rt  r  r  r  r(  rL  rv  r   r,   r!   <module>r     s   
 
 $ t  (HVIE IEX &$+? $+N# #$J.? J.Z$-/ $-N# #$C+ C+L6_ 6rC-_ C-LBO BJ28o 28j3+o 3+l(+ (+r,   