§
    �Åjú  ã                   ó¬   — d Z 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
e
e¦  «        Z G d„ dee¦  «        Z G d„ dee¦  «        ZdS )aj  
Comment about tensorflow layers:
unfortunately instructions on creation of TF layers change constantly,
and changed way too many times at this point to remember what-compatible-where.

Layers in einops==0.7.0 (and several prior versions)
 are compatible with TF 2.13

Layers in einops==0.8.0 were re-implemented
 according to official instructions for TF 2.16

é    )ÚDictÚOptionalÚcastN)ÚLayeré   )ÚRearrangeMixinÚReduceMixin)Ú_EinmixMixinzAlex Rogozhnikovc                   ó    — e Zd Zd„ Zd„ Zd„ ZdS )Ú	Rearrangec                 ó   — d S ©N© ©ÚselfÚinput_shapes     úIC:\Projects\Historical\venv\Lib\site-packages\einops/layers/tensorflow.pyÚbuildzRearrange.build   ó   € Øˆó    c                 ó,   — |                       |¦  «        S r   ©Ú_apply_recipe©r   Úinputss     r   ÚcallzRearrange.call   ó   € Ø×!Ò! &Ñ)Ô)Ð)r   c                 ó"   — d| j         i| j        ¥S )NÚpattern)r   Úaxes_lengths©r   s    r   Ú
get_configzRearrange.get_config    s   € Ø˜4œ<Ð=¨4Ô+<Ð=Ð=r   N©Ú__name__Ú
__module__Ú__qualname__r   r   r"   r   r   r   r   r      sA   € € € € € ðð ð ð*ð *ð *ð>ð >ð >ð >ð >r   r   c                   ó    — e Zd Zd„ Zd„ Zd„ ZdS )ÚReducec                 ó   — d S r   r   r   s     r   r   zReduce.build%   r   r   c                 ó,   — |                       |¦  «        S r   r   r   s     r   r   zReduce.call(   r   r   c                 ó.   — | j         | j        dœ| j        ¥S )N)r   Ú	reduction)r   r,   r    r!   s    r   r"   zReduce.get_config+   s   € Øœ<°d´nÐZÐZÈÔHYÐZÐZr   Nr#   r   r   r   r(   r(   $   sF   € € € € € ðð ð ð*ð *ð *ð[ð [ð [ð [ð [r   r(   c            	       ón   — e Zd Zd„ Zdee         dee         dee         dee         fd„Zd„ Zd„ Z	d	„ Z
d
S )ÚEinMixc                 ó   — ||||g| _         d S r   )Ú_params)r   Úweight_shapeÚweight_boundÚ
bias_shapeÚ
bias_bounds        r   Ú_create_parameterszEinMix._create_parameters0   s   € ð % l°JÀ
ÐKˆŒˆˆr   Úpre_reshape_patternÚpre_reshape_lengthsÚpost_reshape_patternÚpost_reshape_lengthsc                 óÂ   — d | _         |�%t          |fi t          t          |¦  «        ¤Ž| _         d | _        |�'t          |fi t          t          |¦  «        ¤Ž| _        d S d S r   )Úpre_rearranger   r   ÚdictÚpost_rearrange)r   r6   r7   r8   r9   s        r   Ú_create_rearrange_layerszEinMix._create_rearrange_layers5   sv   € ð "ˆÔØÐ*Ý!*Ð+>Ð!bÐ!bÅ$ÅtÐM`ÑBaÔBaÐ!bÐ!bˆDÔà"ˆÔØÐ+Ý"+Ð,@Ð"eÐ"eÅDÍÐOcÑDdÔDdÐ"eÐ"eˆDÔÐÐð ,Ð+r   c                 óø   — | j         \  }}}}|                      |t          j        | |¦  «        d¬¦  «        | _        |�3|                      |t          j        | |¦  «        d¬¦  «        | _        d S d | _        d S )NT)ÚshapeÚinitializerÚ	trainable)r0   Ú
add_weightÚtfÚrandom_uniform_initializerÚweightÚbias)r   r   r1   r2   r3   r4   s         r   r   zEinMix.buildD   s�   € Ø?C¼|Ñ<ˆ�| Z°Ø—o’oØÝÔ5°|°mÀ\ÑRÔRØð &ñ 
ô 
ˆŒð Ð!ØŸšØ ÝÔ9¸:¸+ÀzÑRÔRØð (ñ ô ˆDŒIˆIˆIð ˆDŒIˆIˆIr   c                 óØ   — | j         �|                       |¦  «        }t          j        | j        || j        ¦  «        }| j        �
|| j        z   }| j        �|                      |¦  «        }|S r   )r;   rD   ÚeinsumÚeinsum_patternrF   rG   r=   )r   r   Úresults      r   r   zEinMix.callU   sk   € ØÔÐ)Ø×'Ò'¨Ñ/Ô/ˆFÝ”˜4Ô.°¸¼ÑDÔDˆØŒ9Ð Ø˜dœiÑ'ˆFØÔÐ*Ø×(Ò(¨Ñ0Ô0ˆFØˆr   c                 ó:   — | j         | j        | j        dœ| j        ¥S )N)r   r1   r3   )r   r1   r3   r    r!   s    r   r"   zEinMix.get_config_   s.   € à”|Ø Ô-Øœ/ð
ð 
ð Ôð	
ð 	
r   N)r$   r%   r&   r5   r   Ústrr   r>   r   r   r"   r   r   r   r.   r.   /   s¥   € € € € € ðLð Lð Lð
fà% cœ]ðfð & dœ^ðfð ' sœmð	fð
 ' tœnðfð fð fð fðð ð ð"ð ð ð
ð 
ð 
ð 
ð 
r   r.   )Ú__doc__Útypingr   r   r   Ú
tensorflowrD   Útensorflow.keras.layersr   Ú r   r	   Ú_einmixr
   Ú
__author__r   r(   r.   r   r   r   ú<module>rU      s  ððð ð (Ð 'Ð 'Ð 'Ð 'Ð 'Ð 'Ð 'Ð 'Ð 'à Ð Ð Ð Ø )Ð )Ð )Ð )Ð )Ð )à )Ð )Ð )Ð )Ð )Ð )Ð )Ð )Ø !Ð !Ð !Ð !Ð !Ð !à€
ð>ð >ð >ð >ð >� ñ >ô >ð >ð[ð [ð [ð [ð [ˆ[˜%ñ [ô [ð [ð6
ð 6
ð 6
ð 6
ð 6
ˆ\˜5ñ 6
ô 6
ð 6
ð 6
ð 6
r   