Ë
    ÜÓ^jûw  ã                   ó¤  — d Z ddlZddlmZmZ ddlm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 dd	lmZmZ dd
lmZ ddlmZ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'  ejP                  e)«      Z*ee G d„ de«      «       «       Z+ee G d„ de«      «       «       Z, G d„ de	jZ                  «      Z. G d„ de	jZ                  «      Z/ G d„ de#«      Z0 G d„ de	jZ                  «      Z1 G d„ d e	jZ                  «      Z2 G d!„ d"e	jZ                  «      Z3e G d#„ d$e«      «       Z4e G d%„ d&e4«      «       Z5 G d'„ d(e4«      Z6g d)¢Z7y)*zPyTorch TimesFM model.é    N)ÚCallableÚSequence)Ú	dataclassé   )Úinitialization)ÚFlashAttentionKwargs)ÚBaseModelOutput)ÚALL_ATTENTION_FUNCTIONSÚPreTrainedModel)ÚUnpack)ÚTransformersKwargsÚauto_docstringÚcan_return_tupleÚlogging)Úmerge_with_config_defaults)Úcapture_outputsé   )ÚLlamaRMSNorm)Úsimple_eager_attention_forwardé   )ÚTimesFmConfigc                   ób   — e Zd ZU dZdZej                  dz  ed<   dZej                  dz  ed<   y)ÚTimesFmOutputzÇ
    loc (`torch.Tensor` of shape `(batch_size, )`):
        The mean of the time series inputs.
    scale (`torch.Tensor` of shape `(batch_size,)`):
        The scale of the time series inputs.
    NÚlocÚscale)	Ú__name__Ú
__module__Ú__qualname__Ú__doc__r   ÚtorchÚTensorÚ__annotations__r   © ó    úv/var/www/ramen.bs-engineer-server.com/venv/lib/python3.12/site-packages/transformers/models/timesfm/modular_timesfm.pyr   r   (   s/   … ñð  $€Cˆ�‰˜Ñ	Ó#Ø!%€Eˆ5�<‰<˜$ÑÔ%r$   r   c                   ó�   — e Zd ZU dZdZej                  dz  ed<   dZej                  dz  ed<   dZ	ej                  e
z  dz  ed<   y)ÚTimesFmOutputForPredictionaµ  
    mean_predictions (`torch.Tensor` of shape `(batch_size, sequence_length)`):
        The mean predictions of the time series.
    full_predictions (`torch.Tensor` of shape `(batch_size, sequence_length)`):
        The full predictions of the time series including the mean and the quantiles.
    loss (`torch.Tensor` of shape `(1,)`, *optional*, returned when `future_values` is provided):
        The loss of the TimesFM model.
    NÚmean_predictionsÚfull_predictionsÚloss)r   r   r   r   r(   r    r!   r"   r)   r*   Úfloatr#   r$   r%   r'   r'   6   sI   … ñð -1Ð�e—l‘l TÑ)Ó0Ø,0Ð�e—l‘l TÑ)Ó0Ø(,€Dˆ%�,‰,˜Ñ
 Ñ
%Ô,r$   r'   c                   ó0   ‡ — e Zd ZdZdefˆ fd„Zdd„Zˆ xZS )Ú
TimesFmMLPzPax MLP in pytorch.Úconfigc                 óö   •— t         ‰| �  «        |j                  }|j                  }t	        j
                  ||«      | _        t	        j
                  ||«      | _        t	        j                  |d¬«      | _	        y )Ng�íµ ÷Æ°>)Únormalized_shapeÚeps)
ÚsuperÚ__init__Úhidden_sizeÚintermediate_sizeÚnnÚLinearÚ	gate_projÚ	down_projÚ	LayerNormÚ
layer_norm)Úselfr.   r4   r5   Ú	__class__s       €r%   r3   zTimesFmMLP.__init__J   s]   ø€ Ü‰ÑÔØ×(Ñ(ˆØ"×4Ñ4ÐäŸ™ ;Ð0AÓBˆŒÜŸ™Ð#4°kÓBˆŒÜŸ,™,¸ÈÔNˆ�r$   c                 óÄ   — | j                  |«      }| j                  |«      }t        j                  |«      }| j	                  |«      }|�|d|d d …d d …d f   z
  z  }||z   S )Nç      ð?)r;   r8   ÚFÚrelur9   )r<   ÚxÚpaddingsÚgate_inpÚgateÚoutputss         r%   ÚforwardzTimesFmMLP.forwardS   sc   € Ø—?‘? 1Ó%ˆØ�~‰~˜hÓ'ˆÜ�v‰v�d‹|ˆØ—.‘. Ó&ˆØÐØ  x²²1°d°
Ñ';Ñ!;Ñ<ˆGØ˜‰{Ðr$   ©N©r   r   r   r   r   r3   rG   Ú__classcell__©r=   s   @r%   r-   r-   G   s   ø„ ÙðO˜}õ O÷r$   r-   c                   ó(   ‡ — e Zd ZdZˆ fd„Zd„ Zˆ xZS )ÚTimesFmResidualBlockzTimesFM residual block.c                 ó   •— t         ‰| �  «        || _        || _        || _        t        j                  ||«      | _        t        j                  «       | _	        t        j                  ||«      | _
        t        j                  ||«      | _        y rH   )r2   r3   Ú
input_dimsÚhidden_dimsÚoutput_dimsr6   r7   Úinput_layerÚSiLUÚ
activationÚoutput_layerÚresidual_layer)r<   rO   rP   rQ   r=   s       €r%   r3   zTimesFmResidualBlock.__init__`   sk   ø€ Ü‰ÑÔØ$ˆŒØ&ˆÔØ&ˆÔäŸ9™9 Z°Ó=ˆÔÜŸ'™'›)ˆŒÜŸI™I k°;Ó?ˆÔÜ Ÿi™i¨
°KÓ@ˆÕr$   c                 ó”   — | j                  |«      }| j                  |«      }| j                  |«      }| j                  |«      }||z   S rH   )rR   rT   rU   rV   )r<   rB   ÚhiddenÚoutputÚresiduals        r%   rG   zTimesFmResidualBlock.forwardk   sK   € Ø×!Ñ! !Ó$ˆØ—‘ Ó(ˆØ×"Ñ" 6Ó*ˆØ×&Ñ& qÓ)ˆØ˜Ñ Ð r$   )r   r   r   r   r3   rG   rJ   rK   s   @r%   rM   rM   ]   s   ø„ Ù!ô	Aö!r$   rM   c                   ó   — e Zd Zy)ÚTimesFmRMSNormN)r   r   r   r#   r$   r%   r\   r\   s   s   „ Ør$   r\   c                   ó0   ‡ — e Zd ZdZdefˆ fd„Zdd„Zˆ xZS )ÚTimesFmPositionalEmbeddingz6Generates position embedding for a given 1-d sequence.r.   c           
      óÂ  •— t         ‰| �  «        |j                  }|j                  }||c| _        | _        |j                  | _        | j
                  dz  }t        j                  t        |«      t        |«      z  «      t        |dz
  d«      z  }| j                  d|t        j                  t        j                  |t        j                  ¬«      | z  «      z  «       y )Nr   r   Úinv_timescales©Údtype)r2   r3   Úmin_timescaleÚmax_timescaler4   Úembedding_dimsÚmathÚlogr+   ÚmaxÚregister_bufferr    ÚexpÚarangeÚfloat32)r<   r.   rc   rd   Únum_timescalesÚlog_timescale_incrementr=   s         €r%   r3   z#TimesFmPositionalEmbedding.__init__z   sÁ   ø€ Ü‰ÑÔØ×,Ñ,ˆØ×,Ñ,ˆØ1>ÀÐ.ˆÔ˜DÔ.Ø$×0Ñ0ˆÔà×,Ñ,°Ñ1ˆÜ"&§(¡(¬5°Ó+?Ä%ÈÓBVÑ+VÓ"WÔZ]Ð^lÐopÑ^pÐrsÓZtÑ"tÐØ×ÑØØœEŸI™I¤e§l¡l°>ÌÏÉÔ&WÐ[rÐZrÑ&rÓsÑsõ	
r$   c                 óN  — |€|€t        d«      ‚|€Jt        j                  |t        j                  | j                  j
                  ¬«      j                  d«      }n'|j                  dk7  rt        d|j                  › �«      ‚ |j                  g |j                  ¢d‘­Ž | j                  j                  ddd«      z  }t        j                  t        j                  |«      t        j                  |«      gd¬«      }t        j                  |ddd| j                  dz  f«      }|S )	aÍ  Generates a Tensor of sinusoids with different frequencies.

        Args:
            seq_length: an optional Python int defining the output sequence length.
              if the `position` argument is specified.
            position: [B, seq_length], optional position for each token in the
              sequence, only required when the sequence is packed.

        Returns:
            [B, seqlen, D] if `position` is specified, else [1, seqlen, D]
        z.Either position or seq_length must be provided©rb   Údevicer   r   z*position must be 2-dimensional, got shape r   éÿÿÿÿ©Údim)Ú
ValueErrorr    rk   rl   r`   rq   Ú	unsqueezeÚndimÚshapeÚviewÚcatÚsinÚcosr@   Úpadre   )r<   Ú
seq_lengthÚpositionÚscaled_timeÚsignals        r%   rG   z"TimesFmPositionalEmbedding.forwardˆ   sÿ   € ð Ð 
Ð 2ÜÐMÓNÐNàÐä—|‘| J´e·m±mÈD×L_ÑL_×LfÑLfÔg×qÑqÐrsÓt‰HØ�]‰]˜aÒÜÐIÈ(Ï.É.ÐIYÐZÓ[Ð[à#�h—m‘mÐ7 X§^¡^Ð7°QÒ7¸$×:MÑ:M×:RÑ:RÐSTÐVWÐY[Ó:\Ñ\ˆÜ—‘œEŸI™I kÓ2´E·I±I¸kÓ4JÐKÐQRÔSˆô —‘�v  1 a¨×)<Ñ)<¸qÑ)@ÐAÓBˆØˆr$   ©NNrI   rK   s   @r%   r^   r^   w   s   ø„ Ù@ð
˜}õ 
÷r$   r^   c                   óì   ‡ — e Zd ZdZdedefˆ fd„Zdej                  dej                  fd„Z		 dd	ej                  d
ej                  dz  de
e   deej                  ej                  dz  f   fd„Zˆ xZS )ÚTimesFmAttentionzlImplements the attention used in TimesFM. One key difference is that there is _per_dim_scaling of the query.r.   Ú	layer_idxc                 óœ  •— t         ‰| �  «        || _        d| _        |j                  | _        || _        |j                  | _        |j                  | _        |j                  | _	        | j                  | j                  z  | _
        | j                  | j                  z  | _        t        j                  t        j                  | j                  f«      «      | _        t        j"                  | j                  | j                  | j                  z  «      | _        t        j"                  | j                  | j                  | j                  z  «      | _        t        j"                  | j                  | j                  | j                  z  «      | _        t        j"                  | j                  | j                  z  | j                  «      | _        y )NT)r2   r3   r.   Ú	is_causalÚattention_dropoutr…   Únum_attention_headsÚ	num_headsr4   Úhead_dimÚq_sizeÚkv_sizer6   Ú	Parameterr    ÚemptyÚscalingr7   Úq_projÚk_projÚv_projÚo_proj©r<   r.   r…   r=   s      €r%   r3   zTimesFmAttention.__init__¨   s3  ø€ Ü‰ÑÔØˆŒØˆŒØ!'×!9Ñ!9ˆÔØ"ˆŒà×3Ñ3ˆŒØ!×-Ñ-ˆÔØŸ™ˆŒà—n‘n t§}¡}Ñ4ˆŒØ—~‘~¨¯©Ñ5ˆŒÜ—|‘|¤E§K¡K°·±Ð0@Ó$AÓBˆŒä—i‘i × 0Ñ 0°$·.±.À4Ç=Á=Ñ2PÓQˆŒÜ—i‘i × 0Ñ 0°$·.±.À4Ç=Á=Ñ2PÓQˆŒÜ—i‘i × 0Ñ 0°$·.±.À4Ç=Á=Ñ2PÓQˆŒÜ—i‘i §¡°·±Ñ >À×@PÑ@PÓQˆ�r$   ÚqueryÚreturnc                 óº   — t        j                  | j                  «      j                  dt	        j
                  | j                  «      z  «      }||d d d d d …f   z  S )Ng^$3eG÷?)r@   Úsoftplusr�   Úmulrf   Úsqrtr‹   )r<   r–   r   s      r%   Ú_scale_queryzTimesFmAttention._scale_query¼   sJ   € Ü—
‘
˜4Ÿ<™<Ó(×,Ñ,¨[¼4¿9¹9ÀTÇ]Á]Ó;SÑ-SÓTˆØ�u˜T 4¨ªqÐ0Ñ1Ñ1Ð1r$   NÚhidden_statesÚattention_maskÚkwargsc                 ó¨  — |j                   d d }g |¢d‘| j                  ‘­}| j                  |«      j                  |«      j	                  dd«      }| j                  |«      }| j                  |«      j                  |«      j	                  dd«      }| j                  |«      j                  |«      j	                  dd«      }t        j                  | j                  j                  t        «      }	 |	| ||||f| j                  sdn| j                  ddœ|¤Ž\  }
} |
j                  g |¢d‘­Ž j!                  «       }
| j#                  |
«      }
|
|fS )Nrr   r   r   ç        r?   )Údropoutr�   )rx   r‹   r‘   ry   Ú	transposerœ   r’   r“   r
   Úget_interfacer.   Ú_attn_implementationr   Útrainingrˆ   ÚreshapeÚ
contiguousr”   )r<   r�   rž   rŸ   Úinput_shapeÚhidden_shapeÚquery_statesÚ
key_statesÚvalue_statesÚattention_interfaceÚattn_outputÚattn_weightss               r%   rG   zTimesFmAttention.forwardÀ   sW  € ð $×)Ñ)¨#¨2Ð.ˆØ8˜Ð8 bÐ8¨$¯-©-Ñ8ˆà—{‘{ =Ó1×6Ñ6°|ÓD×NÑNÈqÐRSÓTˆØ×(Ñ(¨Ó6ˆØ—[‘[ Ó/×4Ñ4°\ÓB×LÑLÈQÐPQÓRˆ
Ø—{‘{ =Ó1×6Ñ6°|ÓD×NÑNÈqÐRSÓTˆä(?×(MÑ(MØ�K‰K×,Ñ,Ô.Ló)
Ðñ %8ØØØØØð	%
ð  $Ÿ}š}‘C°$×2HÑ2HØñ	%
ð ñ	%
Ñ!ˆ�\ð *�k×)Ñ)Ð;¨;Ð;¸Ò;×FÑFÓHˆØ—k‘k +Ó.ˆØ˜LÐ(Ð(r$   rH   )r   r   r   r   r   Úintr3   r    r!   rœ   r   r   ÚtuplerG   rJ   rK   s   @r%   r„   r„   ¥   s‘   ø„ ÙvðR˜}ð R¸õ Rð(2 %§,¡,ð 2°5·<±<ó 2ð /3ñ)à—|‘|ð)ð Ÿ™ tÑ+ð)ð Ð-Ñ.ð	)ð
 
ˆu�|‰|˜UŸ\™\¨DÑ0Ð0Ñ	1÷)r$   r„   c                   ó”   ‡ — e Zd ZdZdedefˆ fd„Zdej                  dej                  dej                  dej                  fd	„Z	ˆ xZ
S )
ÚTimesFmDecoderLayerzTransformer layer.r.   r…   c                 ó²   •— t         ‰| �  «        t        ||¬«      | _        t	        |«      | _        t        |j                  |j                  ¬«      | _	        y )N)r…   )r1   )
r2   r3   r„   Ú	self_attnr-   Úmlpr\   r4   Úrms_norm_epsÚinput_layernormr•   s      €r%   r3   zTimesFmDecoderLayer.__init__ä   sC   ø€ Ü‰ÑÔä)¨&¸IÔFˆŒÜ˜fÓ%ˆŒÜ-¨f×.@Ñ.@Àf×FYÑFYÔZˆÕr$   r�   rž   rC   r—   c                 óˆ   — |}| j                  |«      }| j                  ||¬«      \  }}||z   }| j                  ||¬«      }|S )N)r�   rž   )rC   )r¹   r¶   r·   )r<   r�   rž   rC   rŸ   rZ   Ú_s          r%   rG   zTimesFmDecoderLayer.forwardë   s]   € ð !ˆØ×,Ñ,¨]Ó;ˆØŸ>™>Ø'Ø)ð *ó 
Ñˆ�qð ! =Ñ0ˆð Ÿ™ ¸˜ÓBˆàÐr$   )r   r   r   r   r   r±   r3   r    r!   rG   rJ   rK   s   @r%   r´   r´   á   sW   ø„ Ùð[˜}ð [¸õ [ðà—|‘|ðð Ÿ™ðð —,‘,ð	ð 
�‰÷r$   r´   c                   ór   ‡ — e Zd ZU eed<   dZdgZdZdZdZ	e
edœZ ej                  «       ˆ fd„«       Zˆ xZS )	ÚTimesFmPreTrainedModelr.   Útimesfmr´   Úpast_values)ÚtimeT)r�   Ú
attentionsc           
      ó"  •— t         ‰| �  |«       t        |t        «      r t	        j
                  |j                  «       y t        |t        «      r¿|j                  dz  }|j                  |j                  }}t        j                  t        |«      t        |«      z  «      t        |dz
  d«      z  }t	        j                  |j                   |t#        j$                  t#        j&                  |t"        j(                  ¬«      | z  «      z  «       y y )Nr   r   ra   )r2   Ú_init_weightsÚ
isinstancer„   ÚinitÚones_r�   r^   re   rd   rc   rf   rg   r+   rh   Úcopy_r`   r    rj   rk   rl   )r<   Úmodulerm   rd   rc   rn   r=   s         €r%   rÃ   z$TimesFmPreTrainedModel._init_weights  sÚ   ø€ ä‰Ñ˜fÔ%Ü�fÔ.Ô/ä�J‰J�v—~‘~Õ&Ü˜Ô :Ô;Ø#×2Ñ2°aÑ7ˆNØ+1×+?Ñ+?À×AUÑAU˜=ˆMÜ&*§h¡h¬u°]Ó/CÄeÈMÓFZÑ/ZÓ&[Ô^aØ Ñ" Aó_ñ 'Ð#ô �J‰JØ×%Ñ%ØÜ—)‘)œEŸL™L¨¼u¿}¹}ÔMÐQhÐPhÑhÓiñjõð <r$   )r   r   r   r   r"   Úbase_model_prefixÚ_no_split_modulesÚmain_input_nameÚinput_modalitiesÚ_supports_sdpar´   r„   Ú_can_record_outputsr    Úno_gradrÃ   rJ   rK   s   @r%   r½   r½     sR   ø… àÓØ!ÐØ.Ð/ÐØ#€OØ ÐØ€Nà,Ø&ñÐð
 €U‡]�]ƒ_óó ôr$   r½   c                   óˆ  ‡ — e Zd Zdefˆ fd„Zdej                  dej                  deej                  eej                  ej                  f   f   fd„Ze	e
edej                  dej                  d	ej                  d
ee   def
d„«       «       «       Ze	 ddej                  dz  dedej&                  dej(                  dedej                  dz  fd„«       Zedej                  dej                  deej                  ej                  f   fd„«       Zedej                  dej                  dej                  fd„«       Zˆ xZS )ÚTimesFmModelr.   c           	      óü  •— t         ‰| �  |«       || _        t        d|j                  z  |j
                  |j                  ¬«      | _        t        j                  |j                  |j
                  ¬«      | _        t        j                  t        |j                  «      D �cg c]  }t        ||«      ‘Œ c}«      | _        | j                  j"                  rt%        |¬«      | _        | j)                  «        y c c}w )Nr   ©rO   rQ   rP   )Únum_embeddingsÚembedding_dim)r.   )r2   r3   r.   rM   Úpatch_lengthr4   r5   Úinput_ff_layerr6   Ú	EmbeddingÚ	freq_sizeÚfreq_embÚ
ModuleListÚrangeÚnum_hidden_layersr´   ÚlayersÚuse_positional_embeddingr^   Úposition_embÚ	post_initr•   s      €r%   r3   zTimesFmModel.__init__#  sÄ   ø€ Ü‰Ñ˜Ô àˆŒÜ2Ø˜6×.Ñ.Ñ.Ø×*Ñ*Ø×0Ñ0ô
ˆÔô
 Ÿ™°F×4DÑ4DÐTZ×TfÑTfÔgˆŒÜ—m‘mÜEJÈ6×KcÑKcÓEdÖe¸	Ô  ¨Õ3Òeó
ˆŒð �;‰;×/Ò/Ü :À&Ô IˆDÔð 	�‰Õùò fs   Â"C9ÚinputsÚpatched_padsr—   c                 óê  — | j                  ||«      \  }}t        j                  || j                  j                  ¬«      }||dd…ddf   z
  |dd…ddf   z  }t        j
                  t        j                  || j                  j                  z
  «      | j                  j                  k  t        j                  | j                  j                  |j                  |j                  ¬«      |«      }|||ffS )zInput is of shape [B, N, P].©ÚminNrp   )Ú_timesfm_masked_mean_stdr    Úclampr.   Ú	toleranceÚwhereÚabsÚpad_valÚtensorrb   rq   )r<   râ   rã   ÚmuÚsigmarF   s         r%   Ú_forward_transformzTimesFmModel._forward_transform6  sÉ   € ð ×1Ñ1°&¸,ÓG‰	ˆˆEÜ—‘˜E t§{¡{×'<Ñ'<Ô=ˆð ˜Bšq $¨˜}Ñ-Ñ-°²q¸$À°}Ñ1EÑEˆÜ—+‘+Ü�I‰I�f˜tŸ{™{×2Ñ2Ñ2Ó3°d·k±k×6KÑ6KÑKÜ�L‰L˜Ÿ™×,Ñ,°G·M±MÈ'Ï.É.ÔYØó
ˆð
 ˜˜U˜Ð#Ð#r$   r¿   Úpast_values_paddingÚfreqrŸ   c                 ór  — |j                   d   }|j                  |d| j                  j                  «      }|j                  |d| j                  j                  «      }t	        j
                  t	        j                  |dz
  «      | j                  j                  k  t	        j                  d|j                  |j                  ¬«      |«      }t	        j
                  t	        j                  || j                  j                  z
  «      | j                  j                  k  t	        j                  d|j                  |j                  ¬«      |«      }| j                  ||«      \  }}|d|z
  z  }t	        j                  ||gd¬«      }	| j                  |	«      }
t	        j                  |d¬«      d   }| j                  j                   r]| j#                  |
j                   d   «      }t	        j$                  |g|
j                   d   z  d¬«      }| j'                  ||«      }|
|z  }
| j)                  |«      }|
|z  }
|
}| j+                  ||j                   d   |j                  |j                  d¬	«      }| j,                  d
| j                  j.                   D ]  } ||f||dœ|¤Ž}Œ t1        ||d   |d   ¬«      S )a°  
        past_values (`torch.FloatTensor` of shape `(batch_size, sequence_length)`):
            Past values of the time series that serves as input to the model.
        past_values_padding (`torch.LongTensor` of shape `(batch_size, sequence_length)`):
            The padding indicator of the time series.
        freq (`torch.LongTensor` of shape `(batch_size,)`):
            Frequency indices for the time series data.
        r   rr   r?   r¡   rp   rs   r   T)rž   Úsequence_lengthrb   rq   r‡   N)rž   rC   )Úlast_hidden_stater   r   )rx   ry   r.   rÖ   r    rê   rë   ré   rí   rb   rq   rì   rð   rz   r×   ræ   rß   rà   ÚconcatÚ_timesfm_shift_padded_seqrÚ   Ú_prepare_4d_attention_maskrÞ   rÝ   r   )r<   r¿   rñ   rò   rŸ   ÚbsizeÚpatched_inputsrã   ÚstatsÚconcat_inputsÚmodel_inputÚpatched_paddingÚpos_embÚf_embr�   rž   Úlayers                    r%   rG   zTimesFmModel.forwardF  s…  € ð& ×!Ñ! !Ñ$ˆØ$×)Ñ)¨%°°T·[±[×5MÑ5MÓNˆØ*×/Ñ/°°r¸4¿;¹;×;SÑ;SÓTˆäŸ™Ü�I‰I�l SÑ(Ó)¨D¯K©K×,AÑ,AÑAÜ�L‰L˜ N×$8Ñ$8À×AVÑAVÔWØó
ˆô
 —{‘{Ü�I‰I�n t§{¡{×':Ñ':Ñ:Ó;¸d¿k¹k×>SÑ>SÑSÜ�L‰L˜ L×$6Ñ$6¸|×?RÑ?RÔSØó
ˆð
 !%× 7Ñ 7¸ÈÓ UÑˆ˜ð (¨3°Ñ+=Ñ>ˆÜŸ	™	 >°<Ð"@ÀbÔIˆØ×)Ñ)¨-Ó8ˆô  Ÿ)™) L°bÔ9¸!Ñ<ˆØ�;‰;×/Ò/Ø×'Ñ'¨×(9Ñ(9¸!Ñ(<Ó=ˆGÜ—l‘l G 9¨{×/@Ñ/@ÀÑ/CÑ#CÈÔKˆGØ×4Ñ4°_ÀgÓNˆGØ˜7Ñ"ˆKà—‘˜dÓ#ˆØ�uÑˆð $ˆØ×8Ñ8Ø*Ø)×/Ñ/°Ñ2Ø×%Ñ%Ø ×'Ñ'Øð 9ó 
ˆð —[‘[Ð!@ 4§;¡;×#@Ñ#@ÐAò 	ˆEÙ!Øðà-Ø(ñð ñ	‰Mð	ô Ø+Ø�a‘Ø˜‘(ô
ð 	
r$   rž   Nrô   rb   rq   r‡   c                 ó²  — |j                   rt        j                  |«      j                  nt        j                  |«      j                  }| �&| j                  | j                  d   ddd«      } | |z  } |rbt        j                  t        j                  ||f||¬«      |z  d¬«      }|j                  dd||«      }| �t        j                  | |«      } | S |} | S )aí  
        Creates 4D attention mask and combines causal and padding masks if needed.

        Args:
            attention_mask: Optional tensor of shape (batch_size, seq_length) containing padding mask
            sequence_length: Length of the sequence
            dtype: Data type of the mask
            device: Device of the mask
            is_causal: Whether to apply causal masking

        Returns:
            4D attention mask of shape (batch_size, 1, seq_length, seq_length)
        r   r   rr   rp   )Údiagonal)
Úis_floating_pointr    Úfinforæ   Úiinfory   rx   ÚtriuÚonesÚminimum)rž   rô   rb   rq   r‡   Ú	min_valueÚcausal_masks          r%   rø   z'TimesFmModel._prepare_4d_attention_mask‘  sÝ   € ð, /4×.EÒ.E”E—K‘K Ó&×*Ò*Ì5Ï;É;ÐW\ÓK]×KaÑKaˆ	ð Ð%à+×0Ñ0°×1EÑ1EÀaÑ1HÈ!ÈQÐPRÓSˆNØ+¨iÑ7ˆNñ ÜŸ*™*Ü—
‘
˜O¨_Ð=ÀUÐSYÔZÐ]fÑfØôˆKð &×*Ñ*¨1¨a°À/ÓRˆKð Ð)Ü!&§¡¨~¸{Ó!K�ð Ðð "-�àÐr$   Úpaddingc                 óF  — dt         j                  fd„}t        j                  d|z
  d¬«      } ||«      }t        j                  | j                  d   «      }| ||dd…f   }|||dd…f   }d|z
  }t        j                  |d¬«      }	t        j
                  |	d¬	«      }	t        j                  ||z  d¬«      }
|
|	z  }||j                  d
«      z
  |z  }t        j                  |dz  d¬«      |	z  }t        j
                  |d¬	«      }t        j                  |«      }||fS )aÃ  Calculates mean and standard deviation of `inputs` across axis 1.

        It excludes values where `padding` is 1.

        Args:
            inputs: A PyTorch tensor of shape [b, n, p].
            padding: A PyTorch tensor of shape [b, n, p] with values 0 or 1.

        Returns:
            A tuple containing the mean and standard deviation.
            We return the statistics of the first patch with more than three non-padded values.
        Úarrc                 ó(  — t        j                  | dk\  j                  t         j                  «      d¬«      }| dk\  j                  t         j                  «      j	                  d¬«      }t        j
                  |dk(  | j                  d   dz
  |«      S )Nr   r   rs   r   )r    ÚargmaxÚtoÚint32Úsumrê   rx   )r  ÚindicesÚrow_sums      r%   Ú_get_patch_indexz?TimesFmModel._timesfm_masked_mean_std.<locals>._get_patch_indexÏ  sk   € Ü—l‘l C¨1¡H§=¡=´·±Ó#=À1ÔEˆGØ˜a‘x—m‘m¤E§K¡KÓ0×4Ñ4¸Ð4Ó;ˆGÜ—;‘;˜w¨!™|¨S¯Y©Y°q©\¸AÑ-=¸wÓGÐGr$   r   r   rs   r   Nr?   rå   rr   r¡   )r    r!   r  rk   rx   rè   rv   r›   )râ   r  r  Úpad_sumÚpatch_indicesÚbidxsr  r}   ÚmaskÚnum_valid_elementsÚ
masked_sumÚmasked_meanÚmasked_centered_arrÚ
masked_varÚ
masked_stds                  r%   rç   z%TimesFmModel._timesfm_masked_mean_std¿  s  € ð 	H¤%§,¡,ó 	Hô
 —)‘)˜A ™K¨QÔ/ˆÙ(¨Ó1ˆÜ—‘˜VŸ\™\¨!™_Ó-ˆà�U˜Mª1Ð,Ñ-ˆØ�e˜]ªAÐ-Ñ.ˆð �3‰wˆô #ŸY™Y t°Ô3ÐÜ"Ÿ[™[Ð);ÀÔEÐô —Y‘Y˜s T™z¨qÔ1ˆ
Ø Ð#5Ñ5ˆð  # [×%:Ñ%:¸2Ó%>Ñ>À$ÑFÐÜ—Y‘YÐ2°AÑ5¸1Ô=Ð@RÑRˆ
Ü—[‘[ °Ô5ˆ
Ü—Z‘Z 
Ó+ˆ
à˜JÐ&Ð&r$   r  Úseqc                 ó„  — |j                   \  }}}| dk(  }|j                  t        j                  «      j	                  d¬«      }d||j                  d¬«       <   t        j                  ||j                  ¬«      j                  ddd«      j                  |d|«      }||dd…ddf   z
  |z  }|j                  d|«      }	|	S )zéShifts rows of seq based on the first 0 in each row of the mask.

        Args:
            mask: mask tensor of shape [B, N]
            seq: seq tensor of shape [B, N, P]

        Returns:
            The shifted sequence.
        r   r   rs   rr   )rq   N)rx   r  r    r  r  Úanyrk   rq   ry   ÚexpandÚgather)
r  r!  Ú
batch_sizeÚnum_seqÚfeature_dimÚnew_maskr  Ú	idx_rangeÚshifted_idxÚshifted_seqs
             r%   r÷   z&TimesFmModel._timesfm_shift_padded_seqî  sÄ   € ð ,/¯9©9Ñ(ˆ
�G˜[à%)¨Q¡Yˆð —+‘+œeŸk™kÓ*×1Ñ1°aÐ1Ó8ˆð )+ˆ�—‘ !�Ó$Ð$Ñ%ô —L‘L °·±Ô<×AÑAÀ!ÀRÈÓK×RÑRÐS]Ð_aÐcnÓoˆ	ð ! 7ª1¨d°D¨=Ñ#9Ñ9¸WÑDˆð —j‘j  KÓ0ˆàÐr$   )T)r   r   r   r   r3   r    r!   r²   rð   r   r   r   Ú
LongTensorr   r   r   rG   Ústaticmethodr±   rb   rq   Úboolrø   rç   r÷   rJ   rK   s   @r%   rÑ   rÑ   !  s°  ø„ ð˜}õ ð&$Ø—l‘lð$Ø27·,±,ð$à	ˆu�|‰|˜U 5§<¡<°·±Ð#=Ñ>Ð>Ñ	?ó$ð   ØØðF
à—\‘\ðF
ð #×-Ñ-ðF
ð �l‰lð	F
ð
 Ð+Ñ,ðF
ð 
òF
ó ó ó  ðF
ðP ð ñ+ØŸ™ tÑ+ð+àð+ð �{‰{ð+ð —‘ð	+ð
 ð+ð 
�‰˜Ñ	ò+ó ð+ðZ ð,'¨¯©ð ,'ÀÇÁð ,'ÐQVÐW\×WcÑWcÐej×eqÑeqÐWqÑQrò ,'ó ð,'ð\ ð¨¯©ð ¸5¿<¹<ð ÈEÏLÉLò ó ôr$   rÑ   c                   óR  ‡ — e Zd ZdZdefˆ fd„Z	 ddeej                     dee	   dz  de	dz  de
ej                  d	f   fd
„Zdej                  de
ej                  ej                  f   dej                  fd„Zdej                  dej                  dej                  fd„Zee	 	 	 	 	 	 ddeej                     deej                  e	z     dz  de	dz  dej                  dz  de	dz  dededee   defd„«       «       Zedej                  de	deej                     fd„«       Zˆ xZS )ÚTimesFmModelForPredictionz/TimesFM model for quantile and mean prediction.r.   c                 óJ  •— t         ‰| �  |«       || _        |j                  | _        |j
                  | _        t        |«      | _        t        |j                  |j
                  dt        |j                  «      z   z  |j                  ¬«      | _        | j                  «        y )Nr   rÓ   )r2   r3   r.   Úcontext_lengthÚcontext_lenÚhorizon_lengthÚhorizon_lenrÑ   ÚdecoderrM   r4   ÚlenÚ	quantilesr5   Úhorizon_ff_layerrá   )r<   r.   r=   s     €r%   r3   z"TimesFmModelForPrediction.__init__  sŠ   ø€ Ü‰Ñ˜Ô àˆŒØ!×0Ñ0ˆÔØ!×0Ñ0ˆÔä# FÓ+ˆŒô !5Ø×)Ñ)Ø×-Ñ-°´S¸×9IÑ9IÓ5JÑ1JÑKØ×0Ñ0ô!
ˆÔð 	�‰Õr$   Nrâ   rò   r4  r—   .c                 óX  — |€| j                   }g g }}|D �]  }|j                  d   }t        j                  || j                  z   |j
                  |j                  ¬«      }||k  rŒ||z
  }	t        j                  t        j                  |	|j
                  |j                  ¬«      |gd¬«      }t        j                  t        j                  |	|j
                  |j                  ¬«      |gd¬«      }n||kD  r|| d }||| j                  z    d }|j                  |«       |j                  |«       �Œ t        j                  |d¬«      t        j                  |d¬«      f}
|�E|
t        j                  |dt        |«       t        j                  ¬«      j                  dd«      fz   }
|
S )aá  Pad/truncate input time series to `context_len` and build a padding mask.

        Args:
            inputs: A list of 1d Tensors. Each Tensor is the context time series of a single forecast task.
            freq: Optional list of frequencies (returned as a tensor when provided).
            context_len: Optional context length override (defaults to `self.context_len`).

        Returns:
            Tuple of (padded_inputs, padding_mask) and optionally a freq tensor.
        Nr   rp   rs   ra   rr   r   )r4  rx   r    Úzerosr6  rb   rq   rz   r  ÚappendÚstackrí   r8  r  r§   )r<   râ   rò   r4  Úinput_tsÚinput_paddingÚtsÚ	input_lenr  Únum_front_padÚresults              r%   Ú_preprocessz%TimesFmModelForPrediction._preprocess%  s€  € ð ÐØ×*Ñ*ˆKà"$ b�-ˆàó 	*ˆBØŸ™ ™ˆIÜ—k‘k )¨d×.>Ñ.>Ñ">ÀbÇhÁhÐWY×W`ÑW`ÔaˆGØ˜;Ò&Ø +¨iÑ 7�Ü—Y‘Y¤§¡¨MÀÇÁÐRT×R[ÑR[Ô \Ð^`ÐaÐghÔi�ÜŸ)™)¤U§Z¡Z°ÀRÇXÁXÐV]×VdÑVdÔ%eÐgnÐ$oÐuvÔw‘Ø˜[Ò(Ø˜˜˜Ð&�Ø! K°$×2BÑ2BÑ$BÐ"CÐ"EÐF�à�O‰O˜BÔØ× Ñ  Ö)ð	*ô —+‘+˜h¨AÔ.´·±¸MÈqÔ0QÐRˆØÐØœuŸ|™|¨D°´3°v³;Ð,?ÄuÇ{Á{ÔS×[Ñ[Ð\^Ð`aÓbÐdÑdˆFØˆr$   Úmodel_outputrû   c                 ó  — | j                  |«      }|j                  \  }}}|j                  ||| j                  j                  t        | j                  j                  «      dz   «      }|\  }}||dd…dddf   z  |dd…dddf   z   S )z*Postprocess output of stacked transformer.r   N)r:  rx   ry   r.   r5  r8  r9  )	r<   rF  rû   Ú	output_tsÚbÚnr»   rî   rï   s	            r%   Ú_postprocess_outputz-TimesFmModelForPrediction._postprocess_outputJ  s�   € ð ×)Ñ)¨,Ó7ˆ	ð —/‘/‰ˆˆ1ˆaØ—N‘N 1 a¨¯©×)CÑ)CÄSÈÏÉ×I^ÑI^ÓE_ÐbcÑEcÓdˆ	à‰	ˆˆEØ˜5¢ D¨$°Ð!4Ñ5Ñ5¸º1¸dÀDÈ$Ð;NÑ8OÑOÐOr$   ÚpredictionsÚtargetsc                 ó*  — g }t        | j                  j                  «      D ]M  \  }}||d|f   z
  }t        j                  |dz
  |z  ||z  «      }|j                  |j                  «       «       ŒO t        j                  |«      j                  «       S )N.r   )Ú	enumerater.   r9  r    rh   r=  Úmeanr>  )r<   rL  rM  ÚlossesÚiÚqÚerrorsr*   s           r%   Ú_quantile_lossz(TimesFmModelForPrediction._quantile_lossY  s…   € ØˆÜ˜dŸk™k×3Ñ3Ó4ò 	'‰DˆAˆqØ˜{¨3°¨6Ñ2Ñ2ˆFÜ—9‘9˜a !™e vÑ-¨q°6©zÓ:ˆDØ�M‰M˜$Ÿ)™)›+Õ&ð	'ô �{‰{˜6Ó"×'Ñ'Ó)Ð)r$   r¿   Úwindow_sizeÚfuture_valuesÚforecast_context_lenÚreturn_forecast_on_contextÚtruncate_negativerŸ   c           
      ó>	  — |€| j                   }	n|}	|d   j                  }
|D �cg c]  }||	 d ‘Œ
 }}t        j                  t        j                  |D �cg c]  }t        j                  |«      ‘Œ c}«      «      }|�Yg }g }t        |«      D ]A  \  }}|j                  | j                  ||«      «       |€Œ*|j                  ||   gdz  «       ŒC |}|�|}|€$t        j                  d«       dgt        |«      z  }| j                  ||«      \  }}}|j                  |
«      }|j                  |
«      }|j                  |
«      }|}|j                  d   }g }|j                  d   |j                  d   | j                  z   k7  r8t        d|j                  d   › d|j                  d   › d| j                  › �«      ‚| j                   j"                  }| j                  |z   dz
  |z  }t%        |«      D �]/  }|dd…d|j                  d   …f   }|dd…|	 d…f   }|dd…|	 d…f   } | j&                  d|||d	œ|¤Ž}| j)                  |j*                  |j,                  |j.                  f«      }|rl|dk(  rg|dd…dd
…d| j                   j0                  …dd…f   }|j3                  |j5                  d«      d
|j5                  d«      «      }|j7                  |«       |dd…d
d|…df   }|dd…d
d|…dd…f   }|j7                  |«       t        j8                  ||gd
¬«      }�Œ2 |rHt        j8                  |d¬«      dd…d|| j                   j0                  z
  | j                  z   …dd…f   }n-t        j8                  |d¬«      dd…d| j                  …dd…f   }|dd…dd…df   }|�*|ddd…df   |ddd…df   z   }|ddd…df   |ddd…df   z   }|rQ|dk\  } t        j:                  | |j=                  d«      |«      }t        j:                  | |j=                  d«      |«      }d}!|�9t?        j@                  ||«      }"| jC                  |dd…dd…dd…f   |«      }#|"|#z   }!tE        j*                  |jF                  |jH                  |||!¬«      S c c}w c c}w )aŸ  
        past_values (`torch.FloatTensor` of shape `(batch_size, sequence_length)`):
            Past values of the time series that serves as input to the model.
        freq (`torch.LongTensor` of shape `(batch_size,)`):
            Frequency indices for the time series data.
        window_size (`int`, *optional*):
            Window size of trend + residual decomposition. If None then we do not do decomposition.
        future_values (`torch.Tensor`, *optional*):
            Optional future time series values to be used for loss computation.
        forecast_context_len (`int`, *optional*):
            Optional max context length.
        return_forecast_on_context (`bool`, *optional*):
            True to return the forecast on the context when available, i.e. after the first input patch.
        truncate_negative (`bool`, *optional*):
            Truncate to only non-negative values if any of the contexts have non-negative values,
            otherwise do nothing.

        Example:

        ```python
        >>> from transformers import TimesFmModelForPrediction

        >>> model = TimesFmModelForPrediction.from_pretrained("google/timesfm-2.0-500m-pytorch")

        >>> forecast_input = [torch.linspace(0, 20, 100).sin(), torch.linspace(0, 20, 200).sin(), torch.linspace(0, 20, 400).sin()]
        >>> frequency_input = torch.tensor([0, 1, 2], dtype=torch.long)

        >>> # Generate
        >>> with torch.no_grad():
        >>>     outputs = model(past_values=forecast_input, freq=frequency_input, return_dict=True)
        >>>     point_forecast_conv = outputs.mean_predictions
        >>>     quantile_forecast_conv = outputs.full_predictions
        ```
        Nr   r   z6No frequency provided via `freq`. Default to high (0).r   z=Length of paddings must match length of input + horizon_len: z != z + )r¿   rñ   rò   rr   r   )Úaxis.r¡   )rõ   rÁ   r�   r(   r)   r*   r#   )%r4  rq   r    ræ   r>  rO  ÚextendÚ_timesfm_moving_averageÚloggerÚinfor8  rE  r  rx   r6  ru   r.   r5  rÜ   r7  rK  rõ   r   r   rÖ   r§   Úsizer=  Úconcatenaterê   Ú	clamp_minr@   Úmse_lossrU  r'   rÁ   r�   )$r<   r¿   rò   rV  rW  rX  rY  rZ  rŸ   Úfcontext_lenrq   rA  râ   Úinp_minÚ
new_inputsÚ	new_freqsrR  r?  r@  Úinp_freqÚ	final_outr4  Úfull_outputsÚoutput_patch_lenÚnum_decode_patchesÚ
step_indexÚcurrent_paddingÚdecoder_outputÚfprop_outputsÚnew_full_tsÚnew_tsÚmean_outputsrè   r*   rd  Úquantile_losss$                                       r%   rG   z!TimesFmModelForPrediction.forwarda  s  € ð^  Ð'Ø×+Ñ+‰Là/ˆLà˜Q‘×&Ñ&ˆà/:Ö;¨�"�l�]�^Ò$Ð;ˆÐ;Ü—)‘)œEŸK™KÀÖ(H¸2¬¯©°2­Ò(HÓIÓJˆàÐ"ØˆJØˆIÜ" 6Ó*ò 4‘��2Ø×!Ñ! $×">Ñ">¸rÀ;Ó"OÔPØÑ#Ø×$Ñ$ d¨1¡g Y°¡]Õ3ð4ð  ˆFØÐØ �àˆ<Ü�K‰KÐPÔQØ�3œ˜V›Ñ$ˆDà,0×,<Ñ,<¸VÀTÓ,JÑ)ˆ�- Ø—;‘;˜vÓ&ˆØ%×(Ñ(¨Ó0ˆØ—;‘;˜vÓ&ˆàˆ	Ø—o‘o aÑ(ˆØˆà×Ñ˜qÑ! Y§_¡_°QÑ%7¸$×:JÑ:JÑ%JÒJÜðØ!×'Ñ'¨Ñ*Ð+¨4°	·±ÀÑ0BÐ/CÀ3Àt×GWÑGWÐFXðZóð ð  Ÿ;™;×5Ñ5Ðà"×.Ñ.Ð1AÑAÀAÑEÐJZÑZÐÜÐ 2Ó3ó 	HˆJØ+ªA¨q°9·?±?À1Ñ3EÐ/EÐ,EÑFˆOØ ¢ \ M¡NÐ!2Ñ3ˆHØ+ªA°¨}©~Ð,=Ñ>ˆMØ,8¨D¯L©Lð -Ø$Ø$1Øñ-ð ñ	-ˆNð !×4Ñ4Ø×0Ñ0Ø×#Ñ# ^×%9Ñ%9Ð:óˆMñ
 *¨j¸AªoØ+ªA¨s°¨sÐ4N°d·k±k×6NÑ6NÐ4NÒPQÐ,QÑR�Ø)×1Ñ1°+×2BÑ2BÀ1Ó2EÀrÈ;×K[ÑK[Ð\]ÓK^Ó_�Ø×#Ñ# KÔ0à"¢1 bÐ*;Ð+;Ð*;¸QÐ#>Ñ?ˆFØ'ª¨2Ð/@Ð0@Ð/@Â!Ð(CÑDˆKØ×Ñ Ô,Ü×)Ñ)¨9°fÐ*=ÀBÔGŠIð/	Hñ2 &Ü ×,Ñ,¨\ÀÔBÚÐP�k D§K¡K×$<Ñ$<Ñ<¸t×?OÑ?OÑOÐPÒRSÐSñ‰Lô !×,Ñ,¨\ÀÔBÂ1ÀaÈ$×JZÑJZÐFZÒ\]ÐC]Ñ^ˆLà#¢A¢q¨! GÑ,ˆØÐ"Ø'¨¨¨1¨¨c¨	Ñ2°\À!À$ÀQÀ$ÈÀ)Ñ5LÑLˆLØ'¨¨¨1¨¨c¨	Ñ2°\À!À$ÀQÀ$ÈÀ)Ñ5LÑLˆLÙà˜q‘LˆEÜ Ÿ;™; u¨l×.DÑ.DÀSÓ.IÈ<ÓXˆLÜ Ÿ;™; u¨l×.DÑ.DÀSÓ.IÈ<ÓXˆLàˆØÐ$Ü—z‘z ,°Ó>ˆHØ ×/Ñ/°ºQÂÀ1Á2¸XÑ0FÈÓVˆMØ˜mÑ+ˆDä)Ø,×>Ñ>Ø%×0Ñ0Ø(×6Ñ6Ø)Ø)Øô
ð 	
ùòg <ùÚ(Hs   ¥RÁRr  c                 ó4  — t        j                  | |dz
  dfdd«      }t        j                  || j                  | j
                  ¬«      |z  }t        j                  |j                  ddd«      |j                  ddd«      «      j                  «       }|| |z
  gS )zCCalculates the moving average using PyTorch's convolution function.r   r   Úconstantrp   rr   )	r@   r}   r    r  rb   rq   Úconv1dry   Úsqueeze)r  rV  Ú
arr_paddedÚkernelÚsmoothed_arrs        r%   r^  z1TimesFmModelForPrediction._timesfm_moving_averageó  sƒ   € ô —U‘U˜3 ¨q¡°!Ð 4°jÀ!ÓDˆ
ä—‘˜K¨s¯y©yÀÇÁÔLÈ{ÑZˆä—x‘x 
§¡°°1°bÓ 9¸6¿;¹;ÀqÈ!ÈRÓ;PÓQ×YÑYÓ[ˆØ˜c LÑ0Ð1Ð1r$   r‚   )NNNNFF)r   r   r   r   r   r3   r   r    r!   r±   r²   rE  rK  rU  r   r   r/  r   r   r'   rG   r.  Úlistr^  rJ   rK   s   @r%   r1  r1    sÆ  ø„ Ù9ð˜}õ ð( lpñ#Ø˜uŸ|™|Ñ,ð#Ø4<¸S±MÀDÑ4Hð#Ø^aÐdhÑ^hð#à	ˆu�|‰|˜SÐ Ñ	!ó#ðJPØ!ŸL™LðPØ16°u·|±|ÀUÇ\Á\Ð7QÑ1RðPà	�‰óPð*¨%¯,©,ð *ÀÇÁð *ÐRW×R^ÑR^ó *ð Øð 59Ø"&Ø-1Ø+/Ø+0Ø"'ñN
à˜eŸl™lÑ+ðN
ð �u—|‘| cÑ)Ñ*¨TÑ1ðN
ð ˜4‘Zð	N
ð
 —|‘| dÑ*ðN
ð " D™jðN
ð %)ðN
ð  ðN
ð Ð+Ñ,ðN
ð 
$òN
ó ó ðN
ð` ð2 U§\¡\ð 2Àð 2ÈÈUÏ\É\ÑHZò 2ó ô2r$   r1  )r1  r½   rÑ   )8r   rf   Úcollections.abcr   r   Údataclassesr   r    Útorch.nnr6   Útorch.nn.functionalÚ
functionalr@   Ú r   rÅ   Úmodeling_flash_attention_utilsr   Úmodeling_outputsr	   Úmodeling_utilsr
   r   Úprocessing_utilsr   Úutilsr   r   r   r   Úutils.genericr   Úutils.output_capturingr   Úllama.modeling_llamar   Ú(phi4_multimodal.modeling_phi4_multimodalr   Úconfiguration_timesfmr   Ú
get_loggerr   r_  r   r'   ÚModuler-   rM   r\   r^   r„   r´   r½   rÑ   r1  Ú__all__r#   r$   r%   ú<module>r‘     sO  ðñ ã ß .Ý !ã Ý ß Ð å &Ý BÝ /ß FÝ &ß RÓ RÝ 7Ý 5Ý /Ý UÝ 0ð 
ˆ×	Ñ	˜HÓ	%€ð Ø
ô	&�Oó 	&ó ó ð	&ð Ø
ô- ó -ó ó ð-ô�—‘ô ô,!˜2Ÿ9™9ô !ô,	�\ô 	ô+ §¡ô +ô\9)�r—y‘yô 9)ôx˜"Ÿ)™)ô ð@ ô˜_ó ó ðð> ôjÐ)ó jó ðjôZm2Ð 6ô m2ò` R�r$   