a
    dB                     @   s   d Z ddlZddlZdZi ZdZd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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dS ) a  
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 by present but installed with errors (but never used),
      importing may drive to crashes
- backend should be either symbolic or imperative (tensorflow is for both, but that causes problems)
    - this determines which methods (from_numpy/to_numpy or create_symbol/eval_symbol) should be defined
- if backend can't (temporarily) provide symbols for shape dimensions, UnknownSize objects are used
    NzAlex RogozhnikovFAbstractBackend)returnc                 C   s   t  D ]\}}|| r|  S qg }t }|rT| }|| 7 }|| q0|D ]Z}trjtd| |j	t vrX|j	t
jv rXtrtd|j	 | }|t |j	< || rX|  S qXtdt| dS )z
    Takes a correct backend (e.g. numpy backend if tensor is numpy.ndarray) for a tensor.
    If needed, imports package and creates backend
    zTesting for subclass of zImported backend for z Tensor type unknown to einops {}N)	_backendsitemsis_appropriate_typer   __subclasses__popappend_debug_importingprintframework_namesysmodulesRuntimeErrorformattype)tensorr   backendZbackend_subclassesbackendsZBackendSubclass r   Y/var/www/html/stable-diffusion-webui/venv/lib/python3.9/site-packages/einops/_backends.pyget_backend   s*    






r   c                   @   s   e Zd 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d ZedddZdd Zdd Zdd Zd d! Zd"d# Zd$d% ZdS )&r   zL Base backend class, major part of methods are only for debugging purposes. Nc                 C   s
   t  dS )z6 helper method should recognize tensors it can handle NNotImplementedErrorselfr   r   r   r   r   ;   s    z#AbstractBackend.is_appropriate_typec                 C   s   t dd S Nz.framework doesn't support imperative executionr   r   xr   r   r   
from_numpy?   s    zAbstractBackend.from_numpyc                 C   s   t dd S r   r   r   r   r   r   to_numpyB   s    zAbstractBackend.to_numpyc                 C   s   t dd S Nz/framework doesn't support symbolic computationsr   r   shaper   r   r   create_symbolE   s    zAbstractBackend.create_symbolc                 C   s   t dd S r!   r   )r   symbol
input_dictr   r   r   eval_symbolH   s    zAbstractBackend.eval_symbolc                 C   s   t dd S )Nz"framework doesn't implement aranger   r   startstopr   r   r   arangeK   s    zAbstractBackend.arangec                 C   s   |j S )zashape should return a tuple with integers or "shape symbols" (which will evaluate to actual size))r#   r   r   r   r   r#   O   s    zAbstractBackend.shapec                 C   s
   | |S N)reshaper   r   r#   r   r   r   r-   S   s    zAbstractBackend.reshapec                 C   s
   | |S r,   )	transposer   r   axesr   r   r   r/   V   s    zAbstractBackend.transposec                 C   s   t |||dS Naxis)getattrr   r   	operationr1   r   r   r   reduceY   s    zAbstractBackend.reducetensorsc                 C   s
   t  d S r,   r   r   r:   r   r   r   stack_on_zeroth_dimension\   s    z)AbstractBackend.stack_on_zeroth_dimensionc                 C   s
   t  d S r,   r   r   r   Znew_positionr   r   r   add_axis_   s    zAbstractBackend.add_axisc                 C   s@   dg| }|  D ]\}}| ||}|||< q| |t|S )N   )r   r>   tiletupler   r   Zn_axesZpos2lenrepeatsZaxis_positionZaxis_lengthr   r   r   add_axesb   s
    

zAbstractBackend.add_axesc                 C   s
   t  dS )zrepeats is a number of  Nr   r   r   rC   r   r   r   r@   i   s    zAbstractBackend.tilec                 C   s
   t  d S r,   r   r   r   r   r   is_float_typem   s    zAbstractBackend.is_float_typec                 C   s   t dd S )Nzbackend does not provide layersr   r   r   r   r   layersr   s    zAbstractBackend.layersc                 C   s   d | jS )Nz<einops backend for {}>)r   r   rG   r   r   r   __repr__u   s    zAbstractBackend.__repr__)__name__
__module____qualname____doc__r   r   r   r    r$   r'   r+   r#   r-   r/   r8   listr<   r>   rD   r@   rF   rH   rI   r   r   r   r   r   7   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 )UnknownSizezW pseudo-symbol for symbolic frameworks which do not provide symbols for shape elements c                 C   s   | S r,   r   r   otherr   r   r   __floordiv__|   s    zUnknownSize.__floordiv__c                 C   s   dS NTr   rP   r   r   r   __eq__   s    zUnknownSize.__eq__c                 C   s   | S r,   r   rP   r   r   r   __mul__   s    zUnknownSize.__mul__c                 C   s   | S r,   r   rP   r   r   r   __rmul__   s    zUnknownSize.__rmul__c                 C   s   d   S r,   )__hash__rG   r   r   r   rW      s    zUnknownSize.__hash__N)	rJ   rK   rL   rM   rR   rT   rU   rV   rW   r   r   r   r   rO   y   s   rO   c                   @   s^   e Zd ZdZdd Zdd Zdd Zdd	 Zd
d Ze	dddZ
dd Zdd Zdd ZdS )NumpyBackendnumpyc                 C   s   dd l }|| _d S Nr   )rY   np)r   rY   r   r   r   __init__   s    zNumpyBackend.__init__c                 C   s   t || jjS r,   )
isinstancer[   ndarrayr   r   r   r   r      s    z NumpyBackend.is_appropriate_typec                 C   s   |S r,   r   r   r   r   r   r      s    zNumpyBackend.from_numpyc                 C   s   |S r,   r   r   r   r   r   r       s    zNumpyBackend.to_numpyc                 C   s   | j ||S r,   )r[   r+   r(   r   r   r   r+      s    zNumpyBackend.aranger9   c                 C   s   | j |S r,   )r[   stackr;   r   r   r   r<      s    z&NumpyBackend.stack_on_zeroth_dimensionc                 C   s   | j ||S r,   )r[   r@   rE   r   r   r   r@      s    zNumpyBackend.tilec                 C   s
   |j dv S N)float16float32float64Zfloat128dtyper   r   r   r   rF      s    zNumpyBackend.is_float_typec                 C   s   | j ||S r,   )r[   expand_dimsr=   r   r   r   r>      s    zNumpyBackend.add_axisN)rJ   rK   rL   r   r\   r   r   r    r+   rN   r<   r@   rF   r>   r   r   r   r   rX      s   rX   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   )superrg   r\   r[   onpZ	jax.numpyrY   )r   rh   	__class__r   r   r\      s    zJaxBackend.__init__c                 C   s   | j |S r,   )r[   asarrayr   r   r   r   r      s    zJaxBackend.from_numpyc                 C   s   | j |S r,   )rj   rm   r   r   r   r   r       s    zJaxBackend.to_numpy)rJ   rK   rL   r   r\   r   r    __classcell__r   r   rk   r   rg      s   rg   c                   @   sn   e Zd ZdZdd Zdd Zdd Zdd	 Zd
d Zdd Z	e
dddZdd Zdd Zdd Zdd ZdS )GluonBackendzmxnet.ndarrayc                 C   s   dd l }|| _d S rZ   mxnetmxr   rq   r   r   r   r\      s    zGluonBackend.__init__c                 C   s   t || jjjS r,   )r]   rr   ndNDArrayr   r   r   r   r      s    z GluonBackend.is_appropriate_typec                 C   s6   t |jdkr|d  }| jjj||jd}|  |S )Nr   rd   )lenr#   rr   rt   arrayre   Zattach_grad)r   r   varr   r   r   r      s
    zGluonBackend.from_numpyc                 C   s   | j jj|S r,   )rr   rt   ru   asnumpyr   r   r   r   r       s    zGluonBackend.to_numpyc                 C   s   t |dkr|S ||S rZ   )rv   r-   r.   r   r   r   r-      s    zGluonBackend.reshapec                 C   s   | j j||S r,   )rr   rt   r+   r(   r   r   r   r+      s    zGluonBackend.aranger9   c                 C   s   | j jj| S r,   )rr   rt   r_   r;   r   r   r   r<      s    z&GluonBackend.stack_on_zeroth_dimensionc                 C   s   | j j||S r,   )rr   rt   r@   rE   r   r   r   r@      s    zGluonBackend.tilec                 C   s   | j j||S r,   )rr   rt   rf   r=   r   r   r   r>      s    zGluonBackend.add_axisc                 C   s   dt |jv S Nfloat)strre   r   r   r   r   rF      s    zGluonBackend.is_float_typec                 C   s   ddl m} |S Nr?   )gluonrH   r~   r   r~   r   r   r   rH      s    zGluonBackend.layersN)rJ   rK   rL   r   r\   r   r   r    r-   r+   rN   r<   r@   r>   rF   rH   r   r   r   r   ro      s   ro   c                   @   sx   e Zd ZdZdd Zdd ZdddZd	d
 Zdd Zdd Z	dd Z
edddZdd Zdd Zdd Zdd ZdS )MXNetBackendzmxnet.symbolc                 C   s   dd l }|| _d S rZ   rp   rs   r   r   r   r\      s    zMXNetBackend.__init__c                 C   s   t || jjjS r,   )r]   rr   r%   ZSymbolr   r   r   r   r      s    z MXNetBackend.is_appropriate_typerb   c                 C   s*   t dd |D }| jjjd||d}|S )Nc                 s   s   | ]}|d u rdn|V  qd S rZ   r   .0dr   r   r   	<genexpr>       z-MXNetBackend.create_symbol.<locals>.<genexpr>input)r#   re   )rA   rr   r%   Variable)r   r#   re   rx   r   r   r   r$      s    zMXNetBackend.create_symbolc                    s<    fdd|D }|j  j |d}|  |jd  S )Nc                    s"   i | ]\}}|j  jj|qS r   )namerr   rt   rw   )r   rx   valrG   r   r   
<dictcomp>   r   z,MXNetBackend.eval_symbol.<locals>.<dictcomp>)ctxargsr   )bindrr   cpuZforwardoutputsry   )r   r%   r&   r   exr   rG   r   r'      s    zMXNetBackend.eval_symbolc                 C   s<   |  d d }t|dkr&td tdd |D }|S )Nr?   r   zLmxnet inferred shape to be (), which probably means it could not be inferredc                 s   s    | ]}|d krt  n|V  qdS )r   N)rO   r   r   r   r   r     r   z%MXNetBackend.shape.<locals>.<genexpr>)Zinfer_shape_partialrv   warningswarnrA   r.   r   r   r   r#      s
    
zMXNetBackend.shapec                 C   s@   t |dkr|S tdd |D r6ddlm} |d||S )Nr   c                 s   s   | ]}t |tV  qd S r,   )r]   rO   )r   Z	dimensionr   r   r   r     r   z'MXNetBackend.reshape.<locals>.<genexpr>)EinopsErrorzVMxnet couldn't infer all dimensions statically, please provide those with axes_lengths)rv   anyZeinopsr   r-   )r   r   r#   r   r   r   r   r-     s    zMXNetBackend.reshapec                 C   s   | j j||S r,   )rr   r%   r+   r(   r   r   r   r+     s    zMXNetBackend.aranger9   c                 C   s   | j jj| S r,   )rr   r%   r_   r;   r   r   r   r<     s    z&MXNetBackend.stack_on_zeroth_dimensionc                 C   s   | j j||S r,   )rr   r%   r@   rE   r   r   r   r@     s    zMXNetBackend.tilec                 C   s   | j j||S r,   )rr   r%   rf   r=   r   r   r   r>     s    zMXNetBackend.add_axisc                 C   s   dt | d d v S )Nr{   r?   r   )r|   Z
infer_typer   r   r   r   rF     s    zMXNetBackend.is_float_typec                 C   s   ddl m} |S r}   r   r   r   r   r   rH   "  s    zMXNetBackend.layersN)rb   )rJ   rK   rL   r   r\   r   r$   r'   r#   r-   r+   rN   r<   r@   r>   rF   rH   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
edddZ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 S rZ   r   r   r   r   r   r   r\   *  s    zTorchBackend.__init__c                 C   s   t || jjS r,   )r]   r   Tensorr   r   r   r   r   .  s    z TorchBackend.is_appropriate_typec                 C   s    | j |}| |rd|_|S rS   )r   r   rF   Zrequires_grad)r   r   variabler   r   r   r   1  s    
zTorchBackend.from_numpyc                 C   s   |    S r,   )detachr   rY   r   r   r   r   r    8  s    zTorchBackend.to_numpyc                 C   s   | j j||| j jdS )Nrd   )r   r+   int64r(   r   r   r   r+   ;  s    zTorchBackend.arangec                 C   sn   t |ddD ]\}|dkr*|j|d\}}q|dkrD|j|d\}}q|dv r^t|||d}qtd|q|S )NT)reversemin)dimmax)summeanprodzUnknown reduction )sortedr   r   r5   r   )r   r   r7   Zreduced_axesr4   _r   r   r   r8   >  s    zTorchBackend.reducec                 C   s
   | |S r,   )Zpermuter0   r   r   r   r/   J  s    zTorchBackend.transposer9   c                 C   s   | j |S r,   )r   r_   r;   r   r   r   r<   M  s    z&TorchBackend.stack_on_zeroth_dimensionc                 C   s:   dg| }|  D ]\}}| ||}|||< q||S )N)r   r>   expandrB   r   r   r   rD   P  s
    

zTorchBackend.add_axesc                 C   s
   | |S r,   )repeatrE   r   r   r   r@   W  s    zTorchBackend.tilec                 C   s   | j ||S r,   )r   Z	unsqueezer=   r   r   r   r>   Z  s    zTorchBackend.add_axisc                 C   s   |j | jj| jj| jjfv S r,   )re   r   ra   rb   rc   r   r   r   r   rF   ]  s    zTorchBackend.is_float_typec                 C   s   ddl m} |S )Nr?   r   )rH   r   r   r   r   r   rH   `  s    zTorchBackend.layersN)rJ   rK   rL   r   r\   r   r   r    r+   r8   r/   rN   r<   rD   r@   r>   rF   rH   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e	dddZ
dd Zdd Zdd ZdS )CupyBackendcupyc                 C   s   dd l }|| _ d S rZ   )r   )r   r   r   r   r   r\   h  s    zCupyBackend.__init__c                 C   s   t || jjS r,   )r]   r   r^   r   r   r   r   r   l  s    zCupyBackend.is_appropriate_typec                 C   s   | j |S r,   )r   rm   r   r   r   r   r   o  s    zCupyBackend.from_numpyc                 C   s   | j |S r,   )r   ry   r   r   r   r   r    r  s    zCupyBackend.to_numpyc                 C   s   | j ||S r,   )r   r+   r(   r   r   r   r+   u  s    zCupyBackend.aranger9   c                 C   s   | j |S r,   )r   r_   r;   r   r   r   r<   x  s    z%CupyBackend.stack_on_zeroth_dimensionc                 C   s   | j ||S r,   )r   r@   rE   r   r   r   r@   {  s    zCupyBackend.tilec                 C   s   | j ||S r,   )r   rf   r=   r   r   r   r>   ~  s    zCupyBackend.add_axisc                 C   s
   |j dv S r`   rd   r   r   r   r   rF     s    zCupyBackend.is_float_typeN)rJ   rK   rL   r   r\   r   r   r    r+   rN   r<   r@   r>   rF   r   r   r   r   r   e  s   r   c                   @   sn   e Zd ZdZdd Zdd Zdd Zdd	 Zd
d Zdd Z	e
d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 rZ   )r   rY   )r   r   rY   r   r   r   r\     s    zChainerBackend.__init__c                 C   s   t || jjS r,   )r]   r   r   r   r   r   r   r     s    z"ChainerBackend.is_appropriate_typec                 C   s   | j |dS )Nrb   )r   r   Zastyper   r   r   r   r     s    zChainerBackend.from_numpyc                 C   s   t || jjr|j}|S r,   )r]   r   r   datar   r   r   r   r      s    zChainerBackend.to_numpyc                 C   s   | j ||S r,   )rY   r+   r(   r   r   r   r+     s    zChainerBackend.arangec                 C   s   t | jj|||dS r2   )r5   r   	functionsr6   r   r   r   r8     s    zChainerBackend.reducer9   c                 C   s   | j j|S r,   )r   r   r_   r;   r   r   r   r<     s    z(ChainerBackend.stack_on_zeroth_dimensionc                 C   s   | j j||S r,   )r   r   r@   rE   r   r   r   r@     s    zChainerBackend.tilec                 C   s   | j j||S r,   )r   r   rf   r=   r   r   r   r>     s    zChainerBackend.add_axisc                 C   s
   |j dv S r`   rd   r   r   r   r   rF     s    zChainerBackend.is_float_typec                 C   s   ddl m} |S )Nr?   )r   )rH   r   )r   r   r   r   r   rH     s    zChainerBackend.layersN)rJ   rK   rL   r   r\   r   r   r    r+   r8   rN   r<   r@   r>   rF   rH   r   r   r   r   r     s   r   c                   @   s6   e Zd ZdZed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\     s    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,   )rv   r   rG   r   r   r   __len__  s    zHashableTuple.__len__c                 C   s
   | j | S r,   r   )r   itemr   r   r   __getitem__  s    zHashableTuple.__getitem__N)	rJ   rK   rL   rM   rA   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edddZdd Zdd Zdd Zdd ZdS ) TensorflowBackend
tensorflowc                 C   s   dd l }|| _d S rZ   )r   tfr   r   r   r   r   r\     s    zTensorflowBackend.__init__c                 C   s   t || jj| jjfS r,   )r]   r   r   r   r   r   r   r   r     s    z%TensorflowBackend.is_appropriate_typec                 C   s   | j  sJ | j |S r,   )r   executing_eagerlyZconvert_to_tensorr   r   r   r   r     s    zTensorflowBackend.from_numpyc                 C   s   | j  sJ | S r,   )r   r   rY   r   r   r   r   r      s    zTensorflowBackend.to_numpyc                 C   s   | j ||S r,   )r   ranger(   r   r   r   r+     s    zTensorflowBackend.arangec                    sv   | j  rtdd |jD S |j }| j | t fddt|D }zt| |W S    t| Y S 0 d S )Nc                 s   s$   | ]}|d u rt  nt|V  qd S r,   )rO   intr   r   r   r   r     r   z*TensorflowBackend.shape.<locals>.<genexpr>c                    s   g | ]\}}|p | qS r   r   )r   r   sZtf_shaper   r   
<listcomp>  r   z+TensorflowBackend.shape.<locals>.<listcomp>)r   r   rA   r#   Zas_list	enumeratehashr   )r   r   Zstatic_shaper#   r   r   r   r#     s    

zTensorflowBackend.shapec                 C   s   t | jd| ||dS )NZreduce_r3   )r5   r   r6   r   r   r   r8     s    zTensorflowBackend.reducec                 C   s   | j ||S r,   )r   r-   r.   r   r   r   r-     s    zTensorflowBackend.reshapec                 C   s   | j ||S r,   )r   r/   r0   r   r   r   r/     s    zTensorflowBackend.transposer9   c                 C   s   | j |S r,   )r   r_   r;   r   r   r   r<     s    z+TensorflowBackend.stack_on_zeroth_dimensionc                 C   s   | j ||S r,   )r   r@   rE   r   r   r   r@     s    zTensorflowBackend.tilec                 C   s   | j ||S r,   )r   rf   r=   r   r   r   r>     s    zTensorflowBackend.add_axisc                 C   s
   |j dv S r`   rd   r   r   r   r   rF     s    zTensorflowBackend.is_float_typec                 C   s   ddl m} |S )Nr?   )r   )rH   r   r   r   r   r   rH     s    zTensorflowBackend.layersN)rJ   rK   rL   r   r\   r   r   r    r+   r#   r8   r-   r/   rN   r<   r@   r>   rF   rH   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edddZdd Zdd Zdd Zdd ZdS ) KerasBackendz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KerasBackend.__init__c                 C   s   | j |o| j|S r,   )r   Z	is_tensorr   Zis_keras_tensorr   r   r   r   r     s    z KerasBackend.is_appropriate_typec                 C   s   | j j|dS )N)Zbatch_shape)r   ZInputr"   r   r   r   r$     s    zKerasBackend.create_symbolc                 C   s$   |\\}}| j j||}||S r,   )r   modelsZModelZpredict_on_batch)r   r%   r&   r   valuemodelr   r   r   r'     s    
zKerasBackend.eval_symbolc                 C   s   | j ||S r,   )r   r+   r(   r   r   r   r+     s    zKerasBackend.arangec                 C   s   | j |}tt|S r,   )r   r#   r   rA   r.   r   r   r   r#     s    zKerasBackend.shapec                 C   s   t | j|||dS r2   )r5   r   r6   r   r   r   r8     s    zKerasBackend.reducec                 C   s   | j ||S r,   )r   r-   r.   r   r   r   r-     s    zKerasBackend.reshapec                 C   s   | j ||S r,   )r   Zpermute_dimensionsr0   r   r   r   r/      s    zKerasBackend.transposer9   c                 C   s   | j |S r,   )r   r_   r;   r   r   r   r<   #  s    z&KerasBackend.stack_on_zeroth_dimensionc                 C   s   | j ||S r,   )r   r@   rE   r   r   r   r@   &  s    zKerasBackend.tilec                 C   s   | j ||S r,   )r   rf   r=   r   r   r   r>   )  s    zKerasBackend.add_axisc                 C   s   d| j |v S rz   )r   re   r   r   r   r   rF   ,  s    zKerasBackend.is_float_typec                 C   s   ddl m} |S )Nr?   )r   )rH   r   )r   r   r   r   r   rH   /  s    zKerasBackend.layersN)rJ   rK   rL   r   r\   r   r$   r'   r+   r#   r8   r-   r/   rN   r<   r@   r>   rF   rH   r   r   r   r   r     s   r   )rM   r   r   
__author__r   r
   r   r   rO   rX   rg   ro   r   r   r   r   r   r   r   r   r   r   r   <module>   s$   !B -=> +>