a
    d                     @   s   d dl mZmZmZ d dlZd dlmZ ddlm	Z	 ddl
mZmZ ddlmZ dd	lmZmZ d
Zeeee  dddZG dd deeZG dd deeZG dd deeZdS )    )ListOptionalDictN)Layer   )UnknownSize   )RearrangeMixinReduceMixin)_EinmixMixin)TransformRecipe _reconstruct_from_shape_uncachedzAlex Rogozhnikov)recipereturnc                 C   s4   dd |D }t | |\}}}}}dd |D }|S )Nc                 S   s"   g | ]}|d u rt  nt|qS N)r   int.0d r   a/var/www/html/stable-diffusion-webui/venv/lib/python3.9/site-packages/einops/layers/tensorflow.py
<listcomp>       z)_compute_output_shape.<locals>.<listcomp>c                 S   s"   g | ]}t |trd nt|qS r   )
isinstancer   r   r   r   r   r   r      r   )r   )r   input_shapeZinit_shapesZreduced_axesZaxes_reorderingZ
added_axesZfinal_shapeZoutput_shaper   r   r   _compute_output_shape   s
    r   c                   @   s$   e Zd Zdd Zdd Zdd ZdS )	Rearrangec                 C   s   t |  |S r   r   r   selfr   r   r   r   compute_output_shape   s    zRearrange.compute_output_shapec                 C   s
   |  |S r   Z_apply_reciper   inputsr   r   r   call   s    zRearrange.callc                 C   s   d| j i| jS )Npattern)r%   axes_lengthsr   r   r   r   
get_config   s    zRearrange.get_configN__name__
__module____qualname__r    r$   r(   r   r   r   r   r      s   r   c                   @   s$   e Zd Zdd Zdd Zdd ZdS )Reducec                 C   s   t |  |S r   r   r   r   r   r   r    "   s    zReduce.compute_output_shapec                 C   s
   |  |S r   r!   r"   r   r   r   r$   %   s    zReduce.callc                 C   s   | j | jd| jS )N)r%   	reduction)r%   r.   r&   r'   r   r   r   r(   (   s    zReduce.get_configNr)   r   r   r   r   r-   !   s   r-   c                   @   sP   e Zd Zdd Zee ee ee ee dddZdd Zdd	 Z	d
d Z
dS )EinMixc                 C   sT   t jt | ||ddd| _|d urJt jt | ||ddd| _nd | _d S )N)shapeT)Z	trainable)tfVariableZrandom_uniform_initializerweightbias)r   weight_shapeZweight_bound
bias_shapeZ
bias_boundr   r   r   _create_parameters-   s    
zEinMix._create_parameters)pre_reshape_patternpre_reshape_lengthspost_reshape_patternpost_reshape_lengthsc                 C   sD   d | _ |d ur t|fi || _ d | _|d ur@t|fi || _d S r   )pre_rearranger   post_rearrange)r   r8   r9   r:   r;   r   r   r   _create_rearrange_layers6   s    zEinMix._create_rearrange_layersc                 C   s   d S r   r   r   r   r   r   buildD   s    zEinMix.buildc                 C   sR   | j d ur|  |}t| j|| j}| jd ur:|| j }| jd urN| |}|S r   )r<   r1   ZeinsumZeinsum_patternr3   r4   r=   )r   r#   resultr   r   r   r$   G   s    





zEinMix.callc                 C   s   | j | j| jd| jS )N)r%   r5   r6   )r%   r5   r6   r&   r'   r   r   r   r(   Q   s    zEinMix.get_configN)r*   r+   r,   r7   r   strr   r>   r?   r$   r(   r   r   r   r   r/   ,   s   

r/   )typingr   r   r   Z
tensorflowr1   Ztensorflow.keras.layersr   Z	_backendsr    r	   r
   Z_einmixr   Zeinopsr   r   
__author__r   r   r   r-   r/   r   r   r   r   <module>   s   