
    ^jY:                    f   d dl mZ d dlZd dlmZmZ d dlmZ d dlm	Z	m
Z
 d dlmZ e	rd dlmZ  ej                  e      Z e       Z G d d	e      Ze G d
 d             ZddZddZ	 	 	 	 	 	 ddZddZ	 	 	 	 	 	 ddZ	 	 	 	 	 	 ddZ	 	 	 	 	 	 ddZ G d ded         ZddZ G d d      Z y)     )annotationsN)IterableSequence)	dataclass)TYPE_CHECKINGAny)logging)PreTrainedConfigc                      e Zd ZdZy)%AmbiguousGlobalPerLayerAttributeErrorzMRaised when a per-layer attribute is read from a heterogeneous global config.N)__name__
__module____qualname____doc__     /var/www/ramen.bs-engineer-server.com/venv/lib/python3.12/site-packages/transformers/integrations/heterogeneity/configuration_utils.pyr   r   #   s    Wr   r   c                  ,    e Zd ZU ded<   ded<   ded<   y)_HeterogeneitySpecdict[int, dict[str, Any]]per_layer_overridesset[str]per_layer_attributesexplicit_per_layer_attributesN)r   r   r   __annotations__r   r   r   r   r   '   s    22""#++r   r   c                    t        j                  |       }d|v rt|j                  d      }t        |t              st        |t
              st        d      t        |      }t        d |D              st        d      |rt        |      |d<   |S )Nskipz&`skip` must be an iterable of strings.c              3  <   K   | ]  }t        |t                y wN)
isinstancestr).0items     r   	<genexpr>z-_normalize_layer_overrides.<locals>.<genexpr>7   s     :T:dC(:s   z!`skip` must contain only strings.)
copydeepcopypopr    r!   r   	TypeErrorsetallsorted)layer_overrides
normalizedr   s      r   _normalize_layer_overridesr.   .   s    /J~~f%dC 
4(BDEE4y:T::?@@!'Jvr   r
   c                    |sy | j                   }|D cg c]  }|dk  s||k\  s| }}|rt        d| d| d      y c c}w )Nr   zG`per_layer_config` keys must be integer layer indices in the range [0, z); got .)num_hidden_layers
ValueError)configr   r1   	layer_idxinvalid_layer_indicess        r   _validate_layer_indicesr6   @   su    00#6)a-9XiKi	  UVgUh i(),
 	
 s   ??c                8   g }t        | j                        D ]o  }|j                  |i       }|j                  d| j                  dd             }|j                  d| j                  dd             }|\|_|j	                  |       q |rt        d| d      y )Nsliding_windowattention_chunk_sizezkThe following layers have the mutually exclusive `sliding_window` and `attention_chunk_size` both defined: z. To fix this, either remove a conflicting attribute from the global config,or set it to `None` in `per_layer_config` for the problematic layers.)ranger1   get)_getattr_without_heterogeneous_validationappendr2   )r3   r   problematic_indicesr4   r,   r8   r9   s          r   1_validate_sliding_window_and_attention_chunk_sizer?   O   s     6334 2	-11)R@(,,fNNO_aef
  /22"<<=SUYZ 

 %*>*J&&y12 y"# $TU
 	
 r   c                    t               }| j                         D ]  }|j                  |        |j                  d       |S )Nr   )r)   valuesupdatediscard)r   r   r,   s      r   _get_per_layer_attributesrD   i   sF    %(U.557 5##O45   (r   c                   t        |      }t               }|D ]{  }t        |      | j                  k7  r$| j	                  |      r-|j                  |       ?|j                         D ]*  }||vs| j	                  |      s|j                  |        { } |rt        dt        |       d      |D ]K  }| j	                  |      s| j                  |      }|j                         D ]  }||v s||   |k(  s||=  M t        |j                               D ]  \  }}|r	||=  t        |      }t        |||      }	|	S )Nz&The following attributes are missing: zS
Please define them globally, or provide them for every layer in `per_layer_config`)r   r   r   )rD   r)   lenr1   )_hasattr_without_heterogeneous_validationaddrA   r2   r+   r<   listitemsr   )
r3   r   r   "missing_required_global_attributesattrr,   global_valuer4   r   heterogeneity_specs
             r   ,_modify_config_and_create_heterogeneity_specrO   r   s    %>>Q$R! *-&- 	"#v'?'??CCDI266t<#6#=#=#? .!KKDQ:>>tD		 *4V<^5_4`  au  v
 	

 . *??EGGM299; 	*O&?4+@L+P#D)	** '++>+D+D+F&G /"	?#I./ 55HI+/1&C r   c                    |j                         D ci c]  \  }}t        |      t        |       }}}t        | |       t	        | |       t        | |      | _        yc c}}w )a  Register per-layer configuration overrides on a model config.

    In a heterogeneous model, individual layers can differ from the global config
    (e.g., different ``intermediate_size``, ``num_key_value_heads``, or entire
    sub-layers skipped via the ``skip`` attribute).

    This function validates the overrides and stores a ``_HeterogeneitySpec`` on ``config._heterogeneity_spec``.
    At model-init time, ``apply_heterogeneous_modeling`` reads this spec to patch
    each layer with its resolved config.

    Args:
        config: The global model config to modify in-place.
        per_layer_config: Mapping from layer index to a dictionary
            of attribute overrides. Only layers that differ from the global
            config need to be included.
    N)rJ   intr.   r6   r?   rO   _heterogeneity_spec)r3   per_layer_configr4   r,   normalized_per_layer_overridess        r   _apply_heterogeneous_configrU      sk    . +;*@*@*B&&I 	I2?CC&" &
 F$BC5f>\]!MfVt!uF&s   A c                    t        j                   |       }|j                  j                  dd        |j                  dg       |_        |j                         D ]  \  }}|dk(  rt        |||        |S )NrR   r   )r%   __dict__r'   r;   r   rJ   setattr)r3   r,   output_configrL   values        r   _get_layer_configr[      sx     IIf%M4d;(,,VR8M&,,. ,e6>tU+,
 r   c                  $    e Zd ZddZddZddZy)_PerLayerConfigViewc                    || _         y r   )_config)selfr3   s     r   __init__z_PerLayerConfigView.__init__   s	    r   c                .    | j                   j                  S r   )r_   r1   r`   s    r   __len__z_PerLayerConfigView.__len__   s    ||---r   c                |   t        |t              r1t        |j                  t	        |              D cg c]  }| |   	 c}S |dk  r|t	        |       z  }|dk  s|t	        |       k\  rt        d      | j                  j                  }t        | j                  |j                  j                  |i             S c c}w )Nr   zlist index out of range)r    slicer:   indicesrF   
IndexErrorr_   rR   r[   r   r;   )r`   r4   irN   s       r   __getitem__z_PerLayerConfigView.__getitem__   s    i'%*I,=,=c$i,H%IJDGJJq=T"Iq=IT2677!\\== LL2266y"E
 	
 Ks   B9N)r3   r
   returnNone)rk   rQ   )r4   zint | slicerk   z)PreTrainedConfig | list[PreTrainedConfig])r   r   r   ra   rd   rj   r   r   r   r]   r]      s    .
r   r]   c                   | j                   }i }t        | j                        D ]c  }t        j                  |j
                  j                  |i             }|j                  D ]  }||vs| j                  |      ||<    |s_|||<   e |S r   )	rR   r:   r1   r%   r&   r   r;   r   r<   )r3   rN   explicit_per_layer_overridesr4   r,   rL   s         r   !_get_explicit_per_layer_overridesro      s    33#% 6334 F	--(:(N(N(R(RS\^`(ab&DD 	_D?*(.(X(XY](^%	_ 6E(3F ('r   c                      e Zd ZdZd fdZedd       Zedd       Zej                  dd       Zedd       Z	edd       Z
e
j                  dd       Z
edd	       Zej                  dd
       ZddZddZefd fdZddZ xZS )HeterogeneousConfigMixina_  Mixin for heterogeneous per-layer config behavior.

    This mixin owns heterogeneity-specific state and rules. ``PreTrainedConfig`` assigns the ``per_layer_config``
    property in the post-init phase and calls hook methods where heterogeneity needs to participate in the config lifecycle: attribute
    access, key iteration, and serialization.
    c           	         t         |   d      j                  d      }|K||j                  v r=t         |   d      st	        d| d| d| d      t
        j                  d| d	       t         |   |      S )
NrW   rR   'allow_global_per_layer_attribute_access'z' is a per-layer attribute and may vary across layers. Access it via the individual layer configs instead (e.g. config.per_layer_config[i].z/). To read the global config value from config.z anyway, set `allow_global_per_layer_attribute_access` to `True` on the config. Warning: only do this if the caller can safely handle heterogeneous configs; code that assumes a homogeneous model may use the global value incorrectly.z5Reading global config value for per-layer attribute `z` on a heterogeneous config. Only do this if the caller can safely handle heterogeneous configs; code that assumes a homogeneous model may use the global value incorrectly.)super__getattribute__r;   r   r   loggerwarning_once)r`   keyrN   	__class__s      r   rv   z)HeterogeneousConfigMixin.__getattribute__  s     #W5jAEEF[\)(===w/0YZ?C5 !LLO5 Q""% 'TU  ##KC5 QB B w',,r   c                    t        | d      S NrR   )hasattrrc   s    r   is_heterogeneousz)HeterogeneousConfigMixin.is_heterogeneous  s    t233r   c                2    | j                   sy t        |       S r   )r~   r]   rc   s    r   rS   z)HeterogeneousConfigMixin.per_layer_config  s    $$"4((r   c                Z    || j                   j                  dd        y t        | |       y r|   )rW   r'   rU   )r`   rS   s     r   rS   z)HeterogeneousConfigMixin.per_layer_config$  s+    #MM3T:#D*:;r   c                H    | j                   sy | j                  j                  S r   )r~   rR   r   rc   s    r   r   z-HeterogeneousConfigMixin.per_layer_attributes,  s     $$''<<<r   c                :    | j                   j                  dd      S )Nrs   FrW   r;   rc   s    r   rs   z@HeterogeneousConfigMixin.allow_global_per_layer_attribute_access2  s    }}  !JERRr   c                "    || j                   d<   y )Nrs   rW   r`   rZ   s     r   rs   z@HeterogeneousConfigMixin.allow_global_per_layer_attribute_access6  s    CH?@r   c                :    | j                   j                  dd      S )N#serialize_explicit_per_layer_configFr   rc   s    r   r   z<HeterogeneousConfigMixin.serialize_explicit_per_layer_config:  s    }}  !FNNr   c                "    || j                   d<   y )Nr   r   r   s     r   r   z<HeterogeneousConfigMixin.serialize_explicit_per_layer_config>  s    ?D;<r   c              #     K   | j                   r'| j                  s|D ]  }|| j                  vs|  y |E d {    y 7 wr   )r~   rs   r   )r`   keysry   s      r   /_iter_config_keys_with_heterogeneous_adjustmentzHHeterogeneousConfigMixin._iter_config_keys_with_heterogeneous_adjustmentB  sD        )U)U d777I OOs   ,AAAAc                   | j                   sy | j                  rt        |       }n| j                  j                  }|r~t        t        t        |j                                           }|j                         D ci c]3  \  }}t        |      j                  |      t        j                  |      5 c}}|d<   ni |d<   |j                  dd        y c c}}w )NrS   rR   )r~   r   ro   rR   r   rF   r!   maxr   rJ   zfillr%   r&   r'   )r`   dr   
max_digitsr4   r,   s         r   $_update_heterogeneous_to_dict_outputz=HeterogeneousConfigMixin._update_heterogeneous_to_dict_outputL  s    $$33"CD"I"&":":"N"NS%8%=%=%?!@ABJ 3F2K2K2M%.I I$$Z0$--2PP%A !
 %'A !	#T*%s   <8Cc                    |dk7  r#|t         |   d      v rt         |   d      |   }	 t         |   |      S # t        $ r |t        u r |cY S w xY w)Nattribute_map)ru   rv   AttributeError	_SENTINEL)r`   ry   defaultrz   s      r   r<   zBHeterogeneousConfigMixin._getattr_without_heterogeneous_validationa  sd    /!cUW-Eo-V&V'*?;C@C	7+C00 	)#N	s   : AAc                F    	 | j                  |       y# t        $ r Y yw xY w)NFT)r<   r   )r`   ry   s     r   rG   zBHeterogeneousConfigMixin._hasattr_without_heterogeneous_validationl  s.    	::3?   		s    	  )ry   r!   rk   r   )rk   bool)rk   z!Sequence[PreTrainedConfig] | None)rS   z&dict[int | str, dict[str, Any]] | Nonerk   rl   )rk   zset[str] | None)rZ   r   rk   rl   )r   Iterable[str]rk   r   )r   dict[str, Any]rk   rl   )ry   r!   r   r   rk   r   )ry   r!   rk   r   )r   r   r   r   rv   propertyr~   rS   setterr   rs   r   r   r   r   r<   rG   __classcell__)rz   s   @r   rq   rq      s    -. 4 4 ) )
 < < = =
 S S -33I 4I O O )//E 0E+* R[ 	r   rq   )r,   r   rk   r   )r3   r
   r   r   rk   rl   )r   r   rk   r   )r3   r
   r   r   rk   r   )r3   r
   rS   zdict[int | str, dict[str, Any]]rk   rl   )r3   r
   r,   r   rk   r
   )r3   r
   rk   r   )!
__future__r   r%   collections.abcr   r   dataclassesr   typingr   r   transformers.utilsr	   transformersr
   
get_loggerr   rw   objectr   RuntimeErrorr   r   r.   r6   r?   rD   rO   rU   r[   r]   ro   rq   r   r   r   <module>r      s    #  . ! % & - 
		H	%H	XL X , , ,$


3L
	
4 --3L--`vv5v 
v@# "
(#56 
.("v vr   