o
    eqi!S                     @   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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#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   backendZbackend_subclassesbackendsZBackendSubclass r   W/home/app/PaddleOCR-VL/.venv_paddleocr/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symbol_value_pairsr   r   r   eval_symbolP      zAbstractBackend.eval_symbolc                 C   r#   )Nz"framework doesn't implement aranger   r!   startstopr   r   r   arangeT   r2   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,   X   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   reduceb      zAbstractBackend.reducetensorsc                 C   r   r:   r   r!   rK   r   r   r   stack_on_zeroth_dimensione      z)AbstractBackend.stack_on_zeroth_dimensionc                 C   r   r:   r   r!   r&   Znew_positionr   r   r   add_axish   rN   zAbstractBackend.add_axisc                 C   s@   dg| }|  D ]\}}| ||}|||< q	| |t|S )N   )r	   rP   tiletupler!   r&   Zn_axesZpos2lenrepeatsZaxis_positionZaxis_lengthr   r   r   add_axesk   s
   

zAbstractBackend.add_axesc                 C   r   )z!repeats - same lengths as x.shaper   r!   r&   rU   r   r   r   rR   r   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   concatv      zAbstractBackend.concatc                 C   r   r:   r   r%   r   r   r   is_float_type{   rZ   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   r\   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-   r1   r6   r,   r<   r@   rI   r   rM   rP   rV   rR   intrY   r[   r]   r^   rb   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   rl   r   r   r   __eq__   ro   zUnknownSize.__eq__c                 C   rk   r:   r   rl   r   r   r   __mul__   ro   zUnknownSize.__mul__c                 C   rk   r:   r   rl   r   r   r   __rmul__   ro   zUnknownSize.__rmul__c                 C   s   t d S r:   )hashr\   r   r   r   __hash__   r(   zUnknownSize.__hash__N)	rc   rd   re   rf   rn   rq   rr   rs   ru   r   r   r   r   rj      s    rj   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   )rx   np)r!   rx   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'      ro   zNumpyBackend.from_numpyc                 C   r   r:   r   r%   r   r   r   r)      ro   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      r_   z&NumpyBackend.stack_on_zeroth_dimensionc                 C   r   r:   )r{   rR   rW   r   r   r   rR      r   zNumpyBackend.tilerE   c                 C      | j j||dS rC   )r{   concatenaterX   r   r   r   rY      rJ   zNumpyBackend.concatc                 C   
   |j dv S N)float16float32float64Zfloat128bfloat16dtyper%   r   r   r   r[      r>   zNumpyBackend.is_float_typec                 C   r   r:   )r{   expand_dimsrO   r   r   r   rP      r   zNumpyBackend.add_axisc                 G      | j j|g|R  S r:   )r{   rb   r`   r   r   r   rb         zNumpyBackend.einsumN)rc   rd   re   r   r|   r
   r'   r)   r6   r   rM   rR   ri   rY   r[   rP   rb   r   r   r   r   rw          rw   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 rz   )superr   r|   r{   onpZ	jax.numpyrx   )r!   r   	__class__r   r   r|      s   zJaxBackend.__init__c                 C   r   r:   )r{   asarrayr%   r   r   r   r'      r_   zJaxBackend.from_numpyc                 C   r   r:   )r   r   r%   r   r   r   r)      r_   zJaxBackend.to_numpy)rc   rd   re   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   rQ   )_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 rp   )r   r'   r[   requires_gradr!   r&   variabler   r   r   r'         
zTorchBackend.from_numpyc                 C      |    S r:   detachcpurx   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 )ZaminZamaxr   r   r   sortedrF   r   )r!   r&   rH   reduced_axesir   r   r   rI      s   
zTorchBackend.reducec                 C   r9   r:   ZpermuterA   r   r   r   r@     r>   zTorchBackend.transposerK   c                 C   r   r:   )r   r   rL   r   r   r   rM     r_   z&TorchBackend.stack_on_zeroth_dimensionc                 C   :   dg| }|  D ]\}}| ||}|||< q	||S Nr   r	   rP   expandrT   r   r   r   rV     
   


zTorchBackend.add_axesc                 C   r9   r:   repeatrW   r   r   r   rR     r>   zTorchBackend.tilerE   c                 C   r   Nr   )r   catrX   r   r   r   rY     rJ   zTorchBackend.concatc                 C   r   r:   )r   	unsqueezerO   r   r   r   rP     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 )NrQ   )r   )r]   r   )r!   r   r   r   r   r]        zTorchBackend.layersc                 G   r   r:   )r   rb   r`   r   r   r   rb     r   zTorchBackend.einsumNrc   rd   re   r   r|   r
   r'   r)   r6   rI   r@   r   rM   rV   rR   ri   rY   rP   r[   r]   rb   r   r   r   r   r      s"    r   c                   @   rv   )CupyBackendcupyc                 C      dd l }|| _ d S rz   )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'   .  r_   zCupyBackend.from_numpyc                 C   r   r:   )r   Zasnumpyr%   r   r   r   r)   1  r_   zCupyBackend.to_numpyc                 C   r   r:   )r   r6   r3   r   r   r   r6   4  r   zCupyBackend.arangerK   c                 C   r   r:   )r   r   rL   r   r   r   rM   7  r_   z%CupyBackend.stack_on_zeroth_dimensionc                 C   r   r:   )r   rR   rW   r   r   r   rR   :  r   zCupyBackend.tilerE   c                 C   r   rC   )r   r   rX   r   r   r   rY   =  rJ   zCupyBackend.concatc                 C   r   r:   )r   r   rO   r   r   r   rP   @  r   zCupyBackend.add_axisc                 C   r   r   r   r%   r   r   r   r[   C  r>   zCupyBackend.is_float_typec                 G   r   r:   )r   rb   r`   r   r   r   rb   F  r   zCupyBackend.einsumN)rc   rd   re   r   r|   r
   r'   r)   r6   r   rM   rR   ri   rY   rP   r[   rb   r   r   r   r   r   #  r   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|   M  r>   zHashableTuple.__init__c                 c   s    | j D ]}|V  qd S r:   r   r%   r   r   r   __iter__P  s   
zHashableTuple.__iter__c                 C   s
   t | jS r:   )lenr   r\   r   r   r   __len__T  r>   zHashableTuple.__len__c                 C   s
   | j | S r:   r   )r!   itemr   r   r   __getitem__W  r>   zHashableTuple.__getitem__N)	rc   rd   re   rf   rS   r|   r   r   r   r   r   r   r   r   J  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   ry   rz   )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   Variabler    r   r   r   r
   e  r   z%TensorflowBackend.is_appropriate_typec                 C   s   | j  sJ | j |S r:   )r   executing_eagerlyZconvert_to_tensorr%   r   r   r   r'   h  s   zTensorflowBackend.from_numpyc                 C   s   | j  sJ | S r:   )r   r   rx   r%   r   r   r   r)   l  s   zTensorflowBackend.to_numpyc                 C   r   r:   )r   ranger3   r   r   r   r6   p  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:   )rj   ri   ).0dr   r   r   	<genexpr>u  s   $ z*TensorflowBackend.shape.<locals>.<genexpr>c                    s   g | ]
\}}|p | qS r   r   )r   r   sZtf_shaper   r   
<listcomp>z  s    z+TensorflowBackend.shape.<locals>.<listcomp>)	r   r   rS   r,   as_list	enumeratert   BaseExceptionr   )r!   r&   Zstatic_shaper,   r   r   r   r,   s  s   

zTensorflowBackend.shapec                 C   s   t | jd| ||dS )NZ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     r_   z+TensorflowBackend.stack_on_zeroth_dimensionc                 C   r   r:   )r   rR   rW   r   r   r   rR     r   zTensorflowBackend.tilerE   c                 C   r   rC   )r   rY   rX   r   r   r   rY     rJ   zTensorflowBackend.concatc                 C   r   r:   )r   r   rO   r   r   r   rP     r   zTensorflowBackend.add_axisc                 C   r   r   r   r%   r   r   r   r[     r>   zTensorflowBackend.is_float_typec                 C   r   )NrQ   )r   )r]   r   r   r   r   r   r]     r   zTensorflowBackend.layersc                 G   r   r:   )r   rb   r`   r   r   r   rb     r   zTensorflowBackend.einsumN)rc   rd   re   r   r|   r
   r'   r)   r6   r,   rI   r<   r@   r   rM   rR   ri   rY   rP   r[   r]   rb   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 rz   )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   Zis_keras_tensorr    r   r   r   r
     r   z"TFKerasBackend.is_appropriate_typec                 C   s   | j j|dS )N)Zbatch_shape)r   Z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   modelsZModelZpredict_on_batch)r!   r/   r0   modelr   r   r   r1     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   rS   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   Zpermute_dimensionsrA   r   r   r   r@     r   zTFKerasBackend.transposerK   c                 C   r   r:   )r   r   rL   r   r   r   rM     r_   z(TFKerasBackend.stack_on_zeroth_dimensionc                 C   r   r:   )r   rR   rW   r   r   r   rR     r   zTFKerasBackend.tilerE   c                 C   r   rC   )r   r   rX   r   r   r   rY     rJ   zTFKerasBackend.concatc                 C   r   r:   )r   r   rO   r   r   r   rP     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   )NrQ   )r   )r]   r   )r!   r   r   r   r   r]     r   zTFKerasBackend.layersN)rc   rd   re   r   r|   r
   r-   r1   r6   r,   rI   r<   r@   r   rM   rR   ri   rY   rP   r[   r]   r   r   r   r   r     s"    r   c                   @   r   )#OneFlowBackendoneflowc                 C   ry   rz   )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   rp   )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@      r>   zOneFlowBackend.transposerK   c                 C   r   r:   )r   r   rL   r   r   r   rM     r_   z(OneFlowBackend.stack_on_zeroth_dimensionc                 C   s:   dg| }|  D ]\}}| ||}|||< q	|j| S r   r   rT   r   r   r   rV     r   zOneFlowBackend.add_axesc                 C   r9   r:   r   rW   r   r   r   rR     r>   zOneFlowBackend.tilerE   c                 C   r   r   )r   rY   rX   r   r   r   rY     rJ   zOneFlowBackend.concatc                 C   r   r:   )r   r   rO   r   r   r   rP     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[        zOneFlowBackend.is_float_typec                 C   r   )NrQ   )r   )r]   r   )r!   r   r   r   r   r]     r   zOneFlowBackend.layersc                 G   r   r:   )r   rb   r`   r   r   r   rb     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   rz   r   r!   r   r   r   r   r|   %  r}   zPaddleBackend.__init__c                 C   r   r:   )r   r   r    r   r   r   r
   *  r_   z!PaddleBackend.is_appropriate_typec                 C   s   | j |}d|_|S )NF)r   Z	to_tensorZstop_gradient)r!   r&   r   r   r   r   r'   -  s   zPaddleBackend.from_numpyc                 C   s   |   S r:   )r   rx   r%   r   r   r   r)   2  r_   zPaddleBackend.to_numpyc                 C   r   r   )r   r6   r   r3   r   r   r   r6   5  r   zPaddleBackend.arangec                    s4   t ||jkrt |||dS t |||S rz   )r   ndimr   rI   ZsqueezerG   r   r   r   rI   8  s   zPaddleBackend.reducec                 C   r9   r:   r?   rA   r   r   r   r@   ?  r>   zPaddleBackend.transposec                 C   r   r   r   rT   r   r   r   rV   B  r   zPaddleBackend.add_axesrK   c                 C   r   r:   )r   r   rL   r   r   r   rM   I  r_   z'PaddleBackend.stack_on_zeroth_dimensionc                 C   r9   r:   r;   r=   r   r   r   r<   L  r>   zPaddleBackend.reshapec                 C   r9   r:   )rR   rW   r   r   r   rR   O  r>   zPaddleBackend.tilerE   c                 C   r   rC   )r   rY   rX   r   r   r   rY   R  rJ   zPaddleBackend.concatc                 C   r9   r:   r   rO   r   r   r   rP   U  r>   zPaddleBackend.add_axisc                 C   r   r:   )r   r   r   r   r   r%   r   r   r   r[   X  r   zPaddleBackend.is_float_typec                 C   r   )NrQ   r   )r]   r   r   r   r   r   r]   [  r   zPaddleBackend.layersc                 G   r   r:   )r   rb   r`   r   r   r   rb   `  r   zPaddleBackend.einsumc                 C   s
   t |jS r:   )rS   r,   r%   r   r   r   r,   c  r>   zPaddleBackend.shape)rc   rd   re   r   r|   r
   r'   r)   r6   rI   r@   rV   r   rM   r<   rR   ri   rY   rP   r[   r]   rb   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d ZdefddZdd Zd d! Zd"S )#TinygradBackendtinygradc                 C   r   rz   )r   )r!   r   r   r   r   r|   j  r}   zTinygradBackend.__init__c                 C   r~   r:   )r   r   r   r    r   r   r   r
   o  r   z#TinygradBackend.is_appropriate_typec                 C   r   r:   )r   r   r%   r   r   r   r'   r  r_   zTinygradBackend.from_numpyc                 C      |  S r:   )rx   r%   r   r   r   r)   u  r(   zTinygradBackend.to_numpyc                 C   s   | j j||S r:   )r   r   r6   r3   r   r   r   r6   x  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   s   | j j|S r:   )r   r   r   rL   r   r   r   rM     r   z)TinygradBackend.stack_on_zeroth_dimensionc                 C   r9   r:   r   rO   r   r   r   rP     r>   zTinygradBackend.add_axisc                 C   r9   r:   r   rW   r   r   r   rR     r>   zTinygradBackend.tilerE   c                 C   s0   t |dkr|d j|dd  d|iS |d S )NrQ   r   r   )r   r   rX   r   r   r   rY     s   0zTinygradBackend.concatc                 C   s   | j j|jS r:   )r   ZdtypesZis_floatr   r%   r   r   r   r[     rJ   zTinygradBackend.is_float_typec                 G   s   | j jj|g|R  S r:   )r   r   rb   r`   r   r   r   rb     r   zTinygradBackend.einsumN)rc   rd   re   r   r|   r
   r'   r)   r6   r,   r<   r@   rI   r   rM   rP   rR   ri   rY   r[   rb   r   r   r   r   r   g  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 S )!PyTensorBackendpytensorc                 C   s   ddl m} || _d S )Nr   )r   )r  r   ptr    r   r   r   r|     s   
zPyTensorBackend.__init__c                 C   r~   r:   )r   r  ZTensorVariabler    r   r   r   r
     r   z#PyTensorBackend.is_appropriate_typec                 C   s   |j | jjjv S r:   )r   r  r   Zfloat_dtypesr%   r   r   r   r[     rJ   zPyTensorBackend.is_float_typec                 C   r   r:   )r  Z	as_tensorr%   r   r   r   r'     r_   zPyTensorBackend.from_numpyc                 C   r  r:   )evalr%   r   r   r   r)     r(   zPyTensorBackend.to_numpyc                 C   s"   t |ttB s
|f}| jj|dS )Nr8   )r   rS   r   r  r   r+   r   r   r   r-     s   zPyTensorBackend.create_symbolc                 C   s   | t|S r:   )r  dictr.   r   r   r   r1     r   zPyTensorBackend.eval_symbolc                 C   r   r:   )r  r6   r3   r   r   r   r6     r   zPyTensorBackend.arangec                 C   s   t dd t|jj|jD S )Nc                 s   s$    | ]\}}|d ur|n|V  qd S r:   r   )r   Z
static_dimZsymbolic_dimr   r   r   r     s
    
z(PyTensorBackend.shape.<locals>.<genexpr>)rS   zipr   r,   r%   r   r   r   r,     s   zPyTensorBackend.shaperK   c                 C   r   r:   )r  r   rL   r   r   r   rM     r_   z)PyTensorBackend.stack_on_zeroth_dimensionc                 C   r   r:   )r  rR   rW   r   r   r   rR     r   zPyTensorBackend.tilerE   c                 C   r   rC   )r  r   rX   r   r   r   rY     rJ   zPyTensorBackend.concatc                 C   r   r:   )r  r   rO   r   r   r   rP     r   zPyTensorBackend.add_axisc                 G   r   r:   )r  rb   r`   r   r   r   rb     r   zPyTensorBackend.einsumN)rc   rd   re   r   r|   r
   r[   r'   r)   r-   r1   r6   r,   r   rM   rR   ri   rY   rP   rb   r   r   r   r   r    s     r  )r   r   )rf   r   
__author__r   r  rh   r   r   r   r   rj   rw   r   r   r   r   r   r   r   r   r   r  r   r   r   r   <module>   s(    
(L'M'F9FE5