o
    `iYR                     @   s  U d Z ddlZdZi Zeed< i Zeed< dZd$d	d
ZG dd dZ	G dd dZ
G dd de	ZG dd deZG dd de	ZG dd de	ZG dd de	ZG dd dZG dd de	ZG dd de	ZG dd de	ZG d d! d!e	ZG d"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                 C   s   t | }t|d}|dur|S tt D ]\}}|| r'|t|< |  S qg }t }|rA|	 }|| 7 }|
| |s0|D ]1}trLtd| |jtvrt|jtjv rttr_td|j | }|t|j< || rt|t|< |  S qCt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BackendSubclass r   N/home/ubuntu/SoloSpeech/.venv/lib/python3.10/site-packages/einops/_backends.pyget_backend   s<   





r   c                   @   s   e Zd ZU dZeed< dd Zdd Zdd Zd	d
 Z	dd Z
dd Zdd Zdd Zdd Zdd ZdefddZdd Zdd Zdd Zd efd!d"Zd#d$ Zd%d& Zd'd( Zd)d* Zd+S ),r   zJBase backend class, major part of methods are only for debugging purposes.r   c                 C      t  )z4helper method should recognize tensors it can handleNotImplementedErrorselfr   r   r   r   r
   C      z#AbstractBackend.is_appropriate_typec                 C      t dNz.framework doesn't support imperative executionr    r#   xr   r   r   
from_numpyG      zAbstractBackend.from_numpyc                 C   r%   r&   r    r'   r   r   r   to_numpyJ   r*   zAbstractBackend.to_numpyc                 C   r%   Nz/framework doesn't support symbolic computationsr    r#   shaper   r   r   create_symbolM   r*   zAbstractBackend.create_symbolc                 C   r%   r,   r    )r#   symbol
input_dictr   r   r   eval_symbolP   r*   zAbstractBackend.eval_symbolc                 C   r%   )Nz"framework doesn't implement aranger    r#   startstopr   r   r   arangeS   s   zAbstractBackend.arangec                 C      |j S )zashape should return a tuple with integers or "shape symbols" (which will evaluate to actual size)r.   r'   r   r   r   r.   W   r$   zAbstractBackend.shapec                 C   
   | |S Nreshaper#   r(   r.   r   r   r   r<   [      
zAbstractBackend.reshapec                 C   r9   r:   	transposer#   r(   axesr   r   r   r@   ^   r>   zAbstractBackend.transposec                 C   s   t |||dS Naxis)getattrr#   r(   	operationrB   r   r   r   reducea      zAbstractBackend.reducetensorsc                 C   r   r:   r    r#   rK   r   r   r   stack_on_zeroth_dimensiond      z)AbstractBackend.stack_on_zeroth_dimensionc                 C   r   r:   r    r#   r(   new_positionr   r   r   add_axisg   rN   zAbstractBackend.add_axisc                 C   s@   dg| }|  D ]\}}| ||}|||< q	| |t|S )N   )r	   rQ   tiletupler#   r(   n_axespos2lenrepeatsaxis_positionaxis_lengthr   r   r   add_axesj   s
   

zAbstractBackend.add_axesc                 C   r   )z!repeats - same lengths as x.shaper    r#   r(   rX   r   r   r   rS   q   r$   zAbstractBackend.tilerE   c                 C   r   )zzconcatenates tensors along axis.
        Assume identical across tensors: devices, dtypes and shapes except selected axis.r    r#   rK   rE   r   r   r   concatu      zAbstractBackend.concatc                 C   r   r:   r    r'   r   r   r   is_float_typez   r_   zAbstractBackend.is_float_typec                 C   r%   )Nzbackend does not provide layersr    r#   r   r   r   layers   r*   zAbstractBackend.layersc                 C   s   d | jS )Nz<einops backend for {}>)r   r   ra   r   r   r   __repr__      zAbstractBackend.__repr__c                 G   r%   )Nzbackend does not support einsumr    r#   patternr(   r   r   r   einsum   r*   zAbstractBackend.einsumN)__name__
__module____qualname____doc__str__annotations__r
   r)   r+   r/   r2   r6   r.   r<   r@   rI   r   rM   rQ   r[   rS   intr^   r`   rb   rc   rg   r   r   r   r   r   >   s,   
 c                   @   s8   e Zd ZdZdd Zdd Zdd Zdd	 Zd
d ZdS )UnknownSizezUpseudo-symbol for symbolic frameworks which do not provide symbols for shape elementsc                 C      | S r:   r   r#   otherr   r   r   __floordiv__      zUnknownSize.__floordiv__c                 C   s   dS NTr   rq   r   r   r   __eq__   rt   zUnknownSize.__eq__c                 C   rp   r:   r   rq   r   r   r   __mul__   rt   zUnknownSize.__mul__c                 C   rp   r:   r   rq   r   r   r   __rmul__   rt   zUnknownSize.__rmul__c                 C   s   t d S r:   )hashra   r   r   r   __hash__   r*   zUnknownSize.__hash__N)	rh   ri   rj   rk   rs   rv   rw   rx   rz   r   r   r   r   ro      s    ro   c                   @   t   e Zd ZdZdd Zdd Zdd Zdd	 Zd
d Zde	fddZ
dd ZdefddZdd Zdd Zdd ZdS )NumpyBackendnumpyc                 C      dd l }|| _d S Nr   )r}   np)r#   r}   r   r   r   __init__      
zNumpyBackend.__init__c                 C      t || jjS r:   )
isinstancer   ndarrayr"   r   r   r   r
         z NumpyBackend.is_appropriate_typec                 C      |S r:   r   r'   r   r   r   r)      rt   zNumpyBackend.from_numpyc                 C   r   r:   r   r'   r   r   r   r+      rt   zNumpyBackend.to_numpyc                 C      | j ||S r:   )r   r6   r3   r   r   r   r6      r   zNumpyBackend.arangerK   c                 C      | j |S r:   )r   stackrL   r   r   r   rM      rd   z&NumpyBackend.stack_on_zeroth_dimensionc                 C   r   r:   )r   rS   r\   r   r   r   rS      r   zNumpyBackend.tilerE   c                 C      | j j||dS rC   )r   concatenater]   r   r   r   r^      rJ   zNumpyBackend.concatc                 C   
   |j dv S N)float16float32float64float128bfloat16dtyper'   r   r   r   r`      r>   zNumpyBackend.is_float_typec                 C   r   r:   )r   expand_dimsrO   r   r   r   rQ      r   zNumpyBackend.add_axisc                 G      | j j|g|R  S r:   )r   rg   re   r   r   r   rg         zNumpyBackend.einsumN)rh   ri   rj   r   r   r
   r)   r+   r6   r   rM   rS   rn   r^   r`   rQ   rg   r   r   r   r   r|          r|   c                       s0   e Zd ZdZ fddZdd Zdd Z  ZS )
JaxBackendjaxc                    s*   t t|   | j| _dd l}|j| _d S r   )superr   r   r   onp	jax.numpyr}   )r#   r   	__class__r   r   r      s   zJaxBackend.__init__c                 C   r   r:   )r   asarrayr'   r   r   r   r)      rd   zJaxBackend.from_numpyc                 C   r   r:   )r   r   r'   r   r   r   r+      rd   zJaxBackend.to_numpy)rh   ri   rj   r   r   r)   r+   __classcell__r   r   r   r   r      s
    r   c                   @      e Zd ZdZdd Zdd Zdd Zdd	 Zd
d Zdd Z	dd Z
defddZdd Zdd ZdefddZdd Zdd Zdd Zd d! Zd"S )#TorchBackendtorchc                 C   s   dd l }|| _ ddlm} d S )Nr   rR   )_torch_specific)r    r   )r#   r   r   r   r   r   r      s   zTorchBackend.__init__c                 C   r   r:   )r   r   Tensorr"   r   r   r   r
      r   z TorchBackend.is_appropriate_typec                 C       | j |}| |rd|_|S ru   )r   r)   r`   requires_gradr#   r(   variabler   r   r   r)         
zTorchBackend.from_numpyc                 C      |    S r:   detachcpur}   r'   r   r   r   r+      rJ   zTorchBackend.to_numpyc                 C      | j j||| j jdS Nr   )r   r6   int64r3   r   r   r   r6         zTorchBackend.arangec                 C   s   |dkr
|j |dS |dkr|j|dS |dkr|j|dS |dkr(|j|dS |dv rDtt|d d d D ]
}t|||d}q7|S td|)	Nmindimmaxsummean)anyallprodUnknown reduction )aminamaxr   r   r   sortedrF   r!   )r#   r(   rH   reduced_axesir   r   r   rI      s   
zTorchBackend.reducec                 C   r9   r:   permuterA   r   r   r   r@      r>   zTorchBackend.transposerK   c                 C   r   r:   )r   r   rL   r   r   r   rM     rd   z&TorchBackend.stack_on_zeroth_dimensionc                 C   :   dg| }|  D ]\}}| ||}|||< q	||S Nr   r	   rQ   expandrU   r   r   r   r[     
   


zTorchBackend.add_axesc                 C   r9   r:   repeatr\   r   r   r   rS     r>   zTorchBackend.tilerE   c                 C   r   Nr   )r   catr]   r   r   r   r^     rJ   zTorchBackend.concatc                 C   r   r:   )r   	unsqueezerO   r   r   r   rQ     r   zTorchBackend.add_axisc                 C   s"   |j | jj| jj| jj| jjfv S r:   )r   r   r   r   r   r   r'   r   r   r   r`     s   "zTorchBackend.is_float_typec                 C      ddl m} |S )NrR   )r   )rb   r   )r#   r   r   r   r   rb        zTorchBackend.layersc                 G   r   r:   )r   rg   re   r   r   r   rg     r   zTorchBackend.einsumNrh   ri   rj   r   r   r
   r)   r+   r6   rI   r@   r   rM   r[   rS   rn   r^   rQ   r`   rb   rg   r   r   r   r   r      s"    r   c                   @   r{   )CupyBackendcupyc                 C      dd l }|| _ d S r   )r   )r#   r   r   r   r   r   %  r   zCupyBackend.__init__c                 C   r   r:   )r   r   r   r"   r   r   r   r
   *  r   zCupyBackend.is_appropriate_typec                 C   r   r:   )r   r   r'   r   r   r   r)   -  rd   zCupyBackend.from_numpyc                 C   r   r:   )r   asnumpyr'   r   r   r   r+   0  rd   zCupyBackend.to_numpyc                 C   r   r:   )r   r6   r3   r   r   r   r6   3  r   zCupyBackend.arangerK   c                 C   r   r:   )r   r   rL   r   r   r   rM   6  rd   z%CupyBackend.stack_on_zeroth_dimensionc                 C   r   r:   )r   rS   r\   r   r   r   rS   9  r   zCupyBackend.tilerE   c                 C   r   rC   )r   r   r]   r   r   r   r^   <  rJ   zCupyBackend.concatc                 C   r   r:   )r   r   rO   r   r   r   rQ   ?  r   zCupyBackend.add_axisc                 C   r   r   r   r'   r   r   r   r`   B  r>   zCupyBackend.is_float_typec                 G   r   r:   )r   rg   re   r   r   r   rg   E  r   zCupyBackend.einsumN)rh   ri   rj   r   r   r
   r)   r+   r6   r   rM   rS   rn   r^   rQ   r`   rg   r   r   r   r   r   "  r   r   c                   @   s   e Zd ZdZdd Zdd Zdd Zdd	 Zd
d Zdd Z	de
fddZdd ZdefddZdd Zdd Zdd Zdd ZdS )ChainerBackendchainerc                 C   s    dd l }dd l}|| _|| _ d S r   )r   r}   )r#   r   r}   r   r   r   r   L  s   
zChainerBackend.__init__c                 C   r   r:   )r   r   Variabler"   r   r   r   r
   S  r   z"ChainerBackend.is_appropriate_typec                 C   s   | j |dS )Nr   )r   r   astyper'   r   r   r   r)   V     zChainerBackend.from_numpyc                 C   s   t || jjr
|j}|S r:   )r   r   r   datar'   r   r   r   r+   Y  s   zChainerBackend.to_numpyc                 C   r   r:   )r}   r6   r3   r   r   r   r6   ^  r   zChainerBackend.arangec                 C   s   t | jj|||dS rC   )rF   r   	functionsrG   r   r   r   rI   a  r   zChainerBackend.reducerK   c                 C      | j j|S r:   )r   r   r   rL   r   r   r   rM   d  r   z(ChainerBackend.stack_on_zeroth_dimensionc                 C      | j j||S r:   )r   r   rS   r\   r   r   r   rS   g  rJ   zChainerBackend.tilerE   c                 C   s   | j jj||dS rC   )r   r   r^   r]   r   r   r   r^   j  r   zChainerBackend.concatc                 C   r   r:   )r   r   r   rO   r   r   r   rQ   m  rJ   zChainerBackend.add_axisc                 C   r   r   r   r'   r   r   r   r`   p  r>   zChainerBackend.is_float_typec                 C   r   )NrR   )r   )rb   r   )r#   r   r   r   r   rb   s  r   zChainerBackend.layersc                 G      | j jj|g|R  S r:   )r   r   rg   re   r   r   r   rg   x  r   zChainerBackend.einsumN)rh   ri   rj   r   r   r
   r)   r+   r6   rI   r   rM   rS   rn   r^   rQ   r`   rb   rg   r   r   r   r   r   I  s    r   c                   @   s6   e Zd ZdZdefddZdd Zdd Zd	d
 ZdS )HashableTuplez.Overcomes non-hashability of symbolic elementselementsc                 C   s
   || _ d S r:   r   )r#   r   r   r   r   r     r>   zHashableTuple.__init__c                 c   s    | j D ]}|V  qd S r:   r   r'   r   r   r   __iter__  s   
zHashableTuple.__iter__c                 C   s
   t | jS r:   )lenr   ra   r   r   r   __len__  r>   zHashableTuple.__len__c                 C   s
   | j | S r:   r   )r#   itemr   r   r   __getitem__  r>   zHashableTuple.__getitem__N)	rh   ri   rj   rk   rT   r   r   r   r   r   r   r   r   r   |  s    r   c                   @   s   e Zd ZdZdd Zdd Zdd Zdd	 Zd
d Zdd Z	dd Z
dd Zdd ZdefddZdd ZdefddZdd Zdd Zd d! Zd"d# Zd$S )%TensorflowBackend
tensorflowc                 C   r~   r   )r   tfr#   r   r   r   r   r     r   zTensorflowBackend.__init__c                 C   s   t || jj| jjfS r:   )r   r   r   r   r"   r   r   r   r
     r   z%TensorflowBackend.is_appropriate_typec                 C   s   | j  sJ | j |S r:   )r   executing_eagerlyconvert_to_tensorr'   r   r   r   r)     s   zTensorflowBackend.from_numpyc                 C   s   | j  sJ | S r:   )r   r   r}   r'   r   r   r   r+     s   zTensorflowBackend.to_numpyc                 C   r   r:   )r   ranger3   r   r   r   r6     r   zTensorflowBackend.arangec                    sx   | j  rtdd |jD S |j }| j | t fddt|D }zt| |W S  ty;   t| Y S w )Nc                 s   s&    | ]}|d u rt  nt|V  qd S r:   )ro   rn   ).0dr   r   r   	<genexpr>  s   $ z*TensorflowBackend.shape.<locals>.<genexpr>c                    s   g | ]
\}}|p | qS r   r   )r   r   stf_shaper   r   
<listcomp>  s    z+TensorflowBackend.shape.<locals>.<listcomp>)	r   r   rT   r.   as_list	enumeratery   BaseExceptionr   )r#   r(   static_shaper.   r   r   r   r.     s   

zTensorflowBackend.shapec                 C   s   t | jd| ||dS )Nreduce_rD   )rF   r   rG   r   r   r   rI        zTensorflowBackend.reducec                 C   r   r:   )r   r<   r=   r   r   r   r<     r   zTensorflowBackend.reshapec                 C   r   r:   )r   r@   rA   r   r   r   r@     r   zTensorflowBackend.transposerK   c                 C   r   r:   )r   r   rL   r   r   r   rM     rd   z+TensorflowBackend.stack_on_zeroth_dimensionc                 C   r   r:   )r   rS   r\   r   r   r   rS     r   zTensorflowBackend.tilerE   c                 C   r   rC   )r   r^   r]   r   r   r   r^     rJ   zTensorflowBackend.concatc                 C   r   r:   )r   r   rO   r   r   r   rQ     r   zTensorflowBackend.add_axisc                 C   r   r   r   r'   r   r   r   r`     r>   zTensorflowBackend.is_float_typec                 C   r   )NrR   )r   )rb   r   r   r   r   r   rb     r   zTensorflowBackend.layersc                 G   r   r:   )r   rg   re   r   r   r   rg     r   zTensorflowBackend.einsumN)rh   ri   rj   r   r   r
   r)   r+   r6   r.   rI   r<   r@   r   rM   rS   rn   r^   rQ   r`   rb   rg   r   r   r   r   r     s$    r   c                   @   s   e Zd ZdZdd Zdd Zdd Zdd	 Zd
d Zdd Z	dd Z
dd Zdd ZdefddZdd ZdefddZdd Zdd Zd d! Zd"S )#TFKerasBackendztensorflow.kerasc                 C   s$   dd l }|| _|j| _|jj| _d S r   )r   r   kerasr   K)r#   r   r   r   r   r     s   zTFKerasBackend.__init__c                 C   s   | j |o| j|S r:   )r   	is_tensorr  is_keras_tensorr"   r   r   r   r
     r   z"TFKerasBackend.is_appropriate_typec                 C   s   | j j|dS )N)batch_shape)r   Inputr-   r   r   r   r/     r   zTFKerasBackend.create_symbolc                 C   s.   | j jdd |D |}|dd |D S )Nc                 S   s   g | ]\}}|qS r   r   )r   var_r   r   r   r         z.TFKerasBackend.eval_symbol.<locals>.<listcomp>c                 S   s   g | ]\}}|qS r   r   )r   r  valr   r   r   r     r  )r   modelsModelpredict_on_batch)r#   r0   r1   modelr   r   r   r2     s   zTFKerasBackend.eval_symbolc                 C   r   r:   )r  r6   r3   r   r   r   r6     r   zTFKerasBackend.arangec                 C   s   | j |}tt|S r:   )r  r.   r   rT   r=   r   r   r   r.     s   zTFKerasBackend.shapec                 C   s   t | j|||dS rC   )rF   r  rG   r   r   r   rI     r   zTFKerasBackend.reducec                 C   r   r:   )r  r<   r=   r   r   r   r<     r   zTFKerasBackend.reshapec                 C   r   r:   )r  permute_dimensionsrA   r   r   r   r@     r   zTFKerasBackend.transposerK   c                 C   r   r:   )r  r   rL   r   r   r   rM     rd   z(TFKerasBackend.stack_on_zeroth_dimensionc                 C   r   r:   )r  rS   r\   r   r   r   rS     r   zTFKerasBackend.tilerE   c                 C   r   rC   )r  r   r]   r   r   r   r^     rJ   zTFKerasBackend.concatc                 C   r   r:   )r  r   rO   r   r   r   rQ     r   zTFKerasBackend.add_axisc                 C   s   d| j |v S )Nfloat)r  r   r'   r   r   r   r`     rJ   zTFKerasBackend.is_float_typec                 C   r   )NrR   )r   )rb   r   )r#   r   r   r   r   rb     r   zTFKerasBackend.layersN)rh   ri   rj   r   r   r
   r/   r2   r6   r.   rI   r<   r@   r   rM   rS   rn   r^   rQ   r`   rb   r   r   r   r   r     s"    r   c                   @   r   )#OneFlowBackendoneflowc                 C   r~   r   )r  flow)r#   r  r   r   r   r     r   zOneFlowBackend.__init__c                 C   r   r:   )r   r  r   r"   r   r   r   r
     r   z"OneFlowBackend.is_appropriate_typec                 C   r   ru   )r  r)   r`   r   r   r   r   r   r)     r   zOneFlowBackend.from_numpyc                 C   r   r:   r   r'   r   r   r   r+      rJ   zOneFlowBackend.to_numpyc                 C   r   r   )r  r6   r   r3   r   r   r   r6   #  r   zOneFlowBackend.arangec                 C   sl   t |ddD ]-}|dkr|j|d\}}q|dkr"|j|d\}}q|dv r/t|||d}qtd||S )NTreverser   r   r   )r   r   r   r   r   r   )r   r   r   rF   r!   )r#   r(   rH   r   rE   r  r   r   r   rI   &  s   
zOneFlowBackend.reducec                 C   r9   r:   r   rA   r   r   r   r@   2  r>   zOneFlowBackend.transposerK   c                 C   r   r:   )r  r   rL   r   r   r   rM   5  rd   z(OneFlowBackend.stack_on_zeroth_dimensionc                 C   s:   dg| }|  D ]\}}| ||}|||< q	|j| S r   r   rU   r   r   r   r[   8  r   zOneFlowBackend.add_axesc                 C   r9   r:   r   r\   r   r   r   rS   ?  r>   zOneFlowBackend.tilerE   c                 C   r   r   )r  r^   r]   r   r   r   r^   B  rJ   zOneFlowBackend.concatc                 C   r   r:   )r  r   rO   r   r   r   rQ   E  r   zOneFlowBackend.add_axisc                 C      |j | jj| jj| jjfv S r:   )r   r  r   r   r   r'   r   r   r   r`   H     zOneFlowBackend.is_float_typec                 C   r   )NrR   )r  )rb   r  )r#   r  r   r   r   rb   K  r   zOneFlowBackend.layersc                 G   r   r:   )r  rg   re   r   r   r   rg   P  r   zOneFlowBackend.einsumNr   r   r   r   r   r    s"    r  c                       s   e Zd ZdZdd Zdd Zdd Zdd	 Zd
d Z fddZ	dd Z
dd ZdefddZdd Zdd ZdefddZdd Zdd Zd d! Zd"d# Zd$d% Z  ZS )&PaddleBackendpaddlec                 C   r   r   r  r#   r  r   r   r   r   W  r   zPaddleBackend.__init__c                 C   s   t || jj| jjjfS r:   )r   r  r   staticr   r"   r   r   r   r
   \  r   z!PaddleBackend.is_appropriate_typec                 C   s   | j |}d|_|S )NF)r  	to_tensorstop_gradient)r#   r(   r   r   r   r   r)   _  s   zPaddleBackend.from_numpyc                 C   s   |   S r:   )r   r}   r'   r   r   r   r+   d  rd   zPaddleBackend.to_numpyc                 C   r   r   )r  r6   r   r3   r   r   r   r6   g  r   zPaddleBackend.arangec                    s4   t ||jkrt |||dS t |||S r   )r   ndimr   rI   squeezerG   r   r   r   rI   j  s   zPaddleBackend.reducec                 C   r9   r:   r?   rA   r   r   r   r@   q  r>   zPaddleBackend.transposec                 C   r   r   r   rU   r   r   r   r[   t  r   zPaddleBackend.add_axesrK   c                 C   r   r:   )r  r   rL   r   r   r   rM   {  rd   z'PaddleBackend.stack_on_zeroth_dimensionc                 C   r9   r:   r;   r=   r   r   r   r<   ~  r>   zPaddleBackend.reshapec                 C   r9   r:   )rS   r\   r   r   r   rS     r>   zPaddleBackend.tilerE   c                 C   r   rC   )r  r^   r]   r   r   r   r^     rJ   zPaddleBackend.concatc                 C   r9   r:   r   rO   r   r   r   rQ     r>   zPaddleBackend.add_axisc                 C   r  r:   )r   r  r   r   r   r'   r   r   r   r`     r  zPaddleBackend.is_float_typec                 C   r   )NrR   r  )rb   r  r  r   r   r   rb     r   zPaddleBackend.layersc                 G   r   r:   )r  rg   re   r   r   r   rg     r   zPaddleBackend.einsumc                 C   s
   t |jS r:   )rT   r.   r'   r   r   r   r.     r>   zPaddleBackend.shape)rh   ri   rj   r   r   r
   r)   r+   r6   rI   r@   r[   r   rM   r<   rS   rn   r^   rQ   r`   rb   rg   r.   r   r   r   r   r   r  T  s&    r  c                   @   s   e Zd ZdZdd Zdd Zdd Zdd	 Zd
d Zdd Z	dd Z
dd Zdd ZdefddZdd Zdd ZdefddZdd Zd d! Zd"S )#TinygradBackendtinygradc                 C   r   r   )r"  )r#   r"  r   r   r   r     r   zTinygradBackend.__init__c                 C   r   r:   )r   r"  r   r"   r   r   r   r
     r   z#TinygradBackend.is_appropriate_typec                 C   r   r:   )r"  r   r'   r   r   r   r)     rd   zTinygradBackend.from_numpyc                 C   s   |  S r:   )r}   r'   r   r   r   r+     r*   zTinygradBackend.to_numpyc                 C   r   r:   )r"  r   r6   r3   r   r   r   r6     rJ   zTinygradBackend.arangec                 C   r7   r:   r8   r'   r   r   r   r.     rN   zTinygradBackend.shapec                 C   r9   r:   r;   r=   r   r   r   r<     r>   zTinygradBackend.reshapec                 C   r9   r:   r   rA   r   r   r   r@     r>   zTinygradBackend.transposec                 C   s&   t |ddD ]
}t|||d}q|S )NTr  rD   )r   rF   )r#   r(   rH   rB   rE   r   r   r   rI     s   zTinygradBackend.reducerK   c                 C   r   r:   )r"  r   r   rL   r   r   r   rM     r   z)TinygradBackend.stack_on_zeroth_dimensionc                 C   r9   r:   r   rO   r   r   r   rQ     r>   zTinygradBackend.add_axisc                 C   r9   r:   r   r\   r   r   r   rS     r>   zTinygradBackend.tilerE   c                 C   s,   t |dkr|d |dd  |S |d S )NrR   r   )r   r   r]   r   r   r   r^     s   ,zTinygradBackend.concatc                 C   s   | j j|jS r:   )r"  dtypesis_floatr   r'   r   r   r   r`     rJ   zTinygradBackend.is_float_typec                 G   r   r:   )r"  r   rg   re   r   r   r   rg     r   zTinygradBackend.einsumN)rh   ri   rj   r   r   r
   r)   r+   r6   r.   r<   r@   rI   r   rM   rQ   rS   rn   r^   r`   rg   r   r   r   r   r!    s"    r!  )r   r   )rk   r   
__author__r   dictrm   r   r   r   r   ro   r|   r   r   r   r   r   r   r   r  r  r!  r   r   r   r   <module>   s(    
(K'M'3F9FE