Ë
    éÓ^jÕƒ  ã                   ó  — d Z ddlZddlmZ ddlmZmZmZmZ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mZmZmZmZmZmZ ddlmZ dd	lmZ dd
lmZm Z m!Z! ddl"m#Z#m$Z$m%Z% ddgZ& G d„ dejN                  «      Z( G d„ dejN                  «      Z) G d„ dejN                  «      Z* G d„ dejN                  «      Z+ G d„ dejN                  «      Z, G d„ dejN                  «      Z-didejN                  de.de/de0ddf
d„Z1d„ Z2djde-fd„Z3dkdee.ef   fd „Z4 e#i d! e4«       “d" e4«       “d# e4«       “d$ e4d%d&¬'«      “d( e4d%d)d*¬+«      “d, e4«       “d- e4d%d.¬'«      “d/ e4d%d0d*¬+«      “d1 e4d%d2d3d4d5d6d7¬8«      “d9 e4d%d:d3d4d5d6¬;«      “d< e4ee¬=«      “d> e4d%d?ee¬@«      “dA e4d%dBee¬@«      “dC e4d%dDee¬@«      “dE e4d%dFee¬@«      “dG e4d%dHee¬@«      “dI e4d%dJee¬@«      “ e4d%dKee¬@«       e4d%dLee¬@«       e4d%dMee¬@«       e4d%dNee¬@«       e4d%dOee¬@«       e4d%dPee¬@«       e4«        e4d%dQ¬'«       e4«       dRœ	¥«      Z5e$djde-fdS„«       Z6e$djde-fdT„«       Z7e$djde-fdU„«       Z8e$djde-fdV„«       Z9e$djde-fdW„«       Z:e$djde-fdX„«       Z;e$djde-fdY„«       Z<e$djde-fdZ„«       Z=e$djde-fd[„«       Z>e$djde-fd\„«       Z?e$djde-fd]„«       Z@e$djde-fd^„«       ZAe$djde-fd_„«       ZBe$djde-fd`„«       ZCe$djde-fda„«       ZD e%eEd$d-d9d1dIdbdcdddedfdgdhœ«       y)luj   MLP-Mixer, ResMLP, and gMLP in PyTorch

This impl originally based on MLP-Mixer paper.

Official JAX impl: https://github.com/google-research/vision_transformer/blob/linen/vit_jax/models_mixer.py

Paper: 'MLP-Mixer: An all-MLP Architecture for Vision' - https://arxiv.org/abs/2105.01601

@article{tolstikhin2021,
  title={MLP-Mixer: An all-MLP Architecture for Vision},
  author={Tolstikhin, Ilya and Houlsby, Neil and Kolesnikov, Alexander and Beyer, Lucas and Zhai, Xiaohua and Unterthiner,
        Thomas and Yung, Jessica and Keysers, Daniel and Uszkoreit, Jakob and Lucic, Mario and Dosovitskiy, Alexey},
  journal={arXiv preprint arXiv:2105.01601},
  year={2021}
}

Also supporting ResMlp, and a preliminary (not verified) implementations of gMLP

Code: https://github.com/facebookresearch/deit
Paper: `ResMLP: Feedforward networks for image classification...` - https://arxiv.org/abs/2105.03404
@misc{touvron2021resmlp,
      title={ResMLP: Feedforward networks for image classification with data-efficient training},
      author={Hugo Touvron and Piotr Bojanowski and Mathilde Caron and Matthieu Cord and Alaaeldin El-Nouby and
        Edouard Grave and Armand Joulin and Gabriel Synnaeve and Jakob Verbeek and HervÃ© JÃ©gou},
      year={2021},
      eprint={2105.03404},
}

Paper: `Pay Attention to MLPs` - https://arxiv.org/abs/2105.08050
@misc{liu2021pay,
      title={Pay Attention to MLPs},
      author={Hanxiao Liu and Zihang Dai and David R. So and Quoc V. Le},
      year={2021},
      eprint={2105.08050},
}

A thank you to paper authors for releasing code and weights.

Hacked together by / Copyright 2021 Ross Wightman
é    N)Úpartial)ÚAnyÚDictÚListÚOptionalÚTypeÚUnionÚTuple)ÚIMAGENET_DEFAULT_MEANÚIMAGENET_DEFAULT_STD)Ú
PatchEmbedÚMlpÚGluMlpÚGatedMlpÚDropPathÚlecun_normal_Ú	to_2tupleé   )Úbuild_model_with_cfg)Úfeature_take_indices)Únamed_applyÚ
checkpointÚcheckpoint_seq)Úgenerate_default_cfgsÚregister_modelÚregister_model_deprecationsÚ
MixerBlockÚMlpMixerc                   ó,  ‡ — e Zd ZdZde eej                  d¬«      ej                  ddddfde	de	d	e
eeeef   f   d
eej                     deej                     deej                     dededdfˆ fd„Zdej"                  dej"                  fd„Zˆ xZS )r   z—Residual Block w/ token mixing and channel MLPs.

    Based on: 'MLP-Mixer: An all-MLP Architecture for Vision' - https://arxiv.org/abs/2105.01601
    ©ç      à?ç      @ç�íµ ÷Æ°>©Úepsç        NÚdimÚseq_lenÚ	mlp_ratioÚ	mlp_layerÚ
norm_layerÚ	act_layerÚdropÚ	drop_pathÚreturnc                 óX  •— |	|
dœ}t         ‰| �  «        t        |«      D �cg c]  }t        ||z  «      ‘Œ c}\  }} ||fi |¤Ž| _         |||f||dœ|¤Ž| _        |dkD  rt        |«      nt        j                  «       | _	         ||fi |¤Ž| _
         |||f||dœ|¤Ž| _        yc c}w )a’  Initialize MixerBlock.

        Args:
            dim: Dimension of input features.
            seq_len: Sequence length.
            mlp_ratio: Expansion ratios for token mixing and channel MLPs.
            mlp_layer: MLP layer class.
            norm_layer: Normalization layer.
            act_layer: Activation layer.
            drop: Dropout rate.
            drop_path: Drop path rate.
        ©ÚdeviceÚdtype©r,   r-   r&   N)ÚsuperÚ__init__r   ÚintÚnorm1Ú
mlp_tokensr   ÚnnÚIdentityr.   Únorm2Úmlp_channels)Úselfr'   r(   r)   r*   r+   r,   r-   r.   r2   r3   ÚddÚxÚ
tokens_dimÚchannels_dimÚ	__class__s                  €ú`/var/www/ramen.bs-engineer-server.com/venv/lib/python3.12/site-packages/timm/models/mlp_mixer.pyr6   zMixerBlock.__init__@   s·   ø€ ð2 ¨Ñ/ˆÜ‰ÑÔÜ:CÀIÓ:NÖ#O°Q¤C¨¨C©¥LÒ#OÑ ˆ
�LÙ Ñ* rÑ*ˆŒ
Ù# G¨ZÐ^À9ÐSWÑ^Ð[]Ñ^ˆŒØ09¸B²œ )Ô,ÄBÇKÁKÃMˆŒÙ Ñ* rÑ*ˆŒ
Ù% c¨<Ð^À9ÐSWÑ^Ð[]Ñ^ˆÕùò $Ps   ¢B'r@   c           	      ó  — || j                  | j                  | j                  |«      j                  dd«      «      j                  dd«      «      z   }|| j                  | j	                  | j                  |«      «      «      z   }|S ©úForward pass.r   é   )r.   r9   r8   Ú	transposer=   r<   ©r>   r@   s     rD   ÚforwardzMixerBlock.forwardb   sm   € à�—‘˜tŸ™¨t¯z©z¸!«}×/FÑ/FÀqÈ!Ó/LÓM×WÑWÐXYÐ[\Ó]Ó^Ñ^ˆØ�—‘˜t×0Ñ0°·±¸A³Ó?Ó@Ñ@ˆØˆó    )Ú__name__Ú
__module__Ú__qualname__Ú__doc__r   r   r:   Ú	LayerNormÚGELUr7   r	   Úfloatr
   r   ÚModuler6   ÚtorchÚTensorrK   Ú__classcell__©rC   s   @rD   r   r   ;   sà   ø„ ñð <FØ),Ù*1°"·,±,ÀDÔ*IØ)+¯©ØØ!ØØñ _àð _ð ð _ð ˜U E¨%°¨,Ñ$7Ð7Ñ8ð	 _ð
 ˜BŸI™I‘ð _ð ˜RŸY™Y™ð _ð ˜BŸI™I‘ð _ð ð _ð ð _ð 
õ _ðD˜Ÿ™ð ¨%¯,©,÷ rL   c                   óf   ‡ — e Zd ZdZddeddfˆ fd„Zdej                  dej                  fd„Zˆ xZ	S )	ÚAffinezAffine transformation layer.Nr'   r/   c                 óð   •— ||dœ}t         ‰| �  «        t        j                  t	        j
                  dd|ffi |¤Ž«      | _        t        j                  t	        j                  dd|ffi |¤Ž«      | _        y)zXInitialize Affine layer.

        Args:
            dim: Dimension of features.
        r1   r   N)	r5   r6   r:   Ú	ParameterrU   ÚonesÚalphaÚzerosÚbeta)r>   r'   r2   r3   r?   rC   s        €rD   r6   zAffine.__init__l   sb   ø€ ð ¨Ñ/ˆÜ‰ÑÔÜ—\‘\¤%§*¡*¨a°°C¨[Ñ"?¸BÑ"?Ó@ˆŒ
Ü—L‘L¤§¡¨a°°C¨[Ñ!?¸BÑ!?Ó@ˆ�	rL   r@   c                 óX   — t        j                  | j                  | j                  |«      S )zApply affine transformation.)rU   Úaddcmulr`   r^   rJ   s     rD   rK   zAffine.forwardw   s   € ä�}‰}˜TŸY™Y¨¯
©
°AÓ6Ð6rL   ©NN)
rM   rN   rO   rP   r7   r6   rU   rV   rK   rW   rX   s   @rD   rZ   rZ   i   s7   ø„ Ù&ñ	A˜Cð 	A¸Tõ 	Að7˜Ÿ™ð 7¨%¯,©,÷ 7rL   rZ   c                   óú   ‡ — e Zd ZdZdeeej                  dddddf	dedede	d	e
ej                     d
e
ej                     de
ej                     de	de	de	ddfˆ fd„Zdej                  dej                  fd„Zˆ xZS )ÚResBlockz¥Residual MLP block w/ LayerScale and Affine 'norm'.

    Based on: `ResMLP: Feedforward networks for image classification...` - https://arxiv.org/abs/2105.03404
    é   g-Cëâ6?r&   Nr'   r(   r)   r*   r+   r,   Úinit_valuesr-   r.   r/   c                 óò  •— |
|dœ}t         ‰| �  «        t        ||z  «      } ||fi |¤Ž| _        t	        j
                  ||fi |¤Ž| _        |	dkD  rt        |	«      nt	        j                  «       | _	         ||fi |¤Ž| _
         |||f||dœ|¤Ž| _        t	        j                  |t        j                  |fi |¤Žz  «      | _        t	        j                  |t        j                  |fi |¤Žz  «      | _        y)a²  Initialize ResBlock.

        Args:
            dim: Dimension of input features.
            seq_len: Sequence length.
            mlp_ratio: Channel MLP expansion ratio.
            mlp_layer: MLP layer class.
            norm_layer: Normalization layer.
            act_layer: Activation layer.
            init_values: Initial values for layer scale.
            drop: Dropout rate.
            drop_path: Drop path rate.
        r1   r&   r4   N)r5   r6   r7   r8   r:   ÚLinearÚlinear_tokensr   r;   r.   r<   r=   r\   rU   r]   Úls1Úls2)r>   r'   r(   r)   r*   r+   r,   rg   r-   r.   r2   r3   r?   Úchannel_dimrC   s                 €rD   r6   zResBlock.__init__�   sß   ø€ ð6 ¨Ñ/ˆÜ‰ÑÔÜ˜# 	™/Ó*ˆÙ Ñ* rÑ*ˆŒ
ÜŸY™Y w°Ñ>¸2Ñ>ˆÔØ09¸B²œ )Ô,ÄBÇKÁKÃMˆŒÙ Ñ* rÑ*ˆŒ
Ù% c¨;Ð]À)ÐRVÑ]ÐZ\Ñ]ˆÔÜ—<‘< ¬e¯j©j¸Ñ.CÀÑ.CÑ CÓDˆŒÜ—<‘< ¬e¯j©j¸Ñ.CÀÑ.CÑ CÓDˆ�rL   r@   c           
      óB  — || j                  | j                  | j                  | j                  |«      j	                  dd«      «      j	                  dd«      z  «      z   }|| j                  | j
                  | j                  | j                  |«      «      z  «      z   }|S rF   )r.   rk   rj   r8   rI   rl   r=   r<   rJ   s     rD   rK   zResBlock.forward§   sƒ   € à�—‘˜tŸx™x¨$×*<Ñ*<¸T¿Z¹ZÈ»]×=TÑ=TÐUVÐXYÓ=ZÓ*[×*eÑ*eÐfgÐijÓ*kÑkÓlÑlˆØ�—‘˜tŸx™x¨$×*;Ñ*;¸D¿J¹JÀq»MÓ*JÑJÓKÑKˆØˆrL   )rM   rN   rO   rP   r   rZ   r:   rR   r7   rS   r   rT   r6   rU   rV   rK   rW   rX   s   @rD   re   re   |   sÏ   ø„ ñð  !Ø),Ø*0Ø)+¯©Ø!%ØØ!ØØñ$Eàð$Eð ð$Eð ð	$Eð
 ˜BŸI™I‘ð$Eð ˜RŸY™Y™ð$Eð ˜BŸI™I‘ð$Eð ð$Eð ð$Eð ð$Eð 
õ$EðL˜Ÿ™ð ¨%¯,©,÷ rL   re   c            	       óª   ‡ — e Zd ZdZej
                  ddfdededeej                     ddfˆ fd„Z	dd„Z
d	ej                  dej                  fd
„Zˆ xZS )ÚSpatialGatingUnitzcSpatial Gating Unit.

    Based on: `Pay Attention to MLPs` - https://arxiv.org/abs/2105.08050
    Nr'   r(   r+   r/   c                 óŠ   •— ||dœ}t         ‰| �  «        |dz  } ||fi |¤Ž| _        t        j                  ||fi |¤Ž| _        y)z¸Initialize Spatial Gating Unit.

        Args:
            dim: Dimension of input features.
            seq_len: Sequence length.
            norm_layer: Normalization layer.
        r1   rH   N)r5   r6   Únormr:   ri   Úproj)	r>   r'   r(   r+   r2   r3   r?   Úgate_dimrC   s	           €rD   r6   zSpatialGatingUnit.__init__³   sK   ø€ ð ¨Ñ/ˆÜ‰ÑÔØ˜!‘8ˆÙ˜xÑ.¨2Ñ.ˆŒ	Ü—I‘I˜g wÑ5°"Ñ5ˆ�	rL   c                 óÔ   — t         j                  j                  | j                  j                  d¬«       t         j                  j                  | j                  j                  «       y)z'Initialize weights for projection gate.r#   ©ÚstdN)r:   ÚinitÚnormal_rs   ÚweightÚones_Úbias©r>   s    rD   Úinit_weightszSpatialGatingUnit.init_weightsÈ   s:   € ô 	�‰�‰˜Ÿ	™	×(Ñ(¨dˆÔ3Ü
�‰�‰�d—i‘i—n‘nÕ%rL   r@   c                 ó¼   — |j                  dd¬«      \  }}| j                  |«      }| j                  |j                  dd«      «      }||j                  dd«      z  S )zApply spatial gating.rH   éÿÿÿÿ©r'   éþÿÿÿ)Úchunkrr   rs   rI   )r>   r@   ÚuÚvs       rD   rK   zSpatialGatingUnit.forwardÎ   sT   € à�w‰w�q˜bˆwÓ!‰ˆˆ1Ø�I‰I�a‹LˆØ�I‰I�a—k‘k " bÓ)Ó*ˆØ�1—;‘;˜r 2Ó&Ñ&Ð&rL   )r/   N)rM   rN   rO   rP   r:   rQ   r7   r   rT   r6   r~   rU   rV   rK   rW   rX   s   @rD   rp   rp   ®   sj   ø„ ñð +-¯,©,ØØñ6àð6ð ð6ð ˜RŸY™Y™ð	6ð 
õ6ó*&ð'˜Ÿ™ð '¨%¯,©,÷ 'rL   rp   c                   ó  ‡ — e Zd ZdZde eej                  d¬«      ej                  ddddfde	de	d	e
d
eej                     deej                     deej                     de
de
ddfˆ fd„Zdej                  dej                  fd„Zˆ xZS )ÚSpatialGatingBlockzpResidual Block w/ Spatial Gating.

    Based on: `Pay Attention to MLPs` - https://arxiv.org/abs/2105.08050
    rf   r#   r$   r&   Nr'   r(   r)   r*   r+   r,   r-   r.   r/   c                 ó  •— |	|
dœ}t         ‰| �  «        t        ||z  «      } ||fi |¤Ž| _        t	        t
        fd|i|¤Ž} |||f|||dœ|¤Ž| _        |dkD  rt        |«      | _
        yt        j                  «       | _
        y)aƒ  Initialize SpatialGatingBlock.

        Args:
            dim: Dimension of input features.
            seq_len: Sequence length.
            mlp_ratio: Channel MLP expansion ratio.
            mlp_layer: MLP layer class.
            norm_layer: Normalization layer.
            act_layer: Activation layer.
            drop: Dropout rate.
            drop_path: Drop path rate.
        r1   r(   )r,   Ú
gate_layerr-   r&   N)r5   r6   r7   rr   r   rp   r=   r   r:   r;   r.   )r>   r'   r(   r)   r*   r+   r,   r-   r.   r2   r3   r?   rm   ÚsgurC   s                 €rD   r6   zSpatialGatingBlock.__init__Û   s›   ø€ ð2 ¨Ñ/ˆÜ‰ÑÔÜ˜# 	™/Ó*ˆÙ˜sÑ) bÑ)ˆŒ	ÜÔ'Ñ?°Ð?¸BÑ?ˆÙ%ØØð
ð  ØØñ
ð ñ
ˆÔð 1:¸B²œ )Ó,ˆ�ÄBÇKÁKÃMˆ�rL   r@   c                 ój   — || j                  | j                  | j                  |«      «      «      z   }|S ©rG   )r.   r=   rr   rJ   s     rD   rK   zSpatialGatingBlock.forward  s-   € à�—‘˜t×0Ñ0°·±¸1³Ó>Ó?Ñ?ˆØˆrL   )rM   rN   rO   rP   r   r   r:   rQ   rR   r7   rS   r   rT   r6   rU   rV   rK   rW   rX   s   @rD   r‡   r‡   Ö   sÌ   ø„ ñð  !Ø)1Ù*1°"·,±,ÀDÔ*IØ)+¯©ØØ!ØØñ&Ràð&Rð ð&Rð ð	&Rð
 ˜BŸI™I‘ð&Rð ˜RŸY™Y™ð&Rð ˜BŸI™I‘ð&Rð ð&Rð ð&Rð 
õ&RðP˜Ÿ™ð ¨%¯,©,÷ rL   r‡   c            %       ó&  ‡ — e Zd ZdZdddddddee eej                  d	¬
«      ej                  ddddddddfde
de
de
de
de
de
deeeeef   f   deej                     deej                     deej                     deej                     dedededededed df$ˆ fd!„Zej(                  j*                  d7ded dfd"„«       Zej(                  j*                  d7d#ed eeef   fd$„«       Zej(                  j*                  d8d%ed dfd&„«       Zej(                  j*                  d ej                  fd'„«       Zd9de
dee   d dfd(„Z	 	 	 	 	 d:d)ej<                  d*eee
ee
   f      d+ed,ed-ed.ed eeej<                     eej<                  eej<                     f   f   fd/„Z 	 	 	 d;d*ee
ee
   f   d0ed1ed ee
   fd2„Z!d)ej<                  d ej<                  fd3„Z"d7d)ej<                  d4ed ej<                  fd5„Z#d)ej<                  d ej<                  fd6„Z$ˆ xZ%S )<r   z„MLP-Mixer model architecture.

    Based on: 'MLP-Mixer: An all-MLP Architecture for Vision' - https://arxiv.org/abs/2105.01601
    éè  éà   é   é   é   é   r    r#   r$   r&   FÚavgNÚnum_classesÚimg_sizeÚin_chansÚ
patch_sizeÚ
num_blocksÚ	embed_dimr)   Úblock_layerr*   r+   r,   Ú	drop_rateÚproj_drop_rateÚdrop_path_rateÚnlhbÚ	stem_normÚglobal_poolr/   c                 ó(  •— t         ‰| �  «        ||dœ}|| _        || _        || _        |x| _        x| _        | _        d| _        t        d|||||r|
nddœ|¤Ž| _
        t        | j                  d«      r| j                  j                  «       n|}t        j                  t        |«      D �cg c]'  } ||| j                  j                   |f|	|
|||dœ|¤Ž‘Œ) c}Ž | _        t        |«      D �cg c]  }t%        d|› �||¬«      ‘Œ c}| _         |
|fi |¤Ž| _        t        j*                  |«      | _        |d	kD  r!t        j.                  || j                  fi |¤Žnt        j0                  «       | _        | j5                  |¬
«       yc c}w c c}w )aB  Initialize MLP-Mixer.

        Args:
            num_classes: Number of classes for classification.
            img_size: Input image size.
            in_chans: Number of input channels.
            patch_size: Patch size.
            num_blocks: Number of mixer blocks.
            embed_dim: Embedding dimension.
            mlp_ratio: MLP expansion ratio(s).
            block_layer: Block layer class.
            mlp_layer: MLP layer class.
            norm_layer: Normalization layer.
            act_layer: Activation layer.
            drop_rate: Head dropout rate.
            proj_drop_rate: Projection dropout rate.
            drop_path_rate: Drop path rate.
            nlhb: Use negative log bias initialization.
            stem_norm: Apply normalization to stem.
            global_pool: Global pooling type.
        r1   FN)r–   r˜   r—   rš   r+   Ú
feat_ratio)r*   r+   r,   r-   r.   zblocks.)ÚmoduleÚnum_chsÚ	reductionr   )rŸ   © )r5   r6   r•   r—   r¡   Únum_featuresÚhead_hidden_sizerš   Úgrad_checkpointingr   ÚstemÚhasattrr£   r:   Ú
SequentialÚrangeÚnum_patchesÚblocksÚdictÚfeature_inforr   ÚDropoutÚ	head_dropri   r;   Úheadr~   )r>   r•   r–   r—   r˜   r™   rš   r)   r›   r*   r+   r,   rœ   r�   rž   rŸ   r    r¡   r2   r3   r?   r¦   Ú_ÚirC   s                           €rD   r6   zMlpMixer.__init__  sª  ø€ ôV 	‰ÑÔØ¨Ñ/ˆØ&ˆÔØ ˆŒØ&ˆÔØENÐNˆÔÐN˜DÔ1°D´NØ"'ˆÔäð 
ØØ!ØØÙ%.‘z°Dñ
ð ñ
ˆŒ	ô /6°d·i±iÀÔ.N�D—I‘I×(Ñ(Ô*ÐT^ˆ	ä—m‘mô ˜:Ó&ö&(ð ñ ØØ—	‘	×%Ñ%Øð
ð $Ø%Ø#Ø#Ø(ñ
ð ó
ò&(ð )ˆŒô Y^Ð^hÓXiökØSTŒD˜' ! ˜¨yÀIÖNòkˆÔá˜yÑ/¨BÑ/ˆŒ	ÜŸ™ IÓ.ˆŒØDOÐRSÂO”B—I‘I˜i¨×)9Ñ)9Ñ@¸RÒ@ÔY[×YdÑYdÓYfˆŒ	à×Ñ˜tÐÕ$ùò'&(ùòks   Â.,F
Ã0Fc                 ó„   — |r t        j                  | j                  «       nd}t        t	        t
        |¬«      | ¬«       y)zrInitialize model weights.

        Args:
            nlhb: Use negative log bias initialization for head.
        r&   )Ú	head_bias)r¤   N)ÚmathÚlogr•   r   r   Ú_init_weights)r>   rŸ   r¹   s      rD   r~   zMlpMixer.init_weightsa  s0   € ñ 48”T—X‘X˜d×.Ñ.Ó/Ñ/¸Rˆ	Ü”GœM°YÔ?ÈÖMrL   Úcoarsec                 ó    — t        dddg¬«      S )z¾Create regex patterns for parameter grouping.

        Args:
            coarse: Use coarse grouping.

        Returns:
            Dictionary mapping group names to regex patterns.
        z^stem)z^blocks\.(\d+)N)z^norm)iŸ† )r«   r°   )r±   )r>   r½   s     rD   Úgroup_matcherzMlpMixer.group_matcherk  s   € ô ØØ-Ð/CÐDô
ð 	
rL   Úenablec                 ó   — || _         y)zEnable or disable gradient checkpointing.

        Args:
            enable: Whether to enable gradient checkpointing.
        N)rª   )r>   rÀ   s     rD   Úset_grad_checkpointingzMlpMixer.set_grad_checkpointingz  s   € ð #)ˆÕrL   c                 ó   — | j                   S )zGet the classifier module.)rµ   r}   s    rD   Úget_classifierzMlpMixer.get_classifierƒ  s   € ð �y‰yÐrL   c                 ón  — || _         |�|dv sJ ‚|| _        | j                  j                  j                  t        | j                  d«      r | j                  j                  j                  nd}}|dkD  r)t        j                  | j                  |||¬«      | _        yt        j                  «       | _        y)zŸReset the classifier head.

        Args:
            num_classes: Number of classes for new classifier.
            global_pool: Global pooling type.
        N)Ú r”   rz   rc   r   r1   )r•   r¡   rµ   rz   r2   r¬   r3   r:   ri   rš   r;   )r>   r•   r¡   r2   r3   s        rD   Úreset_classifierzMlpMixer.reset_classifierˆ  s˜   € ð 'ˆÔØÐ"Ø +Ñ-Ð-Ð-Ø*ˆDÔØŸ	™	×(Ñ(×/Ñ/Ì7ÐSW×S\ÑS\Ð^fÔKg°·±×1AÑ1A×1GÒ1GÐmy�ˆØZeÐhiÒZi”B—I‘I˜dŸn™n¨kÀ&ÐPUÔVˆ�	Ôoq×ozÑozÓo|ˆ�	rL   r@   Úindicesrr   Ú
stop_earlyÚ
output_fmtÚintermediates_onlyc           	      ó$  — |dv sJ d«       ‚|dk(  }g }t        t        | j                  «      |«      \  }	}
|j                  \  }}}}| j	                  |«      }t
        j                  j                  «       s|s| j                  }n| j                  d|
dz    }t        |«      D ]m  \  }}| j                  r+t
        j                  j                  «       st        ||«      }n ||«      }||	v sŒJ|j                  |r| j                  |«      n|«       Œo |ra| j                  j                  ||f«      \  }}|D �cg c]6  }|j                  |||d«      j                  dddd	«      j!                  «       ‘Œ8 }}|r|S | j                  |«      }||fS c c}w )
aV  Forward features that returns intermediates.

        Args:
            x: Input image tensor.
            indices: Take last n blocks if int, all if None, select matching indices if sequence.
            norm: Apply norm layer to all intermediates.
            stop_early: Stop iterating over blocks when last desired intermediate hit.
            output_fmt: Shape of intermediate feature outputs ('NCHW' or 'NLC').
            intermediates_only: Only return intermediate features.

        Returns:
            List of intermediate features or tuple of (final features, intermediates).
        )ÚNCHWÚNLCz)Output format must be one of NCHW or NLC.rÍ   Nr   r€   r   r�   rH   )r   Úlenr°   Úshaper«   rU   ÚjitÚis_scriptingÚ	enumeraterª   r   Úappendrr   Údynamic_feat_sizeÚreshapeÚpermuteÚ
contiguous)r>   r@   rÈ   rr   rÉ   rÊ   rË   rÖ   ÚintermediatesÚtake_indicesÚ	max_indexÚBr¶   ÚheightÚwidthr°   r·   ÚblkÚHÚWÚys                        rD   Úforward_intermediateszMlpMixer.forward_intermediates–  s  € ð, ˜_Ñ,ÐYÐ.YÓYÐ,Ø Ñ&ˆØˆÜ"6´s¸4¿;¹;Ó7GÈÓ"QÑˆ�ið  Ÿg™gÑˆˆ1ˆf�eØ�I‰I�a‹Lˆä�9‰9×!Ñ!Ô#©:Ø—[‘[‰Fà—[‘[  )¨a¡-Ð0ˆFÜ Ó'ò 	B‰FˆAˆsØ×&Ò&¬u¯y©y×/EÑ/EÔ/GÜ˜s AÓ&‘á˜“F�Ø�LÒ à×$Ñ$±T T§Y¡Y¨q¤\¸qÕAð	Bñ à—9‘9×.Ñ.°¸¨Ó?‰DˆAˆqØ^kÖlÐYZ˜QŸY™Y q¨!¨Q°Ó3×;Ñ;¸A¸qÀ!ÀQÓG×RÑRÕTÐlˆMÐláØ Ð à�I‰I�a‹Lˆà�-ÐÐùò ms   Ä7;FÚ
prune_normÚ
prune_headc                 óÖ   — t        t        | j                  «      |«      \  }}| j                  d|dz    | _        |rt        j                  «       | _        |r| j                  dd«       |S )aE  Prune layers not required for specified intermediates.

        Args:
            indices: Indices of intermediate layers to keep.
            prune_norm: Whether to prune normalization layer.
            prune_head: Whether to prune the classifier head.

        Returns:
            List of indices that were kept.
        Nr   r   rÆ   )r   rÏ   r°   r:   r;   rr   rÇ   )r>   rÈ   rä   rå   rÚ   rÛ   s         rD   Úprune_intermediate_layersz"MlpMixer.prune_intermediate_layersÏ  s]   € ô  #7´s¸4¿;¹;Ó7GÈÓ"QÑˆ�iØ—k‘k . 9¨q¡=Ð1ˆŒÙÜŸ™›ˆDŒIÙØ×!Ñ! ! RÔ(ØÐrL   c                 óî   — | j                  |«      }| j                  r5t        j                  j	                  «       st        | j                  |«      }n| j                  |«      }| j                  |«      }|S )z/Forward pass through feature extraction layers.)r«   rª   rU   rÑ   rÒ   r   r°   rr   rJ   s     rD   Úforward_featureszMlpMixer.forward_featuresç  sV   € à�I‰I�a‹LˆØ×"Ò"¬5¯9©9×+AÑ+AÔ+CÜ˜tŸ{™{¨AÓ.‰Aà—‘˜A“ˆAØ�I‰I�a‹LˆØˆrL   Ú
pre_logitsc                 ó�   — | j                   dk(  r|j                  d¬«      }| j                  |«      }|r|S | j                  |«      S )zÊForward pass through classifier head.

        Args:
            x: Feature tensor.
            pre_logits: Return features before final classifier.

        Returns:
            Output tensor.
        r”   r   r�   )r¡   Úmeanr´   rµ   )r>   r@   rê   s      rD   Úforward_headzMlpMixer.forward_headñ  sD   € ð ×Ñ˜uÒ$Ø—‘˜1�“ˆAØ�N‰N˜1ÓˆÙˆqÐ0 D§I¡I¨a£LÐ0rL   c                 óJ   — | j                  |«      }| j                  |«      }|S rŒ   )ré   rí   rJ   s     rD   rK   zMlpMixer.forward   s'   € à×!Ñ! !Ó$ˆØ×Ñ˜aÓ ˆØˆrL   ©F)T)N)NFFrÍ   F)r   FT)&rM   rN   rO   rP   r   r   r   r:   rQ   rR   r7   r	   rS   r
   r   rT   ÚboolÚstrr6   rU   rÑ   Úignorer~   r   r   r¿   rÂ   rÄ   r   rÇ   rV   r   rã   rç   ré   rí   rK   rW   rX   s   @rD   r   r   	  sf  ø„ ñð  $ØØØ ØØ Ø;EØ+5Ø),Ù*1°"·,±,ÀDÔ*IØ)+¯©Ø!Ø$&Ø$&ØØ#Ø$ØØñ)P%àðP%ð ðP%ð ð	P%ð
 ðP%ð ðP%ð ðP%ð ˜U E¨%°¨,Ñ$7Ð7Ñ8ðP%ð ˜bŸi™i™ðP%ð ˜BŸI™I‘ðP%ð ˜RŸY™Y™ðP%ð ˜BŸI™I‘ðP%ð ðP%ð "ðP%ð "ðP%ð  ð!P%ð" ð#P%ð$ ð%P%ð* 
õ+P%ðd ‡Y�Y×ÑñN ð N°$ò Nó ðNð ‡Y�Y×Ññ
 Dð 
°T¸#¸s¸(±^ò 
ó ð
ð ‡Y�Y×Ññ)¨Tð )¸Tò )ó ð)ð ‡Y�Y×Ñð §	¡	ò ó ðñ}¨Cð }¸hÀs¹mð }ÐW[ó }ð" 8<ØØ$Ø$Ø',ñ7 à�|‰|ð7 ð ˜e C¨¨c© NÑ3Ñ4ð7 ð ð	7 ð
 ð7 ð ð7 ð !%ð7 ð 
ˆt�E—L‘LÑ! 5¨¯©°t¸E¿L¹LÑ7IÐ)IÑ#JÐJÑ	Kó7 ðv ./Ø$Ø#ñ	à˜3  S¡	˜>Ñ*ðð ðð ð	ð
 
ˆc‰óð0 %§,¡,ð °5·<±<ó ñ1˜eŸl™lð 1¸ð 1ÈÏÉó 1ð˜Ÿ™ð ¨%¯,©,÷ rL   r¤   Únamer¹   Úflaxr/   c                 óÞ  — t        | t        j                  «      �rC|j                  d«      rTt        j                  j                  | j                  «       t        j                  j                  | j                  |«       y|rKt        | j                  «       | j                  �ºt        j                  j                  | j                  «       yt        j                  j                  | j                  «       | j                  �Zd|v r,t        j                  j                  | j                  d¬«       yt        j                  j                  | j                  «       yyyt        | t        j                  «      rLt        | j                  «       | j                  �*t        j                  j                  | j                  «       yyt        | t        j                  t        j                  t        j                  f«      rSt        j                  j!                  | j                  «       t        j                  j                  | j                  «       yt#        | d«      r| j%                  «        yy)zèMixer weight initialization (trying to match Flax defaults).

    Args:
        module: Module to initialize.
        name: Module name.
        head_bias: Bias value for head layer.
        flax: Use Flax-style initialization.
    rµ   NÚmlpr#   rv   r~   )Ú
isinstancer:   ri   Ú
startswithrx   Úzeros_rz   Ú	constant_r|   r   Úxavier_uniform_ry   ÚConv2drQ   ÚBatchNorm2dÚ	GroupNormr{   r¬   r~   )r¤   ró   r¹   rô   s       rD   r¼   r¼     sw  € ô �&œ"Ÿ)™)Õ$Ø�?‰?˜6Ô"Ü�G‰G�N‰N˜6Ÿ=™=Ô)Ü�G‰G×Ñ˜fŸk™k¨9Õ5áä˜fŸm™mÔ,Ø—;‘;Ð*Ü—G‘G—N‘N 6§;¡;Õ/ô —‘×'Ñ'¨¯©Ô6Ø—;‘;Ð*Ø ‘}ÜŸ™Ÿ™¨¯©¸˜Õ>äŸ™Ÿ™ v§{¡{Õ3ð	 +ð +ô 
�FœBŸI™IÔ	&Ü�f—m‘mÔ$Ø�;‰;Ð"Ü�G‰G�N‰N˜6Ÿ;™;Õ'ð #ä	�FœRŸ\™\¬2¯>©>¼2¿<¹<ÐHÔ	IÜ
�‰�‰�f—m‘mÔ$Ü
�‰�‰�v—{‘{Õ#Ü	�˜Ô	(ð 	×ÑÕð 
)rL   c                 óJ  — d| v rži }| j                  «       D ]‡  \  }}|j                  dd«      }|j                  dd«      }|j                  dd«      }|j                  dd	«      }|j                  d
«      s|j                  d«      r|j                  ddd«      }|||<   Œ‰ |S | S )z Remap checkpoints if needed zpatch_embed.proj.weightzpatch_embed.zstem.zattn.zlinear_tokens.zmlp.zmlp_channels.Úgamma_Úlsz.alphaz.betar   r€   )ÚitemsÚreplaceÚendswithrÖ   )Ú
state_dictÚmodelÚout_dictÚkr…   s        rD   Úcheckpoint_filter_fnr	  /  s«   € à  JÑ.àˆØ×$Ñ$Ó&ò 	‰DˆAˆqØ—	‘	˜.¨'Ó2ˆAØ—	‘	˜'Ð#3Ó4ˆAØ—	‘	˜& /Ó2ˆAØ—	‘	˜( DÓ)ˆAØ�z‰z˜(Ô# q§z¡z°'Ô':Ø—I‘I˜a  BÓ'�ØˆH�QŠKð	ð ˆØÐrL   c                 ór   — |j                  dd«      }t        t        | |ft        t	        |d¬«      dœ|¤Ž}|S )NÚout_indicesr�   Úgetter)r  Úfeature_cls)Úpretrained_filter_fnÚfeature_cfg)Úpopr   r   r	  r±   )ÚvariantÚ
pretrainedÚkwargsr  r  s        rD   Ú_create_mixerr  @  sJ   € Ø—*‘*˜]¨AÓ.€KÜ ÜØØðô 2Ü [¸hÔGñð ñ€Eð €LrL   c                 ó$   — | ddd dddddddd	d
œ|¥S )NrŽ   )r�   r�   r�   ç      ì?ÚbicubicT)r!   r!   r!   z	stem.projrµ   z
apache-2.0)Úurlr•   Ú
input_sizeÚ	pool_sizeÚcrop_pctÚinterpolationÚfixed_input_sizerì   rw   Ú
first_convÚ
classifierÚlicenser§   )r  r  s     rD   Ú_cfgr!  M  s4   € àØ¨=ÀtØ¨IÈ4Ø¨Ø!°Øñð ðð rL   zmixer_s32_224.untrainedzmixer_s16_224.untrainedzmixer_b32_224.untrainedz mixer_b16_224.goog_in21k_ft_in1kztimm/zlhttps://github.com/rwightman/pytorch-image-models/releases/download/v0.1-vitjx/jx_mixer_b16_224-76587d61.pth)Ú	hf_hub_idr  zmixer_b16_224.goog_in21kzrhttps://github.com/rwightman/pytorch-image-models/releases/download/v0.1-vitjx/jx_mixer_b16_224_in21k-617b3de2.pthiSU  )r"  r  r•   zmixer_l32_224.untrainedz mixer_l16_224.goog_in21k_ft_in1kzlhttps://github.com/rwightman/pytorch-image-models/releases/download/v0.1-vitjx/jx_mixer_l16_224-92f9adc4.pthzmixer_l16_224.goog_in21kzrhttps://github.com/rwightman/pytorch-image-models/releases/download/v0.1-vitjx/jx_mixer_l16_224_in21k-846aa33c.pthzmixer_b16_224.miil_in21kzvhttps://github.com/rwightman/pytorch-image-models/releases/download/v0.1-tresnet/mixer_b16_224_miil_in21k-2a558a71.pth)r&   r&   r&   )ç      ð?r#  r#  r  ÚbilineariÕ+  )r"  r  rì   rw   r  r  r•   z mixer_b16_224.miil_in21k_ft_in1kzphttps://github.com/rwightman/pytorch-image-models/releases/download/v0.1-tresnet/mixer_b16_224_miil-9229a591.pth)r"  r  rì   rw   r  r  zgmixer_12_224.untrained)rì   rw   zgmixer_24_224.ra3_in1kzohttps://github.com/rwightman/pytorch-image-models/releases/download/v0.1-weights/gmixer_24_224_raa-7daf7ae6.pth)r"  r  rì   rw   zresmlp_12_224.fb_in1kz9https://dl.fbaipublicfiles.com/deit/resmlp_12_no_dist.pthzresmlp_24_224.fb_in1kz9https://dl.fbaipublicfiles.com/deit/resmlp_24_no_dist.pthzresmlp_36_224.fb_in1kz9https://dl.fbaipublicfiles.com/deit/resmlp_36_no_dist.pthzresmlp_big_24_224.fb_in1kz:https://dl.fbaipublicfiles.com/deit/resmlpB_24_no_dist.pthzresmlp_12_224.fb_distilled_in1kz6https://dl.fbaipublicfiles.com/deit/resmlp_12_dist.pthz6https://dl.fbaipublicfiles.com/deit/resmlp_24_dist.pthz6https://dl.fbaipublicfiles.com/deit/resmlp_36_dist.pthz7https://dl.fbaipublicfiles.com/deit/resmlpB_24_dist.pthz6https://dl.fbaipublicfiles.com/deit/resmlpB_24_22k.pthz6https://dl.fbaipublicfiles.com/deit/resmlp_12_dino.pthz6https://dl.fbaipublicfiles.com/deit/resmlp_24_dino.pthznhttps://github.com/rwightman/pytorch-image-models/releases/download/v0.1-weights/gmlp_s16_224_raa-10536d42.pth)	úresmlp_24_224.fb_distilled_in1kúresmlp_36_224.fb_distilled_in1kú#resmlp_big_24_224.fb_distilled_in1kú"resmlp_big_24_224.fb_in22k_ft_in1kzresmlp_12_224.fb_dinozresmlp_24_224.fb_dinozgmlp_ti16_224.untrainedzgmlp_s16_224.ra3_in1kzgmlp_b16_224.untrainedc                 ó>   — t        dddddœ|¤Ž}t        dd| i|¤Ž}|S )zv Mixer-S/32 224x224
    Paper: 'MLP-Mixer: An all-MLP Architecture for Vision' - https://arxiv.org/abs/2105.01601
    é    r’   r“   ©r˜   r™   rš   r  r§   )Úmixer_s32_224©r±   r  ©r  r  Ú
model_argsr  s       rD   r,  r,  ½  ó1   € ô
 ÐK °¸SÑKÀFÑK€JÜÑO°jÐOÀJÑO€EØ€LrL   c                 ó>   — t        dddddœ|¤Ž}t        dd| i|¤Ž}|S )zw Mixer-S/16 224x224
    Paper:  'MLP-Mixer: An all-MLP Architecture for Vision' - https://arxiv.org/abs/2105.01601
    r‘   r’   r“   r+  r  r§   )Úmixer_s16_224r-  r.  s       rD   r2  r2  Ç  r0  rL   c                 ó>   — t        dddddœ|¤Ž}t        dd| i|¤Ž}|S )zw Mixer-B/32 224x224
    Paper:  'MLP-Mixer: An all-MLP Architecture for Vision' - https://arxiv.org/abs/2105.01601
    r*  é   é   r+  r  r§   )Úmixer_b32_224r-  r.  s       rD   r6  r6  Ñ  ó1   € ô
 ÐL °¸cÑLÀVÑL€JÜÑO°jÐOÀJÑO€EØ€LrL   c                 ó>   — t        dddddœ|¤Ž}t        dd| i|¤Ž}|S )z˜ Mixer-B/16 224x224. ImageNet-1k pretrained weights.
    Paper:  'MLP-Mixer: An all-MLP Architecture for Vision' - https://arxiv.org/abs/2105.01601
    r‘   r4  r5  r+  r  r§   )Úmixer_b16_224r-  r.  s       rD   r9  r9  Û  r7  rL   c                 ó>   — t        dddddœ|¤Ž}t        dd| i|¤Ž}|S )zx Mixer-L/32 224x224.
    Paper:  'MLP-Mixer: An all-MLP Architecture for Vision' - https://arxiv.org/abs/2105.01601
    r*  é   é   r+  r  r§   )Úmixer_l32_224r-  r.  s       rD   r=  r=  å  ó1   € ô
 ÐM °¸dÑMÀfÑM€JÜÑO°jÐOÀJÑO€EØ€LrL   c                 ó>   — t        dddddœ|¤Ž}t        dd| i|¤Ž}|S )z˜ Mixer-L/16 224x224. ImageNet-1k pretrained weights.
    Paper:  'MLP-Mixer: An all-MLP Architecture for Vision' - https://arxiv.org/abs/2105.01601
    r‘   r;  r<  r+  r  r§   )Úmixer_l16_224r-  r.  s       rD   r@  r@  ï  r>  rL   c           
      óh   — t        dddddt        t        j                  dœ|¤Ž}t	        dd| i|¤Ž}|S )	zV Glu-Mixer-12 224x224
    Experiment by Ross Wightman, adding SwiGLU to MLP-Mixer
    r‘   r4  é€  ©r#  r"   ©r˜   r™   rš   r)   r*   r,   r  r§   )Úgmixer_12_224©r±   r   r:   ÚSiLUr  r.  s       rD   rE  rE  ù  óF   € ô
 ð 7Ø "°¸zÜ¤B§G¡Gñ7à/5ñ7€Jô ÑO°jÐOÀJÑO€EØ€LrL   c           
      óh   — t        dddddt        t        j                  dœ|¤Ž}t	        dd| i|¤Ž}|S )	zV Glu-Mixer-24 224x224
    Experiment by Ross Wightman, adding SwiGLU to MLP-Mixer
    r‘   r;  rB  rC  rD  r  r§   )Úgmixer_24_224rF  r.  s       rD   rJ  rJ    rH  rL   c           
      óT   — t        dddddt        t        dœ|¤Ž}t        dd| i|¤Ž}|S )	zx ResMLP-12
    Paper: `ResMLP: Feedforward networks for image classification...` - https://arxiv.org/abs/2105.03404
    r‘   r4  rB  rf   ©r˜   r™   rš   r)   r›   r+   r  r§   )Úresmlp_12_224)r±   re   rZ   r  r.  s       rD   rM  rM    sC   € ô
 ð uØ "°¸qÌhÔciñuØmsñu€JäÑO°jÐOÀJÑO€EØ€LrL   c                 ój   — t        d	ddddt        t        d¬«      t        dœ|¤Ž}t	        d
d| i|¤Ž}|S )zx ResMLP-24
    Paper: `ResMLP: Feedforward networks for image classification...` - https://arxiv.org/abs/2105.03404
    r‘   r;  rB  rf   gñhãˆµøä>©rg   rL  r  r§   )Úresmlp_24_224©r±   r   re   rZ   r  r.  s       rD   rP  rP    óL   € ô
 ð VØ "°¸qÜœH°$Ô7ÄFñVàNTñV€Jô ÑO°jÐOÀJÑO€EØ€LrL   c                 ój   — t        d	ddddt        t        d¬«      t        dœ|¤Ž}t	        d
d| i|¤Ž}|S )zx ResMLP-36
    Paper: `ResMLP: Feedforward networks for image classification...` - https://arxiv.org/abs/2105.03404
    r‘   é$   rB  rf   r#   rO  rL  r  r§   )Úresmlp_36_224rQ  r.  s       rD   rU  rU  (  rR  rL   c                 ój   — t        d	ddddt        t        d¬«      t        dœ|¤Ž}t	        d
d| i|¤Ž}|S )zz ResMLP-B-24
    Paper: `ResMLP: Feedforward networks for image classification...` - https://arxiv.org/abs/2105.03404
    r’   r;  r5  rf   r#   rO  rL  r  r§   )Úresmlp_big_24_224rQ  r.  s       rD   rW  rW  4  sL   € ô
 ð VØ ¨s¸aÜœH°$Ô7ÄFñVàNTñV€Jô ÑS¸*ÐSÈ
ÑS€EØ€LrL   c           
      óT   — t        dddddt        t        dœ|¤Ž}t        dd| i|¤Ž}|S )	zU gMLP-Tiny
    Paper: `Pay Attention to MLPs` - https://arxiv.org/abs/2105.08050
    r‘   é   é€   é   ©r˜   r™   rš   r)   r›   r*   r  r§   )Úgmlp_ti16_224©r±   r‡   r   r  r.  s       rD   r]  r]  @  sC   € ô
 ð &Ø "°¸qÔN`Üñ&à$ñ&€Jô ÑO°jÐOÀJÑO€EØ€LrL   c           
      óT   — t        dddddt        t        dœ|¤Ž}t        dd| i|¤Ž}|S )	zV gMLP-Small
    Paper: `Pay Attention to MLPs` - https://arxiv.org/abs/2105.08050
    r‘   rY  é   r[  r\  r  r§   )Úgmlp_s16_224r^  r.  s       rD   ra  ra  L  óC   € ô
 ð &Ø "°¸qÔN`Üñ&à$ñ&€Jô ÑN°ZÐNÀ:ÑN€EØ€LrL   c           
      óT   — t        dddddt        t        dœ|¤Ž}t        dd| i|¤Ž}|S )	zU gMLP-Base
    Paper: `Pay Attention to MLPs` - https://arxiv.org/abs/2105.08050
    r‘   rY  r“   r[  r\  r  r§   )Úgmlp_b16_224r^  r.  s       rD   rd  rd  X  rb  rL   r%  r&  r'  r(  rM  rP  )Úmixer_b16_224_in21kÚmixer_l16_224_in21kÚmixer_b16_224_miilÚmixer_b16_224_miil_in21kÚresmlp_12_distilled_224Úresmlp_24_distilled_224Úresmlp_36_distilled_224Úresmlp_big_24_distilled_224Úresmlp_big_24_224_in22ft1kÚresmlp_12_224_dinoÚresmlp_24_224_dino)r&   Frï   )rÆ   )FrP   rº   Ú	functoolsr   Útypingr   r   r   r   r   r	   r
   rU   Útorch.nnr:   Ú	timm.datar   r   Útimm.layersr   r   r   r   r   r   r   Ú_builderr   Ú	_featuresr   Ú_manipulater   r   r   Ú	_registryr   r   r   Ú__all__rT   r   rZ   re   rp   r‡   r   rñ   rS   rð   r¼   r	  r  r!  Údefault_cfgsr,  r2  r6  r9  r=  r@  rE  rJ  rM  rP  rU  rW  r]  ra  rd  rM   r§   rL   rD   ú<module>r{     sK  ðñ'óP Ý ß @× @Ñ @ã Ý ç Aß ]× ]Ñ ]å *Ý +ß @Ñ @ß YÑ Yà˜Ð
$€ô+�—‘ô +ô\7ˆR�Y‰Yô 7ô&/ˆr�y‰yô /ôd%'˜Ÿ	™	ô %'ôP0˜Ÿ™ô 0ôf{ˆr�y‰yô {ñ|%˜"Ÿ)™)ð %¨3ð %¸5ð %ÈTð %Ð^bó %òPñ"
¸(ó 
ñ	˜d 3¨ 8™nó 	ñ %ð a&Ø™t›vða&à™t›vða&ð ™t›vða&ð '©ØØzô)ð	a&ð ¡Øð AØô!ða&ð ™t›vða&ð '©ØØzô)ða&ð$ ¡Øð AØô!ð%a&ð2 ¡Øð EØ˜|°eÈ:Ðchô!ð3a&ð< '©ØØ~Ø˜|°eÈ:ô)ð=a&ðH ™tÐ)>ÐDXÔYðIa&ðJ ™dØØ}Ø"Ð(<ô>ðKa&ðT ™TØØGØ"Ð(<ô>ðUa&ð\ ™TØØGà"Ð(<ô	>ð]a&ðf ™TØØGØ"Ð(<ô>ðga&ðn  ¡ØØHØ"Ð(<ô">ðoa&ðx &¡tØØDØ"Ð(<ô(>ðya&ñ@ (,ØØDØ"Ð(<ô(>ñ (,ØØDØ"Ð(<ô(>ñ ,0ØØEØ"Ð(<ô,>ñ
 +/ØØDØ"Ð(<ô+>ñ
 "ØØDØ"Ð(<ô>ñ "ØØDØ"Ð(<ô>ñ
  $›vÙ!ØØ|ôñ #›fòAa&ó a€ðH ñ°ò ó ðð ñ°ò ó ðð ñ°ò ó ðð ñ°ò ó ðð ñ°ò ó ðð ñ°ò ó ðð ñ°ò ó ðð ñ°ò ó ðð ñ°ò ó ðð ñ°ò ó ðð ñ°ò ó ðð ñ°Xò ó ðð ñ°ò ó ðð ñ°ò ó ðð ñ°ò ó ðñ ˜HØ=Ø=Ø<Ø :Ø@Ø@Ø@Ø#HØ"FØ)Ø)ñ'õ rL   