
    3j                     z   S SK r S SKrS SKrS SKrS SKrS SKrS SKrS SKrS SKrS SK	r	S SK
Jr  S SKJr  S SKJr  S SKJrJr  S SKJrJrJrJrJrJr  S SKJr  S SKJr  \\\ \!" S5      \"\#\$\%\&4	r'\\\ \!" S5      \"\%4r(\" S	\\-  \ -  \"-  \#-  \$-  \%-  \&-  S-  S
9r)\*" 5       r+\" SS9 " S S\\)   5      5       r,\(       aC  \+SSSSSSS4S\)\*-  S\"S-  S\"\#\"   -  S-  S\"\#\"   -  S-  S\!S-  S\"S-  S\ S\"S-  S\)4S jjr-OE\+SSSSSSS4S\)\*-  S\"S-  S\"\#\"   -  S-  S\"\#\"   -  S-  S\!S-  S\"S-  S\ S\"S-  S\,\)   4S jjr-S\"S\ \"-  S-  4S jr.S\SS4S jr/Sr0S\S\$\"   4S  jr1\ " S! S"5      5       r2 " S# S$\5      r3 " S% S&\ Rh                  5      r4 " S' S(5      r5S+S\"S\S\ S-  4S) jjr6S* r7g),    N)Callable)
ContextVar)	dataclass)FunctionType
ModuleType)AnyGenericNoReturnOptionalTYPE_CHECKINGTypeVar)
deprecated)justknobs_checkT)boundT)kw_onlyc                       \ rS rSr% Sr\\-  \S'   Sr\	S-  \S'   Sr
\\	   S-  \S'   Sr\\	   S-  \S'   Sr\S-  \S'   Sr\	S-  \S	'   S
r\\S'   Sr\	S-  \S'   SS jr\S\	\\	   -  S-  S\\	   S-  4S j5       rSrg)_Config$   a  Represents a config with richer behaviour than just a default value.
::
    i.e.
    foo = Config(justknob="//foo:bar", default=False)
    install_config_module(...)

This configs must be installed with install_config_module to be used

Precedence Order:
    alias: If set, the directly use the value of the alias.
    env_name_force: If set, this environment variable has precedence over
        everything after this.
        If multiple env variables are given, the precedence order is from
        left to right.
    user_override: If a user sets a value (i.e. foo.bar=True), that
        has precedence over everything after this.  User overrides are thread-local.
    env_name_default: If set, this environment variable will override everything
        after this.
        If multiple env variables are given, the precedence order is from
        left to right.
    justknob: If this pytorch installation supports justknobs, that will
        override defaults, but will not override the user_override precedence.
    default: This value is the lowest precedence, and will be used if nothing is
        set.

Environment Variables:
    These are interpreted to be either "0" or "1" to represent true and false.

Arguments:
    justknob: the name of the feature / JK. In OSS this is unused.
    default: is the value to default this knob to in OSS.
    alias: The alias config to read instead.
    env_name_force: The environment variable, or list of, to read that is a FORCE
        environment variable. I.e. it overrides everything except for alias.
    env_name_default: The environment variable, or list of, to read that changes the
        default behaviour. I.e. user overrides take preference.
defaultNjustknobenv_name_defaultenv_name_force
value_typealiasFr   deprecation_messagereturnc                 :   [         R                  U R                  5      U l        [         R                  U R                  5      U l        U R                  bF  U R
                  [        Ld'  U R                  c  U R                  c  U R                  b  [        S5      eg g )Nztif alias is set, none of {default, justknob,                         env_name_default and env_name_force} can be set)	r    string_or_list_of_string_to_listr   r   r   r   _UNSET_SENTINELr   AssertionErrorselfs    T/home/wildlama/miniconda3/lib/python3.13/site-packages/torch/utils/_config_module.py__post_init___Config.__post_init__V   s     ' H H!!!
 &FF
 ::!O3==,((4&&2$I  3 "    valc                     U c  g [        U [        5      (       a  U /$ [        U [        5      (       d  [        S[	        U 5       35      eU $ )Nzval is not a list, got )
isinstancestrlistr!   type)r(   s    r$   r   (_Config.string_or_list_of_string_to_listj   sI     ;c35L#t$$ #:49+!FGG
r'   )r   r   r   N)__name__
__module____qualname____firstlineno____doc__r   object__annotations__r   r+   r   r,   r   r   r-   r   r   boolr   r%   staticmethodr   __static_attributes__ r'   r$   r   r   $   s    $L ZHcDj)-d3i$&-'+NDI$+"Jt"E3:J&*t*( 	49_t#		cT		 	r'   r   Fr   r   r   r   r   r   r   r   r   c                     g Nr:   r   r   r   r   r   r   r   r   s           r$   Configr>   }   s     r'   c                 "    [        U UUUUUUUS9$ )Nr=   )r   r=   s           r$   r>   r>      s)     -)!! 3

 
	
r'   namec                 `    [         R                  R                  U 5      nUS:X  a  gUS:X  a  gU$ N1T0Fosenvironget)r@   values     r$   _read_env_variablerJ      s-    JJNN4 E||Lr'   modulec                    ^ ^^  " S S[         5      nS[        [        -  S[        [        -  S[        SS4UU U4S jjm0 m[        T 5      nT" T T S	5        TT l        UT l        UT l        S
T l	        ST l
        g)z
Converts a module-level config into a `ConfigModule()`.

See _config_typing.pyi for instructions on how to get the converted module to typecheck.
c                   (    \ rS rSr\" 1 Sk5      rSrg)3install_config_module.<locals>.ConfigModuleInstance   >   	_is_dirty_hash_digestr6   r:   N)r0   r1   r2   r3   set_bypass_keysr9   r:   r'   r$   ConfigModuleInstancerN      s    KLr'   rT   sourcedestprefixr   Nc                 d  > [         R                  " U 5      n[        U R                  R	                  5       5       GH  u  pEUR                  S5      (       d  [        U[        [        45      (       dk  [        US5      (       a0  UR                  S:X  dJ  UR                  R                  S5      (       d*  [        U[        5      (       a  [        U[        5      (       a  M  U U 3nUR                  US5      n[        U[        5      (       a+  [!        [        XWS9U5      T	U'   UT
L a  [#        T
U5        M  M  [        U[        5      (       a;  Ub  UR$                  c  Xul        [!        XV5      T	U'   UT
L a  [#        T
U5        GMI  GML  [        U[        5      (       au  UR                  T
R&                  :w  a  [)        SU ST
R&                   35      e[+        T
U S	35      nT" XXU S	35        UT
L a  [-        XU5        GM  XR                  U'   GM  [)        S
U SU S[        U5       S35      e   g)z?Walk the module structure and move everything to module._config__r1   typingzcollections.abcN)r   r   zsubconfig class z must be defined in module .zUnhandled config =z ())inspectget_annotationsr,   __dict__items
startswithr*   r   r   hasattrr1   r-   
issubclassr   rH   CONFIG_TYPES_ConfigEntrydelattrr   r0   r!   SubConfigProxysetattr)rU   rV   rW   
type_hintskeyrI   r@   annotated_typeproxyconfigrK   visits            r$   ro   $install_config_module.<locals>.visit   s    ,,V4
v4467JCt$$ej,%?@@E<00((H4 ++667HII ud++
5'0J0JXcU#D'^^C6N%..+EEt t 6>FC( "E7++!-%2B2B2J'5$+E8t6>FC( "E4((##v6(*5'1LV__L]^  'v$qz:etfAJ/6>Du-).MM#&$'8QugRU}TU%VWW[ 8r'    T)ConfigModuler   r-   rh   r+   -get_assignments_with_compile_ignored_comments_config_compile_ignored_keys	__class__rP   rQ   )rK   rT   compile_ignored_keysrn   ro   s   `  @@r$   install_config_modulerx      s    M| M4XT!4X>)4X 4X 
	4X 4Xl ')FHP	&&"FN#7F +FFFr'   z@compile_ignoredc                 >   [         R                  " U 5      n[        5       n[        R                  " [        R
                  " UR                  S5      5      R                  5      nSnSnU GH  nUR                  [        R                  :X  aR  SnUR                  R                  5       n[        U;   a*  US:w  a  [        S[         35      eXvR                  S   4nMr  Mt  UR                  [        R                  :X  a  U(       d  UR                  nM  M  UR                  [        R                   :X  d  M  UR                  S:X  d  M  [        US   ;   a,  US   UR                  S   S-
  :X  a  UR#                  U5        SnSnGM     US:w  a  [        S[         35      eU$ )Nutf-8)rq   rq   zunconsumed r   r\      )r^   	getsourcerR   tokenizeioBytesIOencodereadliner-   COMMENTstringstripCOMPILE_IGNORED_MARKERr!   startNAMEOPadd)rK   source_codeassignmentstokenscurrent_comment	prev_nametokenmaybe_currents           r$   rs   rs      s^   ##F+K%K rzz+*<*<W*EFOOPFOI::)))I!LL..0M%6"h.(;7M6N)OPP"/Q"? 7 ZZ8==( !LL	 ZZ8;;&5<<3+> '/!*<<#A&%++a.1*<<	*"(I- . ("{+A*BCDDr'   c                       \ rS rSr% \\S'   \\S'   \\   \S'   Sr	\
S-  \S'   \r\\S'   \r\\S'   S	r\\S
'   Sr\
S-  \S'   S	r\\S'   Sr\
S-  \S'   S	r\\S'   S\S\
SS4S jrSrg)rf   i"  r   r   user_overrideNr   env_value_forceenv_value_defaultFhider   r   r   _deprecation_warnedrn   r@   r   c                    UR                   U l         UR                  b  UR                  O[        U R                   5      U l        UR                  U l        UR                  U l        UR
                  U l        UR                  U l        SU l        [        U[        S9U l
        UR                  b)  UR                   H  n[        U5      =nc  M  X@l          O   UR                  b)  UR                   H  n[        U5      =nc  M  X@l          O   U R                  bE  U R                   b8  [!        U R                   ["        5      (       d  [%        SU R                    S35      eU R                  bg  UR                  c  UR                  bL  U R                  ["        [&        [(        ["           [(        [&           4;  a  [%        SU R                   S35      eg g g )NFr   z!justknobs only support booleans, z is not a booleanz<envvar configs only support (optional) booleans or strings, z is neither)r   r   r-   r   r   r   r   r   r   r    r   r   rJ   r   r   r   r*   r7   r!   r+   r   )r#   rn   r@   r(   	env_values        r$   __init___ConfigEntry.__init__B  s   ~~!'!2!2!>FDDV 	 \\
 ++#)#=#= #( 'oF""...!3C!88IE-6* /   ,,,!3C!88IE+4( - ==$)AdllD11$7~EVW  ??&##/63H3H3T	'  %RSWSbSbRccno  4U 'r'   )
r   r   r   r   r   r   r   r   r   r   )r0   r1   r2   r3   r   r6   r-   r   r5   r   r+   r    r   r   r   r7   r   r   r   r   r   r   r9   r:   r'   r$   rf   rf   "  s     L f%%HcDj*OS*,s, D$E3:J&*t* %%)w )c )d )r'   rf   c                     ^  \ rS rSr% \\\4   \S'   \\   \S'   \\   \S'   \	\S'   \
S-  \S'   S5S	 jrS
\S\SS4S jrS
\S\SS4U 4S jjrS
\S\4S jrS
\SS4S jrS\S\\\4   S-  4S jrS\S\4S jrS\S\SS4S jrS
\S\	4S jr   S6S\\   S-  S\\   S-  S\	S\\\4   4S jjrS\S\4S jrS\
4S jrSS.S \	S\\\4   4S! jjrS\4S" jrS\
4S# jr\ " S$\!S%9S\\\4   4S& j5       r"\ " S'\!S%9S\\\4   4S( j5       r#S)\
\\\4   -  SS4S* jr$S\\\4   4S+ jr%S\\\4   4S, jr&  S7S-\\\\4   -  S-  S.\S/\\\4   SS04S1 jjr'S2\\\4   S\4S3 jr(S4r)U =r*$ )8rr   in  rt   rS   ru   rP   NrQ   r   c                 (    [        S[         S35      e)Nzuse z-.install_config_module(sys.modules[__name__]))NotImplementedErrorr0   r"   s    r$   r   ConfigModule.__init__z  s    !8*IJ
 	
r'   r@   rn   c                     UR                   (       am  UR                  (       d[  SSKnU R                   SU S3nUR                  (       a  USUR                   3-  nUS-  nUR                  U[        SS9  S	Ul        ggg)
z;Issue deprecation warning for config if not already warned.r   Nr[   z is deprecatedz and z4. It will be removed in a future version of PyTorch.   )
stacklevelT)r   r   warningsr0   r   warnFutureWarning)r#   r@   rn   r   msgs        r$   _warn_if_deprecated ConfigModule._warn_if_deprecated  s{    V%?%?]]O1TF.9C))v99:;;IICMM#}M;)-F& &@r'   rI   c                 h  > XR                   ;   a  [        TU ]	  X5        g XR                  ;  a  [	        U R
                   SU S35      eU R                  U   nU R                  X5        UR                  b  U R                  X25        g UR                  R                  U5        SU l        SUl        g )Nr[    does not existTF)rS   super__setattr__rt   AttributeErrorr0   r   r   _set_alias_valr   rR   rP   r   )r#   r@   rI   rn   rv   s       r$   r   ConfigModule.__setattr__  s    $$$G,% DMM?!D6!IJJ \\$'F$$T2||'##F2$$((/!%#r'   c                 H    U R                   U   nUR                  (       a  [        U R                   SU S35      eU R	                  X5        U R                  U5      nU[        La  U$ UR                  [        La  UR                  $ UR                  R                  5       nU[        La  U$ UR                  [        La  UR                  $ UR                  b  [        UR                  UR                  S9$ [        UR                  [        5      (       dS  UR                  R!                  ["        R$                  " UR                  5      5        UR                  R                  5       $ UR                  $ ! [&         a!  n[        U R                   SU S35      UeS nAff = f)Nr[   r   r@   r   )rt   r   r   r0   r   _get_alias_valr    r   r   rH   r   r   r   r   r*   _IMMUTABLE_CONFIG_TYPESrR   copydeepcopyKeyError)r#   r@   rn   	alias_valr   es         r$   __getattr__ConfigModule.__getattr__  sa   $	R\\$'F{{$av_%MNN $$T2++F3I/  %%_<---"00446MO3$$''>///*&FOOV^^TT fnn.EFF$$((v~~)FG++//11>>! 	R DMM?!D6!IJPQQ	Rs=   A'E6 *E6 	$E6 .E6 *E6 8A1E6 *E6 6
F! FF!c                     SU l         U R                  U   R                  R                  [        5        SU R                  U   l        g NT)rP   rt   r   rR   r    r   r#   r@   s     r$   __delattr__ConfigModule.__delattr__  s9     	T((,,_="&Tr'   entryc                     UR                   nUc  g UR                  SS5      u  p4 [        R                  " U5      nXT4$ ! [         a  n[        SU S35      UeS nAff = f)Nr[   r|   zconfig alias r   )r   rsplit	importlibimport_moduleImportErrorr   )r#   r   r   module_nameconstant_namerK   r   s          r$   _get_alias_module_and_name'ConfigModule._get_alias_module_and_name  ss     =%*\\#q%9"	P,,[9F $$  	P =!GHaO	Ps   ? 
A	AAc                 X    U R                  U5      nUc  [        $ Uu  p4[        X45      nU$ r<   )r   r    getattr)r#   r   datarK   r   constant_values         r$   r   ConfigModule._get_alias_val  s5    ..u5<"" $ 7r'   r(   c                 b    U R                  U5      nUc  [        S5      eUu  pE[        XEU5        g )Nz6alias data should not be None when setting alias value)r   r!   ri   )r#   r   r(   r   rK   r   s         r$   r   ConfigModule._set_alias_val  s;    ..u5< H  !%s+r'   c                    U R                   U   nUR                  [        L =(       d    UR                  UR                  :H  nUR                  [        L =(       d    UR                  UR                  :H  nUR
                  R                  5       [        L n[        UR                  [        5      (       d0  U=(       d'    UR
                  R                  5       UR                  :H  nU=(       a    U=(       a    U$ )zo
Returns true if the config is at its default value.
configs overridden by the env are not considered default.
)	rt   r   r    r   r   r   rH   r*   r   )r#   r@   
config_valnot_set_env_defaultnot_set_env_forceunsets         r$   _is_defaultConfigModule._is_default  s    
 \\$'

 ((O; B++z/A/AA 	
 &&/9 @))Z-?-?? 	
 ((,,./A*,,.EFFQZ5599;z?Q?QQEB,B1BBr'   ignored_keysignored_prefixesskip_defaultc                   ^ 0 nU R                   R                  5        GH4  u  mnUR                  b  M  U(       a  TU;   a  M%  U(       a  [        U4S jU 5       5      (       a  MH  U(       a  U R	                  T5      (       a  Mg  UR
                  R                  5       nUR                  [        La  UR                  nOdU[        La  UnOXUR                  [        La  UR                  nO8UR                  b  [        UR                  UR                  S9nOUR                  n[        U[        5      (       d  [        R                   " U5      nXtT'   GM7     U$ )ag  Export a dictionary of current configuration keys and values.

This function is design to provide a single point which handles
accessing config options and exporting them into a dictionary.
This is used by a number of different user facing export methods
which all have slightly different semantics re: how and what to
skip.
If a config is aliased, it skips this config.

Arguments:
    ignored_keys are keys that should not be exported.
    ignored_prefixes are prefixes that if a key matches should
        not be exported
    skip_default does two things. One if a key has not been modified
        it skips it.
c              3   F   >#    U  H  nTR                  U5      v   M     g 7fr<   )rb   ).0rW   rk   s     r$   	<genexpr>)ConfigModule._get_dict.<locals>.<genexpr>  s     M<L&s~~f--<Ls   !r   )rt   ra   r   anyr   r   rH   r   r    r   r   r   r   r*   r   r   r   )	r#   r   r   r   rn   r   r   r(   rk   s	           @r$   	_get_dictConfigModule._get_dict   s   , "$,,,,.JC{{&| 3M<LMMM 0 0 5 5 "//335M$$O;++o5#((?--+%5>>5==Qmmc#:;;mmC(3K5 /8 r'   config_namec                 4    U R                   U   R                  $ r<   )rt   r   )r#   r   s     r$   get_typeConfigModule.get_type5  s    ||K(333r'   c                 `    [        U S/ 5      n[        R                  " U R                  US9SS9$ )z Convert config to a pickled blob_save_config_ignorer      )protocol)r   pickledumpsr   )r#   r   s     r$   save_configConfigModule.save_config8  s3    t%:B?||NNN5
 	
r'   T)ignore_private_configsr   c                T   / nU(       a  UR                  S5        UR                  [        U S/ 5      5        U R                  US9n[        U S/ 5       HQ  nXC;   d  M
  X4   c  M  X4   " 5       n[	        US5      (       a  UR                  5       X4'   M?  [        SU SX4    S35      e   U$ )	z!Convert config to portable format__cache_config_ignore_prefix)r   _cache_config_factory_keysuuidzConfig 'z' is set to zO which does not implement uuid(). Implement uuid() for cache key participation.)appendextendr   r   rc   r   RuntimeError)r#   r   prefixesrn   rk   instances         r$   save_config_portable!ConfigModule.save_config_portable@  s     !OOC &CRHI:4!=rBC}!8!;=8V,,"*--/FK&"3%|FK= A) *  C r'   c                   ^^^	^
^ [        5       m
S[        S[        S[        4S jmS[        SS4UU
4S jjmS[        [         -  S[        [           4U4S jjmS[
        S[        4S	 jm	S[        4UUU	U4S
 jjn/ nU R                  nU R                  [        U S/ 5      SS9R                  5        H  u  pEUR                  U" X4U5      5        M     T
 H  nUR                  SSU 35        M     SR                  U5      $ )zConvert config to Python statements that replicate current config.
This does NOT include config settings that are at default values.
funcadd_dotr   c                 R    U R                   nUS:X  a  SnU(       a  US:w  a  US-  nU$ )Nbuiltinsrq   r[   )r1   )r   r   r   s      r$   get_module_name4ConfigModule.codegen_config.<locals>.get_module_name^  s2    //Kj( ;",s"r'   Nc                 J   > T" U S5      nU(       a  TR                  U5        g g )NF)r   )r   r   r  importss     r$   
add_import/ConfigModule.codegen_config.<locals>.add_importf  s#    )$6KK( r'   vc                 ^   > U  Vs/ s H  nT" US5       UR                    3PM     sn$ s  snf r   )r0   )r	  itemr  s     r$   list_of_callables_to_string@ConfigModule.codegen_config.<locals>.list_of_callables_to_stringk  s2    PQRPQtT23DMM?CPQRRRs   !*c                 d    [        U 5      =(       a    [        U S5      =(       a    [        U S5      $ )Nr1   r0   )callablerc   )r	  s    r$   importable_callable8ConfigModule.codegen_config.<locals>.importable_callablen  s$    A;V71l#;V:@VVr'   c                   > T" U5      (       a%  T" U5        U  SU ST" US5       UR                    3$ [        U[        [        45      (       al  [	        U4S jU 5       5      (       aR  U H  nT" U5        M     T" U5      n[        U[        5      (       a
  U  SU SU 3$ U  SU SSR                  U5       S3$ U  SU SU< 3$ )a  
Return a string version of the config line.
Handle v when v is a callable, or a list/dict of callables. Add import statements for callables if necessary.
We assume that the value of a single config won't be a mix of callables and non-callables.

Example output:
    import logging
    import _warnings
    torch._dynamo.config.reorderable_logging_functions = { _warnings.warn, logging.warn, print }
r[   z = Tc              3   4   >#    U  H  nT" U5      v   M     g 7fr<   r:   )r   r  r  s     r$   r   GConfigModule.codegen_config.<locals>.get_config_line.<locals>.<genexpr>  s      467d#D))as   z = { z, z })r0   r*   r,   rR   alljoin)	modkr	  r  v_listr  r  r  r  s	        r$   get_config_line4ConfigModule.codegen_config.<locals>.get_config_liner  s     #1%%1as#oa&>%?

|LLAc{++ 4674 1 1 Dt$ 4Q7a&&!U!A3c&22!U!A3fTYYv->,?sCCas#aU++r'   r   T)r   r   r   zimport 
)rR   r   r7   r+   r,   r   r0   r   r   ra   r   insertr  )r#   r  linesr  r  r	  import_namer  r  r  r  r  s          @@@@@r$   codegen_configConfigModule.codegen_configV  s    %	( 	T 	c 		)X 	)$ 	) 	)
	S4#: 	S$s) 	S	W3 	W4 	W	,# 	, 	,6 mmNN '<bAPT # 

%'DA LL34 #KLLgk]34 #yyr'   c                 Z   U R                   (       d  U R                  c  U R                  [        U R                  5      S9n[        [        UR                  5       5      5      n[        R                  " UR                  S5      SS9R                  5       U l        SU l         U R                  $ )z/Hashes the configs that are not compile_ignoredr   rz   F)usedforsecurity)rP   rQ   r   r,   ru   reprsortedra   hashlibmd5r   digest)r#   dict_to_hashstring_to_hashs      r$   get_hashConfigModule.get_hash  s    >>T..6>>tD<V<V7W>XL!&););)=">?N '%%g.!fh  #DN   r'   z`config.to_dict()` has been deprecated. It no longer changes the underlying config. use `config.get_config_copy()` instead if you just want a copy of the config, or config.load_config if you need mutable access)categoryc                 "    U R                  5       $ r<   get_config_copyr"   s    r$   to_dictConfigModule.to_dict       ##%%r'   z`config.shallow_copy_dict()` has been deprecated. It no longer changes the underlying config. use `config.get_config_copy()` instead if you just want a copy of the config, or config.load_config if you need mutable accessc                 "    U R                  5       $ r<   r/  r"   s    r$   shallow_copy_dictConfigModule.shallow_copy_dict  r3  r'   maybe_pickled_configc                     [        U[        5      (       d  [        R                  " U5      nOUnUR	                  5        H7  u  p4X0R
                  ;   a  [        XU5        M"  SSKJn  U" SU SU S35        M9     g)zARestore from a prior call to save_config() or shallow_copy_dict()r   )	warn_oncezkey z with value z! is not understood by this configN)	r*   dictr   loadsra   rt   ri   torch._dynamo.utilsr9  )r#   r7  rn   r  r	  r9  s         r$   load_configConfigModule.load_config  se    .55\\"67F)FLLNDALL #9D<s2STU #r'   c                 "    U R                  5       $ r<   )r   r"   s    r$   r0  ConfigModule.get_config_copy  s    ~~r'   c                 6    U R                  [        U S/ 5      S9$ )Nr   r   )r   r   r"   s    r$   get_serializable_config_copy)ConfigModule.get_serializable_config_copy  s    ~~749NPR+S~TTr'   arg1arg2kwargsContextDecoratorc                 t  ^^ Ub\  Ub$  [        U[        5      (       d  [        S5      eX0mO"[        U[        5      (       d  [        S5      eUmU(       a  [        S5      eOUmUb  [        S5      e[        T[        5      (       d  [        S[	        T5       35      eU m " UU4S jS[
        5      nU" 5       $ )aj  
Decorator and/or context manager to make temporary changes to a config.  Note that patched settings are thread-local.

As a decorator:

    @config.patch("name", val)
    @config.patch(name1=val1, name2=val2)
    @config.patch({"name1": val1, "name2", val2})
    def foo(...):
        ...

As a context manager:

    with config.patch("name", val):
        ...
zGfirst argument must be a string when passing 2 positional args to patchzKfirst argument must be a dict when passing a single positional arg to patchz:cannot pass both positional and keyword arguments to patchzLsecond positional argument is only valid when first argument is a key stringzexpected `dict` got c                   D   > \ rS rSrSU U4S jjrSU4S jjrU4S jrSrg)'ConfigModule.patch.<locals>.ConfigPatchi  Nc                 d   > TU l         [        TR                   S[        U 5       S3SS9U l        g )Nz.ConfigPatch[]r:   r   )changesr   r0   id_prior)r#   rM  rn   s    r$   r   0ConfigModule.patch.<locals>.ConfigPatch.__init__  s3    &FP'}RXJa@Gr'   c                   > 0 nU R                    H  nTR                  U5      X'   M     U R                  R                  5       nU R                  R	                  / UQUP75         U R                   R                  5        H  u  pETR                  XE5        M     g ! [         a    U R                  R	                  U5        e f = fr<   )rM  r   rO  rH   rR   ra   r   	Exception)r#   priorrk   prior_stackr  r	  rn   s         r$   	__enter__1ConfigModule.patch.<locals>.ConfigPatch.__enter__  s    (*<<C!'!3!3C!8EJ ( #kkoo/ 5+ 5u 56 $ 2 2 4**10 !5  KKOOK0s   %4B 'Cc                    > U R                   R                  5       nU(       d  [        S5      eUS   nU R                   R                  US S 5        UR	                  5        H  u  pgTR                  Xg5        M     g )Nz2prior should not be empty when exiting ConfigPatchr{   )rO  rH   r!   rR   ra   r   )	r#   exc_typeexc_valexc_tbrT  rS  r  r	  rn   s	           r$   __exit__0ConfigModule.patch.<locals>.ConfigPatch.__exit__  sh    "kkoo/"(L  $BCR 01!KKMDA&&q, *r'   )rO  rM  r/   )r0   r1   r2   r3   r   rU  r[  r9   )rM  rn   s   r$   ConfigPatchrJ    s     	- 	-r'   r]  )r*   r+   r!   r:  r-   rG  )r#   rD  rE  rF  r]  rM  rn   s        @@r$   patchConfigModule.patch  s    . !$,,(a   ,!$--(e  $P   G$b  '4(( #7W!GHH	- 	-* 	-B }r'   rM  c                 N   ^ ^^ T R                   mS[        / S4   4UUU 4S jjnU$ )z
A lower-overhead version of patch() for things on the critical path.

Usage:

    # do this off the critical path
    change_fn = config.make_closure_patcher(foo=True)

    ...

    revert = change_fn()
    try:
      ...
    finally:
        revert()

r   Nc                    >^ T V s0 s H   o TU    R                   R                  5       _M"     sn mTR                  5        H-  u  pTR                  U    R                   R	                  U5        M/     SUU4S jjnU$ s  sn f )Nc                     > TR                  5        H-  u  pTR                  U    R                  R                  U5        M/     g r<   )ra   rt   r   rR   )r  r	  rS  r#   s     r$   revertBConfigModule._make_closure_patcher.<locals>.change.<locals>.revert9  s1    !KKMDALLO1155a8 *r'   r/   )r   rH   ra   rt   rR   )r  r	  rc  rS  rM  rn   r#   s      @r$   change2ConfigModule._make_closure_patcher.<locals>.change4  sr    ?FGw!q	//3355wGEQ--11!4 (9 9 M Hs   'A=)rt   r   )r#   rM  re  rn   s   `` @r$   _make_closure_patcher"ConfigModule._make_closure_patcher   s/    $ 		T* 		 		 r'   )rQ   rP   r/   )NNF)NN)+r0   r1   r2   r3   r:  r+   rf   r6   rR   r7   bytesr   r   r5   r   r   r   r   tupler   r   r   r   r   r,   r   r-   r   r   r   r   r+  r   r   r1  r5  r=  r0  rB  r^  rg  r9   __classcell__rv   s   @r$   rr   rr   n  s    #|#$$c(s8#O$,


. 
.\ 
.d 
.$ $F $t $"%R %R %RN' ' '%!%	z3	$	&%L S ,L ,s ,t ,C C C4 *.-1"	33i$&3 s)d*3 	3
 
c3h3j4C 4D 4
U 
 15)-	c3h,?  ? B	!% 	! 	8 	&c3h && 	8 	&4S> &&VS#X0F V4 V c3h  Ud38n U
 -1VDcN"T)V V sCx.	V
 
VptCH~ #  r'   rr   c                   \   ^  \ rS rSrSrS	S jrS\4S jrS\\	/\	4   S\	4U 4S jjr
SrU =r$ )
rG  iB  zO
Same as contextlib.ContextDecorator, but with support for
`unittest.TestCase`
r   c                     [        S5      eNNYIr   r"   s    r$   rU  ContextDecorator.__enter__H      !%((r'   c                     [        S5      ero  rq  )r#   rX  rY  rZ  s       r$   r[  ContextDecorator.__exit__K  rs  r'   r   c                   >^  [        U[        5      (       ab  [        U[        R                  5      (       aC   " U 4S jSU5      nUR
                  Ul        UR                  Ul        UR                  Ul        U$ [        TT ]%  U5      $ )Nc                   V   >^  \ rS rSr\SU U4S jj5       r\SU U4S jj5       rSrU =r$ ),ContextDecorator.__call__.<locals>._TestCaseiQ  c                    > TR                  5          [        TU ]	  5         g ! [         a    TR	                  S S S 5        e f = fr<   )rU  r   
setUpClassrR  r[  clsrv   r#   s    r$   rz  7ContextDecorator.__call__.<locals>._TestCase.setUpClassR  s?    NN$*,$ dD$7s	   " Ac                 z   >  [         TU ]  5         TR                  S S S 5        g ! TR                  S S S 5        f = fr<   )r   tearDownClassr[  r{  s    r$   r  :ContextDecorator.__call__.<locals>._TestCase.tearDownClass[  s4    8-/dD$7dD$7s   % :r:   r/   )	r0   r1   r2   r3   classmethodrz  r  r9   rk  )rv   r#   s   @r$   	_TestCaserx  Q  s)      8 8r'   r  )
r*   r-   rd   unittestTestCaser0   r2   r1   r   __call__)r#   r   r  rv   s   `  r$   r  ContextDecorator.__call__N  sl    dD!!jx7H7H&I&I8D 8" "&I%)%6%6I"#'??I w%%r'   r:   r/   )r0   r1   r2   r3   r4   rU  r
   r[  r   r   r  r9   rk  rl  s   @r$   rG  rG  B  s<    
))X )&XseSj1 &c & &r'   rG  c                   v   ^  \ rS rSrSrS\S\SS4U 4S jjrS\S	\SS4S
 jrS\S\	4S jr
S\SS4S jrSrU =r$ )rh   ik  zb
Shim to redirect to main config.
`config.triton.cudagraphs` maps to _config["triton.cudagraphs"]
rn   rW   r   Nc                 F   > [         TU ]  SU5        [         TU ]  SU5        g )Nrt   _prefix)r   r   )r#   rn   rW   rv   s      r$   r   SubConfigProxy.__init__q  s!    Iv.Iv.r'   r@   rI   c                 T    U R                   R                  U R                  U-   U5      $ r<   )rt   r   r  )r#   r@   rI   s      r$   r   SubConfigProxy.__setattr__v  s"    ||''t(;UCCr'   c                 R    U R                   R                  U R                  U-   5      $ r<   )rt   r   r  r   s     r$   r   SubConfigProxy.__getattr__y       ||''t(;<<r'   c                 R    U R                   R                  U R                  U-   5      $ r<   )rt   r   r  r   s     r$   r   SubConfigProxy.__delattr__|  r  r'   r:   )r0   r1   r2   r3   r4   r5   r+   r   r   r   r   r   r9   rk  rl  s   @r$   rh   rh   k  sk    
/v /s /t /
D DF Dt D= = == = = =r'   rh   c                 `    [         R                  R                  U 5      nUS:X  a  gUS:X  a  gU$ rB   rE   )r@   r   rI   s      r$   get_tristate_envr    s-    JJNN4 E||Nr'   c                    ^  U 4S jnU$ )Nc                    > TR                   R                  5        H:  u  pUR                  S5      (       a  M  XR                   ;  d  M.  [        XU5        M<     U $ )Nr   )r`   ra   rb   ri   )	child_clsr  r	  
parent_clss      r$   wrapper$inherit_fields_from.<locals>.wrapper  sJ    ''--/DA<<$$2D2D)D	a( 0 r'   r:   )r  r  s   ` r$   inherit_fields_fromr    s     Nr'   r<   )8
contextlibr   r&  r   r^   r   rF   r   r~   r  collections.abcr   contextvarsr   dataclassesr   typesr   r   rZ   r   r	   r
   r   r   r   typing_extensionsr   torch._utils_internalr   intfloatr7   r-   r+   r,   rR   rj  r:  re   r   r   r5   r    r   r>   rJ   rx   r   rs   rf   rr   rG  rh   r  r  r:   r'   r$   <module>r     s        	 	    $ " ! * K K ( 1 UD$t*c4eTJ tT$ZeD  CsU{T)C/$6<uDtKdRS ( 4Ogaj O Ol  .#3715"&  *.
V
*
 S	/D0
 d3i$.	

 4K
 Tz
 
 !4Z
 

 .#3715"&  *.
V
*
 S	/D0
 d3i$.	

 4K
 Tz
 
 !4Z
 

0S TCZ$%6 J* J JZ , "* "S "J H H HVQ: Qh&&z22 &&R= =*3  t r'   