
    'i X                     l   U d Z ddlZdZi Zeed<   i Zeed<   dZd$dZ G d	 d      Z	 G d
 d      Z
 G d de	      Z G d de      Z G d de	      Z G d de	      Z G d d      Z G d de	      Z G d de	      Z G d de	      Z G d de	      Z G d de	      Z G d  d!e	      Z G d" d#e	      Zy)%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                    t        |       }t        j                  |d      }||S t        t        j                               }|D ]#  \  }}|j                  |       s|t        |<   |c S  g }t        j                         }|r7|j                         }||j                         z  }|j                  |       |r7|D 	cg c]  \  }}	|	 }
}}	|D ]  }t        rt        d|       |j                  |
vs$|j                  t        j                  v sAt        rt        d|j                          |       }|t        |j                  <   |j                  |       s|t        |<   |c S  t!        dt        |              c c}	}w )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               J/var/www/stems/demucs_env/lib/python3.12/site-packages/einops/_backends.pyget_backendr"      s|   
 LEt,G!%&6&<&<&>!?$>  &&v.#*M% N --/H
,,.G**,,!!'*  )CC1!CC- #,o>))1CC--<#1?3Q3QR)+;B !7!78..v6+2M%("N# 7V~F
GG Ds   ?E>c                       e Zd ZU dZeed<   d Zd Zd Zd Z	d Z
d Zd	 Zd
 Zd Zd ZdefdZd Zd Zd ZdefdZd Zd Zd Zd Zy)r   zJBase backend class, major part of methods are only for debugging purposes.r   c                     t               )z4helper method should recognize tensors it can handleNotImplementedErrorselfr   s     r!   r   z#AbstractBackend.is_appropriate_typeF       !##    c                     t        d      Nz.framework doesn't support imperative executionr%   r(   r   s     r!   
from_numpyzAbstractBackend.from_numpyJ       !"RSSr*   c                     t        d      r,   r%   r-   s     r!   to_numpyzAbstractBackend.to_numpyM   r/   r*   c                     t        d      Nz/framework doesn't support symbolic computationsr%   r(   shapes     r!   create_symbolzAbstractBackend.create_symbolP   s    !"STTr*   c                     t        d      r3   r%   r(   symbolsymbol_value_pairss      r!   eval_symbolzAbstractBackend.eval_symbolS   s    !"STTr*   c                     t        d      )Nz"framework doesn't implement aranger%   r(   startstops      r!   arangezAbstractBackend.arangeW   s    !"FGGr*   c                     |j                   S )zashape should return a tuple with integers or "shape symbols" (which will evaluate to actual size)r5   r-   s     r!   r5   zAbstractBackend.shape[   s    wwr*   c                 $    |j                  |      S Nreshaper(   r   r5   s      r!   rF   zAbstractBackend.reshape_       yyr*   c                 $    |j                  |      S rD   	transposer(   r   axess      r!   rK   zAbstractBackend.transposeb       {{4  r*   c                 (     t        ||      |      S Naxis)getattrr(   r   	operationrM   s       r!   reducezAbstractBackend.reducee   s    $wq)$$//r*   tensorsc                     t               rD   r%   r(   rW   s     r!   stack_on_zeroth_dimensionz)AbstractBackend.stack_on_zeroth_dimensionh       !##r*   c                     t               rD   r%   r(   r   new_positions      r!   add_axiszAbstractBackend.add_axisk   r[   r*   c                     dg|z  }|j                         D ]  \  }}| j                  ||      }|||<    | j                  |t        |            S )N   )r
   r_   tiletupler(   r   n_axespos2lenrepeatsaxis_positionaxis_lengths          r!   add_axeszAbstractBackend.add_axesn   sX    #,*1--/ 	1&M;a/A%0GM"	1 yyE'N++r*   c                     t               )z!repeats - same lengths as x.shaper%   r(   r   rg   s      r!   rb   zAbstractBackend.tileu   r)   r*   rR   c                     t               )zzconcatenates tensors along axis.
        Assume identical across tensors: devices, dtypes and shapes except selected axis.r%   r(   rW   rR   s      r!   concatzAbstractBackend.concaty        "##r*   c                     t               rD   r%   r-   s     r!   is_float_typezAbstractBackend.is_float_type~   rp   r*   c                     t        d      )Nzbackend does not provide layersr%   r(   s    r!   layerszAbstractBackend.layers       !"CDDr*   c                 "    d| j                    dS )Nz<einops backend for >)r   rt   s    r!   __repr__zAbstractBackend.__repr__   s    %d&9&9%:!<<r*   c                     t        d      )Nzbackend does not support einsumr%   r(   patternr   s      r!   einsumzAbstractBackend.einsum   rv   r*   N)__name__
__module____qualname____doc__str__annotations__r   r.   r1   r6   r;   r@   r5   rF   rK   rV   r	   rZ   r_   rj   rb   intro   rr   ru   ry   r}    r*   r!   r   r   A   s    T$TTUUH !0$ $$,$$C $
$
E=Er*   c                   .    e Zd ZdZd Zd Zd Zd Zd Zy)UnknownSizezUpseudo-symbol for symbolic frameworks which do not provide symbols for shape elementsc                     | S rD   r   r(   others     r!   __floordiv__zUnknownSize.__floordiv__       r*   c                      yNTr   r   s     r!   __eq__zUnknownSize.__eq__   s    r*   c                     | S rD   r   r   s     r!   __mul__zUnknownSize.__mul__   r   r*   c                     | S rD   r   r   s     r!   __rmul__zUnknownSize.__rmul__   r   r*   c                     t        d       S rD   )hashrt   s    r!   __hash__zUnknownSize.__hash__   s    Dzr*   N)	r~   r   r   r   r   r   r   r   r   r   r*   r!   r   r      s    _r*   r   c                   ^    e Zd ZdZd Zd Zd Zd Zd Zde	fdZ
d	 Zd
efdZd Zd Zd Zy)NumpyBackendnumpyc                     dd l }|| _        y Nr   )r   np)r(   r   s     r!   __init__zNumpyBackend.__init__   s    r*   c                 B    t        || j                  j                        S rD   )
isinstancer   ndarrayr'   s     r!   r   z NumpyBackend.is_appropriate_type   s    &$''//22r*   c                     |S rD   r   r-   s     r!   r.   zNumpyBackend.from_numpy       r*   c                     |S rD   r   r-   s     r!   r1   zNumpyBackend.to_numpy   r   r*   c                 :    | j                   j                  ||      S rD   )r   r@   r=   s      r!   r@   zNumpyBackend.arange       ww~~eT**r*   rW   c                 8    | j                   j                  |      S rD   )r   stackrY   s     r!   rZ   z&NumpyBackend.stack_on_zeroth_dimension       ww}}W%%r*   c                 :    | j                   j                  ||      S rD   )r   rb   rl   s      r!   rb   zNumpyBackend.tile       ww||Aw''r*   rR   c                 <    | j                   j                  ||      S rP   )r   concatenatern   s      r!   ro   zNumpyBackend.concat       ww""7"66r*   c                     |j                   dv S N)float16float32float64float128bfloat16dtyper-   s     r!   rr   zNumpyBackend.is_float_type       wwSSSr*   c                 :    | j                   j                  ||      S rD   )r   expand_dimsr]   s      r!   r_   zNumpyBackend.add_axis       ww""1l33r*   c                 <     | j                   j                  |g| S rD   )r   r}   r{   s      r!   r}   zNumpyBackend.einsum       tww~~g***r*   N)r~   r   r   r   r   r   r.   r1   r@   r	   rZ   rb   r   ro   rr   r_   r}   r   r*   r!   r   r      sM    N
3+& &(7C 7T4+r*   r   c                   .     e Zd ZdZ fdZd Zd Z xZS )
JaxBackendjaxc                 n    t         |           | j                  | _        dd l}|j
                  | _        y r   )superr   r   onp	jax.numpyr   )r(   r   	__class__s     r!   r   zJaxBackend.__init__   s'    77))r*   c                 8    | j                   j                  |      S rD   )r   asarrayr-   s     r!   r.   zJaxBackend.from_numpy   s    wwq!!r*   c                 8    | j                   j                  |      S rD   )r   r   r-   s     r!   r1   zJaxBackend.to_numpy   s    xx""r*   )r~   r   r   r   r   r.   r1   __classcell__r   s   @r!   r   r      s    N"#r*   r   c                   v    e Zd ZdZd Zd Zd Zd Zd Zd Z	d Z
d	efd
Zd Zd ZdefdZd Zd Zd Zd Zy)TorchBackendtorchc                 &    dd l }|| _         ddlm} y )Nr   ra   )_torch_specific)r    r   )r(   r   r   s      r!   r   zTorchBackend.__init__   s    
%r*   c                 B    t        || j                  j                        S rD   )r   r   Tensorr'   s     r!   r   z TorchBackend.is_appropriate_type   s    &$**"3"344r*   c                 l    | j                   j                  |      }| j                  |      rd|_        |S r   )r   r.   rr   requires_gradr(   r   variables      r!   r.   zTorchBackend.from_numpy   s1    ::((+h'%)H"r*   c                 Z    |j                         j                         j                         S rD   detachcpur   r-   s     r!   r1   zTorchBackend.to_numpy       xxz~~%%''r*   c                 f    | j                   j                  ||| j                   j                        S Nr   )r   r@   int64r=   s      r!   r@   zTorchBackend.arange   s(    zz  DJJ4D4D EEr*   c                 0   |dk(  r|j                  |      S |dk(  r|j                  |      S |dk(  r|j                  |      S |dk(  r|j                  |      S |dv r+t	        |      d d d   D ]  } t        ||      |      } |S t        d|      )	Nmindimmaxsummean)anyallprodUnknown reduction )aminamaxr   r   sortedrS   r&   )r(   r   rU   reduced_axesis        r!   rV   zTorchBackend.reduce   s    66l6++%66l6++%55\5**& 66l6++00L)$B$/ 1)GAy)a01H%&:IFFr*   c                 $    |j                  |      S rD   permuterL   s      r!   rK   zTorchBackend.transpose      yyr*   rW   c                 8    | j                   j                  |      S rD   )r   r   rY   s     r!   rZ   z&TorchBackend.stack_on_zeroth_dimension  s    zz((r*   c                     dg|z  }|j                         D ]  \  }}| j                  ||      }|||<    |j                  |      S Nr   r
   r_   expandrd   s          r!   rj   zTorchBackend.add_axes
  R    $-*1--/ 	1&M;a/A%0GM"	1 xx  r*   c                 $    |j                  |      S rD   repeatrl   s      r!   rb   zTorchBackend.tile      xx  r*   rR   c                 <    | j                   j                  ||      S Nr   )r   catrn   s      r!   ro   zTorchBackend.concat  s    zz~~g4~00r*   c                 :    | j                   j                  ||      S rD   )r   	unsqueezer]   s      r!   r_   zTorchBackend.add_axis  s    zz##A|44r*   c                     |j                   | j                  j                  | j                  j                  | j                  j                  | j                  j
                  fv S rD   )r   r   r   r   r   r   r-   s     r!   rr   zTorchBackend.is_float_type  sE    ww4::--tzz/A/A4::CUCUW[WaWaWjWjkkkr*   c                     ddl m} |S )Nra   )r   )ru   r   )r(   r   s     r!   ru   zTorchBackend.layers  
    !r*   c                 <     | j                   j                  |g| S rD   )r   r}   r{   s      r!   r}   zTorchBackend.einsum"  s     tzz  -1--r*   Nr~   r   r   r   r   r   r.   r1   r@   rV   rK   r	   rZ   rj   rb   r   ro   r_   rr   ru   r}   r   r*   r!   r   r      sc    N&5(FG") )!!1C 15l
.r*   r   c                   ^    e Zd ZdZd Zd Zd Zd Zd Zde	fdZ
d	 Zd
efdZd Zd Zd Zy)CupyBackendcupyc                     dd l }|| _         y r   )r	  )r(   r	  s     r!   r   zCupyBackend.__init__)  s    	r*   c                 B    t        || j                  j                        S rD   )r   r	  r   r'   s     r!   r   zCupyBackend.is_appropriate_type.  s    &$))"3"344r*   c                 8    | j                   j                  |      S rD   )r	  r   r-   s     r!   r.   zCupyBackend.from_numpy1      yy  ##r*   c                 8    | j                   j                  |      S rD   )r	  asnumpyr-   s     r!   r1   zCupyBackend.to_numpy4  r  r*   c                 :    | j                   j                  ||      S rD   )r	  r@   r=   s      r!   r@   zCupyBackend.arange7  s    yyt,,r*   rW   c                 8    | j                   j                  |      S rD   )r	  r   rY   s     r!   rZ   z%CupyBackend.stack_on_zeroth_dimension:      yyw''r*   c                 :    | j                   j                  ||      S rD   )r	  rb   rl   s      r!   rb   zCupyBackend.tile=  s    yy~~a))r*   rR   c                 <    | j                   j                  ||      S rP   )r	  r   rn   s      r!   ro   zCupyBackend.concat@  s    yy$$W4$88r*   c                 :    | j                   j                  ||      S rD   )r	  r   r]   s      r!   r_   zCupyBackend.add_axisC  s    yy$$Q55r*   c                     |j                   dv S r   r   r-   s     r!   rr   zCupyBackend.is_float_typeF  r   r*   c                 <     | j                   j                  |g| S rD   )r	  r}   r{   s      r!   r}   zCupyBackend.einsumI      tyy,!,,r*   N)r~   r   r   r   r   r   r.   r1   r@   r	   rZ   rb   r   ro   r_   rr   r}   r   r*   r!   r  r  &  sM    N
5$$-( (*9C 96T-r*   r  c                   .    e Zd ZdZdefdZd Zd Zd Zy)HashableTuplez.Overcomes non-hashability of symbolic elementselementsc                     || _         y rD   r  )r(   r  s     r!   r   zHashableTuple.__init__P  s	     r*   c              #   8   K   | j                   E d {    y 7 wrD   r  rt   s    r!   __iter__zHashableTuple.__iter__S  s     ==  s   c                 ,    t        | j                        S rD   )lenr  rt   s    r!   __len__zHashableTuple.__len__V  s    4==!!r*   c                      | j                   |   S rD   r  )r(   items     r!   __getitem__zHashableTuple.__getitem__Y  s    }}T""r*   N)	r~   r   r   r   rc   r   r  r"  r%  r   r*   r!   r  r  M  s     8! !!"#r*   r  c                   |    e Zd ZdZd Zd Zd Zd Zd Zd Z	d Z
d	 Zd
 ZdefdZd ZdefdZd Zd Zd Zd Zy)TensorflowBackend
tensorflowc                     dd l }|| _        y r   )r(  tfr(   r(  s     r!   r   zTensorflowBackend.__init__b  s    r*   c                 n    t        || j                  j                  | j                  j                  f      S rD   )r   r*  r   Variabler'   s     r!   r   z%TensorflowBackend.is_appropriate_typeg  s&    &477>>4773C3C"DEEr*   c                 p    | j                   j                         sJ | j                   j                  |      S rD   )r*  executing_eagerlyconvert_to_tensorr-   s     r!   r.   zTensorflowBackend.from_numpyj  s-    ww((***ww((++r*   c                 Z    | j                   j                         sJ |j                         S rD   )r*  r/  r   r-   s     r!   r1   zTensorflowBackend.to_numpyn  s$    ww((***wwyr*   c                 :    | j                   j                  ||      S rD   )r*  ranger=   s      r!   r@   zTensorflowBackend.aranger  s    ww}}UD))r*   c                    | j                   j                         rt        d |j                  D              S |j                  j	                         }| j                   j                  |      }t        t        |      D cg c]  \  }}|xs ||    c}}      }	 t        |       |S c c}}w # t        $ r t        |      cY S w xY w)Nc              3   J   K   | ]  }|
t               n
t        |        y wrD   )r   r   ).0ds     r!   	<genexpr>z*TensorflowBackend.shape.<locals>.<genexpr>w  s     QA!)Q?Qs   !#)	r*  r/  rc   r5   as_list	enumerater   BaseExceptionr  )r(   r   static_shapetf_shaper   sr5   s          r!   r5   zTensorflowBackend.shapeu  s    77$$&QQQQ77??,Lww}}Q'HIl<ST&#q1--TUE,U U ! ,$U++,s   ?B(
B. .CCc                 D     t        | j                  d|z         ||      S )Nreduce_rQ   )rS   r*  rT   s       r!   rV   zTensorflowBackend.reduce  s!    6wtww	I 56qtDDr*   c                 :    | j                   j                  ||      S rD   )r*  rF   rG   s      r!   rF   zTensorflowBackend.reshape  s    wwq%((r*   c                 :    | j                   j                  ||      S rD   )r*  rK   rL   s      r!   rK   zTensorflowBackend.transpose  s    ww  D))r*   rW   c                 8    | j                   j                  |      S rD   )r*  r   rY   s     r!   rZ   z+TensorflowBackend.stack_on_zeroth_dimension  r   r*   c                 :    | j                   j                  ||      S rD   )r*  rb   rl   s      r!   rb   zTensorflowBackend.tile  r   r*   rR   c                 <    | j                   j                  ||      S rP   )r*  ro   rn   s      r!   ro   zTensorflowBackend.concat  s    ww~~gD~11r*   c                 :    | j                   j                  ||      S rD   )r*  r   r]   s      r!   r_   zTensorflowBackend.add_axis  r   r*   c                     |j                   dv S r   r   r-   s     r!   rr   zTensorflowBackend.is_float_type  r   r*   c                     ddl m} |S )Nra   )r(  )ru   r(  r+  s     r!   ru   zTensorflowBackend.layers  s    &r*   c                 <     | j                   j                  |g| S rD   )r*  r}   r{   s      r!   r}   zTensorflowBackend.einsum  r   r*   N)r~   r   r   r   r   r   r.   r1   r@   r5   rV   rF   rK   r	   rZ   rb   r   ro   r_   rr   ru   r}   r   r*   r!   r'  r'  _  sh    !N
F,*,E)*& &(2C 24T
+r*   r'  c                   v    e Zd ZdZd Zd Zd Zd Zd Zd Z	d Z
d	 Zd
 ZdefdZd ZdefdZd Zd Zd Zy)TFKerasBackendztensorflow.kerasc                 r    dd l }|| _        |j                  | _        |j                  j                  | _        y r   )r(  r*  kerasr   K)r(   r*  s     r!   r   zTFKerasBackend.__init__  s(    XX
!!r*   c                 r    | j                   j                  |      xr | j                  j                  |      S rD   )r*  	is_tensorrN  is_keras_tensorr'   s     r!   r   z"TFKerasBackend.is_appropriate_type  s+    ww  (KTVV-C-CF-KKr*   c                 :    | j                   j                  |      S )N)batch_shape)rM  Inputr4   s     r!   r6   zTFKerasBackend.create_symbol  s    zzE22r*   c                     | j                   j                  j                  |D cg c]  \  }}|	 c}}|      }|j                  |D cg c]  \  }}|	 c}}      S c c}}w c c}}w rD   )rM  modelsModelpredict_on_batch)r(   r9   r:   varr   modelvals          r!   r;   zTFKerasBackend.eval_symbol  sY    

!!''=O(P#q(PRXY%%;M&Nx3s&NOO )Q&Ns   A

A$
c                 :    | j                   j                  ||      S rD   )rN  r@   r=   s      r!   r@   zTFKerasBackend.arange  s    vv}}UD))r*   c                 `    | j                   j                  |      }t        t        |            S rD   )rN  r5   r  rc   rG   s      r!   r5   zTFKerasBackend.shape  s"    QU5\**r*   c                 >     t        | j                  |      ||      S rP   )rS   rN  rT   s       r!   rV   zTFKerasBackend.reduce  s    )wtvvy)!$77r*   c                 :    | j                   j                  ||      S rD   )rN  rF   rG   s      r!   rF   zTFKerasBackend.reshape  s    vv~~a''r*   c                 :    | j                   j                  ||      S rD   )rN  permute_dimensionsrL   s      r!   rK   zTFKerasBackend.transpose  s    vv((D11r*   rW   c                 8    | j                   j                  |      S rD   )rN  r   rY   s     r!   rZ   z(TFKerasBackend.stack_on_zeroth_dimension  s    vv||G$$r*   c                 :    | j                   j                  ||      S rD   )rN  rb   rl   s      r!   rb   zTFKerasBackend.tile  s    vv{{1g&&r*   rR   c                 <    | j                   j                  ||      S rP   )rN  r   rn   s      r!   ro   zTFKerasBackend.concat  s    vv!!'!55r*   c                 :    | j                   j                  ||      S rD   )rN  r   r]   s      r!   r_   zTFKerasBackend.add_axis  s    vv!!!\22r*   c                 <    d| j                   j                  |      v S )Nfloat)rN  r   r-   s     r!   rr   zTFKerasBackend.is_float_type  s    $&&,,q/))r*   c                     ddl m} |S )Nra   )rM  )ru   rM  )r(   rM  s     r!   ru   zTFKerasBackend.layers  r  r*   N)r~   r   r   r   r   r   r6   r;   r@   r5   rV   rF   rK   r	   rZ   rb   r   ro   r_   rr   ru   r   r*   r!   rK  rK    sb    'N"L3P*+8(2% %'6C 63*r*   rK  c                   v    e Zd ZdZd Zd Zd Zd Zd Zd Z	d Z
d	efd
Zd Zd ZdefdZd Zd Zd Zd Zy)OneFlowBackendoneflowc                     dd l }|| _        y r   )rk  flow)r(   rm  s     r!   r   zOneFlowBackend.__init__  s    	r*   c                 B    t        || j                  j                        S rD   )r   rm  r   r'   s     r!   r   z"OneFlowBackend.is_appropriate_type  s    &$))"2"233r*   c                 l    | j                   j                  |      }| j                  |      rd|_        |S r   )rm  r.   rr   r   r   s      r!   r.   zOneFlowBackend.from_numpy  s1    99''*h'%)H"r*   c                 Z    |j                         j                         j                         S rD   r   r-   s     r!   r1   zOneFlowBackend.to_numpy  r   r*   c                 f    | j                   j                  ||| j                   j                        S r   )rm  r@   r   r=   s      r!   r@   zOneFlowBackend.arange  s&    yyt499??CCr*   c                     t        |d      D ][  }|dk(  r|j                  |      \  }}|dk(  r|j                  |      \  }}9|dv r t        ||      |      }Qt	        d|       |S )NTreverser   r   r   )r   r   r   r   r   r   )r   r   r   rS   r&   )r(   r   rU   r   rR   r   s         r!   rV   zOneFlowBackend.reduce  s    <6 	KDE!uuu1e#uuu1CC)GAy)d3)*>	JJ	K r*   c                 $    |j                  |      S rD   r   rL   s      r!   rK   zOneFlowBackend.transpose  r   r*   rW   c                 8    | j                   j                  |      S rD   )rm  r   rY   s     r!   rZ   z(OneFlowBackend.stack_on_zeroth_dimension  r  r*   c                     dg|z  }|j                         D ]  \  }}| j                  ||      }|||<     |j                  | S r   r   rd   s          r!   rj   zOneFlowBackend.add_axes  sT    $-*1--/ 	1&M;a/A%0GM"	1 qxx!!r*   c                 $    |j                  |      S rD   r   rl   s      r!   rb   zOneFlowBackend.tile  r   r*   rR   c                 <    | j                   j                  ||      S r   )rm  ro   rn   s      r!   ro   zOneFlowBackend.concat  s    yyT22r*   c                 :    | j                   j                  ||      S rD   )rm  r  r]   s      r!   r_   zOneFlowBackend.add_axis  s    yy""1l33r*   c                     |j                   | j                  j                  | j                  j                  | j                  j                  fv S rD   )r   rm  r   r   r   r-   s     r!   rr   zOneFlowBackend.is_float_type  s6    ww499,,dii.?.?ARARSSSr*   c                     ddl m} |S )Nra   )rk  )ru   rk  )r(   rk  s     r!   ru   zOneFlowBackend.layers  s
    #r*   c                 <     | j                   j                  |g| S rD   )rm  r}   r{   s      r!   r}   zOneFlowBackend.einsum   r  r*   Nr  r   r*   r!   rj  rj    sb    N
4(D
( ("!3C 34T
-r*   rj  c                        e Zd ZdZd Zd Zd Zd Zd Z fdZ	d Z
d	 Zd
efdZd Zd ZdefdZd Zd Zd Zd Zd Z xZS )PaddleBackendpaddlec                     dd l }|| _         y r   r  r(   r  s     r!   r   zPaddleBackend.__init__'  s    r*   c                 8    | j                   j                  |      S rD   )r  rP  r'   s     r!   r   z!PaddleBackend.is_appropriate_type,  s    {{$$V,,r*   c                 J    | j                   j                  |      }d|_        |S )NF)r  	to_tensorstop_gradient)r(   r   r   s      r!   r.   zPaddleBackend.from_numpy/  s#    &&q)$r*   c                 >    |j                         j                         S rD   )r   r   r-   s     r!   r1   zPaddleBackend.to_numpy4  s    xxz!!r*   c                 f    | j                   j                  ||| j                   j                        S r   )r  r@   r   r=   s      r!   r@   zPaddleBackend.arange7  s(    {{!!%T[[5F5F!GGr*   c                     t        |      |j                  k(  r t        |   |||      j	                  d      S t        |   |||      S r   )r!  ndimr   rV   squeeze)r(   r   rU   rM   r   s       r!   rV   zPaddleBackend.reduce:  sD    t97>!Y5==a@@7>!Y55r*   c                 $    |j                  |      S rD   rJ   rL   s      r!   rK   zPaddleBackend.transposeA  rN   r*   c                     dg|z  }|j                         D ]  \  }}| j                  ||      }|||<    |j                  |      S r   r   rd   s          r!   rj   zPaddleBackend.add_axesD  r   r*   rW   c                 8    | j                   j                  |      S rD   )r  r   rY   s     r!   rZ   z'PaddleBackend.stack_on_zeroth_dimensionK  s    {{  ))r*   c                 $    |j                  |      S rD   rE   rG   s      r!   rF   zPaddleBackend.reshapeN  rH   r*   c                 $    |j                  |      S rD   )rb   rl   s      r!   rb   zPaddleBackend.tileQ  s    vvgr*   rR   c                 <    | j                   j                  ||      S rP   )r  ro   rn   s      r!   ro   zPaddleBackend.concatT  s    {{!!'!55r*   c                 $    |j                  |      S rD   r  r]   s      r!   r_   zPaddleBackend.add_axisW      {{<((r*   c                     |j                   | j                  j                  | j                  j                  | j                  j                  fv S rD   )r   r  r   r   r   r-   s     r!   rr   zPaddleBackend.is_float_typeZ  s6    ww4;;..0C0CT[[EXEXYYYr*   c                     ddl m} |S )Nra   r  )ru   r  r  s     r!   ru   zPaddleBackend.layers]  s
    "r*   c                 <     | j                   j                  |g| S rD   )r  r}   r{   s      r!   r}   zPaddleBackend.einsumb  s    !t{{!!'.A..r*   c                 ,    t        |j                        S rD   )rc   r5   r-   s     r!   r5   zPaddleBackend.shapee  s    QWW~r*   )r~   r   r   r   r   r   r.   r1   r@   rV   rK   rj   r	   rZ   rF   rb   r   ro   r_   rr   ru   r}   r5   r   r   s   @r!   r  r  $  sm    N
-
"H6!!* * 6C 6)Z
/r*   r  c                   v    e Zd ZdZd Zd Zd Zd Zd Zd Z	d Z
d	 Zd
 ZdefdZd Zd ZdefdZd Zd Zy)TinygradBackendtinygradc                     dd l }|| _         y r   )r  )r(   r  s     r!   r   zTinygradBackend.__init__l  s     r*   c                 B    t        || j                  j                        S rD   )r   r  r   r'   s     r!   r   z#TinygradBackend.is_appropriate_typeq  s    &$--"6"677r*   c                 8    | j                   j                  |      S rD   )r  r   r-   s     r!   r.   zTinygradBackend.from_numpyt  s    }}##A&&r*   c                 "    |j                         S rD   )r   r-   s     r!   r1   zTinygradBackend.to_numpyw  s    wwyr*   c                 N    | j                   j                  j                  ||      S rD   )r  r   r@   r=   s      r!   r@   zTinygradBackend.arangez  s    }}##**5$77r*   c                     |j                   S rD   rB   r-   s     r!   r5   zTinygradBackend.shape}  s    wwr*   c                 $    |j                  |      S rD   rE   rG   s      r!   rF   zTinygradBackend.reshape  rH   r*   c                 $    |j                  |      S rD   r   rL   s      r!   rK   zTinygradBackend.transpose  r   r*   c                 P    t        |d      D ]  } t        ||      |      } |S )NTrs  rQ   )r   rS   )r(   r   rU   rM   rR   s        r!   rV   zTinygradBackend.reduce  s0    4. 	1D%9%40A	1r*   rW   c                 L    | j                   j                  j                  |      S rD   )r  r   r   rY   s     r!   rZ   z)TinygradBackend.stack_on_zeroth_dimension  s    }}##))'22r*   c                 $    |j                  |      S rD   r  r]   s      r!   r_   zTinygradBackend.add_axis  r  r*   c                 $    |j                  |      S rD   r   rl   s      r!   rb   zTinygradBackend.tile  r   r*   rR   c                 X    t        |      dkD  r |d   j                  |dd  d|iS |d   S )Nra   r   r   )r!  r   rn   s      r!   ro   zTinygradBackend.concat  s7    9<W9I~wqz~~wqr{55YwWXzYr*   c                 `    | j                   j                  j                  |j                        S rD   )r  dtypesis_floatr   r-   s     r!   rr   zTinygradBackend.is_float_type  s!    }}##,,QWW55r*   c                 P     | j                   j                  j                  |g| S rD   )r  r   r}   r{   s      r!   r}   zTinygradBackend.einsum  s$    *t}}##**77Q77r*   N)r~   r   r   r   r   r   r.   r1   r@   r5   rF   rK   rV   r	   rZ   r_   rb   r   ro   rr   r}   r   r*   r!   r  r  i  sb    N!
8'8 
3 3)!ZC Z68r*   r  c                   p    e Zd ZdZd Zd Zd Zd Zd Zd Z	d Z
d	 Zd
 ZdefdZd ZdefdZd Zd Zy)PyTensorBackendpytensorc                     ddl m} || _        y )Nr   )r   )r  r   ptr'   s     r!   r   zPyTensorBackend.__init__  s    #r*   c                 B    t        || j                  j                        S rD   )r   r  TensorVariabler'   s     r!   r   z#PyTensorBackend.is_appropriate_type  s    &$''"8"899r*   c                 Z    |j                   | j                  j                  j                  v S rD   )r   r  r   float_dtypesr-   s     r!   rr   zPyTensorBackend.is_float_type  s    ww$'',,3333r*   c                 8    | j                   j                  |      S rD   )r  	as_tensorr-   s     r!   r.   zPyTensorBackend.from_numpy  s    ww  ##r*   c                 "    |j                         S rD   )evalr-   s     r!   r1   zPyTensorBackend.to_numpy  s    vvxr*   c                 n    t        |t        t        z        s|f}| j                  j	                  |      S )NrB   )r   rc   r	   r  r   r4   s     r!   r6   zPyTensorBackend.create_symbol  s,    %.HEww~~E~**r*   c                 6    |j                  t        |            S rD   )r  dictr8   s      r!   r;   zPyTensorBackend.eval_symbol  s    {{4 2344r*   c                 :    | j                   j                  ||      S rD   )r  r@   r=   s      r!   r@   zPyTensorBackend.arange  r   r*   c                 v    t        d t        |j                  j                  |j                        D              S )Nc              3   .   K   | ]  \  }}||n|  y wrD   r   )r6  
static_dimsymbolic_dims      r!   r8  z(PyTensorBackend.shape.<locals>.<genexpr>  s&      
(
L %0JlB
s   )rc   zipr   r5   r-   s     r!   r5   zPyTensorBackend.shape  s/     
,/agg,F
 
 	
r*   rW   c                 8    | j                   j                  |      S rD   )r  r   rY   s     r!   rZ   z)PyTensorBackend.stack_on_zeroth_dimension  r   r*   c                 :    | j                   j                  ||      S rD   )r  rb   rl   s      r!   rb   zPyTensorBackend.tile  r   r*   rR   c                 <    | j                   j                  ||      S rP   )r  r   rn   s      r!   ro   zPyTensorBackend.concat  r   r*   c                 :    | j                   j                  ||      S rD   )r  r   r]   s      r!   r_   zPyTensorBackend.add_axis  r   r*   c                 <     | j                   j                  |g| S rD   )r  r}   r{   s      r!   r}   zPyTensorBackend.einsum  r   r*   N)r~   r   r   r   r   r   rr   r.   r1   r6   r;   r@   r5   r	   rZ   rb   r   ro   r_   r}   r   r*   r!   r  r    s[    N
:4$+
5+
& &(7C 74+r*   r  c                   ^    e Zd ZdZd Zd Zd Zd Zd Zde	fdZ
d	 Zd
 ZdefdZd Zd Zy)
MLXBackendmlxc                 4    dd l m} dd l}|| _        || _        y r   )mlx.corecorer   mxr   )r(   r  r   s      r!   r   zMLXBackend.__init__  s    r*   c                 B    t        || j                  j                        S rD   )r   r  arrayr'   s     r!   r   zMLXBackend.is_appropriate_type  s    &$''--00r*   c                 8    | j                   j                  |      S rD   )r  r  r-   s     r!   r.   zMLXBackend.from_numpy  s    ww}}Qr*   c                     |j                   | j                  j                  k(  r%|j                  | j                  j                        }| j
                  j                  |      S rD   )r   r  r   astyper   r   r  r-   s     r!   r1   zMLXBackend.to_numpy  sA    77dgg&&&)Aww}}Qr*   c                 :    | j                   j                  ||      S rD   )r  r@   r=   s      r!   r@   zMLXBackend.arange  r   r*   rW   c                 8    | j                   j                  |      S rD   )r  r   rY   s     r!   rZ   z$MLXBackend.stack_on_zeroth_dimension  r   r*   c                 :    | j                   j                  ||      S rD   )r  r   r]   s      r!   rj   zMLXBackend.add_axes  r   r*   c                 :    | j                   j                  ||      S rD   )r  rb   rl   s      r!   rb   zMLXBackend.tile  r   r*   rR   c                 <    | j                   j                  ||      S rP   )r  r   rn   s      r!   ro   zMLXBackend.concat  r   r*   c                 v    | j                   j                  |j                  | j                   j                        S rD   )r  
issubdtyper   floatingr-   s     r!   rr   zMLXBackend.is_float_type  s'    ww!!!''477+;+;<<r*   c                 <     | j                   j                  |g| S rD   )r  r}   r{   s      r!   r}   zMLXBackend.einsum  r   r*   N)r~   r   r   r   r   r   r.   r1   r@   r	   rZ   rj   rb   r   ro   rr   r}   r   r*   r!   r  r    sL    N1  
+& &4(7C 7=+r*   r  )returnr   )r   r   
__author__r   r  r   r   r   r"   r   r   r   r   r   r  r  r'  rK  rj  r  r  r  r  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*   