o
    i X                     @   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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 }|rC|	 }|| 7 }|
| |s2dd |D }|D ]1}	trUtd|	 |	j|vr}|	jtjv r}trhtd|	j |	 }|t|j< || r}|t|< |  S qLtdt |  )z
    Takes a correct backend (e.g. numpy backend if tensor is numpy.ndarray) for a tensor.
    If needed, imports package and creates backend
    Nc                 S      g | ]\}}|qS  r   ).0x_r   r   M/home/ubuntu/veenaModal/venv/lib/python3.10/site-packages/einops/_backends.py
<listcomp>/       zget_backend.<locals>.<listcomp>zTesting for subclass of zImported backend for zTensor type unknown to einops )typer   getlistr   itemsis_appropriate_typer   __subclasses__popappend_debug_importingprintframework_namesysmodulesRuntimeError)
tensor_type_resultpreviously_loaded_backends_framework_namebackendbackend_subclassesbackendsprev_backend_namesBackendSubclassr   r   r   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   F      z#AbstractBackend.is_appropriate_typec                 C      t dNz.framework doesn't support imperative executionr(   r+   r	   r   r   r   
from_numpyJ      zAbstractBackend.from_numpyc                 C   r-   r.   r(   r/   r   r   r   to_numpyM   r1   zAbstractBackend.to_numpyc                 C   r-   Nz/framework doesn't support symbolic computationsr(   r+   shaper   r   r   create_symbolP   r1   zAbstractBackend.create_symbolc                 C   r-   r3   r(   r+   symbolsymbol_value_pairsr   r   r   eval_symbolS      zAbstractBackend.eval_symbolc                 C   r-   )Nz"framework doesn't implement aranger(   r+   startstopr   r   r   arangeW   r;   zAbstractBackend.arangec                 C      |j S )zashape should return a tuple with integers or "shape symbols" (which will evaluate to actual size)r5   r/   r   r   r   r5   [   r,   zAbstractBackend.shapec                 C   
   | |S Nreshaper+   r	   r5   r   r   r   rE   _      
zAbstractBackend.reshapec                 C   rB   rC   	transposer+   r	   axesr   r   r   rI   b   rG   zAbstractBackend.transposec                 C   s   t |||dS Naxis)getattrr+   r	   	operationrK   r   r   r   reducee      zAbstractBackend.reducetensorsc                 C   r'   rC   r(   r+   rT   r   r   r   stack_on_zeroth_dimensionh      z)AbstractBackend.stack_on_zeroth_dimensionc                 C   r'   rC   r(   r+   r	   new_positionr   r   r   add_axisk   rW   zAbstractBackend.add_axisc                 C   s@   dg| }|  D ]\}}| ||}|||< q	| |t|S )N   )r   rZ   tiletupler+   r	   n_axespos2lenrepeatsaxis_positionaxis_lengthr   r   r   add_axesn   s
   

zAbstractBackend.add_axesc                 C   r'   )z!repeats - same lengths as x.shaper(   r+   r	   ra   r   r   r   r\   u   r,   zAbstractBackend.tilerN   c                 C   r'   )zzconcatenates tensors along axis.
        Assume identical across tensors: devices, dtypes and shapes except selected axis.r(   r+   rT   rN   r   r   r   concaty      zAbstractBackend.concatc                 C   r'   rC   r(   r/   r   r   r   is_float_type~   rh   zAbstractBackend.is_float_typec                 C   r-   )Nzbackend does not provide layersr(   r+   r   r   r   layers   r1   zAbstractBackend.layersc                 C   s   d| j  dS )Nz<einops backend for >)r   rj   r   r   r   __repr__      zAbstractBackend.__repr__c                 G   r-   )Nzbackend does not support einsumr(   r+   patternr	   r   r   r   einsum   r1   zAbstractBackend.einsumN)__name__
__module____qualname____doc__str__annotations__r   r0   r2   r6   r:   r?   r5   rE   rI   rR   r   rV   rZ   rd   r\   intrg   ri   rk   rm   rq   r   r   r   r   r   A   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 rC   r   r+   otherr   r   r   __floordiv__      zUnknownSize.__floordiv__c                 C   s   dS NTr   r{   r   r   r   __eq__   r~   zUnknownSize.__eq__c                 C   rz   rC   r   r{   r   r   r   __mul__   r~   zUnknownSize.__mul__c                 C   rz   rC   r   r{   r   r   r   __rmul__   r~   zUnknownSize.__rmul__c                 C   s   t d S rC   )hashrj   r   r   r   __hash__   r1   zUnknownSize.__hash__N)	rr   rs   rt   ru   r}   r   r   r   r   r   r   r   r   ry      s    ry   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 rC   )
isinstancer   ndarrayr*   r   r   r   r      rn   z NumpyBackend.is_appropriate_typec                 C      |S rC   r   r/   r   r   r   r0      r~   zNumpyBackend.from_numpyc                 C   r   rC   r   r/   r   r   r   r2      r~   zNumpyBackend.to_numpyc                 C      | j ||S rC   )r   r?   r<   r   r   r   r?      rn   zNumpyBackend.arangerT   c                 C      | j |S rC   )r   stackrU   r   r   r   rV         z&NumpyBackend.stack_on_zeroth_dimensionc                 C   r   rC   )r   r\   re   r   r   r   r\      rn   zNumpyBackend.tilerN   c                 C      | j j||dS rL   )r   concatenaterf   r   r   r   rg      rS   zNumpyBackend.concatc                 C   
   |j dv S N)float16float32float64float128bfloat16dtyper/   r   r   r   ri      rG   zNumpyBackend.is_float_typec                 C   r   rC   )r   expand_dimsrX   r   r   r   rZ      rn   zNumpyBackend.add_axisc                 G      | j j|g|R  S rC   )r   rq   ro   r   r   r   rq         zNumpyBackend.einsumN)rr   rs   rt   r   r   r   r0   r2   r?   r   rV   r\   rx   rg   ri   rZ   rq   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    | j| _dd l}|j| _d S r   )superr   r   onp	jax.numpyr   )r+   r   	__class__r   r   r      s   
zJaxBackend.__init__c                 C   r   rC   )r   asarrayr/   r   r   r   r0      r   zJaxBackend.from_numpyc                 C   r   rC   )r   r   r/   r   r   r   r2      r   zJaxBackend.to_numpy)rr   rs   rt   r   r   r0   r2   __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   r[   )_torch_specific)r    r   )r+   r   r   r   r   r   r      s   zTorchBackend.__init__c                 C   r   rC   )r   r   Tensorr*   r   r   r   r      rn   z TorchBackend.is_appropriate_typec                 C       | j |}| |rd|_|S r   )r   r0   ri   requires_gradr+   r	   variabler   r   r   r0         
zTorchBackend.from_numpyc                 C      |    S rC   detachcpur   r/   r   r   r   r2      rS   zTorchBackend.to_numpyc                 C      | j j||| j jdS Nr   )r   r?   int64r<   r   r   r   r?         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 rBt|d d d D ]
}t|||d}q5|S td|)	Nmindimmaxsummean)anyallprodUnknown reduction )aminamaxr   r   sortedrO   r)   )r+   r	   rQ   reduced_axesir   r   r   rR      s   
zTorchBackend.reducec                 C   rB   rC   permuterJ   r   r   r   rI     rG   zTorchBackend.transposerT   c                 C   r   rC   )r   r   rU   r   r   r   rV     r   z&TorchBackend.stack_on_zeroth_dimensionc                 C   :   dg| }|  D ]\}}| ||}|||< q	||S Nr   r   rZ   expandr^   r   r   r   rd   
  
   


zTorchBackend.add_axesc                 C   rB   rC   repeatre   r   r   r   r\     rG   zTorchBackend.tilerN   c                 C   r   Nr   )r   catrf   r   r   r   rg     rS   zTorchBackend.concatc                 C   r   rC   )r   	unsqueezerX   r   r   r   rZ     rn   zTorchBackend.add_axisc                 C   s"   |j | jj| jj| jj| jjfv S rC   )r   r   r   r   r   r   r/   r   r   r   ri     s   "zTorchBackend.is_float_typec                 C      ddl m} |S )Nr[   )r   )rk   r   )r+   r   r   r   r   rk        zTorchBackend.layersc                 G   r   rC   )r   rq   ro   r   r   r   rq   "  r   zTorchBackend.einsumNrr   rs   rt   r   r   r   r0   r2   r?   rR   rI   r   rV   rd   r\   rx   rg   rZ   ri   rk   rq   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   rC   )r   r   r   r*   r   r   r   r   .  rn   zCupyBackend.is_appropriate_typec                 C   r   rC   )r   r   r/   r   r   r   r0   1  r   zCupyBackend.from_numpyc                 C   r   rC   )r   asnumpyr/   r   r   r   r2   4  r   zCupyBackend.to_numpyc                 C   r   rC   )r   r?   r<   r   r   r   r?   7  rn   zCupyBackend.arangerT   c                 C   r   rC   )r   r   rU   r   r   r   rV   :  r   z%CupyBackend.stack_on_zeroth_dimensionc                 C   r   rC   )r   r\   re   r   r   r   r\   =  rn   zCupyBackend.tilerN   c                 C   r   rL   )r   r   rf   r   r   r   rg   @  rS   zCupyBackend.concatc                 C   r   rC   )r   r   rX   r   r   r   rZ   C  rn   zCupyBackend.add_axisc                 C   r   r   r   r/   r   r   r   ri   F  rG   zCupyBackend.is_float_typec                 G   r   rC   )r   rq   ro   r   r   r   rq   I  r   zCupyBackend.einsumN)rr   rs   rt   r   r   r   r0   r2   r?   r   rV   r\   rx   rg   rZ   ri   rq   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 rC   r   )r+   r   r   r   r   r   P  rG   zHashableTuple.__init__c                 c   s    | j E d H  d S rC   r   rj   r   r   r   __iter__S  s   zHashableTuple.__iter__c                 C   s
   t | jS rC   )lenr   rj   r   r   r   __len__V  rG   zHashableTuple.__len__c                 C   s
   | j | S rC   r   )r+   itemr   r   r   __getitem__Y  rG   zHashableTuple.__getitem__N)	rr   rs   rt   ru   r]   r   r   r   r   r   r   r   r   r   M  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   b  r   zTensorflowBackend.__init__c                 C   s   t || jj| jjfS rC   )r   r   r   Variabler*   r   r   r   r   g  r   z%TensorflowBackend.is_appropriate_typec                 C   s   | j  sJ | j |S rC   )r   executing_eagerlyconvert_to_tensorr/   r   r   r   r0   j  s   zTensorflowBackend.from_numpyc                 C   s   | j  sJ | S rC   )r   r   r   r/   r   r   r   r2   n  s   zTensorflowBackend.to_numpyc                 C   r   rC   )r   ranger<   r   r   r   r?   r  rn   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 rC   )ry   rx   )r   dr   r   r   	<genexpr>w  s   $ z*TensorflowBackend.shape.<locals>.<genexpr>c                    s   g | ]
\}}|p | qS r   r   )r   r   stf_shaper   r   r   |  s    z+TensorflowBackend.shape.<locals>.<listcomp>)	r   r   r]   r5   as_list	enumerater   BaseExceptionr   )r+   r	   static_shaper5   r   r   r   r5   u  s   

zTensorflowBackend.shapec                 C   s   t | jd| ||dS )Nreduce_rM   )rO   r   rP   r   r   r   rR        zTensorflowBackend.reducec                 C   r   rC   )r   rE   rF   r   r   r   rE     rn   zTensorflowBackend.reshapec                 C   r   rC   )r   rI   rJ   r   r   r   rI     rn   zTensorflowBackend.transposerT   c                 C   r   rC   )r   r   rU   r   r   r   rV     r   z+TensorflowBackend.stack_on_zeroth_dimensionc                 C   r   rC   )r   r\   re   r   r   r   r\     rn   zTensorflowBackend.tilerN   c                 C   r   rL   )r   rg   rf   r   r   r   rg     rS   zTensorflowBackend.concatc                 C   r   rC   )r   r   rX   r   r   r   rZ     rn   zTensorflowBackend.add_axisc                 C   r   r   r   r/   r   r   r   ri     rG   zTensorflowBackend.is_float_typec                 C   r   )Nr[   )r   )rk   r   r   r   r   r   rk     r   zTensorflowBackend.layersc                 G   r   rC   )r   rq   ro   r   r   r   rq     r   zTensorflowBackend.einsumN)rr   rs   rt   r   r   r   r0   r2   r?   r5   rR   rE   rI   r   rV   r\   rx   rg   rZ   ri   rk   rq   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 rC   )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   Inputr4   r   r   r   r6     rn   zTFKerasBackend.create_symbolc                 C   s.   | j jdd |D |}|dd |D S )Nc                 S   r   r   r   )r   varr
   r   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+   r8   r9   modelr   r   r   r:     s   zTFKerasBackend.eval_symbolc                 C   r   rC   )r   r?   r<   r   r   r   r?     rn   zTFKerasBackend.arangec                 C   s   | j |}tt|S rC   )r   r5   r   r]   rF   r   r   r   r5     s   zTFKerasBackend.shapec                 C   s   t | j|||dS rL   )rO   r   rP   r   r   r   rR     r   zTFKerasBackend.reducec                 C   r   rC   )r   rE   rF   r   r   r   rE     rn   zTFKerasBackend.reshapec                 C   r   rC   )r   permute_dimensionsrJ   r   r   r   rI     rn   zTFKerasBackend.transposerT   c                 C   r   rC   )r   r   rU   r   r   r   rV     r   z(TFKerasBackend.stack_on_zeroth_dimensionc                 C   r   rC   )r   r\   re   r   r   r   r\     rn   zTFKerasBackend.tilerN   c                 C   r   rL   )r   r   rf   r   r   r   rg     rS   zTFKerasBackend.concatc                 C   r   rC   )r   r   rX   r   r   r   rZ     rn   zTFKerasBackend.add_axisc                 C   s   d| j |v S )Nfloat)r   r   r/   r   r   r   ri     rS   zTFKerasBackend.is_float_typec                 C   r   )Nr[   )r   )rk   r   )r+   r   r   r   r   rk     r   zTFKerasBackend.layersN)rr   rs   rt   r   r   r   r6   r:   r?   r5   rR   rE   rI   r   rV   r\   rx   rg   rZ   ri   rk   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   rC   )r   r  r   r*   r   r   r   r     rn   z"OneFlowBackend.is_appropriate_typec                 C   r   r   )r  r0   ri   r   r   r   r   r   r0     r   zOneFlowBackend.from_numpyc                 C   r   rC   r   r/   r   r   r   r2     rS   zOneFlowBackend.to_numpyc                 C   r   r   )r  r?   r   r<   r   r   r   r?     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   rO   r)   )r+   r	   rQ   r   rN   r
   r   r   r   rR     s   
zOneFlowBackend.reducec                 C   rB   rC   r   rJ   r   r   r   rI     rG   zOneFlowBackend.transposerT   c                 C   r   rC   )r  r   rU   r   r   r   rV     r   z(OneFlowBackend.stack_on_zeroth_dimensionc                 C   s:   dg| }|  D ]\}}| ||}|||< q	|j| S r   r   r^   r   r   r   rd     r   zOneFlowBackend.add_axesc                 C   rB   rC   r   re   r   r   r   r\     rG   zOneFlowBackend.tilerN   c                 C   r   r   )r  rg   rf   r   r   r   rg     rS   zOneFlowBackend.concatc                 C   r   rC   )r  r   rX   r   r   r   rZ     rn   zOneFlowBackend.add_axisc                 C      |j | jj| jj| jjfv S rC   )r   r  r   r   r   r/   r   r   r   ri        zOneFlowBackend.is_float_typec                 C   r   )Nr[   )r  )rk   r  )r+   r  r   r   r   rk     r   zOneFlowBackend.layersc                 G   r   rC   )r  rq   ro   r   r   r   rq      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   '  r   zPaddleBackend.__init__c                 C   r   rC   )r  r  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   r0   /  s   zPaddleBackend.from_numpyc                 C   s   |   S rC   )r   r   r/   r   r   r   r2   4  r   zPaddleBackend.to_numpyc                 C   r   r   )r  r?   r   r<   r   r   r   r?   7  r   zPaddleBackend.arangec                    s4   t ||jkrt |||dS t |||S r   )r   ndimr   rR   squeezerP   r   r   r   rR   :  s   zPaddleBackend.reducec                 C   rB   rC   rH   rJ   r   r   r   rI   A  rG   zPaddleBackend.transposec                 C   r   r   r   r^   r   r   r   rd   D  r   zPaddleBackend.add_axesrT   c                 C   r   rC   )r  r   rU   r   r   r   rV   K  r   z'PaddleBackend.stack_on_zeroth_dimensionc                 C   rB   rC   rD   rF   r   r   r   rE   N  rG   zPaddleBackend.reshapec                 C   rB   rC   )r\   re   r   r   r   r\   Q  rG   zPaddleBackend.tilerN   c                 C   r   rL   )r  rg   rf   r   r   r   rg   T  rS   zPaddleBackend.concatc                 C   rB   rC   r   rX   r   r   r   rZ   W  rG   zPaddleBackend.add_axisc                 C   r  rC   )r   r  r   r   r   r/   r   r   r   ri   Z  r  zPaddleBackend.is_float_typec                 C   r   )Nr[   r  )rk   r  r  r   r   r   rk   ]  r   zPaddleBackend.layersc                 G   r   rC   )r  rq   ro   r   r   r   rq   b  r   zPaddleBackend.einsumc                 C   s
   t |jS rC   )r]   r5   r/   r   r   r   r5   e  rG   zPaddleBackend.shape)rr   rs   rt   r   r   r   r0   r2   r?   rR   rI   rd   r   rV   rE   r\   rx   rg   rZ   ri   rk   rq   r5   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   r   )r  )r+   r  r   r   r   r   l  r   zTinygradBackend.__init__c                 C   r   rC   )r   r  r   r*   r   r   r   r   q  rn   z#TinygradBackend.is_appropriate_typec                 C   r   rC   )r  r   r/   r   r   r   r0   t  r   zTinygradBackend.from_numpyc                 C      |  S rC   )r   r/   r   r   r   r2   w  r1   zTinygradBackend.to_numpyc                 C   s   | j j||S rC   )r  r   r?   r<   r   r   r   r?   z  rS   zTinygradBackend.arangec                 C   r@   rC   rA   r/   r   r   r   r5   }  rW   zTinygradBackend.shapec                 C   rB   rC   rD   rF   r   r   r   rE     rG   zTinygradBackend.reshapec                 C   rB   rC   r   rJ   r   r   r   rI     rG   zTinygradBackend.transposec                 C   s&   t |ddD ]
}t|||d}q|S )NTr  rM   )r   rO   )r+   r	   rQ   rK   rN   r   r   r   rR     s   zTinygradBackend.reducerT   c                 C   s   | j j|S rC   )r  r   r   rU   r   r   r   rV     rn   z)TinygradBackend.stack_on_zeroth_dimensionc                 C   rB   rC   r  rX   r   r   r   rZ     rG   zTinygradBackend.add_axisc                 C   rB   rC   r   re   r   r   r   r\     rG   zTinygradBackend.tilerN   c                 C   s0   t |dkr|d j|dd  d|iS |d S )Nr[   r   r   )r   r   rf   r   r   r   rg     s   0zTinygradBackend.concatc                 C   s   | j j|jS rC   )r  dtypesis_floatr   r/   r   r   r   ri     rS   zTinygradBackend.is_float_typec                 G   s   | j jj|g|R  S rC   )r  r   rq   ro   r   r   r   rq     r   zTinygradBackend.einsumN)rr   rs   rt   r   r   r   r0   r2   r?   r5   rE   rI   rR   r   rV   rZ   r\   rx   rg   ri   rq   r   r   r   r   r  i  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   rC   )r   r$  TensorVariabler*   r   r   r   r     rn   z#PyTensorBackend.is_appropriate_typec                 C   s   |j | jjjv S rC   )r   r$  r   float_dtypesr/   r   r   r   ri     rS   zPyTensorBackend.is_float_typec                 C   r   rC   )r$  	as_tensorr/   r   r   r   r0     r   zPyTensorBackend.from_numpyc                 C   r  rC   )evalr/   r   r   r   r2     r1   zPyTensorBackend.to_numpyc                 C   s"   t |ttB s
|f}| jj|dS )NrA   )r   r]   r   r$  r   r4   r   r   r   r6     s   zPyTensorBackend.create_symbolc                 C   s   | t|S rC   )r(  dictr7   r   r   r   r:     rn   zPyTensorBackend.eval_symbolc                 C   r   rC   )r$  r?   r<   r   r   r   r?     rn   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 rC   r   )r   
static_dimsymbolic_dimr   r   r   r     s
    
z(PyTensorBackend.shape.<locals>.<genexpr>)r]   zipr   r5   r/   r   r   r   r5     s   zPyTensorBackend.shaperT   c                 C   r   rC   )r$  r   rU   r   r   r   rV     r   z)PyTensorBackend.stack_on_zeroth_dimensionc                 C   r   rC   )r$  r\   re   r   r   r   r\     rn   zPyTensorBackend.tilerN   c                 C   r   rL   )r$  r   rf   r   r   r   rg     rS   zPyTensorBackend.concatc                 C   r   rC   )r$  r   rX   r   r   r   rZ     rn   zPyTensorBackend.add_axisc                 G   r   rC   )r$  rq   ro   r   r   r   rq     r   zPyTensorBackend.einsumN)rr   rs   rt   r   r   r   ri   r0   r2   r6   r:   r?   r5   r   rV   r\   rx   rg   rZ   rq   r   r   r   r   r"    s     r"  c                   @   st   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d ZdefddZdd Zdd ZdS )
MLXBackendmlxc                 C   s$   dd l m} dd l}|| _|| _d S r   )mlx.corecorer   mxr   )r+   r1  r   r   r   r   r     s   
zMLXBackend.__init__c                 C   r   rC   )r   r1  arrayr*   r   r   r   r     rn   zMLXBackend.is_appropriate_typec                 C   r   rC   )r1  r2  r/   r   r   r   r0     r   zMLXBackend.from_numpyc                 C   s(   |j | jjkr|| jj}| j|S rC   )r   r1  r   astyper   r   r2  r/   r   r   r   r2     s   zMLXBackend.to_numpyc                 C   r   rC   )r1  r?   r<   r   r   r   r?     rn   zMLXBackend.arangerT   c                 C   r   rC   )r1  r   rU   r   r   r   rV     r   z$MLXBackend.stack_on_zeroth_dimensionc                 C   r   rC   )r1  r   rX   r   r   r   rd     rn   zMLXBackend.add_axesc                 C   r   rC   )r1  r\   re   r   r   r   r\     rn   zMLXBackend.tilerN   c                 C   r   rL   )r1  r   rf   r   r   r   rg     rS   zMLXBackend.concatc                 C   s   | j |j| j jS rC   )r1  
issubdtyper   floatingr/   r   r   r   ri     r   zMLXBackend.is_float_typec                 G   r   rC   )r1  rq   ro   r   r   r   rq     r   zMLXBackend.einsumN)rr   rs   rt   r   r   r   r0   r2   r?   r   rV   rd   r\   rx   rg   ri   rq   r   r   r   r   r-    s    r-  )r   r   )ru   r   
__author__r   r)  rw   r   r   r&   r   ry   r   r   r   r   r   r   r   r  r  r  r"  r-  r   r   r   r   <module>   s*    
+L'M'F9FE56