
    Pi X                        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dS )&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returnAbstractBackendc                 4   t          |           }t                              |d          }||S t          t                                                    }|D ](\  }}|                    |           r|t          |<   |c S )g }t                                          }|rB|	                                }||                                z  }|
                    |           |Bd |D             }|D ]}	t          rt          d|	           |	j        |vrk|	j        t          j        v rXt          rt          d|	j                    |	            }|t          |j        <   |                    |           r|t          |<   |c S t!          dt          |                      )z
    Takes a correct backend (e.g. numpy backend if tensor is numpy.ndarray) for a tensor.
    If needed, imports package and creates backend
    Nc                     g | ]\  }}|S  r	   ).0x_s      d/home/jaya/work/projects/VOICE-AGENT/VIET/agent-env/lib/python3.11/site-packages/einops/_backends.py
<listcomp>zget_backend.<locals>.<listcomp>/   s    CCC1!CCC    z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prev_backend_namesBackendSubclasss
             r   get_backendr(      s   
 LLEt,,G!%&6&<&<&>&>!?!?$>   &&v.. 	#*M% NNN	
 --//H
 +,,..G**,,,!!'***  + DC(BCCC- # # 	?,o>>>)1CCC-<<# S1?3QRRR)/++;B !78..v66 #+2M%("NNN
FVFF
G
GGr   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dS )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       !###r   c                      t          d          Nz.framework doesn't support imperative executionr+   r.   r   s     r   
from_numpyzAbstractBackend.from_numpyJ       !"RSSSr   c                      t          d          r1   r+   r2   s     r   to_numpyzAbstractBackend.to_numpyM   r4   r   c                      t          d          Nz/framework doesn't support symbolic computationsr+   r.   shapes     r   create_symbolzAbstractBackend.create_symbolP   s    !"STTTr   c                      t          d          r8   r+   r.   symbolsymbol_value_pairss      r   eval_symbolzAbstractBackend.eval_symbolS   s    !"STTTr   c                      t          d          )Nz"framework doesn't implement aranger+   r.   startstops      r   arangezAbstractBackend.arangeW   s    !"FGGGr   c                     |j         S )zashape should return a tuple with integers or "shape symbols" (which will evaluate to actual size)r:   r2   s     r   r:   zAbstractBackend.shape[   s	    wr   c                 ,    |                     |          S Nreshaper.   r   r:   s      r   rK   zAbstractBackend.reshape_       yyr   c                 ,    |                     |          S rI   	transposer.   r   axess      r   rP   zAbstractBackend.transposeb       {{4   r   c                 6     t          ||          |          S Naxis)getattrr.   r   	operationrR   s       r   reducezAbstractBackend.reducee   s    $wq)$$$////r   tensorsc                     t                      rI   r+   r.   r\   s     r   stack_on_zeroth_dimensionz)AbstractBackend.stack_on_zeroth_dimensionh       !###r   c                     t                      rI   r+   r.   r   new_positions      r   add_axiszAbstractBackend.add_axisk   r`   r   c                     dg|z  }|                                 D ] \  }}|                     ||          }|||<   !|                     |t          |                    S )N   )r   rd   tiletupler.   r   n_axespos2lenrepeatsaxis_positionaxis_lengths          r   add_axeszAbstractBackend.add_axesn   sc    #,*1--// 	1 	1&M;a//A%0GM""yyE'NN+++r   c                     t                      )z!repeats - same lengths as x.shaper+   r.   r   rl   s      r   rg   zAbstractBackend.tileu   r/   r   rW   c                     t                      )zzconcatenates tensors along axis.
        Assume identical across tensors: devices, dtypes and shapes except selected axis.r+   r.   r\   rW   s      r   concatzAbstractBackend.concaty        "###r   c                     t                      rI   r+   r2   s     r   is_float_typezAbstractBackend.is_float_type~   ru   r   c                      t          d          )Nzbackend does not provide layersr+   r.   s    r   layerszAbstractBackend.layers       !"CDDDr   c                     d| j          dS )Nz<einops backend for >)r   ry   s    r   __repr__zAbstractBackend.__repr__   s    <d&9<<<<r   c                      t          d          )Nzbackend does not support einsumr+   r.   patternr   s      r   einsumzAbstractBackend.einsum   r{   r   N)__name__
__module____qualname____doc__str__annotations__r   r3   r6   r;   r@   rE   r:   rK   rP   r[   r   r_   rd   ro   rg   intrt   rw   rz   r~   r   r	   r   r   r   r   A   st        TT$ $ $T T TT T TU U UU U UH H H       ! ! !0 0 0$ $ $ $ $$ $ $, , ,$ $ $$C $ $ $ $
$ $ $
E E E= = =E E E E Er   c                   0    e Zd ZdZd Zd Zd Zd Zd ZdS )UnknownSizezUpseudo-symbol for symbolic frameworks which do not provide symbols for shape elementsc                     | S rI   r	   r.   others     r   __floordiv__zUnknownSize.__floordiv__       r   c                     dS NTr	   r   s     r   __eq__zUnknownSize.__eq__   s    tr   c                     | S rI   r	   r   s     r   __mul__zUnknownSize.__mul__   r   r   c                     | S rI   r	   r   s     r   __rmul__zUnknownSize.__rmul__   r   r   c                      t          d           S rI   )hashry   s    r   __hash__zUnknownSize.__hash__   s    Dzzr   N)	r   r   r   r   r   r   r   r   r   r	   r   r   r   r      se        __            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dS )NumpyBackendnumpyc                     dd l }|| _        d S Nr   )r   np)r.   r   s     r   __init__zNumpyBackend.__init__   s    r   c                 6    t          || j        j                  S rI   )
isinstancer   ndarrayr-   s     r   r   z NumpyBackend.is_appropriate_type   s    &$'/222r   c                     |S rI   r	   r2   s     r   r3   zNumpyBackend.from_numpy       r   c                     |S rI   r	   r2   s     r   r6   zNumpyBackend.to_numpy   r   r   c                 8    | j                             ||          S rI   )r   rE   rB   s      r   rE   zNumpyBackend.arange       w~~eT***r   r\   c                 6    | j                             |          S rI   )r   stackr^   s     r   r_   z&NumpyBackend.stack_on_zeroth_dimension       w}}W%%%r   c                 8    | j                             ||          S rI   )r   rg   rq   s      r   rg   zNumpyBackend.tile       w||Aw'''r   rW   c                 :    | j                             ||          S rU   )r   concatenaters   s      r   rt   zNumpyBackend.concat       w""7"666r   c                     |j         dv S N)float16float32float64float128bfloat16dtyper2   s     r   rw   zNumpyBackend.is_float_type       wSSSr   c                 8    | j                             ||          S rI   )r   expand_dimsrb   s      r   rd   zNumpyBackend.add_axis       w""1l333r   c                 (     | j         j        |g|R  S rI   )r   r   r   s      r   r   zNumpyBackend.einsum       tw~g*****r   N)r   r   r   r   r   r   r3   r6   rE   r   r_   rg   r   rt   rw   rd   r   r	   r   r   r   r      s        N  
3 3 3    + + +& & & & &( ( (7C 7 7 7 7T T T4 4 4+ + + + +r   r   c                   .     e Zd ZdZ fdZd Zd Z xZS )
JaxBackendjaxc                     t                                                       | j        | _        dd l}|j        | _        d S r   )superr   r   onp	jax.numpyr   )r.   r   	__class__s     r   r   zJaxBackend.__init__   s;    7)r   c                 6    | j                             |          S rI   )r   asarrayr2   s     r   r3   zJaxBackend.from_numpy   s    wq!!!r   c                 6    | j                             |          S rI   )r   r   r2   s     r   r6   zJaxBackend.to_numpy   s    x"""r   )r   r   r   r   r   r3   r6   __classcell__r   s   @r   r   r      s[        N    " " "# # # # # # #r   r   c                   x    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dS )TorchBackendtorchc                 (    dd l }|| _         ddlm} d S )Nr   rf   )_torch_specific)r    r   )r.   r   r   s      r   r   zTorchBackend.__init__   s*    
%%%%%%%%r   c                 6    t          || j        j                  S rI   )r   r   Tensorr-   s     r   r   z TorchBackend.is_appropriate_type   s    &$*"3444r   c                 r    | j                             |          }|                     |          rd|_        |S r   )r   r3   rw   requires_gradr.   r   variables      r   r3   zTorchBackend.from_numpy   s:    :((++h'' 	*%)H"r   c                 r    |                                                                                                 S rI   detachcpur   r2   s     r   r6   zTorchBackend.to_numpy   &    xxzz~~%%'''r   c                 P    | j                             ||| j         j                  S Nr   )r   rE   int64rB   s      r   rE   zTorchBackend.arange   s$    z  DJ4D EEEr   c                 x   |dk    r|                     |          S |dk    r|                    |          S |dk    r|                    |          S |dk    r|                    |          S |dv r7t	          |          d d d         D ]} t          ||          |          }|S t          d|          )	Nmindimmaxsummean)anyallprodUnknown reduction )aminamaxr   r   sortedrX   r,   )r.   r   rZ   reduced_axesis        r   r[   zTorchBackend.reduce   s    66l6+++%66l6+++%55\5***&  66l6+++000L))$$B$/ 1 1)GAy))a000H%&:IFFFr   c                 ,    |                     |          S rI   permuterQ   s      r   rP   zTorchBackend.transpose      yyr   r\   c                 6    | j                             |          S rI   )r   r   r^   s     r   r_   z&TorchBackend.stack_on_zeroth_dimension  s    z(((r   c                     dg|z  }|                                 D ] \  }}|                     ||          }|||<   !|                    |          S Nr   r   rd   expandri   s          r   ro   zTorchBackend.add_axes
  [    $-*1--// 	1 	1&M;a//A%0GM""xx   r   c                 ,    |                     |          S rI   repeatrq   s      r   rg   zTorchBackend.tile      xx   r   rW   c                 :    | j                             ||          S Nr   )r   catrs   s      r   rt   zTorchBackend.concat  s    z~~g4~000r   c                 8    | j                             ||          S rI   )r   	unsqueezerb   s      r   rd   zTorchBackend.add_axis  s    z##A|444r   c                 l    |j         | j        j        | j        j        | j        j        | j        j        fv S rI   )r   r   r   r   r   r   r2   s     r   rw   zTorchBackend.is_float_type  s.    w4:-tz/A4:CUW[WaWjkkkr   c                     ddl m} |S )Nrf   )r   )rz   r   )r.   r   s     r   rz   zTorchBackend.layers      !!!!!!r   c                 (     | j         j        |g|R  S rI   )r   r   r   s      r   r   zTorchBackend.einsum"  s     tz -1----r   Nr   r   r   r   r   r   r3   r6   rE   r[   rP   r   r_   ro   rg   r   rt   rd   rw   rz   r   r	   r   r   r   r      s       N& & &5 5 5  ( ( (F F FG G G"  ) ) ) ) )! ! !! ! !1C 1 1 1 15 5 5l l 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dS )CupyBackendcupyc                     dd l }|| _         d S r   )r  )r.   r  s     r   r   zCupyBackend.__init__)  s    			r   c                 6    t          || j        j                  S rI   )r   r  r   r-   s     r   r   zCupyBackend.is_appropriate_type.  s    &$)"3444r   c                 6    | j                             |          S rI   )r  r   r2   s     r   r3   zCupyBackend.from_numpy1      y  ###r   c                 6    | j                             |          S rI   )r  asnumpyr2   s     r   r6   zCupyBackend.to_numpy4  r  r   c                 8    | j                             ||          S rI   )r  rE   rB   s      r   rE   zCupyBackend.arange7  s    yt,,,r   r\   c                 6    | j                             |          S rI   )r  r   r^   s     r   r_   z%CupyBackend.stack_on_zeroth_dimension:      yw'''r   c                 8    | j                             ||          S rI   )r  rg   rq   s      r   rg   zCupyBackend.tile=  s    y~~a)))r   rW   c                 :    | j                             ||          S rU   )r  r   rs   s      r   rt   zCupyBackend.concat@  s    y$$W4$888r   c                 8    | j                             ||          S rI   )r  r   rb   s      r   rd   zCupyBackend.add_axisC  s    y$$Q555r   c                     |j         dv S r   r   r2   s     r   rw   zCupyBackend.is_float_typeF  r   r   c                 (     | j         j        |g|R  S rI   )r  r   r   s      r   r   zCupyBackend.einsumI      ty,!,,,,r   N)r   r   r   r   r   r   r3   r6   rE   r   r_   rg   r   rt   rd   rw   r   r	   r   r   r  r  &  s        N  
5 5 5$ $ $$ $ $- - -( ( ( ( (* * *9C 9 9 9 96 6 6T T T- - - - -r   r  c                   0    e Zd ZdZdefdZd Zd Zd ZdS )HashableTuplez.Overcomes non-hashability of symbolic elementselementsc                     || _         d S rI   r  )r.   r  s     r   r   zHashableTuple.__init__P  s     r   c              #   $   K   | j         E d {V  d S rI   r!  ry   s    r   __iter__zHashableTuple.__iter__S  s&      =         r   c                 *    t          | j                  S rI   )lenr  ry   s    r   __len__zHashableTuple.__len__V  s    4=!!!r   c                     | j         |         S rI   r!  )r.   items     r   __getitem__zHashableTuple.__getitem__Y  s    }T""r   N)	r   r   r   r   rh   r   r#  r&  r)  r	   r   r   r  r  M  sb        8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dS )TensorflowBackend
tensorflowc                     dd l }|| _        d S r   )r,  tfr.   r,  s     r   r   zTensorflowBackend.__init__b  s    r   c                 N    t          || j        j        | j        j        f          S rI   )r   r.  r   Variabler-   s     r   r   z%TensorflowBackend.is_appropriate_typeg  s     &47>473C"DEEEr   c                 l    | j                                         sJ | j                             |          S rI   )r.  executing_eagerlyconvert_to_tensorr2   s     r   r3   zTensorflowBackend.from_numpyj  s2    w((*****w((+++r   c                 `    | j                                         sJ |                                S rI   )r.  r3  r   r2   s     r   r6   zTensorflowBackend.to_numpyn  s*    w((*****wwyyr   c                 8    | j                             ||          S rI   )r.  rangerB   s      r   rE   zTensorflowBackend.aranger  s    w}}UD)))r   c                    | j                                         rt          d |j        D                       S |j                                        }| j                             |          t          fdt          |          D                       }	 t          |           |S # t          $ r t          |          cY S w xY w)Nc              3   T   K   | ]#}|t                      nt          |          V  $d S rI   )r   r   )r
   ds     r   	<genexpr>z*TensorflowBackend.shape.<locals>.<genexpr>w  s4      QQA!)QQQQQQQr   c                 *    g | ]\  }}|p|         S r	   r	   )r
   r   stf_shapes      r   r   z+TensorflowBackend.shape.<locals>.<listcomp>|  s&    TTT&#q1-TTTr   )	r.  r3  rh   r:   as_list	enumerater   BaseExceptionr  )r.   r   static_shaper:   r>  s       @r   r:   zTensorflowBackend.shapeu  s    7$$&& 	,QQQQQQQQ7??,,Lw}}Q''HTTTTIl<S<STTTUUE,U  , , ,$U+++++,s   B& &CCc                 H     t          | j        d|z             ||          S )Nreduce_rV   )rX   r.  rY   s       r   r[   zTensorflowBackend.reduce  s(    6wtw	I 566qtDDDDr   c                 8    | j                             ||          S rI   )r.  rK   rL   s      r   rK   zTensorflowBackend.reshape  s    wq%(((r   c                 8    | j                             ||          S rI   )r.  rP   rQ   s      r   rP   zTensorflowBackend.transpose  s    w  D)))r   r\   c                 6    | j                             |          S rI   )r.  r   r^   s     r   r_   z+TensorflowBackend.stack_on_zeroth_dimension  r   r   c                 8    | j                             ||          S rI   )r.  rg   rq   s      r   rg   zTensorflowBackend.tile  r   r   rW   c                 :    | j                             ||          S rU   )r.  rt   rs   s      r   rt   zTensorflowBackend.concat  s    w~~gD~111r   c                 8    | j                             ||          S rI   )r.  r   rb   s      r   rd   zTensorflowBackend.add_axis  r   r   c                     |j         dv S r   r   r2   s     r   rw   zTensorflowBackend.is_float_type  r   r   c                     ddl m} |S )Nrf   )r,  )rz   r,  r/  s     r   rz   zTensorflowBackend.layers  s    &&&&&&r   c                 (     | j         j        |g|R  S rI   )r.  r   r   s      r   r   zTensorflowBackend.einsum  r   r   N)r   r   r   r   r   r   r3   r6   rE   r:   r[   rK   rP   r   r_   rg   r   rt   rd   rw   rz   r   r	   r   r   r+  r+  _  s*       !N  
F F F, , ,  * * *, , ,E E E) ) )* * *& & & & &( ( (2C 2 2 2 24 4 4T T T  
+ + + + +r   r+  c                   x    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S )TFKerasBackendztensorflow.kerasc                 V    dd l }|| _        |j        | _        |j        j        | _        d S r   )r,  r.  kerasr#   K)r.   r.  s     r   r   zTFKerasBackend.__init__  s.    X
!r   c                 j    | j                             |          o| j                            |          S rI   )r.  	is_tensorrR  is_keras_tensorr-   s     r   r   z"TFKerasBackend.is_appropriate_type  s-    w  ((KTV-C-CF-K-KKr   c                 8    | j                             |          S )N)batch_shape)rQ  Inputr9   s     r   r;   zTFKerasBackend.create_symbol  s    zE222r   c                     | j         j                            d |D             |          }|                    d |D                       S )Nc                     g | ]\  }}|S r	   r	   )r
   varr   s      r   r   z.TFKerasBackend.eval_symbol.<locals>.<listcomp>  s    (P(P(P#q(P(P(Pr   c                     g | ]\  }}|S r	   r	   )r
   r   vals      r   r   z.TFKerasBackend.eval_symbol.<locals>.<listcomp>  s    &N&N&Nx3s&N&N&Nr   )rQ  modelsModelpredict_on_batch)r.   r>   r?   models       r   r@   zTFKerasBackend.eval_symbol  sQ    
!''(P(P=O(P(P(PRXYY%%&N&N;M&N&N&NOOOr   c                 8    | j                             ||          S rI   )rR  rE   rB   s      r   rE   zTFKerasBackend.arange  s    v}}UD)))r   c                 n    | j                             |          }t          t          |                    S rI   )rR  r:   r  rh   rL   s      r   r:   zTFKerasBackend.shape  s'    QU5\\***r   c                 B     t          | j        |          ||          S rU   )rX   rR  rY   s       r   r[   zTFKerasBackend.reduce  s#    )wtvy))!$7777r   c                 8    | j                             ||          S rI   )rR  rK   rL   s      r   rK   zTFKerasBackend.reshape  s    v~~a'''r   c                 8    | j                             ||          S rI   )rR  permute_dimensionsrQ   s      r   rP   zTFKerasBackend.transpose  s    v((D111r   r\   c                 6    | j                             |          S rI   )rR  r   r^   s     r   r_   z(TFKerasBackend.stack_on_zeroth_dimension  s    v||G$$$r   c                 8    | j                             ||          S rI   )rR  rg   rq   s      r   rg   zTFKerasBackend.tile  s    v{{1g&&&r   rW   c                 :    | j                             ||          S rU   )rR  r   rs   s      r   rt   zTFKerasBackend.concat  s    v!!'!555r   c                 8    | j                             ||          S rI   )rR  r   rb   s      r   rd   zTFKerasBackend.add_axis  s    v!!!\222r   c                 :    d| j                             |          v S )Nfloat)rR  r   r2   s     r   rw   zTFKerasBackend.is_float_type  s    $&,,q//))r   c                     ddl m} |S )Nrf   )rQ  )rz   rQ  )r.   rQ  s     r   rz   zTFKerasBackend.layers  r  r   N)r   r   r   r   r   r   r;   r@   rE   r:   r[   rK   rP   r   r_   rg   r   rt   rd   rw   rz   r	   r   r   rO  rO    s       'N" " "L L L3 3 3P P P* * *+ + +8 8 8( ( (2 2 2% % % % %' ' '6C 6 6 6 63 3 3* * *    r   rO  c                   x    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dS )OneFlowBackendoneflowc                     dd l }|| _        d S r   )rq  flow)r.   rs  s     r   r   zOneFlowBackend.__init__  s    			r   c                 6    t          || j        j                  S rI   )r   rs  r   r-   s     r   r   z"OneFlowBackend.is_appropriate_type  s    &$)"2333r   c                 r    | j                             |          }|                     |          rd|_        |S r   )rs  r3   rw   r   r   s      r   r3   zOneFlowBackend.from_numpy  s:    9''**h'' 	*%)H"r   c                 r    |                                                                                                 S rI   r   r2   s     r   r6   zOneFlowBackend.to_numpy  r   r   c                 P    | j                             ||| j         j                  S r   )rs  rE   r   rB   s      r   rE   zOneFlowBackend.arange  s#    yt49?CCCr   c                 
   t          |d          D ]p}|dk    r|                    |          \  }}"|dk    r|                    |          \  }}B|dv r t          ||          |          }at	          d|          |S )NTreverser   r   r   )r   r   r   r   r   r   )r   r   r   rX   r,   )r.   r   rZ   r   rW   r   s         r   r[   zOneFlowBackend.reduce  s    <666 	K 	KDE!!uuu11e##uuu11CCC)GAy))d333)*>	JJJr   c                 ,    |                     |          S rI   r   rQ   s      r   rP   zOneFlowBackend.transpose  r   r   r\   c                 6    | j                             |          S rI   )rs  r   r^   s     r   r_   z(OneFlowBackend.stack_on_zeroth_dimension  r  r   c                     dg|z  }|                                 D ] \  }}|                     ||          }|||<   ! |j        | S r   r   ri   s          r   ro   zOneFlowBackend.add_axes  sX    $-*1--// 	1 	1&M;a//A%0GM""qx!!r   c                 ,    |                     |          S rI   r   rq   s      r   rg   zOneFlowBackend.tile  r   r   rW   c                 :    | j                             ||          S r  )rs  rt   rs   s      r   rt   zOneFlowBackend.concat  s    yT222r   c                 8    | j                             ||          S rI   )rs  r  rb   s      r   rd   zOneFlowBackend.add_axis  s    y""1l333r   c                 V    |j         | j        j        | j        j        | j        j        fv S rI   )r   rs  r   r   r   r2   s     r   rw   zOneFlowBackend.is_float_type  s%    w49,di.?ARSSSr   c                     ddl m} |S )Nrf   )rq  )rz   rq  )r.   rq  s     r   rz   zOneFlowBackend.layers  s    ######r   c                 (     | j         j        |g|R  S rI   )rs  r   r   s      r   r   zOneFlowBackend.einsum   r  r   Nr
  r	   r   r   rp  rp    s       N  
4 4 4  ( ( (D D D
 
 
  ( ( ( ( (" " "! ! !3C 3 3 3 34 4 4T T T  
- - - - -r   rp  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 }|| _         d S r   r  r.   r  s     r   r   zPaddleBackend.__init__'  s    r   c                 6    | j                             |          S rI   )r  rT  r-   s     r   r   z!PaddleBackend.is_appropriate_type,  s    {$$V,,,r   c                 H    | j                             |          }d|_        |S )NF)r  	to_tensorstop_gradient)r.   r   r   s      r   r3   zPaddleBackend.from_numpy/  s$    &&q))$r   c                 N    |                                                                 S rI   )r   r   r2   s     r   r6   zPaddleBackend.to_numpy4  s    xxzz!!!r   c                 P    | j                             ||| j         j                  S r   )r  rE   r   rB   s      r   rE   zPaddleBackend.arange7  s$    {!!%T[5F!GGGr   c                     t          |          |j        k    r6t                                          |||                              d          S t                                          |||          S r   )r%  ndimr   r[   squeeze)r.   r   rZ   rR   r   s       r   r[   zPaddleBackend.reduce:  sX    t9977>>!Y55==a@@@77>>!Y555r   c                 ,    |                     |          S rI   rO   rQ   s      r   rP   zPaddleBackend.transposeA  rS   r   c                     dg|z  }|                                 D ] \  }}|                     ||          }|||<   !|                    |          S r   r   ri   s          r   ro   zPaddleBackend.add_axesD  r   r   r\   c                 6    | j                             |          S rI   )r  r   r^   s     r   r_   z'PaddleBackend.stack_on_zeroth_dimensionK  s    {  )))r   c                 ,    |                     |          S rI   rJ   rL   s      r   rK   zPaddleBackend.reshapeN  rM   r   c                 ,    |                     |          S rI   )rg   rq   s      r   rg   zPaddleBackend.tileQ  s    vvgr   rW   c                 :    | j                             ||          S rU   )r  rt   rs   s      r   rt   zPaddleBackend.concatT  s    {!!'!555r   c                 ,    |                     |          S rI   r  rb   s      r   rd   zPaddleBackend.add_axisW      {{<(((r   c                 V    |j         | j        j        | j        j        | j        j        fv S rI   )r   r  r   r   r   r2   s     r   rw   zPaddleBackend.is_float_typeZ  s%    w4;.0CT[EXYYYr   c                     ddl m} |S )Nrf   r  )rz   r  r  s     r   rz   zPaddleBackend.layers]  s    """"""r   c                 (     | j         j        |g|R  S rI   )r  r   r   s      r   r   zPaddleBackend.einsumb  s    !t{!'.A....r   c                 *    t          |j                  S rI   )rh   r:   r2   s     r   r:   zPaddleBackend.shapee  s    QW~~r   )r   r   r   r   r   r   r3   r6   rE   r[   rP   ro   r   r_   rK   rg   r   rt   rd   rw   rz   r   r:   r   r   s   @r   r  r  $  sK       N  
- - -  
" " "H H H6 6 6 6 6! ! !! ! !* * * * *       6C 6 6 6 6) ) )Z Z Z  
/ / /      r   r  c                   x    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dS )TinygradBackendtinygradc                     dd l }|| _         d S r   )r  )r.   r  s     r   r   zTinygradBackend.__init__l  s     r   c                 6    t          || j        j                  S rI   )r   r  r   r-   s     r   r   z#TinygradBackend.is_appropriate_typeq  s    &$-"6777r   c                 6    | j                             |          S rI   )r  r   r2   s     r   r3   zTinygradBackend.from_numpyt  s    }##A&&&r   c                 *    |                                 S rI   )r   r2   s     r   r6   zTinygradBackend.to_numpyw  s    wwyyr   c                 B    | j         j                            ||          S rI   )r  r   rE   rB   s      r   rE   zTinygradBackend.arangez  s    }#**5$777r   c                     |j         S rI   rG   r2   s     r   r:   zTinygradBackend.shape}  s	    wr   c                 ,    |                     |          S rI   rJ   rL   s      r   rK   zTinygradBackend.reshape  rM   r   c                 ,    |                     |          S rI   r   rQ   s      r   rP   zTinygradBackend.transpose  r   r   c                 b    t          |d          D ]} t          ||          |          }|S )NTry  rV   )r   rX   )r.   r   rZ   rR   rW   s        r   r[   zTinygradBackend.reduce  sA    4... 	1 	1D%9%%4000AAr   r\   c                 @    | j         j                            |          S rI   )r  r   r   r^   s     r   r_   z)TinygradBackend.stack_on_zeroth_dimension  s    }#))'222r   c                 ,    |                     |          S rI   r  rb   s      r   rd   zTinygradBackend.add_axis  r  r   c                 ,    |                     |          S rI   r   rq   s      r   rg   zTinygradBackend.tile  r   r   rW   c                 n    t          |          dk    r |d         j        |dd          d|in|d         S )Nrf   r   r   )r%  r  rs   s      r   rt   zTinygradBackend.concat  s?    9<W9I9I~wqz~wqrr{5555wWXzYr   c                 J    | j         j                            |j                  S rI   )r  dtypesis_floatr   r2   s     r   rw   zTinygradBackend.is_float_type  s    }#,,QW555r   c                 2     | j         j        j        |g|R  S rI   )r  r   r   r   s      r   r   zTinygradBackend.einsum  s"    *t}#*77Q7777r   N)r   r   r   r   r   r   r3   r6   rE   r:   rK   rP   r[   r   r_   rd   rg   r   rt   rw   r   r	   r   r   r  r  i  s       N! ! !
8 8 8' ' '  8 8 8           
3 3 3 3 3) ) )! ! !ZC Z Z Z Z6 6 68 8 8 8 8r   r  c                   r    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S )PyTensorBackendpytensorc                      ddl m} || _        d S )Nr   )r   )r  r   ptr-   s     r   r   zPyTensorBackend.__init__  s    ######r   c                 6    t          || j        j                  S rI   )r   r  TensorVariabler-   s     r   r   z#PyTensorBackend.is_appropriate_type  s    &$'"8999r   c                 2    |j         | j        j        j        v S rI   )r   r  r   float_dtypesr2   s     r   rw   zPyTensorBackend.is_float_type  s    w$',333r   c                 6    | j                             |          S rI   )r  	as_tensorr2   s     r   r3   zPyTensorBackend.from_numpy  s    w  ###r   c                 *    |                                 S rI   )evalr2   s     r   r6   zPyTensorBackend.to_numpy  s    vvxxr   c                 x    t          |t          t          z            s|f}| j                            |          S )NrG   )r   rh   r   r  r   r9   s     r   r;   zPyTensorBackend.create_symbol  s5    %.. 	HEw~~E~***r   c                 F    |                     t          |                    S rI   )r  dictr=   s      r   r@   zPyTensorBackend.eval_symbol  s    {{4 233444r   c                 8    | j                             ||          S rI   )r  rE   rB   s      r   rE   zPyTensorBackend.arange  r   r   c                 n    t          d t          |j        j        |j                  D                       S )Nc              3   (   K   | ]\  }}||n|V  d S rI   r	   )r
   
static_dimsymbolic_dims      r   r;  z(PyTensorBackend.shape.<locals>.<genexpr>  sC       
 
(
L %0JJl
 
 
 
 
 
r   )rh   zipr   r:   r2   s     r   r:   zPyTensorBackend.shape  s@     
 
,/ag,F,F
 
 
 
 
 	
r   r\   c                 6    | j                             |          S rI   )r  r   r^   s     r   r_   z)PyTensorBackend.stack_on_zeroth_dimension  r   r   c                 8    | j                             ||          S rI   )r  rg   rq   s      r   rg   zPyTensorBackend.tile  r   r   rW   c                 :    | j                             ||          S rU   )r  r   rs   s      r   rt   zPyTensorBackend.concat  r   r   c                 8    | j                             ||          S rI   )r  r   rb   s      r   rd   zPyTensorBackend.add_axis  r   r   c                 (     | j         j        |g|R  S rI   )r  r   r   s      r   r   zPyTensorBackend.einsum  r   r   N)r   r   r   r   r   r   rw   r3   r6   r;   r@   rE   r:   r   r_   rg   r   rt   rd   r   r	   r   r   r  r    s       N  
: : :4 4 4$ $ $  + + +
5 5 5+ + +
 
 
& & & & &( ( (7C 7 7 7 74 4 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dS )
MLXBackendmlxc                 6    dd l m} dd l}|| _        || _        d S r   )mlx.corecorer   mxr   )r.   r  r   s      r   r   zMLXBackend.__init__  s2    r   c                 6    t          || j        j                  S rI   )r   r  arrayr-   s     r   r   zMLXBackend.is_appropriate_type  s    &$'-000r   c                 6    | j                             |          S rI   )r  r  r2   s     r   r3   zMLXBackend.from_numpy  s    w}}Qr   c                     |j         | j        j        k    r|                    | j        j                  }| j                            |          S rI   )r   r  r   astyper   r   r  r2   s     r   r6   zMLXBackend.to_numpy  s=    7dg&&&))Aw}}Qr   c                 8    | j                             ||          S rI   )r  rE   rB   s      r   rE   zMLXBackend.arange  r   r   r\   c                 6    | j                             |          S rI   )r  r   r^   s     r   r_   z$MLXBackend.stack_on_zeroth_dimension  r   r   c                 8    | j                             ||          S rI   )r  r   rb   s      r   ro   zMLXBackend.add_axes  r   r   c                 8    | j                             ||          S rI   )r  rg   rq   s      r   rg   zMLXBackend.tile  r   r   rW   c                 :    | j                             ||          S rU   )r  r   rs   s      r   rt   zMLXBackend.concat  r   r   c                 V    | j                             |j        | j         j                  S rI   )r  
issubdtyper   floatingr2   s     r   rw   zMLXBackend.is_float_type  s!    w!!!'47+;<<<r   c                 (     | j         j        |g|R  S rI   )r  r   r   s      r   r   zMLXBackend.einsum  r   r   N)r   r   r   r   r   r   r3   r6   rE   r   r_   ro   rg   r   rt   rw   r   r	   r   r   r  r    s        N  1 1 1          
+ + +& & & & &4 4 4( ( (7C 7 7 7 7= = =+ + + + +r   r  )r   r   )r   r   
__author__r   r  r   r   r   r(   r   r   r   r   r   r  r  r+  rO  rp  r  r  r  r  r	   r   r   <module>r     s  
 
 
 



 $   t    (H (H (H (HVIE IE IE IE IE IE IE IEX       &$+ $+ $+ $+ $+? $+ $+ $+N# # # # # # # #$J. J. J. J. J.? J. J. J.Z$- $- $- $- $-/ $- $- $-N# # # # # # # #$C+ C+ C+ C+ C+ C+ C+ C+L6 6 6 6 6_ 6 6 6rC- C- C- C- C-_ C- C- C-LB B B B BO B B BJ28 28 28 28 28o 28 28 28j3+ 3+ 3+ 3+ 3+o 3+ 3+ 3+l(+ (+ (+ (+ (+ (+ (+ (+ (+ (+r   