Ë
    ÛÓ^j:ô  ã                   ó<  — d dl mZ d dlmZ d dlZd dlZd dlmZ d dlmc 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 dd	lmZ dd
lmZ ddlmZ ddlmZmZ ddlm Z 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,m-Z- ddl.m/Z/m0Z0 ddl1m2Z2m3Z3m4Z4m5Z5m6Z6  G d„ dejn                  «      Z8 G d„ dejn                  «      Z9 G d„ dejn                  «      Z: G d„ de«      Z;dejx                  de=dejx                  fd „Z>	 dXd!ejn                  d"ejx                  d#ejx                  d$ejx                  d%ejx                  dz  d&e?d'e?d(e&e(   fd)„Z@d*„ ZAdYd+„ZB G d,„ d-ejn                  «      ZC G d.„ d/ejn                  «      ZDe) G d0„ d1e$«      «       ZE G d2„ d3eE«      ZF G d4„ d5eE«      ZG G d6„ d7eE«      ZHd8ejx                  d9e=dz  dejx                  fd:„ZI G d;„ d<eE«      ZJdZd=e=fd>„ZK	 d[d?ejx                  d@e=d=e=dAe=fdB„ZLdCejx                  dDejš                  dEe=dFeNdGe=dejx                  fdH„ZOdIdej                   fdJejx                  dKe=dLe=dMeQdNe=dOej¤                  deSejx                  ejx                  f   fdP„ZT G dQ„ dReE«      ZU e)dS¬T«       G dU„ dVeEe«      «       ZVg dW¢ZWy)\é    )ÚCallable)ÚOptionalNé   )Úinitialization)ÚACT2FN)ÚCacheÚDynamicCacheÚEncoderDecoderCache)ÚGenerationMixin)Úcreate_causal_mask)ÚFlashAttentionKwargs)ÚGradientCheckpointingLayer)ÚBaseModelOutputWithPastÚCausalLMOutputWithPast)ÚROPE_INIT_FUNCTIONSÚdynamic_rope_update)ÚALL_ATTENTION_FUNCTIONSÚPreTrainedModel)ÚUnpack)ÚTransformersKwargsÚauto_docstringÚcan_return_tuple)Úmaybe_autocastÚmerge_with_config_defaults)ÚOutputRecorderÚcapture_outputsé   )Ú	BltConfigÚBltGlobalTransformerConfigÚBltLocalDecoderConfigÚBltLocalEncoderConfigÚBltPatcherConfigc                   ó$   ‡ — e Zd Zˆ fd„Zd„ Zˆ xZS )ÚBltMLPc                 óÊ  •— t         ‰| �  «        || _        |j                  | _        |j                  | _        t        j                  | j                  | j                  d¬«      | _        t        j                  | j                  | j                  d¬«      | _        t        j                  | j                  | j                  d¬«      | _	        t        |j                     | _        y ©NF©Úbias)ÚsuperÚ__init__ÚconfigÚhidden_sizeÚintermediate_sizeÚnnÚLinearÚ	gate_projÚup_projÚ	down_projr   Ú
hidden_actÚact_fn©Úselfr+   Ú	__class__s     €úo/var/www/ramen.bs-engineer-server.com/venv/lib/python3.12/site-packages/transformers/models/blt/modeling_blt.pyr*   zBltMLP.__init__5   s¦   ø€ Ü‰ÑÔØˆŒØ!×-Ñ-ˆÔØ!'×!9Ñ!9ˆÔÜŸ™ 4×#3Ñ#3°T×5KÑ5KÐRWÔXˆŒÜ—y‘y ×!1Ñ!1°4×3IÑ3IÐPUÔVˆŒÜŸ™ 4×#9Ñ#9¸4×;KÑ;KÐRWÔXˆŒä˜V×.Ñ.Ñ/ˆ�ó    c                 óˆ   — | j                  | j                  | j                  |«      «      | j                  |«      z  «      }|S ©N)r2   r4   r0   r1   )r6   Úxr2   s      r8   ÚforwardzBltMLP.forward@   s6   € Ø—N‘N 4§;¡;¨t¯~©~¸aÓ/@Ó#AÀDÇLÁLÐQRÃOÑ#SÓTˆ	ØÐr9   )Ú__name__Ú
__module__Ú__qualname__r*   r=   Ú__classcell__©r7   s   @r8   r$   r$   4   s   ø„ ô	0ör9   r$   c                   óh   ‡ — e Zd Zddeddfˆ fd„Zdej                  dej                  fd„Zd„ Zˆ xZ	S )	Ú
BltRMSNormÚepsÚreturnNc                 óŠ   •— t         ‰| �  «        t        j                  t	        j
                  |«      «      | _        || _        y)z9
        BltRMSNorm is equivalent to T5LayerNorm
        N)r)   r*   r.   Ú	ParameterÚtorchÚonesÚweightÚvariance_epsilon)r6   r,   rE   r7   s      €r8   r*   zBltRMSNorm.__init__F   s1   ø€ ô 	‰ÑÔÜ—l‘l¤5§:¡:¨kÓ#:Ó;ˆŒØ #ˆÕr9   Úhidden_statesc                 ó"  — |j                   }|j                  t        j                  «      }|j	                  d«      j                  dd¬«      }|t        j                  || j                  z   «      z  }| j                  |j                  |«      z  S )Né   éÿÿÿÿT)Úkeepdim)	ÚdtypeÚtorI   Úfloat32ÚpowÚmeanÚrsqrtrL   rK   )r6   rM   Úinput_dtypeÚvariances       r8   r=   zBltRMSNorm.forwardN   sy   € Ø#×)Ñ)ˆØ%×(Ñ(¬¯©Ó7ˆØ ×$Ñ$ QÓ'×,Ñ,¨R¸Ð,Ó>ˆØ%¬¯©°H¸t×?TÑ?TÑ4TÓ(UÑUˆØ�{‰{˜]×-Ñ-¨kÓ:Ñ:Ð:r9   c                 ó^   — t        | j                  j                  «      › d| j                  › �S )Nz, eps=)ÚtuplerK   ÚshaperL   ©r6   s    r8   Ú
extra_reprzBltRMSNorm.extra_reprU   s*   € Ü˜Ÿ™×)Ñ)Ó*Ð+¨6°$×2GÑ2GÐ1HÐIÐIr9   )g�íµ ÷Æ°>)
r>   r?   r@   Úfloatr*   rI   ÚTensorr=   r^   rA   rB   s   @r8   rD   rD   E   s7   ø„ ñ$¨ð $¸$õ $ð; U§\¡\ð ;°e·l±ló ;öJr9   rD   c                   óÄ   ‡ — e Zd ZU ej                  ed<   ddefˆ fd„Ze	 	 	 ddedz  de	d   de
dz  ded	ef   fd
„«       Z ej                  «       ed„ «       «       Zˆ xZS )ÚBltRotaryEmbeddingÚinv_freqNr+   c                 ó®  •— t         ‰| �  «        |j                  | _        |j                  | _        || _        | j
                  j                  d   | _        | j                  }| j                  dk7  rt        | j                     } || j
                  |«      \  }| _
        | j                  d|d¬«       | j                  d|j                  «       d¬«       y )NÚ	rope_typeÚdefaultrc   F)Ú
persistentÚoriginal_inv_freq)r)   r*   Úmax_position_embeddingsÚmax_seq_len_cachedÚoriginal_max_seq_lenr+   Úrope_parametersre   Úcompute_default_rope_parametersr   Úattention_scalingÚregister_bufferÚclone)r6   r+   ÚdeviceÚrope_init_fnrc   r7   s        €r8   r*   zBltRotaryEmbedding.__init__\   s¶   ø€ Ü‰ÑÔØ"(×"@Ñ"@ˆÔØ$*×$BÑ$BˆÔ!àˆŒàŸ™×4Ñ4°[ÑAˆŒØ!%×!EÑ!EˆØ�>‰>˜YÒ&Ü.¨t¯~©~Ñ>ˆLÙ+7¸¿¹ÀVÓ+LÑ(ˆ�$Ô(à×Ñ˜Z¨¸eÐÔDØ×ÑÐ0°(·.±.Ó2BÈuÐÕUr9   rq   ztorch.deviceÚseq_lenrF   ztorch.Tensorc                 ó  — | j                   d   }t        | dd«      xs | j                  | j                  z  }d}d|t	        j
                  d|dt        j                  ¬«      j                  |t        j                  ¬«      |z  z  z  }||fS )	a¨  
        Computes the inverse frequencies according to the original RoPE implementation
        Args:
            config ([`~transformers.PreTrainedConfig`]):
                The model configuration.
            device (`torch.device`):
                The device to use for initialization of the inverse frequencies.
            seq_len (`int`, *optional*):
                The current sequence length. Unused for this type of RoPE.
        Returns:
            Tuple of (`torch.Tensor`, `float`), containing the inverse frequencies for the RoPE embeddings and the
            post-processing scaling factor applied to the computed cos/sin (unused in this type of RoPE).
        Ú
rope_thetaÚhead_dimNç      ð?r   rO   ©rR   )rq   rR   )	rl   Úgetattrr,   Únum_attention_headsrI   ÚarangeÚint64rS   r_   )r+   rq   rs   ÚbaseÚdimÚattention_factorrc   s          r8   rm   z2BltRotaryEmbedding.compute_default_rope_parametersl   s�   € ð& ×%Ñ% lÑ3ˆÜ�f˜j¨$Ó/Òc°6×3EÑ3EÈ×IcÑIcÑ3cˆàÐð Ø”U—\‘\ ! S¨!´5·;±;Ô?×BÑBÈ&ÔX]×XcÑXcÐBÓdÐgjÑjÑkñ
ˆð Ð)Ð)Ð)r9   c                 ó  — | j                   d d d …d f   j                  «       j                  |j                  d   dd«      }|d d …d d d …f   j                  «       }t	        |j
                  j                  t        «      r/|j
                  j                  dk7  r|j
                  j                  nd}t        |d¬«      5  |j                  «       |j                  «       z  j                  dd«      }t        j                  |dd¬	«      }|j                  «       | j                  z  }|j                  «       | j                  z  }	d d d «       j                  |j                   ¬
«      	j                  |j                   ¬
«      fS # 1 sw Y   ŒAxY w)Nr   rP   r   ÚmpsÚcpuF)Údevice_typeÚenabledrO   ©r~   rx   )rc   r_   Úexpandr\   Ú
isinstancerq   ÚtypeÚstrr   Ú	transposerI   Úrepeat_interleaveÚcosrn   ÚsinrS   rR   )
r6   r<   Úposition_idsÚinv_freq_expandedÚposition_ids_expandedrƒ   ÚfreqsÚembrŒ   r�   s
             r8   r=   zBltRotaryEmbedding.forwardŠ   s@  € ð !ŸM™M¨$²°4¨-Ñ8×>Ñ>Ó@×GÑGÈ×HZÑHZÐ[\ÑH]Ð_aÐcdÓeÐØ ,ªQ°²a¨ZÑ 8× >Ñ >Ó @Ðä'1°!·(±(·-±-ÄÔ'EÈ!Ï(É(Ï-É-Ð[`ÒJ`�a—h‘h—m’mÐfkˆÜ¨¸UÔCñ 	5Ø&×,Ñ,Ó.Ð1F×1LÑ1LÓ1NÑN×YÑYÐZ[Ð]^Ó_ˆEÜ×)Ñ)¨%°¸Ô;ˆCØ—'‘'“)˜d×4Ñ4Ñ4ˆCØ—'‘'“)˜d×4Ñ4Ñ4ˆC÷		5ð �v‰v˜AŸG™GˆvÓ$ c§f¡f°1·7±7 fÓ&;Ð;Ð;÷	5ð 	5ús   Â=BFÆF
r;   ©NNN)r>   r?   r@   rI   r`   Ú__annotations__r   r*   Ústaticmethodr   Úintr[   r_   rm   Úno_gradr   r=   rA   rB   s   @r8   rb   rb   Y   s˜   ø… Ø�l‰lÓñV˜yõ Vð  à#'Ø+/Ø"ñ*Ø˜DÑ ð*à˜Ñ(ð*ð �t‘ð*ð 
ˆ~˜uÐ$Ñ	%ò	*ó ð*ð: €U‡]�]ƒ_Øñ<ó ó ô<r9   rb   c                   ó¾  ‡ — e Zd Zdefˆ fd„Z	 	 	 	 	 	 	 	 ddej                  dej                  dz  dej                  dz  dej                  dz  deej                  ej                  f   dz  d	ej                  dz  d
e	dz  de
dz  deej                  ej                  f   dz  dee   deej                  eej                  ej                  f   dz  f   fd„Zˆ xZS )ÚBltTransformerLayerÚ	layer_idxc                 ó.  •— t         ‰| �  «        |j                  | _        t        ||¬«      | _        t        |«      | _        t        |j                  |j                  ¬«      | _	        t        |j                  |j                  ¬«      | _
        || _        y )N)r+   rš   ©rE   )r)   r*   r,   ÚBltSelfAttentionÚ	self_attnr$   ÚmlprD   Úrms_norm_epsÚinput_layernormÚpost_attention_layernormrš   ©r6   r+   rš   r7   s      €r8   r*   zBltTransformerLayer.__init__œ   sr   ø€ Ü‰ÑÔØ!×-Ñ-ˆÔä)°À9ÔMˆŒÜ˜&“>ˆŒÜ)¨&×*<Ñ*<À&×BUÑBUÔVˆÔÜ(2°6×3EÑ3EÈ6×K^ÑK^Ô(_ˆÔ%à"ˆ�r9   NrM   Úcross_attention_statesÚcross_attention_maskÚattention_maskÚfull_text_row_masked_out_maskrŽ   Úpast_key_valuesÚ	use_cacheÚposition_embeddingsÚkwargsrF   c
           
      óÀ   — |}| j                  |«      } | j                  d||||||	dœ|
¤Ž\  }}||z   }|}| j                  |«      }| j                  |«      }||z   }|S )a‘  
        Args:
            hidden_states (`torch.FloatTensor`): input to the layer of shape `(batch, seq_len, embed_dim)`
            attention_mask (`torch.FloatTensor`, *optional*):
                attention mask of size `(batch_size, sequence_length)` if flash attention is used or `(batch_size, 1,
                query_sequence_length, key_sequence_length)` if default attention is used.

            use_cache (`bool`, *optional*):
                If set to `True`, `past_key_values` key value states are returned and can be used to speed up decoding
                (see `past_key_values`).
            past_key_values (`Cache`, *optional*): cached past key and value projection states
            position_embeddings (`tuple[torch.FloatTensor, torch.FloatTensor]`, *optional*):
                Tuple containing the cosine and sine positional embeddings of shape `(batch_size, seq_len, head_dim)`,
                with `head_dim` being the embedding dimension of each attention head.
            kwargs (`dict`, *optional*):
                Arbitrary kwargs to be ignored, used for FSDP and other methods that injects code
                into the model
        )rM   r¦   rŽ   r¨   r©   rª   © )r¡   rž   r¢   rŸ   )r6   rM   r¤   r¥   r¦   r§   rŽ   r¨   r©   rª   r«   ÚresidualÚself_attn_weightss                r8   r=   zBltTransformerLayer.forward§   s“   € ð> !ˆà×,Ñ,¨]Ó;ˆð ,:¨4¯>©>ð ,
Ø'Ø)Ø%Ø+ØØ 3ñ,
ð ñ,
Ñ(ˆÐ(ð ! =Ñ0ˆð !ˆØ×5Ñ5°mÓDˆØŸ™ Ó/ˆØ  =Ñ0ˆàÐr9   )NNNNNNFN)r>   r?   r@   r–   r*   rI   r`   r[   Ú
LongTensorr   Úboolr   r   ÚFloatTensorr=   rA   rB   s   @r8   r™   r™   ›   s,  ø„ ð	#¨#õ 	#ð 7;Ø48Ø.2ØRVØ04Ø(,Ø!&ØHLñ5à—|‘|ð5ð !&§¡¨tÑ 3ð5ð $Ÿl™l¨TÑ1ð	5ð
 Ÿ™ tÑ+ð5ð (-¨U¯\©\¸5¿<¹<Ð-GÑ'HÈ4Ñ'Oð5ð ×&Ñ&¨Ñ-ð5ð  ™ð5ð ˜$‘;ð5ð # 5§<¡<°·±Ð#=Ñ>ÀÑEð5ð Ð-Ñ.ð5ð 
ˆu× Ñ  %¨×(9Ñ(9¸5×;LÑ;LÐ(LÑ"MÐPTÑ"TÐTÑ	U÷5r9   r™   rM   Ún_reprF   c                 óª   — | j                   \  }}}}|dk(  r| S | dd…dd…ddd…dd…f   j                  |||||«      } | j                  |||z  ||«      S )zÔ
    This is the equivalent of torch.repeat_interleave(x, dim=1, repeats=n_rep). The hidden states go from (batch,
    num_key_value_heads, seqlen, head_dim) to (batch, num_attention_heads, seqlen, head_dim)
    r   N)r\   r†   Úreshape)rM   r³   ÚbatchÚnum_key_value_headsÚslenrv   s         r8   Ú	repeat_kvr¹   ß   so   € ð
 2?×1DÑ1DÑ.€EÐ  hØ�‚zØÐØ!¢!¢Q¨ªa²Ð"2Ñ3×:Ñ:¸5ÐBUÐW\Ð^bÐdlÓm€MØ× Ñ  Ð(;¸eÑ(CÀTÈ8ÓTÐTr9   ÚmoduleÚqueryÚkeyÚvaluer¦   ÚscalingÚdropoutr«   c                 ó  — t        || j                  «      }t        || j                  «      }	t        j                  ||j	                  dd«      «      |z  }
|�|
|z   }
t
        j                  j                  |
dt        j                  ¬«      j                  |j                  «      }
t
        j                  j                  |
|| j                  ¬«      }
t        j                  |
|	«      }|j	                  dd«      j                  «       }||
fS )NrO   r   rP   )r~   rR   ©ÚpÚtrainingr   )r¹   Únum_key_value_groupsrI   ÚmatmulrŠ   r.   Ú
functionalÚsoftmaxrT   rS   rR   r¿   rÃ   Ú
contiguous)rº   r»   r¼   r½   r¦   r¾   r¿   r«   Ú
key_statesÚvalue_statesÚattn_weightsÚattn_outputs               r8   Úeager_attention_forwardrÍ   ë   sà   € ô ˜3 × ;Ñ ;Ó<€JÜ˜U F×$?Ñ$?Ó@€Lä—<‘<  z×';Ñ';¸A¸qÓ'AÓBÀWÑL€LØÐ!Ø# nÑ4ˆä—=‘=×(Ñ(¨¸2ÄUÇ]Á]Ð(ÓS×VÑVÐW\×WbÑWbÓc€LÜ—=‘=×(Ñ(¨¸È6Ï?É?Ð(Ó[€LÜ—,‘,˜|¨\Ó:€KØ×'Ñ'¨¨1Ó-×8Ñ8Ó:€Kà˜Ð$Ð$r9   c                 ó€   — | dd d d…f   }| ddd d…f   }t        j                  | |gd¬«      j                  d«      }|S )N.rO   r   rP   r…   éþÿÿÿ)rI   ÚstackÚflatten)r<   Úx1Úx2Úrot_xs       r8   Úrotate_halfrÕ     sL   € à	
ˆ3‘�!�ˆ8‰€BØ	
ˆ3���1�ˆ9‰€BÜ�K‰K˜"˜˜b˜	 rÔ*×2Ñ2°2Ó6€EØ€Lr9   c                 óž   — |j                  |«      }|j                  |«      }| |z  t        | «      |z  z   }||z  t        |«      |z  z   }||fS )a…  Applies Rotary Position Embedding to the query and key tensors.

    Args:
        q (`torch.Tensor`): The query tensor.
        k (`torch.Tensor`): The key tensor.
        cos (`torch.Tensor`): The cosine part of the rotary embedding.
        sin (`torch.Tensor`): The sine part of the rotary embedding.
        unsqueeze_dim (`int`, *optional*, defaults to 1):
            The 'unsqueeze_dim' argument specifies the dimension along which to unsqueeze cos[position_ids] and
            sin[position_ids] so that they can be properly broadcasted to the dimensions of q and k. For example, note
            that cos[position_ids] and sin[position_ids] have the shape [batch_size, seq_len, head_dim]. Then, if q and
            k have the shape [batch_size, heads, seq_len, head_dim], then setting unsqueeze_dim=1 makes
            cos[position_ids] and sin[position_ids] broadcastable to the shapes of q and k. Similarly, if q and k have
            the shape [batch_size, seq_len, heads, head_dim], then set unsqueeze_dim=2.
    Returns:
        `tuple(torch.Tensor)` comprising of the query and key tensors rotated using the Rotary Position Embedding.
    )Ú	unsqueezerÕ   )ÚqÚkrŒ   r�   Úunsqueeze_dimÚq_embedÚk_embeds          r8   Úapply_rotary_pos_embrÝ     sY   € ð$ �-‰-˜Ó
&€CØ
�-‰-˜Ó
&€CØ�3‰wœ; q›>¨CÑ/Ñ0€GØ�3‰wœ; q›>¨CÑ/Ñ0€GØ�GÐÐr9   c                   ó|   ‡ — e Zd Zdedefˆ fd„Z	 ddej                  dej                  dej                  fd„Zˆ xZ	S )	r�   r+   rš   c                 ód  •— t         ‰| �  «        || _        |j                  | _        |j
                  | _        |j                  | _        |j                  | _        |j                  | j                  z  | _        | j                  | j                  z  | _	        | j                  dz  | _
        || _        d| _        t        j                  | j                  | j                  | j                  z  d¬«      | _        t        j                  | j                  | j                  | j                  z  d¬«      | _        t        j                  | j                  | j                  | j                  z  d¬«      | _        t        j                  | j                  | j                  z  | j                  d¬«      | _        y )Nç      à¿TFr'   )r)   r*   r+   rz   Ú	num_headsr¿   r,   r·   rv   rÄ   r¾   rš   Ú	is_causalr.   r/   Úq_projÚk_projÚv_projÚo_projr£   s      €r8   r*   zBltSelfAttention.__init__&  s8  ø€ Ü‰ÑÔØˆŒØ×3Ñ3ˆŒØ—~‘~ˆŒØ!×-Ñ-ˆÔØ#)×#=Ñ#=ˆÔ Ø×*Ñ*¨d¯n©nÑ<ˆŒØ$(§N¡N°d×6NÑ6NÑ$NˆÔ!Ø—}‘} dÑ*ˆŒà"ˆŒØˆŒä—i‘i × 0Ñ 0°$·.±.À4Ç=Á=Ñ2PÐW\Ô]ˆŒÜ—i‘i × 0Ñ 0°$×2JÑ2JÈTÏ]É]Ñ2ZÐafÔgˆŒÜ—i‘i × 0Ñ 0°$×2JÑ2JÈTÏ]É]Ñ2ZÐafÔgˆŒÜ—i‘i §¡°·±Ñ >À×@PÑ@PÐW\Ô]ˆ�r9   rM   r¦   rª   c                 ó‚  — |j                  «       \  }}}| j                  |«      }	| j                  |«      }
| j                  |«      }|	j	                  ||| j
                  | j                  «      j                  dd«      }	|
j	                  ||| j                  | j                  «      j                  dd«      }
|j	                  ||| j                  | j                  «      j                  dd«      }|\  }}t        |	|
||«      \  }	}
|� |j                  |
|| j                  «      \  }
}t        j                  | j                  j                  t         «      } || |	|
||f| j"                  sdn| j$                  | j&                  dœ|¤Ž\  }}|j)                  ||d«      j+                  «       }| j-                  |«      }||fS )Nr   rO   ç        ©r¿   r¾   rP   )Úsizerã   rä   rå   Úviewrá   rv   rŠ   r·   rÝ   Úupdaterš   r   Úget_interfacer+   Ú_attn_implementationrÍ   rÃ   r¿   r¾   rµ   rÈ   ræ   )r6   rM   r¦   rª   r¨   r«   ÚbszÚq_lenÚ_Úquery_statesrÉ   rÊ   rŒ   r�   Úattention_interfacerÌ   rË   s                    r8   r=   zBltSelfAttention.forward9  s±  € ð &×*Ñ*Ó,‰ˆˆU�Aà—{‘{ =Ó1ˆØ—[‘[ Ó/ˆ
Ø—{‘{ =Ó1ˆà#×(Ñ(¨¨e°T·^±^ÀTÇ]Á]ÓS×]Ñ]Ð^_ÐabÓcˆØ—_‘_ S¨%°×1IÑ1IÈ4Ï=É=ÓY×cÑcÐdeÐghÓiˆ
Ø#×(Ñ(¨¨e°T×5MÑ5MÈtÏ}É}Ó]×gÑgÐhiÐklÓmˆà&‰ˆˆSÜ#7¸ÀjÐRUÐWZÓ#[Ñ ˆ�jàÐ&Ø'6×'=Ñ'=¸jÈ,ÐX\×XfÑXfÓ'gÑ$ˆJ˜ä(?×(MÑ(MØ�K‰K×,Ñ,Ô.Eó)
Ðñ %8ØØØØØð	%
ð  $Ÿ}š}‘C°$·,±,Ø—L‘Lñ	%
ð ñ	%
Ñ!ˆ�\ð "×)Ñ)¨#¨u°bÓ9×DÑDÓFˆØ—k‘k +Ó.ˆà˜LÐ(Ð(r9   r;   )
r>   r?   r@   r   r–   r*   rI   r`   r=   rA   rB   s   @r8   r�   r�   %  sK   ø„ ð^˜yð ^°Sõ ^ð0 ñ*)à—|‘|ð*)ð Ÿ™ð*)ð #Ÿ\™\÷	*)r9   r�   c                   ó  ‡ — e Zd ZdZddedededz  fˆ fd„Z	 	 ddej                  dej                  dz  d	ej                  dz  d
e	e
   deej                  ej                  dz  eej                     dz  f   f
d„Zˆ xZS )ÚBltCrossAttentionz<Cross-attention module for Blt, following transformers styleNr+   rš   r,   c                 ó$  •— t         ‰| �  «        || _        | j                  j                  | _        | j                  j
                  | _        |j                  | _        |j                  | _        |j                  | j                  z  | _        || _	        | j                  | j
                  z  | _
        | j                  dz  | _        t        j                  | j                  | j                  | j                  z  d¬«      | _        t        j                  | j                  | j
                  | j                  z  d¬«      | _        t        j                  | j                  | j
                  | j                  z  d¬«      | _        t        j                  | j                  | j                  z  | j                  d¬«      | _        t%        | j                  |j&                  ¬«      | _        t%        | j                  |j&                  ¬«      | _        d| _        y )Nrà   Fr'   rœ   )r)   r*   r+   rz   rá   r·   r¿   r,   rv   rš   rÄ   r¾   r.   r/   rã   rä   rå   ræ   rD   r    Úq_normÚk_normrâ   )r6   r+   rš   r,   r7   s       €r8   r*   zBltCrossAttention.__init__i  st  ø€ Ü‰ÑÔØˆŒØŸ™×8Ñ8ˆŒØ#'§;¡;×#BÑ#BˆÔ Ø—~‘~ˆŒØ!×-Ñ-ˆÔØ×*Ñ*¨d¯n©nÑ<ˆŒØ"ˆŒØ$(§N¡N°d×6NÑ6NÑ$NˆÔ!Ø—}‘} dÑ*ˆŒä—i‘i × 0Ñ 0°$·.±.À4Ç=Á=Ñ2PÐW\Ô]ˆŒÜ—i‘i × 0Ñ 0°$×2JÑ2JÈTÏ]É]Ñ2ZÐafÔgˆŒÜ—i‘i × 0Ñ 0°$×2JÑ2JÈTÏ]É]Ñ2ZÐafÔgˆŒÜ—i‘i §¡°·±Ñ >À×@PÑ@PÐW\Ô]ˆŒÜ  ×!1Ñ!1°v×7JÑ7JÔKˆŒÜ  ×!1Ñ!1°v×7JÑ7JÔKˆŒØˆ�r9   rM   r¤   r¦   r«   rF   c                 ó`  — |j                  «       \  }}}| j                  |«      }| j                  |«      }|j                  ||| j                  | j
                  «      j                  dd«      }| j                  |«      }| j                  |«      }	| j                  |«      }
|	j                  |d| j                  | j
                  «      j                  dd«      }	|
j                  |d| j                  | j
                  «      j                  dd«      }
t        j                  | j                  j                  t        «      } || ||	|
|f| j                   sdn| j"                  | j$                  dœ|¤Ž\  }}|j'                  ||d«      j)                  «       }| j+                  |«      }||z   }||fS )z#Input shape: Batch x Time x Channelr   rO   rP   rè   ré   )rê   r÷   rã   rë   rá   rv   rŠ   rø   rä   rå   r·   r   rí   r+   rî   rÍ   rÃ   r¿   r¾   rµ   rÈ   ræ   )r6   rM   r¤   r¦   r«   rï   rð   rñ   rò   rÉ   rÊ   ró   rÌ   rË   s                 r8   r=   zBltCrossAttention.forward}  s•  € ð &×*Ñ*Ó,‰ˆˆU�AØ—{‘{ =Ó1ˆØ—{‘{ <Ó0ˆØ#×(Ñ(¨¨e°T·^±^ÀTÇ]Á]ÓS×]Ñ]Ð^_ÐabÓcˆà!%§¡Ð-CÓ!DÐØ—[‘[Ð!7Ó8ˆ
Ø—{‘{Ð#9Ó:ˆØ—_‘_ S¨"¨d×.FÑ.FÈÏÉÓV×`Ñ`ÐabÐdeÓfˆ
Ø#×(Ñ(¨¨b°$×2JÑ2JÈDÏMÉMÓZ×dÑdÐefÐhiÓjˆä(?×(MÑ(MØ�K‰K×,Ñ,Ô.Eó)
Ðñ %8ØØØØØð	%
ð  $Ÿ}š}‘C°$·,±,Ø—L‘Lñ	%
ð ñ	%
Ñ!ˆ�\ð "×)Ñ)¨#¨u°bÓ9×DÑDÓFˆØ—k‘k +Ó.ˆØ! MÑ1ˆØ˜LÐ(Ð(r9   r;   ©NN)r>   r?   r@   Ú__doc__r   r–   r*   rI   r`   r   r   r[   r=   rA   rB   s   @r8   rõ   rõ   f  s¤   ø„ ÙFñ˜yð °Sð ÀsÈTÁzõ ð. 7;Ø.2ñ	$)à—|‘|ð$)ð !&§¡¨tÑ 3ð$)ð Ÿ™ tÑ+ð	$)ð
 Ð+Ñ,ð$)ð 
ˆu�|‰|˜UŸ\™\¨DÑ0°%¸¿¹Ñ2EÈÑ2LÐLÑ	M÷$)r9   rõ   c                   ó¢   ‡ — e Zd ZU eed<   dZdZdZdgZdZ	dZ
dZdZdZ eed¬«       eed	¬«      d
œZ ej&                  «       ˆ fd„«       Zˆ xZS )ÚBltPreTrainedModelr+   Úmodel)ÚimageÚtextTr™   Fr   )Úindexr   )rM   Ú
attentionsc           	      ó
  •— t         ‰| �  |«       |j                  j                  }t	        |t
        j                  «      rÆt        | j                  dd«      }|€7t        | j                  d«      r!t        | j                  j                  dd«      }|€|j                  }|dz  }t        j                  |j                  d|d|z  d|z  ¬«       |j                  �,t        j                   |j                  |j                     «       yt	        |t"        t$        f«      s|d	v �rqt        | j                  dd«      }|€t        |d«      r|j&                  }|€>d
D ]9  }t        ||d«      }|€Œt        |d«      sŒ |j                  j(                  d   } n |€y|dz  }dD ]v  }t        ||d«      }|€Œt        |d«      sŒ t        j                  |j                  d|d|z  d|z  ¬«       t        |dd«      €ŒXt        j                   |j*                  «       Œx t        |dt        |dd«      «      }	|	�bt        |	d«      rVt        j                  |	j                  d|d|z  d|z  ¬«       t        |	dd«      �t        j                   |	j*                  «       yt	        |t,        «      s|dk(  �rât        | j                  dd«      }|€7t        | j                  d«      r!t        | j                  j.                  dd«      }|€7t        | j                  d«      r!t        | j                  j                  dd«      }d}
|�|dz  }
t        |dt        |dd«      «      }t        |dd«      }t        |dt        |dd«      «      }||fD ]‰  }|€Œt        |d«      sŒ|
xs |j                  j(                  d   dz  }t        j                  |j                  d|d|z  d|z  ¬«       t        |dd«      €Œkt        j                   |j*                  «       Œ‹ |�€t        |d«      rt|j                  j(                  d   }|dz  }t        j                  |j                  d|d|z  d|z  ¬«       t        |dd«      �t        j                   |j*                  «       yt	        |t
        j0                  «      rg|j2                  }|dz  }t        j                  |j                  d|d|z  d|z  ¬«       |j*                  �t        j                   |j*                  «       yy)a  
        Initialize BLT weights following the original ByteLatentTransformer:

        - Most weights are drawn from a truncated normal.
        - Scale is ~ 1 / sqrt(model_dim) (or 1 / sqrt(hidden_dim) for FFN outputs).
        - Norm layers are set to weight = 1, bias = 0.
        r,   NÚencoder_configrà   rè   éýÿÿÿr   )rV   ÚstdÚaÚb)ÚMllamaTextSelfAttentionÚMllamaTextCrossAttention)rã   rä   rå   ræ   ÚdenserK   rP   )rã   rä   rå   r(   ræ   r  ÚMllamaTextMLPÚdecoder_configr0   Úfc1r1   r2   Úfc2r   )r)   Ú_init_weightsr7   r>   r‡   r.   Ú	Embeddingry   r+   Úhasattrr  Úembedding_dimÚinitÚtrunc_normal_rK   Úpadding_idxÚzeros_r�   rõ   r,   r\   r(   r$   r  r/   Úin_features)r6   rº   Ú
class_namer,   r  r~   ÚnameÚprojÚ	proj_nameræ   Úin_stdr0   r1   r2   Ú
hidden_dimÚout_stdÚfan_inr7   s                    €r8   r  z BltPreTrainedModel._init_weightsµ  sÈ  ø€ ô 	‰Ñ˜fÔ%à×%Ñ%×.Ñ.ˆ
ô �fœbŸl™lÔ+Ü! $§+¡+¨}¸dÓCˆKØÐ"¤w¨t¯{©{Ð<LÔ'MÜ% d§k¡k×&@Ñ&@À-ÐQUÓV�ØÐ"Ø$×2Ñ2�à˜tÑ#ˆCÜ×ÑØ—‘ØØØ�s‘(Ø�c‘'õð ×!Ñ!Ð-Ü—‘˜FŸM™M¨&×*<Ñ*<Ñ=Ô>Øô �fÔ/Ô1BÐCÔDÈ
ð W
ò I
ô ˜$Ÿ+™+ }°dÓ;ˆCØˆ{œw v¨}Ô=Ø×(Ñ(�Øˆ{ØMò �DÜ" 6¨4°Ó6�DØÑ'¬G°D¸(Õ,CØ"Ÿk™k×/Ñ/°Ñ3˜Ùð	ð
 ˆ{Øà�t‘)ˆCð <ò /�	Ü˜v y°$Ó7�ØÑ#¬°°hÕ(?Ü×&Ñ&ØŸ™Ø ØØ˜s™(Ø˜c™'õô ˜t V¨TÓ2Ñ>ÜŸ™ D§I¡IÕ.ð/ô ˜V X¬w°v¸wÈÓ/MÓNˆFØÐ!¤g¨f°hÔ&?Ü×"Ñ"Ø—M‘MØØØ˜3‘hØ˜#‘gõô ˜6 6¨4Ó0Ð<Ü—K‘K §¡Ô,Øô �fœfÔ%¨°Ó)FÜ! $§+¡+¨}¸dÓCˆKØÐ"¤w¨t¯{©{Ð<LÔ'MÜ% d§k¡k×&@Ñ&@À-ÐQUÓV�ØÐ"¤w¨t¯{©{Ð<LÔ'MÜ% d§k¡k×&@Ñ&@À-ÐQUÓV�ð ˆFØÐ&Ø$ dÑ*�ä ¨´W¸VÀUÈDÓ5QÓRˆIÜ˜f i°Ó6ˆGÜ ¨´W¸VÀUÈDÓ5QÓRˆIð # GÐ,ò /�ØÑ#¬°°hÕ(?Ø ÒB T§[¡[×%6Ñ%6°qÑ%9¸TÑ%A�CÜ×&Ñ&ØŸ™Ø ØØ˜s™(Ø˜c™'õô ˜t V¨TÓ2Ñ>ÜŸ™ D§I¡IÕ.ð/ð Ð$¬°¸HÔ)EØ&×-Ñ-×3Ñ3°AÑ6�
Ø$ dÑ*�Ü×"Ñ"Ø×$Ñ$ØØØ˜7‘lØ˜'‘kõô ˜9 f¨dÓ3Ð?Ü—K‘K 	§¡Ô/Øô �fœbŸi™iÔ(Ø×'Ñ'ˆFØ˜$‘,ˆCÜ×ÑØ—‘ØØØ�s‘(Ø�c‘'õð �{‰{Ð&Ü—‘˜FŸK™KÔ(Øð )r9   )r>   r?   r@   r   r”   Úbase_model_prefixÚinput_modalitiesÚsupports_gradient_checkpointingÚ_no_split_modulesÚ_can_compile_fullgraphÚ_supports_sdpaÚ_supports_flash_attnÚ_supports_flex_attnÚ_supports_attention_backendr   r™   r�   Ú_can_record_outputsrI   r—   r  rA   rB   s   @r8   rý   rý   ¤  s}   ø… àÓØÐØ(ÐØ&*Ð#Ø.Ð/ÐØ"ÐØ€NØ ÐØÐØ"'Ðá'Ð(;À1ÔEÙ$Ð%5¸QÔ?ñÐð
 €U‡]�]ƒ_óJó ôJr9   rý   c                   ó\  ‡ — e Zd ZU eed<   d eedd¬«      iZdefˆ fd„Z	 	 	 	 	 	 	 	 	 dde	j                  dz  d	e	j                  dz  d
e	j                  dz  de	j                  dz  de	j                  dz  dedz  de	j                  dz  dedz  de	j                  dz  dee   fd„Zd„ Zˆ xZS )ÚBltLocalEncoderr+   Úencoder_attentionsr   Úlocal_encoder©r  Ú
layer_namec           	      óØ  •— t         ‰| �  |«       d| _        || _        t	        j
                  t        |j                  «      D �cg c]  }t        ||«      ‘Œ c}«      | _	        t        |¬«      | _        t	        j                  |j                  |j                  |j                  z  d¬«      | _        t	        j                   |j"                  |j                  «      | _        t	        j
                  «       | _        |j(                  r|j                  nd}t        |«      D ]3  }| j&                  j+                  t-        |||j                  ¬«      «       Œ5 | j/                  «        y c c}w )NF©r+   ©r  Úout_featuresr(   r   ©r+   rš   r,   )r)   r*   Úgradient_checkpointingr+   r.   Ú
ModuleListÚrangeÚnum_hidden_layersr™   Úlayersrb   Ú
rotary_embr/   r,   Úcross_attn_kÚpatch_embedding_projectionr  Ú
vocab_sizeÚembed_tokensÚcross_attn_layersÚcross_attn_all_layersÚappendrõ   Ú	post_init©r6   r+   rš   Úlayers_to_addr7   s       €r8   r*   zBltLocalEncoder.__init__I  s!  ø€ Ü‰Ñ˜Ô Ø&+ˆÔ#ØˆŒÜ—m‘mÜEJÈ6×KcÑKcÓEdÖe¸	Ô  ¨Õ3Òeó
ˆŒô -°FÔ;ˆŒÜ*,¯)©)Ø×*Ñ*Ø×+Ñ+¨f×.AÑ.AÑAØô+
ˆÔ'ô
 ŸL™L¨×):Ñ):¸F×<NÑ<NÓOˆÔÜ!#§¡£ˆÔØ4:×4PÒ4P˜×0Ò0ÐVWˆÜ˜}Ó-ò 	ˆIØ×"Ñ"×)Ñ)Ü!¨¸9ÐRX×RdÑRdÔeõð	ð
 	�‰Õùò! fs   ÁE'NÚ	input_idsÚinputs_embedsÚpatch_embedsr¦   rŽ   r¨   Úencoder_attention_maskÚnum_patchesÚ	patch_idsr«   c
                 ó.  — |€| j                  |«      }|j                  d   }t        j                  || j                  j                  | j
                  ¬«      }|€Mt        j                  |j                  d   |j                  ¬«      j                  d«      j                  |d«      }| j                  ||«      }t        j                  || j                  j                  | j
                  ¬«      }t        | j                  «      D �]  \  }} ||f|||dœ|
¤Ž}|t        | j                  «      dz
  k(  s| j                  j                  sŒF| j!                  |||	«      }| j#                  |«      }|j%                  ||j                  d   | j                  j&                  z  | j                  j(                  «      }| j                  j                  r|nd} | j*                  |   d|||dœ|
¤Ž\  }}||j-                  |j                  «      z   }�Œ |}||fS )	Nr   rÁ   r   ©rq   rP   ©rª   r¦   r¨   ©rM   r¤   r¦   r­   )r?  r\   ÚFr¿   r+   rÃ   rI   r{   rq   r×   r†   r;  Ú	enumerater:  ÚlenrA  Úpatch_reducer=  rµ   r<  r,   r@  rS   )r6   rF  rG  rH  r¦   rŽ   r¨   rI  rJ  rK  r«   Ú
batch_sizerM   rª   ÚidxÚlayerrš   Úcross_attention_outputrñ   Úencoder_cross_statess                       r8   r=   zBltLocalEncoder.forward`  s  € ð Ð Ø ×-Ñ-¨iÓ8ˆMà"×(Ñ(¨Ñ+ˆ
ÜŸ	™	 -°4·;±;×3FÑ3FÐQU×Q^ÑQ^Ô_ˆàÐä—‘˜]×0Ñ0°Ñ3¸M×<PÑ<PÔQ×[Ñ[Ð\]Ó^×eÑeÐfpÐrtÓuð ð #Ÿo™o¨m¸\ÓJÐÜŸ	™	 -°4·;±;×3FÑ3FÐQU×Q^ÑQ^Ô_ˆä# D§K¡KÓ0ó 	]‰JˆC�Ù!Øðà$7Ø-Ø /ñ	ð
 ñˆMð ”c˜$Ÿ+™+Ó&¨Ñ*Ò*¨d¯k©k×.OÓ.OØ#×0Ñ0°ÀÈYÓW�Ø#×>Ñ>¸|ÓL�Ø+×3Ñ3Ø × 2Ñ 2°1Ñ 5¸¿¹×8PÑ8PÑ PÐRV×R]ÑR]×RiÑRió �ð $(§;¡;×#DÒ#D™CÈ!�	Ø,M¨D×,BÑ,BÀ9Ñ,Mð -Ø".Ø+8Ø#9ñ-ð ñ	-Ñ)Ð&¨ð  ,Ð.D×.GÑ.GÈ×H[ÑH[Ó.\Ñ\’ð+	]ð,  ,ÐØÐ2Ð2Ð2r9   c                 óF  — |j                   d   }|j                   d   }|j                  d«      j                  dd|j                   d   «      }t        j                  |||f|j
                  |j                  ¬«      }|j                  |d|dd¬«      }|dd…d|…dd…f   }|S )	a†  
        Reduce variable length patches to single embedding per patch
        Note: this works with variable number of patches for different sequences in the batch
        It handles variable length patches by assuming that patch_lengths will be 0 for any
        extra patches on the *right*. Since there can be a variable number of patches
        this function also return the number of patches for each sequence in the batch.
        Any embeddings on the right that are not allocated to a patch
        (i.e. if the sum(patch_lengths[i]) < seq_len for any i)
        will be sent to a dummy patch, which is trimmed before returning.
        r   rP   ©rR   rq   r   ÚamaxF)Úsrcr~   r  ÚreduceÚinclude_selfN)r\   r×   r†   rI   ÚzerosrR   rq   Úscatter_reduce)r6   rM   Úmax_num_patchesrK  rT  r  Úreduced_embeddingss          r8   rS  zBltLocalEncoder.patch_reduce”  s¿   € ð #×(Ñ(¨Ñ+ˆ
Ø%×+Ñ+¨BÑ/ˆà×'Ñ'¨Ó+×2Ñ2°2°r¸=×;NÑ;NÈrÑ;RÓSˆ	ä"Ÿ[™[Ø˜¨-Ð8À×@SÑ@SÐ\i×\pÑ\pô
Ðð 0×>Ñ>ØØØØØð ?ó 
Ðð 0²Ð3C°OÐ3CÂQÐ0FÑGÐà!Ð!r9   ©	NNNNNNNNN)r>   r?   r@   r!   r”   r   r�   r*  r*   rI   r°   r`   r   r–   r   r   r=   rS  rA   rB   s   @r8   r,  r,  C  s	  ø… Ø!Ó!à™nÐ-=ÀQÐSbÔcðÐðÐ4õ ð2 .2Ø-1Ø,0Ø.2Ø04Ø(,Ø6:Ø"&Ø)-ñ23à×#Ñ# dÑ*ð23ð —|‘| dÑ*ð23ð —l‘l TÑ)ð	23ð
 Ÿ™ tÑ+ð23ð ×&Ñ&¨Ñ-ð23ð  ™ð23ð !&§¡¨tÑ 3ð23ð ˜4‘Zð23ð —<‘< $Ñ&ð23ð Ð+Ñ,ó23öh"r9   r,  c                   ó  ‡ — e Zd ZU eed<   defˆ fd„Z	 	 	 	 	 	 	 ddej                  dz  dej                  dz  dej                  dz  dej                  dz  dej                  dz  d	e	dz  d
ej                  dz  de
e   fd„Zˆ xZS )ÚBltLocalDecoderr+   c           	      óÔ  •— t         ‰| �  |«       d| _        || _        d| _        t        j                  t        |j                  «      D �cg c]  }t        ||«      ‘Œ c}«      | _
        t        |¬«      | _        t        j                  |j                  |j                  |j                   z  d¬«      | _        t%        |j                  |j&                  ¬«      | _        t        j                  «       | _        |j,                  r|j                  nd}t        |«      D ]3  }| j*                  j/                  t1        |||j                  ¬«      «       Œ5 | j3                  «        y c c}w )NFTr2  r3  rœ   r   r5  )r)   r*   r6  r+   Úcross_attn_decoderr.   r7  r8  r9  r™   r:  rb   r;  r/   Úhidden_size_globalr,   r<  r=  rD   r    Únormr@  rA  rB  rõ   rC  rD  s       €r8   r*   zBltLocalDecoder.__init__·  s$  ø€ Ü‰Ñ˜Ô Ø&+ˆÔ#ØˆŒØ"&ˆÔÜ—m‘mÜEJÈ6×KcÑKcÓEdÖe¸	Ô  ¨Õ3Òeó
ˆŒô -°FÔ;ˆŒÜ*,¯)©)Ø×1Ñ1Ø×+Ñ+¨f×.AÑ.AÑAØô+
ˆÔ'ô
 ˜v×1Ñ1°v×7JÑ7JÔKˆŒ	Ü!#§¡£ˆÔØ4:×4PÒ4P˜×0Ò0ÐVWˆÜ˜}Ó-ò 	ˆIØ×"Ñ"×)Ñ)Ü!¨¸9ÐRX×RdÑRdÔeõð	ð
 	�‰Õùò! fs   ÁE%NrF  rG  rH  r¦   rŽ   r¨   rI  r«   c                 ó"  — |j                   d   }	|}
| j                  |«      }|j                  |	|j                   d   | j                  j                  z  | j                  j
                  «      }|�| j                  s|
|z   }
|€Mt        j                  |j                   d   |j                  ¬«      j                  d«      j                  |	d«      }| j                  |
|«      }t        j                  |
| j                  j                  | j                  ¬«      }
t!        | j"                  «      D ]N  \  }}|dk(  s| j                  j$                  r! | j&                  |   d|
||dœ|¤Ž\  }}|
|z   }
 ||
f|||dœ|¤Ž}
ŒP | j)                  |
«      }|S )	Nr   r   rM  rP   rÁ   rO  rN  r­   )r\   r=  rµ   r+   r<  r,   rg  rI   r{   rq   r×   r†   r;  rP  r¿   rÃ   rQ  r:  rA  r@  ri  )r6   rF  rG  rH  r¦   rŽ   r¨   rI  r«   rT  rM   rª   ÚirV  rW  rñ   Úlogitss                    r8   r=   zBltLocalDecoder.forwardÏ  s¤  € ð #×(Ñ(¨Ñ+ˆ
Ø%ˆØ×6Ñ6°|ÓDˆØ#×+Ñ+Ø˜×*Ñ*¨1Ñ-°·±×0HÑ0HÑHÈ$Ï+É+×JaÑJaó
ˆð Ð#¨D×,CÒ,CØ)¨LÑ8ˆMàÐä—‘˜]×0Ñ0°Ñ3¸M×<PÑ<PÔQ×[Ñ[Ð\]Ó^×eÑeÐfpÐrtÓuð ð #Ÿo™o¨m¸\ÓJÐÜŸ	™	 -°4·;±;×3FÑ3FÐQU×Q^ÑQ^Ô_ˆä! $§+¡+Ó.ò 	‰HˆAˆuØ�AŠv˜Ÿ™×:Ò:Ø,E¨D×,BÑ,BÀ1Ñ,Eð -Ø"/Ø+7Ø#9ñ-ð ñ	-Ñ)Ð&¨ð !.Ð0FÑ F�Ù!Øðà$7Ø-Ø /ñ	ð
 ñ‰Mð	ð  —‘˜=Ó)ˆØˆr9   ©NNNNNNN)r>   r?   r@   r    r”   r*   rI   r°   r`   r   r   r   r=   rA   rB   s   @r8   re  re  ´  sÄ   ø… Ø!Ó!ðÐ4õ ð4 .2Ø-1Ø,0Ø.2Ø04Ø(,Ø6:ñ.à×#Ñ# dÑ*ð.ð —|‘| dÑ*ð.ð —l‘l TÑ)ð	.ð
 Ÿ™ tÑ+ð.ð ×&Ñ&¨Ñ-ð.ð  ™ð.ð !&§¡¨tÑ 3ð.ð Ð+Ñ,÷.r9   re  c                   óÂ   ‡ — e Zd ZU eed<   d eedd¬«      iZdefˆ fd„Z	 	 	 dde	j                  d	e	j                  dz  d
e	j                  dz  dedz  dee   f
d„Zˆ xZS )ÚBltGlobalTransformerr+   Úglobal_attentionsr   Úglobal_transformerr/  c                 óÔ  •— t         ‰| �  |«       || _        t        j                  «       | _        t        |j                  «      D ]'  }| j
                  j                  t        ||«      «       Œ) t        |¬«      | _        t        |dd «      �2t        j                  |j                  |j                  d¬«      | _        nt        j"                  «       | _        | j%                  «        y )Nr2  Úencoder_cross_output_sizeFr'   )r)   r*   r+   r.   r7  r:  r8  r9  rB  r™   rb   r;  ry   r/   rs  r,   Útoken_embedding_projectionÚIdentityrC  r£   s      €r8   r*   zBltGlobalTransformer.__init__  s¶   ø€ Ü‰Ñ˜Ô ØˆŒÜ—m‘m“oˆŒÜ˜v×7Ñ7Ó8ò 	GˆIØ�K‰K×ÑÔ2°6¸9ÓEÕFð	Gä,°FÔ;ˆŒô �6Ð6¸Ó=ÐIÜ.0¯i©iØ×0Ñ0°&×2DÑ2DÈ5ô/ˆDÕ+ô /1¯k©k«mˆDÔ+à�‰Õr9   NrG  r¦   rŽ   r¨   r«   c                 óÊ  — |j                   \  }}}| j                  |«      }	t        j                  |	| j                  j                  | j
                  ¬«      }	|€Mt        j                  |j                   d   |j                  ¬«      j                  d«      j                  |d«      }| j                  |	|«      }
t        | j                  «      D ]  \  }} ||	f|
||dœ|¤Ž}	Œ |	S )NrÁ   r   rM  r   rP   rN  )r\   rt  rP  r¿   r+   rÃ   rI   r{   rq   r×   r†   r;  rQ  r:  )r6   rG  r¦   rŽ   r¨   r«   rT  rs   rñ   rM   rª   rk  rV  s                r8   r=   zBltGlobalTransformer.forward  sê   € ð "/×!4Ñ!4Ñˆ
�G˜QØ×7Ñ7¸ÓFˆÜŸ	™	 -°4·;±;×3FÑ3FÐQU×Q^ÑQ^Ô_ˆØÐä—‘˜]×0Ñ0°Ñ3¸M×<PÑ<PÔQ×[Ñ[Ð\]Ó^×eÑeÐfpÐrtÓuð ð #Ÿo™o¨m¸\ÓJÐÜ! $§+¡+Ó.ò 	‰HˆAˆuÙ!Øðà$7Ø-Ø /ñ	ð
 ñ‰Mð	ð Ðr9   r“   )r>   r?   r@   r   r”   r   r�   r*  r*   rI   r`   r°   r   r   r   r=   rA   rB   s   @r8   ro  ro     s�   ø… Ø&Ó&à™^Ð,<ÀAÐRfÔgðÐðÐ9õ ð* /3Ø04Ø(,ñà—|‘|ðð Ÿ™ tÑ+ðð ×&Ñ&¨Ñ-ð	ð
  ™ðð Ð+Ñ,÷r9   ro  Úpatch_lengthsÚmax_patch_lengthc                 ó6  — |€| S | j                  d«      }g }| D ]j  }g }||dkD     D ]J  }|j                  «       }t        ||«      \  }}|j                  |g|z  «       |sŒ:|j	                  |«       ŒL |j	                  |«       Œl t        d„ |D «       «      }	t        j                  ||	f| j                  | j                  ¬«      }
t        |«      D ]D  \  }}|sŒ	t        j                  || j                  | j                  ¬«      |
|dt        |«      …f<   ŒF |
dk7  j                  d¬«      j                  «       |
j                  d   k  rM|
dk7  j                  d¬«      j!                  «       j                  «       j                  «       dz   }|
dd…d|…f   }
|
S )a£  
    Splits patch lengths into smaller segments if they exceed `max_patch_length`.
    Pads the result to uniform length across the batch.

    Args:
        patch_lengths (torch.Tensor): [batch_size, num_patches] tensor of patch lengths.
        max_patch_length (int, optional): Maximum allowed length per patch.

    Returns:
        torch.Tensor: [batch_size, max_len] tensor of split and padded patch lengths.
    Nr   c              3   ó2   K  — | ]  }t        |«      –— Œ y ­wr;   )rR  )Ú.0Úsplitss     r8   ú	<genexpr>z(process_patch_lengths.<locals>.<genexpr>P  s   è ø€ Ò6 &”#�f—+Ñ6ùs   ‚rZ  r…   r   )rê   ÚitemÚdivmodÚextendrB  ÚmaxrI   r_  rR   rq   rQ  ÚtensorrR  ÚanyÚsumr\   Únonzero)rw  rx  rT  Ú	processedÚseqr|  ÚlengthÚfull_chunksÚ	remainderÚmax_lenÚpaddedrk  Úlast_nonzeros                r8   Úprocess_patch_lengthsrŽ  3  s¡  € ð ÐØÐà×#Ñ# AÓ&€JØ€Iàò !ˆØˆØ˜# ™'‘lò 	)ˆFØ—[‘[“]ˆFÜ%+¨FÐ4DÓ%EÑ"ˆK˜Ø�M‰MÐ+Ð,¨{Ñ:Ô;ÚØ—‘˜iÕ(ð	)ð 	×Ñ˜Õ ð!ô Ñ6¨IÔ6Ó6€GÜ�[‰[˜* gÐ.°m×6IÑ6IÐR_×RfÑRfÔg€Fä˜yÓ)ò t‰	ˆˆ6ÚÜ',§|¡|°FÀ-×BUÑBUÐ^k×^rÑ^rÔ'sˆF�1�mœ˜F›�mÐ#Ò$ðtð
 	�!‰×Ñ˜QÐÓ×#Ñ#Ó%¨¯©°Q©Ò7Ø !™×(Ñ(¨QÐ(Ó/×7Ñ7Ó9×=Ñ=Ó?×DÑDÓFÈÑJˆØš˜=˜L˜=Ð(Ñ)ˆà€Mr9   c                   ó  ‡ — e Zd ZU eed<   defˆ fd„Z	 	 	 	 	 	 	 	 	 ddej                  dz  dej                  dz  dej                  dz  de	dz  dej                  dz  d	edz  d
edz  dedz  dedz  dee   fd„Ze	 	 dd„«       Zˆ xZS )Ú
BltPatcherr+   c                 óÖ  •— t         ‰| �  |«       t        | j                  ¬«      | _        t        j                  «       | _        t        | j                  j                  «      D ]1  }| j                  j                  t        | j                  |«      «       Œ3 t        j                  | j                  j                  | j                  j                  «      | _        t!        | j                  j                  | j                  j"                  ¬«      | _        t        j&                  | j                  j                  | j                  j                  d¬«      | _        | j+                  «        y )Nr2  rœ   Fr'   )r)   r*   rb   r+   r;  r.   r7  r:  r8  r9  rB  r™   r  r>  r,   r?  rD   r    ri  r/   Úlm_headrC  r£   s      €r8   r*   zBltPatcher.__init__b  sí   ø€ Ü‰Ñ˜Ô Ü,°D·K±KÔ@ˆŒÜ—m‘m“oˆŒÜ˜tŸ{™{×<Ñ<Ó=ò 	LˆIØ�K‰K×ÑÔ2°4·;±;À	ÓJÕKð	LäŸL™L¨¯©×)?Ñ)?ÀÇÁ×AXÑAXÓYˆÔÜ˜tŸ{™{×6Ñ6¸D¿K¹K×<TÑ<TÔUˆŒ	Ü—y‘yØ�K‰K×#Ñ#Ø�K‰K×"Ñ"Øô
ˆŒð 	�‰Õr9   NrF  r¦   rŽ   r¨   rG  r©   Ú
patch_sizeÚ	thresholdrx  r«   c
                 ó6  — |d u |d uz  rt        d«      ‚|€| j                  |«      }|r|€t        | j                  ¬«      }|€V|�|j	                  «       nd}t        j                  |j                  d   |j                  ¬«      |z   }|j                  d«      }t        | j                  ||||¬«      }|}| j                  ||«      }| j                  D ]  } ||||¬«      }Œ | j                  | j                  |«      «      }t
        j                  j!                  |¬«      j#                  «       }|j                  d d	 \  }}|�| j%                  ||||¬
«      }n.t        j&                  ||f|j(                  |j                  ¬«      }t+        ||	«      }|||fS )Nú:You must specify exactly one of input_ids or inputs_embedsr2  r   r   rM  ©r+   rG  r¦   r¨   rŽ   )rª   r¦   )rl  rO   )Ú	entropiesÚsequence_lengthr“  r”  rZ  )Ú
ValueErrorr?  r	   r+   Úget_seq_lengthrI   r{   r\   rq   r×   r   r;  r:  r’  ri  ÚdistributionsÚCategoricalÚentropyÚpatch_lengths_from_entropiesrJ   rR   rŽ  )r6   rF  r¦   rŽ   r¨   rG  r©   r“  r”  rx  r«   Úpast_seen_tokensÚcausal_maskrM   rª   rV  rl  Úprediction_entropiesrT  r™  rw  s                        r8   r=   zBltPatcher.forwardr  s»  € ð ˜Ð -°tÐ";Ò<ÜÐYÓZÐZàÐ Ø ×-Ñ-¨iÓ8ˆMá˜Ð0Ü*°$·+±+Ô>ˆOàÐØCRÐC^˜×=Ñ=Ô?ÐdeÐÜ Ÿ<™<¨×(;Ñ(;¸AÑ(>À}×G[ÑG[Ô\Ð_oÑoˆLØ'×1Ñ1°!Ó4ˆLä(Ø—;‘;Ø'Ø)Ø+Ø%ô
ˆð &ˆØ"Ÿo™o¨m¸\ÓJÐà—[‘[ò 	vˆEÙ! -ÐEXÐitÔu‰Mð	vð —‘˜dŸi™i¨Ó6Ó7ˆÜ$×2Ñ2×>Ñ>ÀfÐ>ÓM×UÑUÓWÐà&3×&9Ñ&9¸"¸1Ð&=Ñ#ˆ
�OØÐ!Ø ×=Ñ=Ø.Ø /Ø%Ø#ð	 >ó ‰Mô "ŸJ™JØ˜_Ð-°]×5HÑ5HÐQ^×QeÑQeôˆMô .¨mÐ=MÓNˆØ# ]°FÐ:Ð:r9   c                 óŠ  — | j                   d   }t        j                  ddgt        j                  | j                  ¬«      j                  d«      j                  |d«      }|j                   d   }| dd…dd…f   } | |kD  }|j                   d   }t        j                  || j                  ¬«      j                  d«      j                  |d«      }	t        j                  |	|«      }
t        j                  |	|
gd¬«      }t        j                  || gd¬«      }||   j                  ||«      }|j                  d¬«      j                  «       }|dd…d|…f   }t        j                  |||z   fd¬«      }t        j                  |dd…dd…f   |dz
  «      }t        j                  |dd…dd…f   dz
  |fd¬«      }||z
  dz   }|S )zÔ
        Computes patch lengths from token entropies.

        Depending on whether a threshold is provided, the function uses either:
        - Thresholding the entropy values (when `threshold` is set).
        r   r   rZ  NrM  rP   r…   )r\   rI   r‚  Úlongrq   r×   Úrepeatr{   r†   Ú	full_likeÚcatrµ   r„  r�  )r˜  r™  r“  r”  rT  Úinit_tokensÚoffsetÚ
patch_maskrs   Útoken_indicesÚsentinelÚpadded_indicesÚpadded_maskÚpatch_startsÚmax_valid_patchesÚpatch_start_idsÚ
last_tokenÚ
patch_endsrw  s                      r8   rŸ  z'BltPatcher.patch_lengths_from_entropies­  sÆ  € ð —_‘_ QÑ'ˆ
ô �L‰L˜!˜Q˜¤u§z¡z¸)×:JÑ:JÔK×UÑUÐVWÓX×_Ñ_Ð`jÐlmÓnð 	ð ×"Ñ" 1Ñ%ˆð ša ¡˜eÑ$ˆ	ð  Ñ*ˆ
à×"Ñ" 1Ñ%ˆô Ÿ™ W°Y×5EÑ5EÔF×PÑPÐQRÓS×ZÑZÐ[eÐgiÓjˆÜ—?‘? =°'Ó:ˆÜŸ™ M°8Ð#<À!ÔDˆô —i‘i ¨j¨[Ð 9¸qÔAˆð & kÑ2×:Ñ:¸:ÀwÓOˆØ&ŸN™N¨q˜NÓ1×5Ñ5Ó7ÐØ#¢AÐ'9Ð(9Ð'9Ð$9Ñ:ˆô  Ÿ)™) [°,ÀÑ2GÐ$HÈaÔPˆô —_‘_ _²Q¸¸¸°UÑ%;¸_ÈqÑ=PÓQˆ
Ü—Y‘Y ²°1±2°Ñ 6¸Ñ :¸JÐGÈQÔOˆ
à" _Ñ4°qÑ8ˆàÐr9   rc  rú   )r>   r?   r@   r"   r”   r*   rI   r°   r`   r   r²   r±   r–   r_   r   r   r=   r•   rŸ  rA   rB   s   @r8   r�  r�  _  sû   ø… ØÓðÐ/õ ð$ .2Ø.2Ø04Ø(,Ø26Ø!%Ø!%Ø"&Ø'+ñ9;à×#Ñ# dÑ*ð9;ð Ÿ™ tÑ+ð9;ð ×&Ñ&¨Ñ-ð	9;ð
  ™ð9;ð ×(Ñ(¨4Ñ/ð9;ð ˜$‘;ð9;ð ˜$‘Jð9;ð ˜4‘<ð9;ð  ™*ð9;ð Ð+Ñ,ó9;ðv ð Øò	3ó ô3r9   r�  Úprimec                 óü   — t        j                  |t         j                  | j                  ¬«      }t        j                  | j
                  d   | j                  ¬«      }||z  }t        j                  | |z  d¬«      S )aœ  
    A polynomial rolling hash algorithm that converts sequences
    of tokens into hash values. The hash is computed as:
        hash = (token_0 * prime^0 + token_1 * prime^1 + ... + token_n * prime^n)

    The rolling hash allows the model to efficiently
    identify and encode recurring byte-level patterns in the input text.

    Args:
        token_tensor (torch.Tensor): [batch_size, seq_len, group_size] containing token IDs to hash
        prime (int): Prime number used as the base for the polynomial hash.

    Returns:
        torch.Tensor: Hash values of shape [batch_size, seq_len] where each value
                     represents the hash of the corresponding token group

    Example:
        >>> tokens = torch.tensor([[1, 2, 3], [4, 5, 6]])
        >>> hashes = rolling_polynomial_hash(tokens, prime=31)
        >>> # hash[0] = 1*31^0 + 2*31^1 + 3*31^2
        >>> # hash[1] = 4*31^0 + 5*31^1 + 6*31^2
    rZ  rP   rM  r…   )rI   r‚  r|   rq   r{   r\   r„  )Útoken_tensorr´  Úprime_tensorÚpowersÚprime_powerss        r8   Úrolling_polynomial_hashrº  ä  sa   € ô. —<‘< ¬U¯[©[À×ATÑATÔU€LÜ�\‰\˜,×,Ñ,¨RÑ0¸×9LÑ9LÔM€FØ Ñ'€LÜ�9‰9�\ LÑ0°bÔ9Ð9r9   Ú	token_idsÚ
group_sizeÚmax_hashc                 óZ  — t        j                  «       5  | j                  \  }}t        j                  ||dz
  t         j                  | j
                  ¬«      }t        j                  || gd¬«      }|j                  d|d«      }t        ||«      }	|	|z  }
ddd«       |
S # 1 sw Y   
S xY w)z1Hash token groups and map to range [0, max_hash].r   rZ  r…   N)	rI   r—   r\   r_  r|   rq   r§  Úunfoldrº  )r»  r¼  r´  r½  rT  rs   ÚpaddingÚpadded_tokensÚwindowsÚhashesÚhash_valuess              r8   Úbyte_group_hash_functionrÅ    sŸ   € ô 
�‰‹ñ 	(Ø'Ÿo™oÑˆ
�Gä—+‘+˜j¨*°q©.ÄÇÁÐT]×TdÑTdÔeˆÜŸ	™	 7¨IÐ"6¸AÔ>ˆð  ×&Ñ& q¨*°aÓ8ˆÜ(¨°%Ó8ˆØ˜xÑ'ˆ÷	(ð Ð÷	(ð Ðús   •BB Â B*Úlocal_encoder_tokensÚencoder_hash_tok_embeddingÚ$encoder_hash_byte_group_nb_functionsÚencoder_hash_byte_group_sizeÚencoder_hash_byte_group_vocabc                 ó  — g d¢}|j                  | «      }d}t        |«      D ]Y  }	||	t        |«      z     }
|D ]A  }t        | ||
|«      }|||z  z   }| ||«      j	                  |j
                  «      z  }|dz  }ŒC Œ[ |S )z=Compute token embeddings enhanced with hash-based embeddings.)éÊš;l   Í21A ißoYl   Ívt l   ß. l   }îg l   �A§u l   í†0 l   ©ÿT l   AK l   ™| r   r   )r?  r8  rR  rÅ  rS   rq   )rÆ  r.  rÇ  rÈ  rÉ  rÊ  ÚprimesÚ
embeddingsÚembedding_idxÚfunc_nbr´  r¼  Úhash_idsÚoffset_hash_idss                 r8   Úcompute_hash_embeddingsrÓ    s®   € ò€Fð ×+Ñ+Ð,@ÓA€JØ€MÜÐ=Ó>ò ˆØ�w¤ V£Ñ,Ñ-ˆØ6ò 	ˆJÜ/Ð0DÀjÐRWÐYvÓwˆHà&¨Ð9VÑ)VÑVˆOØÑ4°_ÓE×HÑHÈ×IZÑIZÓ[Ñ[ˆJØ˜QÑ‰Mñ	ðð Ðr9   FrK  rJ  r™  Úpatches_as_queriesr<  rR   c                 óz  — | j                   \  }}| j                  }|rp||z  }	|}
t        j                  ||¬«      j	                  d«      j	                  d«      j                  |||«      }| j	                  d«      j                  |||«      }no|}	||z  }
| j	                  d«      j                  |||«      }t        j                  ||¬«      j	                  d«      j	                  d«      j                  |||«      }||k(  }|rdnd}|j                  ||¬«      }||	|
f}|j                   |k7  rt        d|j                   › d|› �«      ‚|j	                  d«      }d|j                  |«      z
  }|j                  |j                  t        j                  «      t        j                  |«      j                  «      }|S )	aR  
    Prepare cross-attention mask for patch-based attention, following mllama's robust approach.

    This function creates masks that control which patches can attend to which other patches,
    with support for query/key role swapping and cross-attention multipliers.

    Args:
        patch_ids (torch.Tensor): Tensor of shape [batch_size, seq_len] containing patch ids.
        num_patches (int): Total number of patches.
        sequence_length (int): Length of the sequence.
        patches_as_queries (bool): If True, patches are used as queries, otherwise as keys.
        cross_attn_k (int): Cross-attention multiplier for repeating patches.
        dtype (torch.dtype): Data type for the output mask.

    Returns:
        Tuple[torch.Tensor, torch.Tensor]:
            - cross_attention_mask: 4D tensor [batch_size, 1, q_len, kv_len]
    rM  r   rP   r   r…   zCross attention mask shape z doesn't match expected rw   )r\   rq   rI   r{   r×   r†   r‹   rš  rS   Úmasked_fillr±   ÚfinfoÚmin)rK  rJ  r™  rÔ  r<  rR   rT  rs   rq   rð   Úkv_lenÚq_patch_idsÚkv_patch_idsr¥   Ú
repeat_dimÚexpected_shapeÚinverted_cross_attn_masks                    r8   Ú#_prepare_patch_cross_attention_maskrß  9  sË  € ð4 $Ÿ/™/Ñ€J�Ø×Ñ€Fñ Ø˜lÑ*ˆØ ˆô �L‰L˜¨VÔ4ß‰Y�q‹\ß‰Y�r‹]ß‰V�J ¨WÓ5ð	 	ð !×*Ñ*¨1Ó-×4Ñ4°ZÀÈgÓV‰àˆØ˜|Ñ+ˆà×)Ñ)¨"Ó-×4Ñ4°ZÀÈ+ÓVˆä�L‰L˜¨VÔ4×>Ñ>¸qÓA×KÑKÈAÓN×UÑUÐV`ÐbiÐkvÓwð 	ð '¨,Ñ6Ðñ )‘¨b€JØ/×AÑAÀ,ÐT^ÐAÓ_Ðð ! %¨Ð0€NØ×!Ñ! ^Ò3ÜØ)Ð*>×*DÑ*DÐ)EÐE]Ð^lÐ]mÐnó
ð 	
ð
 0×9Ñ9¸!Ó<Ðð  #Ð%9×%<Ñ%<¸UÓ%CÑCÐØ3×?Ñ?Ø ×#Ñ#¤E§J¡JÓ/´·±¸UÓ1C×1GÑ1GóÐð  Ðr9   c                   óV  ‡ — e Zd Zdefˆ fd„Zee	 	 	 	 	 	 	 ddej                  dz  dej                  dz  dej                  dz  dej                  dz  de
dz  d	ej                  dz  d
edz  dee   deez  fd„«       «       Zd„ Zd„ Zdej                  dedej                  fd„Zˆ xZS )ÚBltModelr+   c                 ó¬  •— t         ‰| �  |«       d| _        || _        t	        |j
                  «      | _        t        |j                  «      | _	        t        |j                  «      | _        |j                  t        |j                  «      z  }|j                   |z  }t#        j$                  ||j
                  j&                  «      | _        | j                  j*                  r[t-        |j.                  «      | _        | j0                  j3                  «        | j0                  j5                  «       D ]	  }d|_        Œ nd | _        | j9                  «        y )NF)r)   r*   r6  r+   r,  r  r.  ro  Úglobal_configrq  re  r  Úlocal_decoderrÈ  rR  rÉ  rÊ  r.   r  r,   rÇ  Úpatch_in_forwardr�  Úpatcher_configÚpatcherÚevalÚ
parametersÚrequires_gradrC  )r6   r+   Únum_embeddingsÚtotal_vocab_sizeÚparamr7   s        €r8   r*   zBltModel.__init__ˆ  s
  ø€ Ü‰Ñ˜Ô Ø&+ˆÔ#àˆŒÜ,¨V×-BÑ-BÓCˆÔÜ"6°v×7KÑ7KÓ"LˆÔÜ,¨V×-BÑ-BÓCˆÔØ×DÑDÄsÈ6×KnÑKnÓGoÑoˆØ!×?Ñ?À.ÑPÐÜ*,¯,©,Ð7GÈ×I^ÑI^×IjÑIjÓ*kˆÔ'Ø�;‰;×'Ò'Ü% f×&;Ñ&;Ó<ˆDŒLØ�L‰L×ÑÔØŸ™×0Ñ0Ó2ò ,�Ø&+�Õ#ñ,ð  ˆDŒLØ�‰Õr9   NrF  rw  r¦   rŽ   r¨   rG  r©   r«   rF   c                 ó~  — |d u |d uz  rt        d«      ‚|rg|€5t        t        | j                  ¬«      t        | j                  ¬«      «      }n0t	        |t        «      s t        |t        | j                  ¬«      «      }|�|}	|j
                  \  }
}}no|j
                  \  }
}t        || j                  | j                  | j                  j                  | j                  j                  | j                  j                  «      }	|�€| j                  j                  dk(  r�| j                  �ƒ|€t        d«      ‚| j                  || j                  j                  | j                  j                  | j                  j                   | j                  j"                  |j$                  ¬«      \  }}}no|�|j$                  n|j$                  }|�|j&                  n|j&                  }t)        t+        j,                  |
|dz   f||¬«      | j                  j                   «      }| j/                  ||«      }|€V|�|j1                  «       nd}t+        j2                  |	j
                  d   |	j$                  ¬	«      |z   }|j5                  d«      }t7        | j                  |	||�|j8                  nd |¬
«      }t;        ||j
                  d   |d| j                  j<                  |	j&                  ¬«      } | j                  d||	||||j
                  d   ||�|j8                  nd dœ|¤Ž\  }}|j?                  |
|j
                  d   d«      }t+        j2                  d|j
                  d   |j$                  ¬	«      }|j5                  d«      }t7        | j                  |d d d ¬
«      } | j@                  d|||dœ|¤Ž}| j/                  |d d …dd …f   |«      }t;        ||j
                  d   |d| j                  j<                  |	j&                  ¬«      } | jB                  d||||||�|jD                  nd |dœ|¤Ž}tG        ||¬«      S )Nr–  r2  rž  z0input_ids is required for entropy-based patching)r“  r”  rx  Úpatching_batch_sizerq   r   rZ  r   rM  r—  T)rK  rJ  r™  rÔ  r<  rR   )rF  rG  r¦   rŽ   rI  rJ  rK  r¨   rP   )rG  r¦   rŽ   F)rF  rG  rH  r¦   rŽ   r¨   rI  )Úlast_hidden_stater¨   r­   )$rš  r
   r	   r+   r‡   r\   rÓ  r.  rÇ  rÈ  rÉ  rÊ  Úpatching_moderç  r“  Úpatching_thresholdrx  rï  rq   rR   rŽ  rI   rJ   Ú_patch_ids_from_lengthsr›  r{   r×   r   Úself_attention_cacherß  r<  rë   rq  rä  Úcross_attention_cacher   )r6   rF  rw  r¦   rŽ   r¨   rG  r©   r«   Úencoder_embedsrT  r™  rñ   rq   rR   rK  r   r¡  Úcross_attn_mask_encÚencoder_hidden_statesrX  Úglobal_position_idsÚglobal_causal_maskÚglobal_hidden_statesÚdecoder_patch_idsÚcross_attn_mask_decÚoutputs                              r8   r=   zBltModel.forwardœ  sZ  € ð ˜Ð -°tÐ";Ò<ÜÐYÓZÐZáØÐ&Ü"5Ü ¨¯©Ô4´lÈ$Ï+É+Ô6Vó#‘ô   Ô1DÔEô #6°oÄ|Ð[_×[fÑ[fÔGgÓ"h�ð Ð$Ø*ˆNØ-:×-@Ñ-@Ñ*ˆJ˜©à*3¯/©/Ñ'ˆJ˜Ü4ØØ×"Ñ"Ø×/Ñ/Ø—‘×@Ñ@Ø—‘×8Ñ8Ø—‘×9Ñ9óˆNð Ñ Ø�{‰{×(Ñ(¨IÒ5¸$¿,¹,Ð:RØÐ$Ü$Ð%WÓXÐXØ&*§l¡lØØ#Ÿ{™{×5Ñ5Ø"Ÿk™k×<Ñ<Ø%)§[¡[×%AÑ%AØ(,¯©×(GÑ(GØ$×+Ñ+ð '3ó 'Ñ#��=¡!ð .7Ð-B˜×)Ò)È×H\ÑH\�Ø+4Ð+@˜	ŸšÀm×FYÑFY�Ü 5Ü—J‘J 
¨O¸aÑ,?Ð@ÈÐV\Ô]Ø—K‘K×0Ñ0ó!�ð ×0Ñ0°ÀÓPˆ	àÐØCRÐC^˜×=Ñ=Ô?ÐdeÐÜ Ÿ<™<¨×(<Ñ(<¸QÑ(?È×H]ÑH]Ô^ÐaqÑqˆLØ'×1Ñ1°!Ó4ˆLä(Ø—;‘;Ø(Ø)ØDSÐD_˜O×@Ò@ÐeiØ%ô
ˆô BØØ%×+Ñ+¨AÑ.Ø+Ø#ØŸ™×1Ñ1Ø ×&Ñ&ô
Ðð 7I°d×6HÑ6Hð 
7
ØØ(Ø&Ø%Ø#6Ø%×+Ñ+¨AÑ.ØØDSÐD_˜O×@Ò@Ðeiñ
7
ð ñ
7
Ñ3ÐÐ3ð  4×8Ñ8¸À]×EXÑEXÐYZÑE[Ð]_Ó`ÐÜ#Ÿl™l¨1Ð.B×.HÑ.HÈÑ.KÐTh×ToÑToÔpÐØ1×;Ñ;¸AÓ>ÐÜ/Ø—;‘;Ø.ØØ Øô
Ðð  7˜t×6Ñ6ð  
Ø.Ø-Ø,ñ 
ð ñ	 
Ðð !×8Ñ8¸ÂqÈ!É"ÀuÑ9MÈÓ_ÐÜAØ'Ø%×+Ñ+¨AÑ.Ø+Ø$ØŸ™×1Ñ1Ø ×&Ñ&ô
Ðð $�×#Ñ#ð 	
ØØ/Ø-Ø&Ø%ØETÐE`˜O×AÒAÐfjØ#6ñ	
ð ñ	
ˆô 'Ø$Ø+ô
ð 	
r9   c                 ó.   — | j                   j                  S r;   ©r.  r?  r]   s    r8   Úget_input_embeddingszBltModel.get_input_embeddings#  s   € Ø×!Ñ!×.Ñ.Ð.r9   c                 ó&   — || j                   _        y r;   r   )r6   r½   s     r8   Úset_input_embeddingszBltModel.set_input_embeddings&  s   € Ø*/ˆ×ÑÕ'r9   rs   c                 ó¦  — |j                   d   }t        j                  t        j                  |d|j                  |j
                  ¬«      |j                  d¬«      d d …d d…f   gd¬«      }t        j                  ||j
                  ¬«      }|j                  d«      |j                  d«      j                  d«      k  j                  d¬«      dz
  S )Nr   r   rZ  rP   r…   rM  )
r\   rI   r§  r_  rR   rq   Úcumsumr{   r×   r„  )r6   rw  rs   rT  r¯  Útoken_positionss         r8   ró  z BltModel._patch_ids_from_lengths)  sÀ   € Ø"×(Ñ(¨Ñ+ˆ
Ü—y‘yä—‘˜J¨°×1DÑ1DÈ]×MaÑMaÔbØ×$Ñ$¨Ð$Ó,ªQ°°°¨VÑ4ðð ô
ˆô  Ÿ,™, w°}×7KÑ7KÔLˆØ×&Ñ& qÓ)¨_×-FÑ-FÀqÓ-I×-SÑ-SÐTVÓ-WÑW×\Ñ\ÐacÐ\ÓdÐghÑhÐhr9   rm  )r>   r?   r@   r   r*   r   r   rI   r°   r`   r   r²   r±   r   r   r[   r   r=   r  r  r–   ró  rA   rB   s   @r8   rá  rá  ‡  s   ø„ ð˜yõ ð(  Øð .2Ø-1Ø.2Ø04Ø(,Ø26Ø!%ñC
à×#Ñ# dÑ*ðC
ð —|‘| dÑ*ðC
ð Ÿ™ tÑ+ð	C
ð
 ×&Ñ&¨Ñ-ðC
ð  ™ðC
ð ×(Ñ(¨4Ñ/ðC
ð ˜$‘;ðC
ð Ð+Ñ,ðC
ð 
Ð(Ñ	(òC
ó ó  ðC
òJ/ò0ð
i°U·\±\ð 
iÈCð 
iÐTY×T`ÑT`÷ 
ir9   rá  zB
    The Blt Text Model with a language modeling head on top.
    )Úcustom_introc                   óÈ  ‡ — e Zd ZU eed<   dZdZddiZdefˆ fd„Ze	e
	 	 	 	 	 	 	 	 	 	 	 ddej                  dz  d	ej                  dz  d
ej                  dz  dej                  dz  dej                  dz  deej                  ej                  f   dz  dedz  dej                   dz  dej                  dz  dedz  deej                  z  dee   deez  fd„«       «       Zˆ xZS )ÚBltForCausalLMr+   Frþ   z'model.local_encoder.embed_tokens.weightzlm_head.weightc                 ó&  •— t         ‰| �  |«       |j                  «       | _        |j                  | _        t        |«      | _        t        j                  |j                  j                  |j                  d¬«      | _        | j                  «        y r&   )r)   r*   Úget_text_configÚtext_configr>  rá  rþ   r.   r/   r  r,   r’  rC  r5   s     €r8   r*   zBltForCausalLM.__init__A  sk   ø€ Ü‰Ñ˜Ô Ø!×1Ñ1Ó3ˆÔØ ×+Ñ+ˆŒÜ˜fÓ%ˆŒ
Ü—y‘y ×!6Ñ!6×!BÑ!BÀF×DUÑDUÐ\aÔbˆŒà�‰Õr9   NrF  r¦   rŽ   r¤   r¥   r§   r¨   rG  Úlabelsr©   Úlogits_to_keepr«   rF   c                 ó‚  —  | j                   d||||||||
dœ|¤Ž}|j                  }t        |t        «      rt	        | d«      n|}| j                  |dd…|dd…f   «      j                  «       }d}|	� | j                  ||	| j                  fi |¤Ž}t        |||j                  |j                  |j                  ¬«      S )aý
  
        cross_attention_states (`torch.FloatTensor`, *optional*):
            Output of the vision model, used for cross-attention. This tensor contains the processed image features that
            the language model will attend to.
        cross_attention_mask (`torch.Tensor` of shape `(batch_size, seq_length, max_num_images, max_num_tiles)`, *optional*):
            Cross-attention mask to control the interaction between text tokens and image tiles.
            This 4D tensor defines which image tiles each text token should attend to.

            For each text token (in seq_length):
            - 1 indicates the token **should attend** to the corresponding image tile
            - 0 indicates the token **should not attend** to the corresponding image tile
        full_text_row_masked_out_mask (`tuple[torch.Tensor, torch.Tensor]`, *optional*):
            A tuple containing two tensors that mask out rows in the cross-attention mechanism:
            - The first tensor has shape `(batch_size, 1, seq_length, 1)` and contains values of 0 or 1.
              A value of 0 indicates that the corresponding text token's entire row in the cross-attention
              matrix should be masked out (all image tokens ignored).
            - The second tensor has the same shape and is used internally to apply the masking during
              the forward pass of cross-attention layers.
            This mask is derived from the cross_attention_mask and is used to handle cases where a text token
            should not attend to any image token.
        labels (`torch.LongTensor` of shape `(batch_size, sequence_length)`, *optional*):
            Labels for computing the masked language modeling loss. Indices should either be in `[0, ...,
            config.vocab_size]` or -100 (see `input_ids` docstring). Tokens with indices set to `-100` are ignored
            (masked), the loss is only computed for the tokens with labels in `[0, ..., config.vocab_size]`.

        Example:

        ```python
        >>> from transformers import AutoTokenizer, BltForCausalLM

        >>> model = BltForCausalLM.from_pretrained("itazap/blt-1b-hf")
        >>> tokenizer = AutoTokenizer.from_pretrained("itazap/blt-1b-hf")

        >>> prompt = "If I had to write a haiku, it would be:"
        >>> inputs = tokenizer(prompt, return_tensors="pt")

        >>> # Generate
        >>> generate_ids = model.generate(inputs.input_ids, max_length=40, do_sample=True, temperature=0.6)
        >>> result = tokenizer.batch_decode(generate_ids, skip_special_tokens=True, clean_up_tokenization_spaces=False)[0]
        >>> print(result)
        If I had to write a haiku, it would be: "Snowflakes gently fall" - simple, yet peaceful.
        I love the idea of snowflakes gently falling, each one
        ```
        )rF  r¦   rŽ   r¥   r§   r¨   rG  r©   N)Úlossrl  r¨   rM   r  r­   )rþ   rð  r‡   r–   Úslicer’  r_   Úloss_functionr>  r   r¨   rM   r  )r6   rF  r¦   rŽ   r¤   r¥   r§   r¨   rG  r  r©   r  r«   ÚoutputsrM   Úslice_indicesrl  r  s                     r8   r=   zBltForCausalLM.forwardJ  sß   € ð| �$—*‘*ð 

ØØ)Ø%Ø!5Ø*GØ+Ø'Øñ

ð ñ

ˆð  ×1Ñ1ˆÜ8BÀ>ÔSVÔ8Wœ˜~˜o¨tÔ4Ð]kˆØ—‘˜mªA¨}ºaÐ,?Ñ@ÓA×GÑGÓIˆàˆØÐØ%�4×%Ñ% f¨f°d·o±oÑPÈÑPˆDä%ØØØ#×3Ñ3Ø!×/Ñ/Ø×)Ñ)ô
ð 	
r9   )NNNNNNNNNNr   )r>   r?   r@   r   r”   r%  r!  Ú_tied_weights_keysr*   r   r   rI   r°   r`   r[   r   r²   r±   r–   r   r   r   r=   rA   rB   s   @r8   r	  r	  6  s|  ø… ð ÓØ"ÐØÐØCÐEUÐVÐð˜yõ ð Øð .2Ø.2Ø04Ø:>Ø8<ØRVØ(,Ø26Ø*.Ø!%Ø-.ñV
à×#Ñ# dÑ*ðV
ð Ÿ™ tÑ+ðV
ð ×&Ñ&¨Ñ-ð	V
ð
 !&× 0Ñ 0°4Ñ 7ðV
ð $×.Ñ.°Ñ5ðV
ð (-¨U¯\©\¸5¿<¹<Ð-GÑ'HÈ4Ñ'OðV
ð  ™ðV
ð ×(Ñ(¨4Ñ/ðV
ð × Ñ  4Ñ'ðV
ð ˜$‘;ðV
ð ˜eŸl™lÑ*ðV
ð Ð+Ñ,ðV
ð 
Ð'Ñ	'òV
ó ó ôV
r9   r	  )rý   rá  r�  r	  )rè   )r   )rÌ  )rO   rÌ  i0u  )XÚcollections.abcr   Útypingr   rI   Útorch.distributionsÚtorch.nnr.   Útorch.nn.functionalrÆ   rP  Ú r   r  Úactivationsr   Úcache_utilsr   r	   r
   Ú
generationr   Úmasking_utilsr   Úmodeling_flash_attention_utilsr   Úmodeling_layersr   Úmodeling_outputsr   r   Úmodeling_rope_utilsr   r   Úmodeling_utilsr   r   Úprocessing_utilsr   Úutilsr   r   r   Úutils.genericr   r   Úutils.output_capturingr   r   Úconfiguration_bltr   r   r    r!   r"   ÚModuler$   rD   rb   r™   r`   r–   r¹   r_   rÍ   rÕ   rÝ   r�   rõ   rý   r,  re  ro  rŽ  r�  rº  rÅ  r  ÚlistrÓ  rT   r±   rR   r[   rß  rá  r	  Ú__all__r­   r9   r8   ú<module>r-     s.  ðõ* %Ý ã Û Ý ß Ð å &Ý !ß CÑ CÝ )Ý /Ý BÝ 9ß Oß Kß FÝ &ß IÑ Iß Gß E÷õ ôˆR�Y‰Yô ô"J�—‘ô Jô(><˜Ÿ™ô ><ôDAÐ4ô AðH	U˜UŸ\™\ð 	U°#ð 	U¸%¿,¹,ó 	Uð& ñ%Ø�I‰Ið%à�<‰<ð%ð 
�‰ð%ð �<‰<ð	%ð
 —L‘L 4Ñ'ð%ð ð%ð ð%ð Ð'Ñ(ó%ò2óô2>)�r—y‘yô >)ôB;)˜Ÿ	™	ô ;)ð| ô[˜ó [ó ð[ô|n"Ð(ô n"ôbIÐ(ô IôX0Ð-ô 0ðf)¨¯©ð )ÈÈtÉð )ÐX]×XdÑXdó )ôXBÐ#ô BñJ:°ó :ð< \añØ�|‰|ðØ),ðØ9<ðØUXóð$#ØŸ,™,ð#ð !#§¡ð#ð +.ð	#ð
 #'ð#ð $'ð#ð ‡\�\ó#ðT  %ØØŸ™ñK Ø�|‰|ðK àðK ð ðK ð ð	K ð
 ðK ð �;‰;ðK ð ˆ5�<‰<˜Ÿ™Ð%Ñ&óK ô\liÐ!ô liñ^ ðôô
g
Ð'¨ó g
óð
g
òT M�r9   