§
    ’Þjye  ã            
       ó  — d dl Z d dlmZ d dl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mZ d dlmZ 	 	 	 	 d6dedededz  dedz  fd„Z G d„ dej        ¦  «        Z G d„ dej        ¦  «        Zd7dedefd„Z G d„ dej        ¦  «        Z G d„ dej        j        ¦  «        Z G d„ dej        j        ¦  «        Zd„ Zd „ Zd!„ Z G d"„ d#ej        ¦  «        Ze G d$„ d%¦  «        ¦   «         Z G d&„ d'e¦  «        Z G d(„ d)ej        ¦  «        Z G d*„ d+ej        ¦  «        Z  G d,„ d-ej        ¦  «        Z! G d.„ d/ej        ¦  «        Z" G d0„ d1ej        ¦  «        Z# G d2„ d3ej        ¦  «        Z$ G d4„ d5ej        j        ¦  «        Z%dS )8é    N)Ú	dataclass)Ú	rearrange)ÚTensorÚnn)Úattention_kité   )Úapply_rope_Ú	attentionÚrope)Úopsé   ç      @Úhidden_sizeÚ	mlp_ratioÚsingle_linear1_mlp_ratioÚlinear1_mlp_ratioc                 ó¼   — t          | |z  ¦  «        }|€|dk    r|dz  }n|�|n|}t          | |�|n|z  ¦  «        }g d¢| | | gdœg d¢| | | |gdœg d¢| | | gdœdœ}|S )Nç      @r   )ÚqÚkÚv)Úmapped_modulesÚsplit_sizes)Úlinear1_attn_qÚlinear1_attn_kÚlinear1_attn_vÚlinear1_mlp)r   r   r   )ÚqkvÚlinear1Úlinear1_qkv)Úint)r   r   r   r   Úmlp_hidden_dimÚ
lin1_ratioÚlin1_mlpÚsplit_linear_modules_maps           úBC:\Users\johnn\OneDrive\Documents\AI\models\flux\modules\layers.pyÚget_linear_split_mapr'      sÌ   € õ ˜ yÑ0Ñ1Ô1€NØÐ  Y°#Ò%5Ð%5Ø ‘]ˆ
ˆ
à*;Ð*GÐ&Ð&ÈYˆ
Ý�;Ð>VÐ>bÐ":Ð":ÐhrÑsÑtÔt€Hà"1 / /À;ÐP[Ð]hÐBiÐjÐjàcÐcÐcØ'¨°kÀ8ÐLð
ð 
ð
 UÐTÐTØ'¨°kÐBð
ð 
ð
 ð 
 Ðð $Ð#ó    c                   óH   ‡ — e Zd Zdededee         fˆ fd„Zdedefd„Zˆ xZS )ÚEmbedNDÚdimÚthetaÚaxes_dimc                 ór   •— t          ¦   «                              ¦   «          || _        || _        || _        d S ©N©ÚsuperÚ__init__r+   r,   r-   ©Úselfr+   r,   r-   Ú	__class__s       €r&   r2   zEmbedND.__init__*   ó2   ø€ Ý‰Œ×ÒÑÔÐØˆŒØˆŒ
Ø ˆŒˆˆr(   ÚidsÚreturnc                 óª   ‡ ‡— ‰j         d         }t          j        ˆˆ fd„t          |¦  «        D ¦   «         d¬¦  «        }|                     d¦  «        S )Néÿÿÿÿc                 ób   •— g | ]+}t          ‰d |f         ‰j        |         ‰j        ¦  «        ‘Œ,S ©.©r   r-   r,   ©Ú.0Úir7   r4   s     €€r&   ú
<listcomp>z#EmbedND.forward.<locals>.<listcomp>3   s6   ø€ ÐTÐTÐTÀ�T�#�c˜1�f”+˜tœ}¨QÔ/°´Ñ<Ô<ÐTÐTÐTr(   éýÿÿÿ©r+   é   )ÚshapeÚtorchÚcatÚrangeÚ	unsqueeze)r4   r7   Ún_axesÚembs   ``  r&   ÚforwardzEmbedND.forward0   s\   øø€ Ø”˜2”ˆÝŒiØTÐTÐTÐTÐTÅeÈFÁmÄmÐTÑTÔTØð
ñ 
ô 
ˆð
 �}Š}˜QÑÔÐr(   ©	Ú__name__Ú
__module__Ú__qualname__r!   Úlistr2   r   rL   Ú__classcell__©r5   s   @r&   r*   r*   )   sx   ø€ € € € € ð!˜Cð !¨ð !°t¸C´yð !ð !ð !ð !ð !ð !ð ˜6ð   fð  ð  ð  ð  ð  ð  ð  ð  r(   r*   c                   óH   ‡ — e Zd Zdededee         fˆ fd„Zdedefd„Zˆ xZS )ÚEmbedNDFlux2r+   r,   r-   c                 ór   •— t          ¦   «                              ¦   «          || _        || _        || _        d S r/   r0   r3   s       €r&   r2   zEmbedNDFlux2.__init__:   r6   r(   r7   r8   c                 ó´   ‡ ‡— t          j        ˆˆ fd„t          t          ‰ j        ¦  «        ¦  «        D ¦   «         d¬¦  «        }|                     d¦  «        S )Nc                 ób   •— g | ]+}t          ‰d |f         ‰j        |         ‰j        ¦  «        ‘Œ,S r<   r=   r>   s     €€r&   rA   z(EmbedNDFlux2.forward.<locals>.<listcomp>B   s6   ø€ Ð`Ð`Ð`À�T�#�c˜1�f”+˜tœ}¨QÔ/°´Ñ<Ô<Ð`Ð`Ð`r(   rB   rC   rD   )rF   rG   rH   Úlenr-   rI   )r4   r7   rK   s   `` r&   rL   zEmbedNDFlux2.forward@   s_   øø€ ÝŒiØ`Ð`Ð`Ð`Ð`ÅeÍCÐPTÔP]ÑL^ÔL^ÑF_ÔF_Ð`Ñ`Ô`Øð
ñ 
ô 
ˆð
 �}Š}˜QÑÔÐr(   rM   rS   s   @r&   rU   rU   9   sx   ø€ € € € € ð!˜Cð !¨ð !°t¸C´yð !ð !ð !ð !ð !ð !ð ˜6ð   fð  ð  ð  ð  ð  ð  ð  ð  r(   rU   é'  ç     @�@ÚtÚtime_factorc           	      óL  — || z  } |dz  }t          j        t          j        |¦  «         t          j        d|t           j        | j        ¬¦  «        z  |z  ¦  «        }| dd…df                              ¦   «         |d         z  }t          j        t          j	        |¦  «        t          j
        |¦  «        gd¬¦  «        }|dz  r6t          j        |t          j        |dd…dd…f         ¦  «        gd¬¦  «        }t          j        | ¦  «        r|                     | ¦  «        }|S )aM  
    Create sinusoidal timestep embeddings.
    :param t: a 1-D Tensor of N indices, one per batch element.
                      These may be fractional.
    :param dim: the dimension of the output.
    :param max_period: controls the minimum frequency of the embeddings.
    :return: an (N, D) Tensor of positional embeddings.
    r   r   )ÚstartÚendÚdtypeÚdeviceNr:   rC   rD   )rF   ÚexpÚmathÚlogÚarangeÚfloat32rb   ÚfloatrG   ÚcosÚsinÚ
zeros_likeÚis_floating_pointÚto)r\   r+   Ú
max_periodr]   ÚhalfÚfreqsÚargsÚ	embeddings           r&   Útimestep_embeddingrs   I   s  € ð 	�a‰€AØ�!‰8€DÝŒI•t”x 
Ñ+Ô+Ð+­e¬lÀÈÕTYÔTaÐjkÔjrÐ.sÑ.sÔ.sÑsÐvzÑzÑ{Ô{€EàˆQˆQˆQ�ˆWŒ:×ÒÑÔ  d¤Ñ+€DÝ”	�5œ9 T™?œ?­E¬I°d©O¬OÐ<À"ÐEÑEÔE€IØ
ˆQ�wð WÝ”I˜y­%Ô*:¸9ÀQÀQÀQÈÈÈÀUÔ;KÑ*LÔ*LÐMÐSUÐVÑVÔVˆ	ÝÔ˜qÑ!Ô!ð $Ø—L’L ‘O”Oˆ	ØÐr(   c                   ó>   ‡ — e Zd Zd	dededefˆ fd„Zdedefd„Zˆ xZS )
ÚMLPEmbedderTÚin_dimÚ
hidden_dimÚbiasc                 óè   •— t          ¦   «                              ¦   «          t          j        |||¬¦  «        | _        t          j        ¦   «         | _        t          j        |||¬¦  «        | _        d S )N©rx   )r1   r2   r   ÚLinearÚin_layerÚSiLUÚsiluÚ	out_layer)r4   rv   rw   rx   r5   s       €r&   r2   zMLPEmbedder.__init__`   sZ   ø€ Ý‰Œ×ÒÑÔÐÝœ	 &¨*¸4Ð@Ñ@Ô@ˆŒÝ”G‘I”IˆŒ	Ýœ :¨zÀÐEÑEÔEˆŒˆˆr(   Úxr8   c                 óx   — |                       |                      |                      |¦  «        ¦  «        ¦  «        S r/   )r   r~   r|   )r4   r€   s     r&   rL   zMLPEmbedder.forwardf   s,   € Ø�~Š~˜dŸiši¨¯ª°aÑ(8Ô(8Ñ9Ô9Ñ:Ô:Ð:r(   ©T©	rN   rO   rP   r!   Úboolr2   r   rL   rR   rS   s   @r&   ru   ru   _   sƒ   ø€ € € € € ðFð F˜sð F°ð F¸4ð Fð Fð Fð Fð Fð Fð;˜ð ; Fð ;ð ;ð ;ð ;ð ;ð ;ð ;ð ;r(   ru   c                   ó0   ‡ — e Zd Zdefˆ fd„Zdefd„Zˆ xZS )ÚRMSNormr+   c                 óž   •— t          ¦   «                              ¦   «          t          j        t	          j        |¦  «        ¦  «        | _        d S r/   )r1   r2   r   Ú	ParameterrF   ÚonesÚscale©r4   r+   r5   s     €r&   r2   zRMSNorm.__init__k   s6   ø€ Ý‰Œ×ÒÑÔÐÝ”\¥%¤*¨S¡/¤/Ñ2Ô2ˆŒ
ˆ
ˆ
r(   r€   c                 óH   — |gd }}t          j        |d¬¦  «        | j        z  S )NT)Úmanual)r   Úrms_norm_roundedrŠ   ©r4   r€   Úx_lists      r&   rL   zRMSNorm.forwardo   s*   € Ø�C˜�ˆÝÔ# F°4Ð8Ñ8Ô8¸4¼:ÑEÐEr(   ©rN   rO   rP   r!   r2   r   rL   rR   rS   s   @r&   r†   r†   j   sh   ø€ € € € € ð3˜Cð 3ð 3ð 3ð 3ð 3ð 3ðF˜ð Fð Fð Fð Fð Fð Fð Fð Fr(   r†   c            
       óL   ‡ — e Zd Zdefˆ fd„Zdedededeeef         fd„Zˆ xZS )ÚQKNormr+   c                 ó˜   •— t          ¦   «                              ¦   «          t          |¦  «        | _        t          |¦  «        | _        d S r/   )r1   r2   r†   Ú
query_normÚkey_normr‹   s     €r&   r2   zQKNorm.__init__v   s7   ø€ Ý‰Œ×ÒÑÔÐÝ! #™,œ,ˆŒÝ ™œˆŒˆˆr(   r   r   r   r8   c                 ó®   — |d k    r(|                       |¦  «                             |¦  «        S |                      |¦  «                             |¦  «        S r/   )r–   rm   r•   )r4   r   r   r   s       r&   rL   zQKNorm.forward{   sK   € Ø�Š9ˆ9Ø—=’= Ñ#Ô#×&Ò& qÑ)Ô)Ð)à—?’? 1Ñ%Ô%×(Ò(¨Ñ+Ô+Ð+r(   )	rN   rO   rP   r!   r2   r   ÚtuplerL   rR   rS   s   @r&   r“   r“   u   s}   ø€ € € € € ð%˜Cð %ð %ð %ð %ð %ð %ð
,˜ð , Fð ,¨vð ,¸%ÀÈÀÔ:Oð ,ð ,ð ,ð ,ð ,ð ,ð ,ð ,r(   r“   c                 óº   ‡‡‡	— ‰                      dd¦  «        Š| df|dffD ]8\  }}|€Œ|D ]-\  }}Š|rˆfd„nˆfd„Š	t          j        |ˆ	ˆfd„||¦  «         Œ.Œ9dS )	a   attention_kit callback: the QKNorm of each segment of tokens (start, stop, QKNorm), then RoPE with pe (batch, 1, tokens, ...), of
    q and/or k (batch, tokens, heads, head_dim) in place, by chunks of tokens: the values of QKNorm and math.attention's RoPE.rD   r   FTNc                 ó   •—  ‰d | | ¦  «        S r/   © ©ÚpartÚnorms    €r&   ú<lambda>z_norm_rope_.<locals>.<lambda>�   s   ø€  d d¨4°°tÑ&<Ô&<€ r(   c                 ó   •—  ‰| d | ¦  «        S r/   r›   rœ   s    €r&   rŸ   z_norm_rope_.<locals>.<lambda>�   s   ø€ Ð[_Ð[_Ð`dÐfjÐlpÑ[qÔ[q€ r(   c                 óP   •— t           ‰| ¦  «        g‰d d …||…f         ¦  «        S r/   )r	   )r�   ÚfirstÚlastÚ	normalizeÚpes      €€r&   rŸ   z_norm_rope_.<locals>.<lambda>Ž   s6   ø€ Å+ÈyÈyÐY]ÉÌÐN_ÐacÐdeÐdeÐdeÐglÐmqÐgqÐdqÔarÑBsÔBs€ r(   )Ú	transposer   Úrows_)
ÚqueryÚkeyr¥   ÚsegmentsÚtensorÚis_keyr_   Ústoprž   r¤   s
     `     @@r&   Ú_norm_rope_r®   …   sÊ   øøø€ ð 
�Š�a˜Ñ	Ô	€BØ! 5˜>¨C°¨;Ð7ð Bð B‰ˆ�Øˆ>ØØ!)ð 	Bð 	BÑˆE�4˜ØAGÐrÐ<Ð<Ð<Ð<Ð<ÐNqÐNqÐNqÐNqˆIÝÔ Ð(sÐ(sÐ(sÐ(sÐ(sÐuzð  }Añ  Bô  Bð  Bð  Bð	BðBð Br(   c           
      óŠ   — t          j        | ||                     dd¦  «        d„ |D ¦   «         d„ |D ¦   «         ||d¬¦  «        S )zûattention_kit's fused_quant: the QKNorm weights of each segment of tokens (RMSNorm: FP32 statistics, eps 1e-6, one rounding) and
    pe's rotation matrices (interleaved channel pairs) fused with the staged SageAttention 2 quantization of q and / or k.rD   r   c                 ó8   — g | ]\  }}}|||j         j        d ff‘ŒS ©ç�íµ ÷Æ°>)r•   rŠ   ©r?   r_   r­   rž   s       r&   rA   z+_fused_norm_rope_quant_.<locals>.<listcomp>”   s_   € ð  L\ð  L\ð  L\ñ  ~Oð  ~Cð  EIð  KOÈUÐTXÐ[_Ô[jÔ[pÐrvÐZwÐLxð  L\ð  L\ð  L\r(   c                 ó8   — g | ]\  }}}|||j         j        d ff‘ŒS r±   )r–   rŠ   r³   s       r&   rA   z+_fused_norm_rope_quant_.<locals>.<listcomp>•   s4   € Ð+yÐ+yÐ+yÑ[lÐ[`ÐbfÐhl¨U°D¸4¼=Ô;NÐPTÐ:UÐ,VÐ+yÐ+yÐ+yr(   T)Úinterleaved)r   Úsplit_half_norm_rope_quant_r¦   )r¨   r©   r¥   rª   ÚcoreÚsettingss         r&   Ú_fused_norm_rope_quant_r¹   ‘   sƒ   € õ Ô*¨5°#°r·|²|ÀAÀqÑ7IÔ7Ið  L\ð  L\ð  S[ð  L\ñ  L\ô  L\Ø+yÐ+yÐpxÐ+yÑ+yÔ+yÐ{ð  BJð  X\ð]ñ ]ô ]ð ]r(   c                 ób  ‡‡— | j         dd…         \  }Š|j        j         d         Šˆˆfd„t          |¦  «        D ¦   «         }t          j        |                      d| j         d         ¦  «        g||j        dd…df         |j        dd…df         |¦  «                             | j         ¦  «        S )zœnorm(x) * (1 + mod.scale) + mod.shift through the shared segmented modulation, one row per batch item (mod tensors (batch or 1,
    1, dim)); x is borrowed.Nr   r   c                 ó<   •— g | ]}|‰z  |d z   ‰z  ‰d k    r|ndf‘ŒS )rD   r   r›   )r?   ÚbÚrowsÚtokenss     €€r&   rA   z"_norm_modulate.<locals>.<listcomp>�   s9   ø€ Ð[Ð[Ð[È��V‘˜a !™e vÑ-°D¸1²H°H¨q¨qÀ!ÐDÐ[Ð[Ð[r(   r:   )rE   rŠ   rH   r   Únorm_modulateÚviewÚshift)r€   rž   ÚmodÚbatchrª   r½   r¾   s        @@r&   Ú_norm_modulaterÄ   ˜   s®   øø€ ð ”G˜B˜Q˜B”K�M€Eˆ6ØŒ9Œ?˜1Ô€DØ[Ð[Ð[Ð[Ð[ÍeÐTYÉlÌlÐ[Ñ[Ô[€HÝÔ˜aŸfšf R¨¬°¬Ñ5Ô5Ð6¸¸c¼iÈÈÈÈ1È¼oÈsÌyÐYZÐYZÐYZÐ\]ÐY]ÌÐ`hÑiÔi×nÒnÐopÔovÑwÔwÐwr(   c            	       óF   ‡ — e Zd Zddedededefˆ fd„Zd	ed
edefd„Zˆ xZS )ÚSelfAttentioné   FTr+   Ú	num_headsÚqkv_biasÚ	proj_biasc                 óþ   •— t          ¦   «                              ¦   «          || _        ||z  }t          j        ||dz  |¬¦  «        | _        t          |¦  «        | _        t          j        |||¬¦  «        | _        d S )Né   rz   )	r1   r2   rÈ   r   r{   r   r“   rž   Úproj)r4   r+   rÈ   rÉ   rÊ   Úhead_dimr5   s         €r&   r2   zSelfAttention.__init__¢   sq   ø€ Ý‰Œ×ÒÑÔÐØ"ˆŒØ˜)Ñ#ˆå”9˜S #¨¡'°Ð9Ñ9Ô9ˆŒÝ˜8Ñ$Ô$ˆŒ	Ý”I˜c 3¨YÐ7Ñ7Ô7ˆŒ	ˆ	ˆ	r(   r€   r¥   r8   c                 ó    — t          d¦  «        ‚)Nznot implemented)Ú	Exception)r4   r€   r¥   s      r&   rL   zSelfAttention.forward«   s   € ÝÐ)Ñ*Ô*Ð*r(   )rÇ   FTrƒ   rS   s   @r&   rÆ   rÆ   ¡   sˆ   ø€ € € € € ð8ð 8˜Cð 8¨Cð 8¸tð 8ÐX\ð 8ð 8ð 8ð 8ð 8ð 8ð+˜ð + Vð +°ð +ð +ð +ð +ð +ð +ð +ð +r(   rÆ   c                   ó.   — e Zd ZU eed<   eed<   eed<   dS )ÚModulationOutrÁ   rŠ   ÚgateN)rN   rO   rP   r   Ú__annotations__r›   r(   r&   rÒ   rÒ   ®   s+   € € € € € € à€M€M�MØ€M€M�MØ
€L€L�L€L€Lr(   rÒ   c                   ó:   — e Zd Zeddej        defd„¦   «         ZdS )ÚChromaModulationOutr   r«   Úoffsetc           	      ó–   —  | |d d …||dz   …d d …f         |d d …|dz   |dz   …d d …f         |d d …|dz   |dz   …d d …f         ¬¦  «        S )NrD   r   rÌ   )rÁ   rŠ   rÓ   r›   )Úclsr«   r×   s      r&   Úfrom_offsetzChromaModulationOut.from_offsetµ   sƒ   € àˆsØ˜˜˜˜F V¨a¡ZÐ/°°°Ð2Ô3Ø˜˜˜˜F Q™J¨°!©Ð3°Q°Q°QÐ6Ô7Ø˜˜˜˜6 A™:¨°©
Ð2°A°A°AÐ5Ô6ð
ñ 
ô 
ð 	
r(   N)r   )rN   rO   rP   ÚclassmethodrF   r   r!   rÚ   r›   r(   r&   rÖ   rÖ   ´   sG   € € € € € Øð
ð 
 ¤ð 
°sð 
ð 
ð 
ñ „[ð
ð 
ð 
r(   rÖ   c                   óT   ‡ — e Zd Zd
dededefˆ fd„Zdedeeedz  f         fd	„Z	ˆ xZ
S )Ú
ModulationTr+   Údoublerx   c                 ó´   •— t          ¦   «                              ¦   «          || _        |rdnd| _        t	          j        || j        |z  |¬¦  «        | _        d S )Né   rÌ   rz   )r1   r2   Ú	is_doubleÚ
multiplierr   r{   Úlin)r4   r+   rÞ   rx   r5   s       €r&   r2   zModulation.__init__¿   sS   ø€ Ý‰Œ×ÒÑÔÐØˆŒØ%Ð,˜!˜!¨1ˆŒÝ”9˜S $¤/°CÑ"7¸dÐCÑCÔCˆŒˆˆr(   Úvecr8   Nc                 ó
  — |                       t          j                             |¦  «        ¦  «        d d …d d d …f                              | j        d¬¦  «        }t          |d d…         Ž | j        rt          |dd …         Ž nd fS )Nr:   rC   rÌ   )rã   r   Ú
functionalr~   Úchunkrâ   rÒ   rá   )r4   rä   Úouts      r&   rL   zModulation.forwardÅ   s„   € Ø�hŠh•r”}×)Ò)¨#Ñ.Ô.Ñ/Ô/°°°°4¸¸¸°
Ô;×AÒAÀ$Ä/ÐWYÐAÑZÔZˆõ ˜3˜r ˜rœ7Ð#Ø'+¤~Ð?�M˜3˜q˜r˜rœ7Ð#Ð#¸4ð
ð 	
r(   r‚   )rN   rO   rP   r!   r„   r2   r   r˜   rÒ   rL   rR   rS   s   @r&   rÝ   rÝ   ¾   s’   ø€ € € € € ðDð D˜Cð D¨ð D°Tð Dð Dð Dð Dð Dð Dð
˜6ð 
 e¨M¸=È4Ñ;OÐ,OÔ&Pð 
ð 
ð 
ð 
ð 
ð 
ð 
ð 
r(   rÝ   c                   ó.   ‡ — e Zd Zˆ fd„Zdedefd„Zˆ xZS )ÚSiLUActivationc                 óx   •— t          ¦   «                              ¦   «          t          j        ¦   «         | _        d S r/   )r1   r2   r   r}   Úgate_fn)r4   r5   s    €r&   r2   zSiLUActivation.__init__Î   s*   ø€ Ý‰Œ×ÒÑÔÐÝ”w‘y”yˆŒˆˆr(   r€   r8   c                 ó8   — |gd }}t          j        |d¬¦  «        S )NF)Úin_place)r   Úswiglur�   s      r&   rL   zSiLUActivation.forwardÒ   s"   € Ø�C˜�ˆÝŒz˜&¨5Ð1Ñ1Ô1Ð1r(   )rN   rO   rP   r2   r   rL   rR   rS   s   @r&   rê   rê   Í   sZ   ø€ € € € € ð!ð !ð !ð !ð !ð2˜ð 2 Fð 2ð 2ð 2ð 2ð 2ð 2ð 2ð 2r(   rê   c                   ó”   ‡ — e Zd Zddedededededz  d	edz  d
ededefˆ fd„Zddœdedededededz  de	eef         fd„Z
d„ Zˆ xZS )ÚDoubleStreamBlockFNTr   rÈ   r   rÉ   Údouble_mlp_ratioÚdouble_linear1_mlp_ratioÚmod_biasÚmlp_biasrÊ   c           	      óh  •— t          ¦   «                              ¦   «          |}|€|�|n|}|dk    r|dz  n|}t          ||�|n|z  ¦  «        }t          ||z  ¦  «        }|| _        || _        || _        |�dnd| _        |st          |d|¬¦  «        | _        t          j
        |dd¬	¦  «        | _        t          ||||
¬
¦  «        | _        t          j
        |dd¬	¦  «        | _        |�Ut          j        t          j        |||	¬¦  «        t#          ¦   «         t          j        |dz  ||	¬¦  «        ¦  «        | _        nXt          j        t          j        |||	¬¦  «        t          j        d¬¦  «        t          j        |||	¬¦  «        ¦  «        | _        |st          |d|¬¦  «        | _        t          j
        |dd¬	¦  «        | _        t          ||||
¬
¦  «        | _        t          j
        |dd¬	¦  «        | _        |�Vt          j        t          j        |||	¬¦  «        t#          ¦   «         t          j        |dz  ||	¬¦  «        ¦  «        | _        d S t          j        t          j        |||	¬¦  «        t          j        d¬¦  «        t          j        |||	¬¦  «        ¦  «        | _        d S )Nr   r   rï   ÚgeluT©rÞ   rx   Fr²   ©Úelementwise_affineÚeps)r+   rÈ   rÉ   rÊ   rz   Útanh)Úapproximate)r1   r2   r!   rÈ   r   Úshared_modulationÚmlp_activationrÝ   Úimg_modr   Ú	LayerNormÚ	img_norm1rÆ   Úimg_attnÚ	img_norm2Ú
Sequentialr{   rê   Úimg_mlpÚGELUÚtxt_modÚ	txt_norm1Útxt_attnÚ	txt_norm2Útxt_mlp)r4   r   rÈ   r   rÉ   rþ   rò   ró   rô   rõ   rÊ   r#   Ú
base_ratior"   Úlin1_mlp_dimr5   s                  €r&   r2   zDoubleStreamBlock.__init__Ø   s¿  ø€ Ý‰Œ×ÒÑÔÐØ-ˆ
ØÐØ-=Ð-IÐ)Ð)ÈyˆJØ+5¸Ò+<Ð+<˜ a™˜À*ˆJÝ˜[Ð@PÐ@\Ð,<Ð,<ÐbkÑlÑmÔmˆÝ˜;¨Ñ3Ñ4Ô4ˆØ"ˆŒØ&ˆÔØ!2ˆÔØ*BÐ*N˜h˜hÐTZˆÔØ ð 	OÝ% k¸$ÀXÐNÑNÔNˆDŒLÝœ kÀeÐQUÐVÑVÔVˆŒÝ%¨+ÀÐU]ÐirÐsÑsÔsˆŒåœ kÀeÐQUÐVÑVÔVˆŒØ#Ð/Ýœ=Ý”	˜+ |¸(ÐCÑCÔCÝÑ Ô Ý”	˜,¨!Ñ+¨[¸xÐHÑHÔHñô ˆDŒLˆLõ œ=Ý”	˜+ |¸(ÐCÑCÔCÝ” FÐ+Ñ+Ô+Ý”	˜.¨+¸HÐEÑEÔEñô ˆDŒLð !ð 	OÝ% k¸$ÀXÐNÑNÔNˆDŒLÝœ kÀeÐQUÐVÑVÔVˆŒÝ%¨+ÀÐU]ÐirÐsÑsÔsˆŒåœ kÀeÐQUÐVÑVÔVˆŒØ#Ð/Ýœ=Ý”	˜+ |¸(ÐCÑCÔCÝÑ Ô Ý”	˜,¨!Ñ+¨[¸xÐHÑHÔHñô ˆDŒLˆLˆLõ œ=Ý”	˜+ |¸(ÐCÑCÔCÝ” FÐ+Ñ+Ô+Ý”	˜.¨+¸HÐEÑEÔEñô ˆDŒLˆLˆLr(   )ÚNAGÚimgÚtxträ   r¥   r  r8   c                óì  ‡‡— | j         r|\  \  }}\  }}	n0|                      |¦  «        \  }}|                      |¦  «        \  }}	t          || j        |¦  «        }
|€æt          || j        |¦  «        }|j        d         | j        | j        z  }}|g| j	        j
        | j	        j        | j	        j        ff|
g| j        j
        | j        j        | j        j        ffg}~~
d|| j	        j        f|||j        d         z   | j        j        ffŠt          j        || j        |ˆˆfd„ˆˆfd„¬¦  «                             d¦  «        }n|
gd }
}|                      |||‰|¦  «        }|d d …d |j        d         …f         |d d …|j        d         d …f         }}t'          j        || j                             |¦  «        g|j        d¬¦  «         t'          j        t          || j        |¦  «        g| j        d         | j        d         | j        |t'          j        |j        |j        d         |j        d         ¦  «        ¬	¦  «         t'          j        || j	                             |¦  «        g|j        d¬¦  «         t'          j        t          || j        |	¦  «        g| j        d         | j        d         | j        |t'          j        |	j        |j        d         |j        d         ¦  «        ¬	¦  «         ||fS )
NrD   r   c                 ó(   •— t          | |‰‰¦  «        S r/   ©r®   ©r¨   r©   Úgroupr¥   rª   s      €€r&   rŸ   z+DoubleStreamBlock.forward.<locals>.<lambda>  s2   ø€ Õr}ð  Dð  FIð  KMð  OWñ  sXô  sX€ r(   c                 ó,   •— t          | |‰‰||¦  «        S r/   ©r¹   ©r¨   r©   r  r·   r¸   r¥   rª   s        €€r&   rŸ   z+DoubleStreamBlock.forward.<locals>.<lambda>  sD   ø€ õ  lCð  DIð  KNð  PRð  T\ð  ^bð  dlñ  lmô  lm€ r(   ©Úfused_quantr   T)Úfused)Úresidualrª   )rþ   r   r  rÄ   r  r	  rE   r   rÈ   r
  r   r   r   r  rž   r   Újoint_qkv_attentionÚflattenÚ_attention_nagr   Úgated_residual_rÍ   rÓ   Úmlpr  r  rÿ   Úgate_segmentsr  r  )r4   r  r  rä   r¥   r  Úimg_mod1Úimg_mod2Útxt_mod1Útxt_mod2Úimg_modulatedÚtxt_modulatedÚtxt_lenrÎ   ÚstreamsÚattnÚimg_listr
  r  rª   s       `              @r&   rL   zDoubleStreamBlock.forward
  s|  øø€ ØÔ!ð 	3Ø9<Ñ6Ñ ˆX�xÑ"6 8¨X¨Xà!%§¢¨cÑ!2Ô!2ÑˆH�hØ!%§¢¨cÑ!2Ô!2ÑˆH�hõ ' s¨D¬N¸HÑEÔEˆàˆ;Ý*¨3°´ÀÑIÔIˆMØ #¤	¨!¤¨dÔ.>À$Ä.Ñ.P�XˆGØ&˜¨$¬-¬/¸4¼=¼?ÈDÌMÌOÐ)\Ð]ÐanÐ`oÐrvÔrô  sBð  DHô  DQô  DSð  UYô  Ubô  Udð  reð  `fð  gˆGØ˜}Ø˜G T¤]Ô%7Ð8¸7ÀGÈcÌiÐXYÌlÑDZÐ\`Ô\iÔ\nÐ:oÐpˆHÝ Ô4°W¸d¼nÈhð  YXð  YXð  YXð  YXð  YXð Bmð  Bmð  Bmð  Bmð  Bmðnñ nô n÷ ovò  ovð  wxñ  oyô  oyð ˆDð (5 o°t�mˆHØ×&Ò& x°°hÀÀCÑHÔHˆDØ! ! ! ! ^ s¤y°¤| ^Ð"3Ô4°d¸1¸1¸1¸c¼iÈ¼l¸n¸nÐ;LÔ6M�(ˆõ 	Ô˜C $¤-×"4Ò"4°XÑ">Ô">Ð!?ÀÄÐVZÐ[Ñ[Ô[Ð[ÝŒ•  T¤^°XÑ>Ô>Ð?ÀÄÈaÄÐRVÔR^Ð_`ÔRaÐcgÔcvØ¥sÔ'8¸¼ÈÌ	ÐRSÌÐVYÔV_Ð`aÔVbÑ'cÔ'cð	eñ 	eô 	eð 	eõ 	Ô˜C $¤-×"4Ò"4°XÑ">Ô">Ð!?ÀÄÐVZÐ[Ñ[Ô[Ð[ÝŒ•  T¤^°XÑ>Ô>Ð?ÀÄÈaÄÐRVÔR^Ð_`ÔRaÐcgÔcvØ¥sÔ'8¸¼ÈÌ	ÐRSÌÐVYÔV_Ð`aÔVbÑ'cÔ'cð	eñ 	eô 	eð 	eà�Cˆxˆr(   c                 ó–  — |                      ¦   «         }g |j        d d…         ¢| j        ‘t          |j        d         | j        z  ¦  «        ‘R } | j                             |¦  «        j        |Ž                      dd¦  «        } | j                             |¦  «        j        |Ž                      dd¦  «        }	 | j         	                    |¦  «        j        |Ž                      dd¦  «        }
~| j         
                    |d |
¦  «        }| j         
                    d |	|
¦  «        }	t          || j        |¦  «        }g |j        d d…         ¢| j        ‘t          |j        d         | j        z  ¦  «        ‘R } | j                             |¦  «        j        |Ž                      dd¦  «        } | j                             |¦  «        j        |Ž                      dd¦  «        } | j         	                    |¦  «        j        |Ž                      dd¦  «        }~| j         
                    |d |¦  «        }| j         
                    d ||¦  «        }t          j        ||fd¬¦  «        }~~t          j        ||	fd¬¦  «        }~~	t          j        ||
fd¬¦  «        }~~
|||g}~~~t!          |||j        d         |¬¦  «        S )Nr   r:   rD   rC   ©r¥   r*  r  )ÚpoprE   rÈ   r!   r  r   rÀ   r¦   r   r   rž   rÄ   r	  r
  rF   rG   r
   )r4   r-  r  r&  r¥   r  r(  rE   Úimg_qÚimg_kÚimg_vr)  Útxt_qÚtxt_kÚtxt_vr   r   r   Úqkv_lists                      r&   r   z DoubleStreamBlock._attention_nag,  s¦  € Ø Ÿš™œˆØj�-Ô% b q bÔ)Ðj¨4¬>Ðj½3¸}Ô?RÐSUÔ?VÐY]ÔYgÑ?gÑ;hÔ;hÐjÐjˆØ3�”—’ Ñ.Ô.Ô3°UÐ;×EÒEÀaÈÑJÔJˆØ3�”—’ Ñ.Ô.Ô3°UÐ;×EÒEÀaÈÑJÔJˆØ3�”—’ Ñ.Ô.Ô3°UÐ;×EÒEÀaÈÑJÔJˆØð Œ}×!Ò! %¨¨uÑ5Ô5ˆØŒ}×!Ò! $¨¨uÑ5Ô5ˆõ ' s¨D¬N¸HÑEÔEˆàj�-Ô% b q bÔ)Ðj¨4¬>Ðj½3¸}Ô?RÐSUÔ?VÐY]ÔYgÑ?gÑ;hÔ;hÐjÐjˆØ3�”—’ Ñ.Ô.Ô3°UÐ;×EÒEÀaÈÑJÔJˆØ3�”—’ Ñ.Ô.Ô3°UÐ;×EÒEÀaÈÑJÔJˆØ3�”—’ Ñ.Ô.Ô3°UÐ;×EÒEÀaÈÑJÔJˆØð ”×"Ò" 5¨$°Ñ6Ô6ˆØ”×"Ò" 4¨°Ñ6Ô6ˆõ ŒI�u˜e�n¨!Ð,Ñ,Ô,ˆØ�5ÝŒI�u˜e�n¨!Ð,Ñ,Ô,ˆØ�5ÝŒI�u˜e�n¨!Ð,Ñ,Ô,ˆØ�5à�q˜!�9ˆØˆq�!Ý˜ b°#´)¸A´,ÀCÐHÑHÔHÐHr(   )FFNNTTT)rN   rO   rP   r!   rh   r„   r2   r   Údictr˜   rL   r   rR   rS   s   @r&   rñ   rñ   ×   s2  ø€ € € € € ð0ð 0 Cð 0°Cð 0ÀEð 0ÐUYð 0ð  QVð  Y]ñ  Q]ð 0ð  @Eð  HLñ  @Lð 0ð  _cð 0ð  vzð 0ð  NRð 0ð 0ð 0ð 0ð 0ð 0ðd `dð  ð  ð  ˜6ð  ¨ð  °Vð  Àð  ÐQUÐX\ÑQ\ð  ÐhmÐntÐv|Ðn|Ôh}ð  ð  ð  ð  ðD#Ið #Ið #Ið #Ið #Ið #Ið #Ir(   rñ   c                   óš   ‡ — e Zd ZdZ	 	 	 	 	 	 	 ddededed	edz  d
edz  dedz  dedefˆ fd„Zdddœdededededz  de	dz  defd„Z
ˆ xZS )ÚSingleStreamBlockzˆ
    A DiT block with parallel linear layers as described in
    https://arxiv.org/abs/2302.05442 and adapted modulation interface.
    r   NFTr   rÈ   r   Úqk_scaler   Úsingle_mlp_hidden_ratioÚlinear_biasÚmodulation_biasc
                 ój  •— t          ¦   «                              ¦   «          || _        || _        || _        ||z  }
|p|
dz  | _        t          ||�|n|z  ¦  «        }|d u| _        | j        r|dz  | _        nt          ||�|n|z  ¦  «        | _        t          j
        ||dz  |z   |¬¦  «        | _        t          j
        || j        z   ||¬¦  «        | _        t          |
¦  «        | _        || _        t          j        |dd¬¦  «        | _        |st%          |d|	¬¦  «        | _        d S d | _        d S )	Ng      à¿r   rÌ   rz   Fr²   rù   rø   )r1   r2   rw   rÈ   rþ   rŠ   r!   Úuse_silur"   r   r{   r   Úlinear2r“   rž   r   r  Úpre_normrÝ   Ú
modulation)r4   r   rÈ   r   r;  rþ   r   r<  r=  r>  rÎ   r  r5   s               €r&   r2   zSingleStreamBlock.__init__X  s`  ø€ õ 	‰Œ×ÒÑÔÐØ%ˆŒØ"ˆŒØ!2ˆÔØ )Ñ+ˆØÐ/ ¨4¡ˆŒ
Ý˜;ÐF^ÐFjÐ*BÐ*BÐpyÑzÑ{Ô{ˆØ0¸Ð<ˆŒØŒ=ð 	EØ".°!Ñ"3ˆDÔÐå"% kÐPgÐPsÐ5LÐ5Lð  zCñ  'Dñ  #Eô  #EˆDÔå”y ¨k¸A©oÀÑ.LÐS^Ð_Ñ_Ô_ˆŒå”y ¨tÔ/BÑ!BÀKÐVaÐbÑbÔbˆŒå˜8Ñ$Ô$ˆŒ	à&ˆÔÝœ [ÀUÐPTÐUÑUÔUˆŒà ð 	#Ý(¨¸UÈÐYÑYÔYˆDŒOˆOˆOà"ˆDŒOˆOˆOr(   )r*  r  r€   rä   r¥   r*  r  r8   c                ó`  ‡‡— | j         r|}n| j        �|                      |¦  «        \  }}t          || j        |¦  «        }|€qd|j        d         | j        ffŠt          j        |g| j        | j	        | j
        | j        | j        | j        z  ˆˆfd„ˆˆfd„¬¦  «                             d¦  «        }	�ng |j        d d…         ¢| j        ‘t          |j        d         | j        z  ¦  «        ‘R }
 |                      |¦  «        j        |
Ž                      dd¦  «        } |  	                    |¦  «        j        |
Ž                      dd¦  «        } |  
                    |¦  «        j        |
Ž                      dd¦  «        }|                      |d |¦  «        }|                      d ||¦  «        }|||g}~~~t#          |‰||¬¦  «        }	|gd }}t%          j        || j        | j        | j        rd	nd
|	|t%          j        |j        |j        d         |j        d         ¦  «        ¬¦  «         |S )Nr   rD   c                 ó(   •— t          | |‰‰¦  «        S r/   r  r  s      €€r&   rŸ   z+SingleStreamBlock.forward.<locals>.<lambda>Œ  s.   ø€ ÕmxÐy~ð  ADð  FHð  JRñ  nSô  nS€ r(   c                 ó,   •— t          | |‰‰||¦  «        S r/   r  r  s        €€r&   rŸ   z+SingleStreamBlock.forward.<locals>.<lambda>�  s@   ø€ Õe|ð  ~Cð  EHð  JLð  NVð  X\ð  ^fñ  fgô  fg€ r(   r  r   r:   r/  rï   r÷   )Úprefixr  rª   )rþ   rC  rÄ   rB  rE   rž   r   Úqkv_attentionr   r   r   rÈ   r   r  r!   rÀ   r¦   r
   r   r"  r   rA  r@  r#  rÓ   )r4   r€   rä   r¥   r*  r  rÂ   Ú_Úx_modr,  rE   r   r   r   r7  Ú
x_mod_listrª   s      `            @r&   rL   zSingleStreamBlock.forward  s”  øø€ ØÔ!ð 	*ØˆCˆCØŒ_Ð(Ø—_’_ SÑ)Ô)‰FˆC�Ý˜q $¤-°Ñ5Ô5ˆð
 ˆ;Ø˜EœK¨œN¨D¬IÐ6Ð8ˆHÝ Ô.°¨w¸Ô8KÈTÔM`ÐbfÔbuÐw{ô  xFØ/3Ô/?À4Ä>Ñ/Qð  TSð  TSð  TSð  TSð  TSð <gð  <gð  <gð  <gð  <gðhñ hô h÷ ipò  ipð  qrñ  isô  isð ‰Dð _�e”k " 1 "”oÐ^ t¤~Ð^µs¸5¼;Àr¼?ÈTÌ^Ñ;[Ñ7\Ô7\Ð^Ð^ˆEØ/�×#Ò# EÑ*Ô*Ô/°Ð7×AÒAÀ!ÀAÑFÔFˆAØ/�×#Ò# EÑ*Ô*Ô/°Ð7×AÒAÀ!ÀAÑFÔFˆAØ/�×#Ò# EÑ*Ô*Ô/°Ð7×AÒAÀ!ÀAÑFÔFˆAà—	’	˜!˜T 1Ñ%Ô%ˆAØ—	’	˜$  1Ñ%Ô%ˆAð ˜1˜a�yˆHØ�1�aÝ˜X¨"°gÀ3ÐGÑGÔGˆDà"˜G T�Eˆ
ÝŒ�
˜DÔ,¨d¬lÈÌÐ<a¸H¸HÐ[aÐjnÐyzÝÔ*¨3¬8°Q´W¸Q´ZÀÄÈÄÑLÔLð	Nñ 	Nô 	Nð 	Nàˆr(   )r   NFNNTT)rN   rO   rP   Ú__doc__r!   rh   r„   r2   r   r8  rL   rR   rS   s   @r&   r:  r:  R  s  ø€ € € € € ðð ð Ø!%Ø!Ø15Ø04Ø Ø $ð%#ð %#àð%#ð ð%#ð ð	%#ð
 ˜$‘,ð%#ð #(¨$¡,ð%#ð "'¨¡ð%#ð ð%#ð ð%#ð %#ð %#ð %#ð %#ð %#ðN TXÐlpð  ð  ð  ˜ð   fð  °&ð  ÀcÈDÁjð  Ð^bÐeiÑ^ið  Ðu{ð  ð  ð  ð  ð  ð  ð  ð  r(   r:  c                   óZ   ‡ — e Zd Z	 	 	 	 ddedededededed	efˆ fd
„Zdededefd„Zˆ xZS )Ú	LastLayerFTr   Ú
patch_sizeÚout_channelsÚchroma_modulationÚ
use_linearr=  r>  c                 óv  •— t          ¦   «                              ¦   «          || _        || _        t	          j        |dd¬¦  «        | _        |rt	          j        |||z  |z  |¬¦  «        nd | _        |sEt	          j	        t	          j
        ¦   «         t	          j        |d|z  |¬¦  «        ¦  «        | _        d S d S )NFr²   rù   rz   r   )r1   r2   rQ  rR  r   r  Ú
norm_finalr{   Úlinearr  r}   ÚadaLN_modulation)	r4   r   rO  rP  rQ  rR  r=  r>  r5   s	           €r&   r2   zLastLayer.__init__£  sÆ   ø€ õ 	‰Œ×ÒÑÔÐØ!2ˆÔØ$ˆŒÝœ, {ÀuÐRVÐWÑWÔWˆŒð ð�BŒI�k :°
Ñ#:¸\Ñ#IÐP[Ð\Ñ\Ô\Ð\àð 	Œð
 !ð 	Ý$&¤MÝ”‘	”	�2œ9 [°!°k±/ÈÐXÑXÔXñ%ô %ˆDÔ!Ð!Ð!ð	ð 	r(   r€   rä   r8   c           
      ót  — | j         r0|\  }}|                     d¦  «        }|                     d¦  «        }n-|                      |¦  «                             dd¬¦  «        \  }}|gd }}t	          j        || j        |d d …d d d …f         |d d …d d d …f         dd¬¦  «        }|                      |¦  «        }|S )NrD   r   rC   FT)rî   Ú	fused_add)rQ  ÚsqueezerV  rç   r   Únorm_scale_shiftrT  rU  )r4   r€   rä   rÁ   rŠ   r�   s         r&   rL   zLastLayer.forward¼  sÓ   € ØÔ!ð 	FØ‰LˆE�5Ø—M’M !Ñ$Ô$ˆEØ—M’M !Ñ$Ô$ˆEˆEà×0Ò0°Ñ5Ô5×;Ò;¸AÀ1Ð;ÑEÔE‰LˆE�5à�C˜�ˆÝÔ  ¨¬¸%ÀÀÀÀ4ÈÈÈÀ
Ô:KÈUÐSTÐSTÐSTÐVZÐ\]Ð\]Ð\]ÐS]ÔM^ÐinÐz~ÐÑÔˆØ�KŠK˜‰NŒNˆØˆr(   )FTTTrƒ   rS   s   @r&   rN  rN  ¢  s½   ø€ € € € € ð #(ØØ Ø $ðð àðð ðð ð	ð
  ðð ðð ðð ðð ð ð ð ð ð2˜ð  fð °ð ð ð ð ð ð ð ð r(   rN  c                   ó>   ‡ — e Zd Zd	dededefˆ fd„Zdedefd„Zˆ xZS )
ÚDistilledGuidanceé   rv   Úout_dimrw   c                 ó~  •‡— t          ¦   «                              ¦   «          t          j        |‰d¬¦  «        | _        t          j        ˆfd„t          |¦  «        D ¦   «         ¦  «        | _        t          j        ˆfd„t          |¦  «        D ¦   «         ¦  «        | _        t          j        ‰|¦  «        | _	        d S )NTrz   c                 ó0   •— g | ]}t          ‰‰¦  «        ‘ŒS r›   )ru   ©r?   r€   rw   s     €r&   rA   z.DistilledGuidance.__init__.<locals>.<listcomp>Î  s#   ø€ Ð$cÐ$cÐ$cÈQ¥[°¸ZÑ%HÔ%HÐ$cÐ$cÐ$cr(   c                 ó.   •— g | ]}t          ‰¦  «        ‘ŒS r›   )r†   ra  s     €r&   rA   z.DistilledGuidance.__init__.<locals>.<listcomp>Ï  s!   ø€ Ð#RÐ#RÐ#R¸A¥G¨JÑ$7Ô$7Ð#RÐ#RÐ#Rr(   )
r1   r2   r   r{   Úin_projÚ
ModuleListrH   ÚlayersÚnormsÚout_proj)r4   rv   r^  rw   Ún_layersr5   s      ` €r&   r2   zDistilledGuidance.__init__Ë  s§   øø€ Ý‰Œ×ÒÑÔÐÝ”y ¨¸$Ð?Ñ?Ô?ˆŒÝ”mÐ$cÐ$cÐ$cÐ$cÕRWÐYaÑRbÔRbÐ$cÑ$cÔ$cÑdÔdˆŒÝ”]Ð#RÐ#RÐ#RÐ#RÅÈÑAQÔAQÐ#RÑ#RÔ#RÑSÔSˆŒ
Ýœ	 *¨gÑ6Ô6ˆŒˆˆr(   r€   r8   c                 óÈ   — |                       |¦  «        }t          | j        | j        ¦  «        D ]\  }}| | ||¦  «        ¦  «        z   }Œ|                      |¦  «        }|S r/   )rc  Úzipre  rf  rg  )r4   r€   Úlayerrf  s       r&   rL   zDistilledGuidance.forwardÓ  sd   € Ø�LŠL˜‰OŒOˆå ¤¨T¬ZÑ8Ô8ð 	$ð 	$‰LˆE�5Ø�E�E˜%˜% ™(œ(‘O”OÑ#ˆAˆAà�MŠM˜!ÑÔˆàˆr(   )r]  r‘   rS   s   @r&   r\  r\  Ê  sy   ø€ € € € € ð7ð 7˜sð 7¨Sð 7¸cð 7ð 7ð 7ð 7ð 7ð 7ð˜ð  Fð ð ð ð ð ð ð ð r(   r\  c                   ó¦   ‡ — e Zd ZdZ	 	 	 	 	 ddeded	ed
edef
ˆ fd„Zd„ Zdej	        de
j        de
j        de
j        dej        dej	        fd„Zˆ xZS )ÚSigLIPMultiFeatProjModela  
    SigLIP Multi-Feature Projection Model for processing style features from different layers 
    and projecting them into a unified hidden space.
    
    Args:
        siglip_token_nums (int): Number of SigLIP tokens, default 257
        style_token_nums (int): Number of style tokens, default 256  
        siglip_token_dims (int): Dimension of SigLIP tokens, default 1536
        hidden_size (int): Hidden layer size, default 3072
        context_layer_norm (bool): Whether to use context layer normalization, default False
    é  é   é   r   FÚsiglip_token_numsÚstyle_token_numsÚsiglip_token_dimsr   Úcontext_layer_normc                 óx  •— t          ¦   «                              ¦   «          t          j        t          j        ||¦  «        t          j        ¦   «         ¦  «        | _        |rt          j        |¦  «        nt          j        ¦   «         | _	        t          j        ||d¬¦  «        | _
        t          j        t          j        ||¦  «        t          j        ¦   «         ¦  «        | _        |rt          j        |¦  «        nt          j        ¦   «         | _        t          j        ||d¬¦  «        | _        t          j        t          j        ||¦  «        t          j        ¦   «         ¦  «        | _        |rt          j        |¦  «        nt          j        ¦   «         | _        t          j        ||d¬¦  «        | _        d S )NTrz   )r1   r2   r   r  r{   r}   Úhigh_embedding_linearr  ÚIdentityÚhigh_layer_normÚhigh_projectionÚmid_embedding_linearÚmid_layer_normÚmid_projectionÚlow_embedding_linearÚlow_layer_normÚlow_projection)r4   rq  rr  rs  r   rt  r5   s         €r&   r2   z!SigLIPMultiFeatProjModel.__init__ë  s€  ø€ õ 	‰Œ×ÒÑÔÐõ &(¤]ÝŒIÐ'Ð)9Ñ:Ô:ÝŒG‰IŒIñ&
ô &
ˆÔ"ð
 0BÐT�BŒLÐ*Ñ+Ô+Ð+ÅrÄ{Á}Ä}ð 	Ôõ  "œyÐ):¸KÈdÐSÑSÔSˆÔõ %'¤MÝŒIÐ'Ð)9Ñ:Ô:ÝŒG‰IŒIñ%
ô %
ˆÔ!ð
 0BÐT�BŒLÐ*Ñ+Ô+Ð+ÅrÄ{Á}Ä}ð 	Ôõ !œiÐ(9¸;ÈTÐRÑRÔRˆÔõ %'¤MÝŒIÐ'Ð)9Ñ:Ô:ÝŒG‰IŒIñ%
ô %
ˆÔ!ð
 0BÐT�BŒLÐ*Ñ+Ô+Ð+ÅrÄ{Á}Ä}ð 	Ôõ !œiÐ(9¸;ÈTÐRÑRÔRˆÔÐÐr(   c                 ó¼  — t          | j                             ¦   «         ¦  «        j        }|                      |j        d         | j        | j        | j        |¦  «        }|                      |j        d         | j        | j	        | j
        |¦  «        }|                      |j        d         | j        | j        | j        |¦  «        }t          j        |||fd¬¦  «        S )a  
        Forward pass function
        
        Args:
            siglip_outputs: Output from SigLIP model, containing hidden_states
            
        Returns:
            torch.Tensor: Concatenated multi-layer features with shape [bs, 3*style_token_nums, hidden_size]
        éþÿÿÿiõÿÿÿiìÿÿÿrD   rC   )Únextrv  Ú
parametersra   Ú_process_layer_featuresÚhidden_statesrx  ry  rz  r{  r|  r}  r~  r  rF   rG   )r4   Úsiglip_outputsra   Úhigh_embeddingÚmid_embeddingÚlow_embeddings         r&   rL   z SigLIPMultiFeatProjModel.forward  sæ   € õ �TÔ/×:Ò:Ñ<Ô<Ñ=Ô=ÔCˆð ×5Ò5ØÔ(¨Ô,ØÔ&ØÔ ØÔ Øñ
ô 
ˆð ×4Ò4ØÔ(¨Ô-ØÔ%ØÔØÔØñ
ô 
ˆð ×4Ò4ØÔ(¨Ô-ØÔ%ØÔØÔØñ
ô 
ˆõ Œy˜.¨-¸ÐGÈQÐOÑOÔOÐOr(   r…  Úembedding_linearÚ
layer_normÚ
projectionra   r8   c                 ó¾   —  ||                      |¦  «                             dd¦  «        ¦  «                             dd¦  «        } ||¦  «        } ||¦  «        }|S )a¿  
        Helper function to process features from a single layer
        
        Args:
            hidden_states: Input hidden states [bs, seq_len, dim]
            embedding_linear: Embedding linear layer
            layer_norm: Layer normalization
            projection: Projection layer
            dtype: Target data type
            
        Returns:
            torch.Tensor: Processed features [bs, style_token_nums, hidden_size]
        rD   r   )rm   r¦   )r4   r…  rŠ  r‹  rŒ  ra   rr   s          r&   r„  z0SigLIPMultiFeatProjModel._process_layer_features=  so   € ð, %Ð$Ø×Ò˜UÑ#Ô#×-Ò-¨a°Ñ3Ô3ñ
ô 
ç
Š)�A�q‰/Œ/ð 	ð
 �J˜yÑ)Ô)ˆ	ð �J˜yÑ)Ô)ˆ	àÐr(   )rn  ro  rp  r   F)rN   rO   rP   rL  r!   r„   r2   rL   rF   r   r   ÚModulera   r„  rR   rS   s   @r&   rm  rm  Þ  s  ø€ € € € € ð
ð 
ð "%Ø #Ø!%ØØ#(ð&Sð &Sàð&Sð ð&Sð ð	&Sð
 ð&Sð !ð&Sð &Sð &Sð &Sð &Sð &SðP(Pð (Pð (PðT à”|ð ð œ)ð ð ”Ið	 ð
 ”Ið ð Œ{ð ð 
Œð ð  ð  ð  ð  ð  ð  ð  r(   rm  )r   r   NN)rZ   r[   )&rd   Údataclassesr   rF   Úeinopsr   r   r   Úsharedr   r	   r
   r   Úshared.kernelsr   r!   rh   r'   rŽ  r*   rU   rs   ru   r†   r“   r®   r¹   rÄ   rÆ   rÒ   rÖ   rÝ   rê   rñ   r:  rN  r\  rm  r›   r(   r&   ú<module>r“     s  ðð €€€Ø !Ð !Ð !Ð !Ð !Ð !à €€€Ø Ð Ð Ð Ð Ð Ø Ð Ð Ð Ð Ð Ð Ð à  Ð  Ð  Ð  Ð  Ð  Ø /Ð /Ð /Ð /Ð /Ð /Ð /Ð /Ð /Ð /Ø Ð Ð Ð Ð Ð ð ØØ-1Ø&*ð	$ð $Øð$àð$ð $ d™lð$ð ˜t‘|ð	$ð $ð $ð $ð4 ð  ð  ð  ð  ˆbŒiñ  ô  ð  ð  ð  ð  ð  ð  �2”9ñ  ô  ð  ð ð ˜&ð Àeð ð ð ð ð,;ð ;ð ;ð ;ð ;�"”)ñ ;ô ;ð ;ðFð Fð Fð Fð FˆeŒhŒoñ Fô Fð Fð
,ð 
,ð 
,ð 
,ð 
,ˆUŒXŒ_ñ 
,ô 
,ð 
,ð 	Bð 	Bð 	Bð]ð ]ð ]ðxð xð xð+ð +ð +ð +ð +�B”Iñ +ô +ð +ð ðð ð ð ð ñ ô ñ „ðð

ð 
ð 
ð 
ð 
˜-ñ 
ô 
ð 
ð
ð 
ð 
ð 
ð 
�”ñ 
ô 
ð 
ð2ð 2ð 2ð 2ð 2�R”Yñ 2ô 2ð 2ðxIð xIð xIð xIð xI˜œ	ñ xIô xIð xIðvMð Mð Mð Mð M˜œ	ñ Mô Mð Mð`%ð %ð %ð %ð %�”	ñ %ô %ð %ðPð ð ð ð ˜œ	ñ ô ð ð(ð ð ð ð ˜uœxœñ ô ð ð ð r(   