o
    ٷie	                     @   s   d dl mZmZmZ d dlZd dlmZ ddlmZm	Z	 ddl
mZ dZG dd	 d	eejjZG d
d de	ejjZG dd deejjZdS )    )DictOptionalcastN)apply_for_scriptable_torch   )RearrangeMixinReduceMixin)_EinmixMixinzAlex Rogozhnikovc                   @      e Zd Zdd Zdd ZdS )	Rearrangec                 C   s   | j |j }t||d| jdS )N	rearrangereduction_type	axes_dims)_multirecipendimr   _axes_lengthsselfinputrecipe r   G/home/ubuntu/.local/lib/python3.10/site-packages/einops/layers/torch.pyforward   s   zRearrange.forwardc                 C      d S Nr   r   xr   r   r   _apply_recipe      zRearrange._apply_recipeN__name__
__module____qualname__r   r   r   r   r   r   r          r   c                   @   r
   )Reducec                 C   s    | j |j }t||| j| jdS )Nr   )r   r   r   	reductionr   r   r   r   r   r      s   zReduce.forwardc                 C   r   r   r   r   r   r   r   r      r   zReduce._apply_recipeNr    r   r   r   r   r%      r$   r%   c                	   @   sF   e Zd Zdd Zdee dee dee dee fddZd	d
 ZdS )EinMixc                 C   sZ   t jjt || |dd| _|d ur(t jjt || |dd| _d S d | _d S )NT)requires_grad)torchnn	Parameterzerosuniform_weightbias)r   weight_shapeweight_bound
bias_shape
bias_boundr   r   r   _create_parameters"   s   
zEinMix._create_parameterspre_reshape_patternpre_reshape_lengthspost_reshape_patternpost_reshape_lengthsc                 C   sT   d | _ |d urt|fi tt|| _ d | _|d ur(t|fi tt|| _d S d S r   )pre_rearranger   r   dictpost_rearrange)r   r5   r6   r7   r8   r   r   r   _create_rearrange_layers-   s   zEinMix._create_rearrange_layersc                 C   sR   | j d ur
|  |}t| j|| j}| jd ur|| j7 }| jd ur'| |}|S r   )r9   r)   einsumeinsum_patternr.   r/   r;   )r   r   resultr   r   r   r   <   s   





zEinMix.forwardN)	r!   r"   r#   r4   r   strr   r<   r   r   r   r   r   r'   !   s    
r'   )typingr   r   r   r)   einops._torch_specificr    r   r   _einmixr	   
__author__r*   Moduler   r%   r'   r   r   r   r   <module>   s    

