
    0;ji!S                        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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                 B   t          |           }t                              |d          }||S t          t                                                    D ](\  }}|                    |           r|t          |<   |c S )g }t                                          }|rB|	                                }||                                z  }|
                    |           |B|D ]}t          rt          d|           |j        t          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
    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format)tensor_type_resultr   backendbackend_subclassesbackendsBackendSubclasss           J/root/voice-cloning/.venv/lib/python3.11/site-packages/einops/_backends.pyget_backendr      s   
 LLEt,,G#'(8(>(>(@(@#A#A  &&v.. 	#*M% NNN	
 --//H
 +,,..G**,,,!!'***  +
 . # # 	?,o>>>)1AAA-<<# S1?3QRRR)/++;B !78..v66 #+2M%("NNN
9@@fNN
O
OO    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_typeC       !###r    c                      t          d          Nz.framework doesn't support imperative executionr#   r&   xs     r   
from_numpyzAbstractBackend.from_numpyG       !"RSSSr    c                      t          d          r)   r#   r*   s     r   to_numpyzAbstractBackend.to_numpyJ   r-   r    c                      t          d          Nz/framework doesn't support symbolic computationsr#   r&   shapes     r   create_symbolzAbstractBackend.create_symbolM   s    !"STTTr    c                      t          d          r1   r#   r&   symbolsymbol_value_pairss      r   eval_symbolzAbstractBackend.eval_symbolP   s    !"STTTr    c                      t          d          )Nz"framework doesn't implement aranger#   r&   startstops      r   arangezAbstractBackend.arangeT   s    !"FGGGr    c                     |j         S )zashape should return a tuple with integers or "shape symbols" (which will evaluate to actual size)r3   r*   s     r   r3   zAbstractBackend.shapeX   s	    wr    c                 ,    |                     |          S Nreshaper&   r+   r3   s      r   rD   zAbstractBackend.reshape\       yyr    c                 ,    |                     |          S rB   	transposer&   r+   axess      r   rI   zAbstractBackend.transpose_       {{4   r    c                 6     t          ||          |          S Naxis)getattrr&   r+   	operationrK   s       r   reducezAbstractBackend.reduceb   s    $wq)$$$////r    tensorsc                     t                      rB   r#   r&   rU   s     r   stack_on_zeroth_dimensionz)AbstractBackend.stack_on_zeroth_dimensione       !###r    c                     t                      rB   r#   r&   r+   new_positions      r   add_axiszAbstractBackend.add_axish   rY   r    c                     dg|z  }|                                 D ] \  }}|                     ||          }|||<   !|                     |t          |                    S )N   )r   r]   tiletupler&   r+   n_axespos2lenrepeatsaxis_positionaxis_lengths          r   add_axeszAbstractBackend.add_axesk   sc    #,*1--// 	1 	1&M;a//A%0GM""yyE'NN+++r    c                     t                      )z!repeats - same lengths as x.shaper#   r&   r+   re   s      r   r`   zAbstractBackend.tiler   r'   r    rP   c                     t                      )zzconcatenates tensors along axis.
        Assume identical across tensors: devices, dtypes and shapes except selected axis.r#   r&   rU   rP   s      r   concatzAbstractBackend.concatv        "###r    c                     t                      rB   r#   r*   s     r   is_float_typezAbstractBackend.is_float_type{   rn   r    c                      t          d          )Nzbackend does not provide layersr#   r&   s    r   layerszAbstractBackend.layers       !"CDDDr    c                 6    d                     | j                  S )Nz<einops backend for {}>)r   r   rr   s    r   __repr__zAbstractBackend.__repr__   s    (//0CDDDr    c                      t          d          )Nzbackend does not support einsumr#   r&   patternr+   s      r   einsumzAbstractBackend.einsum   rt   r    N)__name__
__module____qualname____doc__str__annotations__r   r,   r/   r4   r9   r>   r3   rD   rI   rT   r
   rX   r]   rh   r`   intrm   rp   rs   rv   rz    r    r   r   r   >   sw        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 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 rB   r   r&   others     r   __floordiv__zUnknownSize.__floordiv__       r    c                     dS NTr   r   s     r   __eq__zUnknownSize.__eq__   s    tr    c                     | S rB   r   r   s     r   __mul__zUnknownSize.__mul__   r   r    c                     | S rB   r   r   s     r   __rmul__zUnknownSize.__rmul__   r   r    c                      t          d           S rB   )hashrr   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 rB   )
isinstancer   ndarrayr%   s     r   r   z NumpyBackend.is_appropriate_type   s    &$'/222r    c                     |S rB   r   r*   s     r   r,   zNumpyBackend.from_numpy       r    c                     |S rB   r   r*   s     r   r/   zNumpyBackend.to_numpy   r   r    c                 8    | j                             ||          S rB   )r   r>   r;   s      r   r>   zNumpyBackend.arange       w~~eT***r    rU   c                 6    | j                             |          S rB   )r   stackrW   s     r   rX   z&NumpyBackend.stack_on_zeroth_dimension       w}}W%%%r    c                 8    | j                             ||          S rB   )r   r`   rj   s      r   r`   zNumpyBackend.tile       w||Aw'''r    rP   c                 :    | j                             ||          S rN   )r   concatenaterl   s      r   rm   zNumpyBackend.concat       w""7"666r    c                     |j         dv S N)float16float32float64float128bfloat16dtyper*   s     r   rp   zNumpyBackend.is_float_type       wSSSr    c                 8    | j                             ||          S rB   )r   expand_dimsr[   s      r   r]   zNumpyBackend.add_axis       w""1l333r    c                 (     | j         j        |g|R  S rB   )r   rz   rx   s      r   rz   zNumpyBackend.einsum       tw~g*****r    N)r{   r|   r}   r   r   r   r,   r/   r>   r
   rX   r`   r   rm   rp   r]   rz   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          t          |                                            | j        | _        dd l}|j        | _        d S r   )superr   r   r   onp	jax.numpyr   )r&   r   	__class__s     r   r   zJaxBackend.__init__   sA    j$((***7)r    c                 6    | j                             |          S rB   )r   asarrayr*   s     r   r,   zJaxBackend.from_numpy   s    wq!!!r    c                 6    | j                             |          S rB   )r   r   r*   s     r   r/   zJaxBackend.to_numpy   s    x"""r    )r{   r|   r}   r   r   r,   r/   __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   r_   )_torch_specific)r    r   )r&   r   r   s      r   r   zTorchBackend.__init__   s*    
%%%%%%%%r    c                 6    t          || j        j                  S rB   )r   r   Tensorr%   s     r   r   z TorchBackend.is_appropriate_type   s    &$*"3444r    c                 r    | j                             |          }|                     |          rd|_        |S r   )r   r,   rp   requires_gradr&   r+   variables      r   r,   zTorchBackend.from_numpy   s:    :((++h'' 	*%)H"r    c                 r    |                                                                                                 S rB   detachcpur   r*   s     r   r/   zTorchBackend.to_numpy   &    xxzz~~%%'''r    c                 P    | j                             ||| j         j                  S Nr   )r   r>   int64r;   s      r   r>   zTorchBackend.arange   s$    z  DJ4D EEEr    c                    |dk    r|                     |          S |dk    r|                    |          S |dk    r|                    |          S |dk    r|                    |          S |dv rDt	          t          |                    d d d         D ]} t          ||          |          }|S t          d|          )	Nmindimmaxsummean)anyallprodUnknown reduction )aminamaxr   r   r
   sortedrQ   r$   )r&   r+   rS   reduced_axesis        r   rT   zTorchBackend.reduce   s    66l6+++%66l6+++%55\5***&  66l6+++000&..//"5 1 1)GAy))a000H%&:IFFFr    c                 ,    |                     |          S rB   permuterJ   s      r   rI   zTorchBackend.transpose      yyr    rU   c                 6    | j                             |          S rB   )r   r   rW   s     r   rX   z&TorchBackend.stack_on_zeroth_dimension  s    z(((r    c                     dg|z  }|                                 D ] \  }}|                     ||          }|||<   !|                    |          S Nr   r   r]   expandrb   s          r   rh   zTorchBackend.add_axes  [    $-*1--// 	1 	1&M;a//A%0GM""xx   r    c                 ,    |                     |          S rB   repeatrj   s      r   r`   zTorchBackend.tile      xx   r    rP   c                 :    | j                             ||          S Nr   )r   catrl   s      r   rm   zTorchBackend.concat  s    z~~g4~000r    c                 8    | j                             ||          S rB   )r   	unsqueezer[   s      r   r]   zTorchBackend.add_axis  s    z##A|444r    c                 l    |j         | j        j        | j        j        | j        j        | j        j        fv S rB   )r   r   r   r   r   r   r*   s     r   rp   zTorchBackend.is_float_type  s.    w4:-tz/A4:CUW[WaWjkkkr    c                     ddl m} |S )Nr_   )r   )rs   r   )r&   r   s     r   rs   zTorchBackend.layers      !!!!!!r    c                 (     | j         j        |g|R  S rB   )r   rz   rx   s      r   rz   zTorchBackend.einsum  s     tz -1----r    Nr{   r|   r}   r   r   r   r,   r/   r>   rT   rI   r
   rX   rh   r`   r   rm   r]   rp   rs   rz   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 rB   )r   r  r   r%   s     r   r   zCupyBackend.is_appropriate_type+  s    &$)"3444r    c                 6    | j                             |          S rB   )r  r   r*   s     r   r,   zCupyBackend.from_numpy.      y  ###r    c                 6    | j                             |          S rB   )r  asnumpyr*   s     r   r/   zCupyBackend.to_numpy1  r
  r    c                 8    | j                             ||          S rB   )r  r>   r;   s      r   r>   zCupyBackend.arange4  s    yt,,,r    rU   c                 6    | j                             |          S rB   )r  r   rW   s     r   rX   z%CupyBackend.stack_on_zeroth_dimension7      yw'''r    c                 8    | j                             ||          S rB   )r  r`   rj   s      r   r`   zCupyBackend.tile:  s    y~~a)))r    rP   c                 :    | j                             ||          S rN   )r  r   rl   s      r   rm   zCupyBackend.concat=  s    y$$W4$888r    c                 8    | j                             ||          S rB   )r  r   r[   s      r   r]   zCupyBackend.add_axis@  s    y$$Q555r    c                     |j         dv S r   r   r*   s     r   rp   zCupyBackend.is_float_typeC  r   r    c                 (     | j         j        |g|R  S rB   )r  rz   rx   s      r   rz   zCupyBackend.einsumF      ty,!,,,,r    N)r{   r|   r}   r   r   r   r,   r/   r>   r
   rX   r`   r   rm   r]   rp   rz   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 rB   r  )r&   r  s     r   r   zHashableTuple.__init__M  s     r    c              #   &   K   | j         D ]}|V  d S rB   r  r*   s     r   __iter__zHashableTuple.__iter__P  s,       	 	AGGGG	 	r    c                 *    t          | j                  S rB   )lenr  rr   s    r   __len__zHashableTuple.__len__T  s    4=!!!r    c                     | j         |         S rB   r  )r&   items     r   __getitem__zHashableTuple.__getitem__W  s    }T""r    N)	r{   r|   r}   r~   ra   r   r  r  r"  r   r    r   r  r  J  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__`  s    r    c                 N    t          || j        j        | j        j        f          S rB   )r   r'  r   Variabler%   s     r   r   z%TensorflowBackend.is_appropriate_typee  s     &47>473C"DEEEr    c                 l    | j                                         sJ | j                             |          S rB   )r'  executing_eagerlyconvert_to_tensorr*   s     r   r,   zTensorflowBackend.from_numpyh  s2    w((*****w((+++r    c                 `    | j                                         sJ |                                S rB   )r'  r,  r   r*   s     r   r/   zTensorflowBackend.to_numpyl  s*    w((*****wwyyr    c                 8    | j                             ||          S rB   )r'  ranger;   s      r   r>   zTensorflowBackend.arangep  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 rB   )r   r   ).0ds     r   	<genexpr>z*TensorflowBackend.shape.<locals>.<genexpr>u  s4      QQA!)QQQQQQQr    c                 *    g | ]\  }}|p|         S r   r   )r3  r   stf_shapes      r   
<listcomp>z+TensorflowBackend.shape.<locals>.<listcomp>z  s&    TTT&#q1-TTTr    )	r'  r,  ra   r3   as_list	enumerater   BaseExceptionr  )r&   r+   static_shaper3   r8  s       @r   r3   zTensorflowBackend.shapes  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_rO   )rQ   r'  rR   s       r   rT   zTensorflowBackend.reduce  s(    6wtw	I 566qtDDDDr    c                 8    | j                             ||          S rB   )r'  rD   rE   s      r   rD   zTensorflowBackend.reshape  s    wq%(((r    c                 8    | j                             ||          S rB   )r'  rI   rJ   s      r   rI   zTensorflowBackend.transpose  s    w  D)))r    rU   c                 6    | j                             |          S rB   )r'  r   rW   s     r   rX   z+TensorflowBackend.stack_on_zeroth_dimension  r   r    c                 8    | j                             ||          S rB   )r'  r`   rj   s      r   r`   zTensorflowBackend.tile  r   r    rP   c                 :    | j                             ||          S rN   )r'  rm   rl   s      r   rm   zTensorflowBackend.concat  s    w~~gD~111r    c                 8    | j                             ||          S rB   )r'  r   r[   s      r   r]   zTensorflowBackend.add_axis  r   r    c                     |j         dv S r   r   r*   s     r   rp   zTensorflowBackend.is_float_type  r   r    c                     ddl m} |S )Nr_   )r%  )rs   r%  r(  s     r   rs   zTensorflowBackend.layers  s    &&&&&&r    c                 (     | j         j        |g|R  S rB   )r'  rz   rx   s      r   rz   zTensorflowBackend.einsum  r   r    N)r{   r|   r}   r   r   r   r,   r/   r>   r3   rT   rD   rI   r
   rX   r`   r   rm   r]   rp   rs   rz   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 rB   )r'  	is_tensorrM  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)rL  Inputr2   s     r   r4   zTFKerasBackend.create_symbol  s    zE222r    c                     | j         j                            d |D             |          }|                    d |D                       S )Nc                     g | ]\  }}|S r   r   )r3  var_s      r   r9  z.TFKerasBackend.eval_symbol.<locals>.<listcomp>  s    (P(P(P#q(P(P(Pr    c                     g | ]\  }}|S r   r   )r3  rW  vals      r   r9  z.TFKerasBackend.eval_symbol.<locals>.<listcomp>  s    &N&N&Nx3s&N&N&Nr    )rL  modelsModelpredict_on_batch)r&   r7   r8   models       r   r9   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 rB   )rM  r>   r;   s      r   r>   zTFKerasBackend.arange  s    v}}UD)))r    c                 n    | j                             |          }t          t          |                    S rB   )rM  r3   r  ra   rE   s      r   r3   zTFKerasBackend.shape  s'    QU5\\***r    c                 B     t          | j        |          ||          S rN   )rQ   rM  rR   s       r   rT   zTFKerasBackend.reduce  s#    )wtvy))!$7777r    c                 8    | j                             ||          S rB   )rM  rD   rE   s      r   rD   zTFKerasBackend.reshape  s    v~~a'''r    c                 8    | j                             ||          S rB   )rM  permute_dimensionsrJ   s      r   rI   zTFKerasBackend.transpose  s    v((D111r    rU   c                 6    | j                             |          S rB   )rM  r   rW   s     r   rX   z(TFKerasBackend.stack_on_zeroth_dimension  s    v||G$$$r    c                 8    | j                             ||          S rB   )rM  r`   rj   s      r   r`   zTFKerasBackend.tile  s    v{{1g&&&r    rP   c                 :    | j                             ||          S rN   )rM  r   rl   s      r   rm   zTFKerasBackend.concat  s    v!!'!555r    c                 8    | j                             ||          S rB   )rM  r   r[   s      r   r]   zTFKerasBackend.add_axis  s    v!!!\222r    c                 :    d| j                             |          v S )Nfloat)rM  r   r*   s     r   rp   zTFKerasBackend.is_float_type  s    $&,,q//))r    c                     ddl m} |S )Nr_   )rL  )rs   rL  )r&   rL  s     r   rs   zTFKerasBackend.layers  r  r    N)r{   r|   r}   r   r   r   r4   r9   r>   r3   rT   rD   rI   r
   rX   r`   r   rm   r]   rp   rs   r   r    r   rJ  rJ    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    rJ  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   )rm  flow)r&   ro  s     r   r   zOneFlowBackend.__init__  s    			r    c                 6    t          || j        j                  S rB   )r   ro  r   r%   s     r   r   z"OneFlowBackend.is_appropriate_type  s    &$)"2333r    c                 r    | j                             |          }|                     |          rd|_        |S r   )ro  r,   rp   r   r   s      r   r,   zOneFlowBackend.from_numpy  s:    9''**h'' 	*%)H"r    c                 r    |                                                                                                 S rB   r   r*   s     r   r/   zOneFlowBackend.to_numpy  r   r    c                 P    | j                             ||| j         j                  S r   )ro  r>   r   r;   s      r   r>   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   rQ   r$   )r&   r+   rS   r   rP   rW  s         r   rT   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 rB   r   rJ   s      r   rI   zOneFlowBackend.transpose   r   r    rU   c                 6    | j                             |          S rB   )ro  r   rW   s     r   rX   z(OneFlowBackend.stack_on_zeroth_dimension  r  r    c                     dg|z  }|                                 D ] \  }}|                     ||          }|||<   ! |j        | S r   r   rb   s          r   rh   zOneFlowBackend.add_axes  sX    $-*1--// 	1 	1&M;a//A%0GM""qx!!r    c                 ,    |                     |          S rB   r   rj   s      r   r`   zOneFlowBackend.tile  r   r    rP   c                 :    | j                             ||          S r   )ro  rm   rl   s      r   rm   zOneFlowBackend.concat  s    yT222r    c                 8    | j                             ||          S rB   )ro  r   r[   s      r   r]   zOneFlowBackend.add_axis  s    y""1l333r    c                 V    |j         | j        j        | j        j        | j        j        fv S rB   )r   ro  r   r   r   r*   s     r   rp   zOneFlowBackend.is_float_type  s%    w49,di.?ARSSSr    c                     ddl m} |S )Nr_   )rm  )rs   rm  )r&   rm  s     r   rs   zOneFlowBackend.layers  s    ######r    c                 (     | j         j        |g|R  S rB   )ro  rz   rx   s      r   rz   zOneFlowBackend.einsum  r  r    Nr  r   r    r   rl  rl    s       N  
4 4 4  ( ( (D D D
 
 
  ( ( ( ( (" " "! ! !3C 3 3 3 34 4 4T T T  
- - - - -r    rl  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 rB   )r  rO  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   r,   zPaddleBackend.from_numpy-  s$    &&q))$r    c                 N    |                                                                 S rB   )r   r   r*   s     r   r/   zPaddleBackend.to_numpy2  s    xxzz!!!r    c                 P    | j                             ||| j         j                  S r   )r  r>   r   r;   s      r   r>   zPaddleBackend.arange5  s$    {!!%T[5F!GGGr    c                     t          |          |j        k    r6t                                          |||                              d          S t                                          |||          S r   )r  ndimr   rT   squeeze)r&   r+   rS   rK   r   s       r   rT   zPaddleBackend.reduce8  sX    t9977>>!Y55==a@@@77>>!Y555r    c                 ,    |                     |          S rB   rH   rJ   s      r   rI   zPaddleBackend.transpose?  rL   r    c                     dg|z  }|                                 D ] \  }}|                     ||          }|||<   !|                    |          S r   r   rb   s          r   rh   zPaddleBackend.add_axesB  r   r    rU   c                 6    | j                             |          S rB   )r  r   rW   s     r   rX   z'PaddleBackend.stack_on_zeroth_dimensionI  s    {  )))r    c                 ,    |                     |          S rB   rC   rE   s      r   rD   zPaddleBackend.reshapeL  rF   r    c                 ,    |                     |          S rB   )r`   rj   s      r   r`   zPaddleBackend.tileO  s    vvgr    rP   c                 :    | j                             ||          S rN   )r  rm   rl   s      r   rm   zPaddleBackend.concatR  s    {!!'!555r    c                 ,    |                     |          S rB   r   r[   s      r   r]   zPaddleBackend.add_axisU      {{<(((r    c                 V    |j         | j        j        | j        j        | j        j        fv S rB   )r   r  r   r   r   r*   s     r   rp   zPaddleBackend.is_float_typeX  s%    w4;.0CT[EXYYYr    c                     ddl m} |S )Nr_   r  )rs   r  r  s     r   rs   zPaddleBackend.layers[  s    """"""r    c                 (     | j         j        |g|R  S rB   )r  rz   rx   s      r   rz   zPaddleBackend.einsum`  s    !t{!'.A....r    c                 *    t          |j                  S rB   )ra   r3   r*   s     r   r3   zPaddleBackend.shapec  s    QW~~r    )r{   r|   r}   r   r   r   r,   r/   r>   rT   rI   rh   r
   rX   rD   r`   r   rm   r]   rp   rs   rz   r3   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__j  s     r    c                 6    t          || j        j                  S rB   )r   r  r   r%   s     r   r   z#TinygradBackend.is_appropriate_typeo  s    &$-"6777r    c                 6    | j                             |          S rB   )r  r   r*   s     r   r,   zTinygradBackend.from_numpyr  s    }##A&&&r    c                 *    |                                 S rB   )r   r*   s     r   r/   zTinygradBackend.to_numpyu  s    wwyyr    c                 B    | j         j                            ||          S rB   )r  r   r>   r;   s      r   r>   zTinygradBackend.arangex  s    }#**5$777r    c                     |j         S rB   r@   r*   s     r   r3   zTinygradBackend.shape{  s	    wr    c                 ,    |                     |          S rB   rC   rE   s      r   rD   zTinygradBackend.reshape~  rF   r    c                 ,    |                     |          S rB   r   rJ   s      r   rI   zTinygradBackend.transpose  r   r    c                 b    t          |d          D ]} t          ||          |          }|S )NTru  rO   )r   rQ   )r&   r+   rS   rK   rP   s        r   rT   zTinygradBackend.reduce  sA    4... 	1 	1D%9%%4000AAr    rU   c                 @    | j         j                            |          S rB   )r  r   r   rW   s     r   rX   z)TinygradBackend.stack_on_zeroth_dimension  s    }#))'222r    c                 ,    |                     |          S rB   r  r[   s      r   r]   zTinygradBackend.add_axis  r  r    c                 ,    |                     |          S rB   r   rj   s      r   r`   zTinygradBackend.tile  r   r    rP   c                 n    t          |          dk    r |d         j        |dd          d|in|d         S )Nr_   r   r   )r  r   rl   s      r   rm   zTinygradBackend.concat  s?    9<W9I9I~wqz~wqrr{5555wWXzYr    c                 J    | j         j                            |j                  S rB   )r  dtypesis_floatr   r*   s     r   rp   zTinygradBackend.is_float_type  s    }#,,QW555r    c                 2     | j         j        j        |g|R  S rB   )r  r   rz   rx   s      r   rz   zTinygradBackend.einsum  s"    *t}#*77Q7777r    N)r{   r|   r}   r   r   r   r,   r/   r>   r3   rD   rI   rT   r
   rX   r]   r`   r   rm   rp   rz   r   r    r   r  r  g  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 rB   )r   r  TensorVariabler%   s     r   r   z#PyTensorBackend.is_appropriate_type  s    &$'"8999r    c                 2    |j         | j        j        j        v S rB   )r   r  r   float_dtypesr*   s     r   rp   zPyTensorBackend.is_float_type  s    w$',333r    c                 6    | j                             |          S rB   )r  	as_tensorr*   s     r   r,   zPyTensorBackend.from_numpy  s    w  ###r    c                 *    |                                 S rB   )evalr*   s     r   r/   zPyTensorBackend.to_numpy  s    vvxxr    c                 x    t          |t          t          z            s|f}| j                            |          S )Nr@   )r   ra   r
   r  r   r2   s     r   r4   zPyTensorBackend.create_symbol  s5    %.. 	HEw~~E~***r    c                 F    |                     t          |                    S rB   )r  dictr6   s      r   r9   zPyTensorBackend.eval_symbol  s    {{4 233444r    c                 8    | j                             ||          S rB   )r  r>   r;   s      r   r>   zPyTensorBackend.arange  r   r    c                 n    t          d t          |j        j        |j                  D                       S )Nc              3   (   K   | ]\  }}||n|V  d S rB   r   )r3  
static_dimsymbolic_dims      r   r5  z(PyTensorBackend.shape.<locals>.<genexpr>  sC       
 
(
L %0JJl
 
 
 
 
 
r    )ra   zipr   r3   r*   s     r   r3   zPyTensorBackend.shape  s@     
 
,/ag,F,F
 
 
 
 
 	
r    rU   c                 6    | j                             |          S rB   )r  r   rW   s     r   rX   z)PyTensorBackend.stack_on_zeroth_dimension  r   r    c                 8    | j                             ||          S rB   )r  r`   rj   s      r   r`   zPyTensorBackend.tile  r   r    rP   c                 :    | j                             ||          S rN   )r  r   rl   s      r   rm   zPyTensorBackend.concat  r   r    c                 8    | j                             ||          S rB   )r  r   r[   s      r   r]   zPyTensorBackend.add_axis  r   r    c                 (     | j         j        |g|R  S rB   )r  rz   rx   s      r   rz   zPyTensorBackend.einsum  r   r    N)r{   r|   r}   r   r   r   rp   r,   r/   r4   r9   r>   r3   r
   rX   r`   r   rm   r]   rz   r   r    r   r  r    s       N  
: : :4 4 4$ $ $  + + +
5 5 5+ + +
 
 
& & & & &( ( (7C 7 7 7 74 4 4+ + + + +r    r  )r   r   )r~   r   
__author__r   r  r   r   r   r   r   r   r   r   r   r  r  r$  rJ  rl  r  r  r  r   r    r   <module>r     s  
 
 
 



 $   t    %P %P %P %PP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+ 3+ 3+r    