
    g,j                        d dl Z d dlZd dlZd dlZd dlZd dlZd dlZd dlZd dlZd dl	Z	d dl
mZ d dlmZ d dlmZ d dlmZmZ d dlmZmZmZmZmZmZ d dlmZ d dlmZ eee  e!d          e"e#e$e%e&f	Z'eee  e!d          e"e%fZ( ed	eez  e z  e"z  e#z  e$z  e%z  e&z  dz  
          Z) e*            Z+ ed           G d dee)                               Z,erGe+dddddddfde)e*z  de"dz  de"e#e"         z  dz  de"e#e"         z  dz  de!dz  de"dz  de de"dz  de)fdZ-nLe+dddddddfde)e*z  de"dz  de"e#e"         z  dz  de"e#e"         z  dz  de!dz  de"dz  de de"dz  de,e)         fdZ-de"de e"z  dz  fdZ.deddfdZ/dZ0dede$e"         fd Z1e G d! d"                      Z2 G d# d$e          Z3 G d% d&e j4                  Z4 G d' d(          Z5d+de"dede dz  fd)Z6d* Z7dS ),    N)Callable)
ContextVar)	dataclass)FunctionType
ModuleType)AnyGenericNoReturnOptionalTYPE_CHECKINGTypeVar)
deprecated)justknobs_checkT)boundT)kw_onlyc                      e Zd ZU dZeez  ed<   dZedz  ed<   dZ	e
e         dz  ed<   dZe
e         dz  ed<   dZedz  ed<   dZedz  ed<   d	Zeed
<   dZedz  ed<   ddZedee
e         z  dz  de
e         dz  fd            ZdS )_Configa+  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                    t                               | j                  | _        t                               | j                  | _        | j        2| j        t          us| j        | j        | j        t          d          d S d S )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    Z/var/www/html/banglarbhumi/venv/lib/python3.11/site-packages/torch/utils/_config_module.py__post_init__z_Config.__post_init__V   s     ' H H!!
 !
 &FF
 
 :!O33=,(4&2$I   "!
 32    valc                     | d S t          | t                    r| gS t          | t                    st          dt	          |                      | S )Nzval is not a list, got )
isinstancestrlistr    type)r&   s    r#   r   z(_Config.string_or_list_of_string_to_listj   s\     ;4c3 	5L#t$$ 	H !F499!F!FGGG
r%   r   N)__name__
__module____qualname____doc__r   object__annotations__r   r)   r   r*   r   r   r+   r   r   boolr   r$   staticmethodr    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                     d S Nr5   r   r   r   r   r   r   r   r   s           r#   Configr9   }   s	     Cr%   c           
      0    t          | |||||||          S )Nr8   )r   r8   s           r#   r9   r9      s3     -)!! 3

 

 

 
	
r%   namec                 d    t           j                            |           }|dk    rdS |dk    rdS |S N1T0Fosenvironget)r;   values     r#   _read_env_variablerE      s6    JNN4  E||t||uLr%   modulec                      G d dt                     }dt          t          z  dt          t          z  dt          ddf fdi t                     }   d	            _        | _        | _        d
 _	        d _
        dS )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                   (    e Zd Z eh d          ZdS )3install_config_module.<locals>.ConfigModuleInstance>   	_is_dirty_hash_digestr2   N)r-   r.   r/   set_bypass_keysr5   r%   r#   ConfigModuleInstancerI      s$        sKKKLLr%   rN   sourcedestprefixr   Nc                 l   t          j        |           }t          | j                                                  D ]\  }}|                    d          s{t          |t          t          f          s_t          |d          r%|j
        dk    sD|j
                            d          s*t          |t                    rt          |t                    r| | }|                    |d          }t          |t                    r7t!          t          ||          |          	|<   |
u rt#          
|           t          |t                    r9||j        ||_        t!          ||          	|<   |
u rt#          
|           Mt          |t                    rp|j
        
j        k    rt)          d| d
j                   t+          
| d	          } ||| d	           |
u rt-          |||           ||j        |<   t)          d
| d| dt          |           d          dS )z?Walk the module structure and move everything to module._config__r.   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   hasattrr.   r+   
issubclassr   rC   CONFIG_TYPES_ConfigEntrydelattrr   r-   r    SubConfigProxysetattr)rO   rP   rQ   
type_hintskeyrD   r;   annotated_typeproxyconfigrF   visits            r#   ri   z$install_config_module.<locals>.visit   s    ,V44
v446677 -	X -	XJCt$$ej,%?@@ E<00	 (H44 +667HII 5
 ud++ 5
 1;5'0J0J 5 #c##D'^^C66N%.. X+EnEEEt   t 6>>FC(((E7++ X!-%2B2J'5E$+E488t6>>FC(((E4(( X#v66(^5^^V_^^   'v$zzz::eUtJJJ///6>>D#u----).DM#&&$%V%V%Vu%V%VU%V%V%VWWW[-	X -	Xr%    T)ConfigModuler   r+   rb   r)   -get_assignments_with_compile_ignored_comments_config_compile_ignored_keys	__class__rJ   rK   )rF   rN   compile_ignored_keysrh   ri   s   `  @@r#   install_config_modulerq      s    M M M M M| M M M4XT!4X>)4X 4X 
	4X 4X 4X 4X 4X 4X 4X 4Xl ')FHPP	E&&"FN#7F +FFFr%   z@compile_ignoredc                    t          j        |           }t                      }t          j        t	          j        |                    d                    j                  }d}d}|D ]}|j        t          j	        k    rQd}|j
                                        }t          |v r,|dk    rt          dt                     ||j        d         f}h|j        t          j        k    r
|s|j
        }|j        t          j        k    rM|j
        dk    rBt          |d         v r1|d         |j        d         dz
  k    r|                    |           d}d}|dk    rt          dt                     |S )Nutf-8)rj   rj   zunconsumed r   rV      )rX   	getsourcerL   tokenizeioBytesIOencodereadliner+   COMMENTstringstripCOMPILE_IGNORED_MARKERr    startNAMEOPadd)rF   source_codeassignmentstokenscurrent_comment	prev_nametokenmaybe_currents           r#   rl   rl      sw   #F++K%%K rz+*<*<W*E*EFFOPPFOI  :)))I!L..00M%66"h..()O7M)O)OPPP"/Q"?Z8=((  )!L	Z8;&&5<3+>+> '/!*<<<#A&%+a.1*<<<	***"(I(""C+ACCDDDr%   c                       e Zd ZU eed<   eed<   ee         ed<   dZe	dz  ed<   e
Zeed<   e
Zeed<   dZeed	<   dZe	dz  ed
<   dZeed<   dZe	dz  ed<   dZeed<   dede	ddfdZdS )r`   r   r   user_overrideNr   env_value_forceenv_value_defaultFhider   r   r   _deprecation_warnedrh   r;   r   c                    |j         | _         |j        |j        nt          | j                   | _        |j        | _        |j        | _        |j        | _        |j        | _        d| _        t          |t                    | _
        |j        $|j        D ]}t          |          x}	|| _         n|j        $|j        D ]}t          |          x}	|| _         n| j        9| j         2t!          | j         t"                    st%          d| j          d          | j        ]|j        |j        S| j        t"          t&          t(          t"                   t(          t&                   fvrt%          d| j         d          d S d S d S )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   rE   r   r   r   r(   r3   r    r)   r   )r"   rh   r;   r&   	env_values        r#   __init__z_ConfigEntry.__init__B  s   ~!'!2!>FDDVDV 	 \
 +#)#= #( 'oFFF"..  !3C!8!88IE-6D*E F  ,,  !3C!8!88IE+4D(E F
 =$)AdlD11 $WWWW   ?&#/63H3T	'   %oSWSbooo   '&  4U3Tr%   )r-   r.   r/   r   r2   r+   r   r1   r   r)   r   r   r   r   r3   r   r   r   r   r   r   r5   r%   r#   r`   r`   "  s          LLL f%%%%HcDj*OS***,s,,, D$E3:J&*t*** %%%%)w )c )d ) ) ) ) ) )r%   r`   c                       e Zd ZU eeef         ed<   ee         ed<   ee         ed<   eed<   e	dz  ed<   d4dZ
d	ed
eddfdZd	ededdf fdZd	edefdZd	eddfdZdedeeef         dz  fdZdedefdZdededdfdZd	edefdZ	 	 	 d5dee         dz  dee         dz  dedeeef         fdZdedefdZde	fdZddd edeeef         fd!Zdefd"Zde	fd#Z ed$e %          deeef         fd&            Z! ed'e %          deeef         fd(            Z"d)e	eeef         z  ddfd*Z#deeef         fd+Z$deeef         fd,Z%	 	 d6d-eeeef         z  dz  d.ed/eeef         dd0fd1Z&d2eeef         defd3Z' xZ(S )7rk   rm   rM   rn   rJ   NrK   r   c                 2    t          dt           d          )Nzuse z-.install_config_module(sys.modules[__name__]))NotImplementedErrorr-   r!   s    r#   r   zConfigModule.__init__z  s"    !J8JJJ
 
 	
r%   r;   rh   c                     |j         rW|j        sRddl}| j         d| d}|j        r|d|j         z  }|dz  }|                    |t          d           d	|_        dS dS dS )
z;Issue deprecation warning for config if not already warned.r   NrU   z is deprecatedz and z4. It will be removed in a future version of PyTorch.   )
stacklevelT)r   r   warningsr-   r   warnFutureWarning)r"   r;   rh   r   msgs        r#   _warn_if_deprecatedz ConfigModule._warn_if_deprecated  s     	.V%? 	.OOO]99T999C) <;v9;;;IICMM#}M;;;)-F&&&	. 	. 	. 	.r%   rD   c                 |   || j         v r$t                                          ||           d S || j        vrt	          | j         d| d          | j        |         }|                     ||           |j        |                     ||           d S |j	        
                    |           d| _        d|_        d S )NrU    does not existTF)rM   super__setattr__rm   AttributeErrorr-   r   r   _set_alias_valr   rL   rJ   r   )r"   r;   rD   rh   ro   s       r#   r   zConfigModule.__setattr__  s    4$$$GGe,,,,,%% DM!I!ID!I!I!IJJJ \$'F$$T6222|'##FE22222$((///!%#r%   c                    	 | j         |         }|j        rt          | j         d| d          |                     ||           |                     |          }|t          ur|S |j        t          ur|j        S |j        	                                }|t          ur|S |j
        t          ur|j
        S |j        t          |j        |j                  S t          |j        t                    sJ|j                            t#          j        |j                             |j        	                                S |j        S # t&          $ r }t          | j         d| d          |d }~ww xY w)NrU   r   r;   r   )rm   r   r   r-   r   _get_alias_valr   r   r   rC   r   r   r   r   r(   _IMMUTABLE_CONFIG_TYPESrL   copydeepcopyKeyError)r"   r;   rh   	alias_valr   es         r#   __getattr__zConfigModule.__getattr__  s   $	R\$'F{ O$%M%M%M%M%MNNN $$T6222++F33I//  %_<<--"04466MO33$$'>>//*&FOV^TTTT fn.EFF 2$((v~)F)FGGG+//111>! 	R 	R 	R DM!I!ID!I!I!IJJPQQ	Rs=   A#E &E ;#E E 4!E A#E :E 
E+E&&E+c                     d| _         | j        |         j                            t                     d| j        |         _        d S )NT)rJ   rm   r   rL   r   r   r"   r;   s     r#   __delattr__zConfigModule.__delattr__  s>     	T(,,_==="&Tr%   entryc                     |j         }|d S |                    dd          \  }}	 t          j        |          }n&# t          $ r}t          d| d          |d }~ww xY w||fS )NrU   ru   zconfig alias r   )r   rsplit	importlibimport_moduleImportErrorr   )r"   r   r   module_nameconstant_namerF   r   s          r#   _get_alias_module_and_namez'ConfigModule._get_alias_module_and_name  s     =4%*\\#q%9%9"]	P,[99FF 	P 	P 	P !G!G!G!GHHaO	P}$$s   ; 
AAAc                 l    |                      |          }|t          S |\  }}t          ||          }|S r7   )r   r   getattr)r"   r   datarF   r   constant_values         r#   r   zConfigModule._get_alias_val  s?    ..u55<"" $ 77r%   r&   c                 ~    |                      |          }|t          d          |\  }}t          |||           d S )Nz6alias data should not be None when setting alias value)r   r    rc   )r"   r   r&   r   rF   r   s         r#   r   zConfigModule._set_alias_val  sS    ..u55< H   !%s+++++r%   c                 \   | j         |         }|j        t          u p|j        |j        k    }|j        t          u p|j        |j        k    }|j                                        t          u }t          |j        t                    s$|p!|j                                        |j        k    }|o|o|S )z
        Returns true if the config is at its default value.
        configs overridden by the env are not considered default.
        )	rm   r   r   r   r   r   rC   r(   r   )r"   r;   
config_valnot_set_env_defaultnot_set_env_forceunsets         r#   _is_defaultzConfigModule._is_default  s    
 \$'

 (O; B+z/AA 	
 &/9 @)Z-?? 	
 (,,../A*,.EFF 	RQZ599;;z?QQEB,B1BBr%   Fignored_keysignored_prefixesskip_defaultc                 &   i }| j                                         D ]\  }|j        |r|v r|rt          fd|D                       r2|r|                               rJ|j                                        }|j        t          ur|j        }nL|t          ur|}n@|j	        t          ur|j	        }n*|j
        t          |j
        |j                  }n|j        }t          |t                    st          j        |          }||<   |S )a  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.
        Nc              3   B   K   | ]}                     |          V  d S r7   )r\   ).0rQ   re   s     r#   	<genexpr>z)ConfigModule._get_dict.<locals>.<genexpr>  s/      MM&s~~f--MMMMMMr%   r   )rm   r[   r   anyr   r   rC   r   r   r   r   r   r   r(   r   r   r   )	r"   r   r   r   rh   r   r   r&   re   s	           @r#   	_get_dictzConfigModule._get_dict   sM   , "$,,,.. 	 	JC{& | 3 3 MMMM<LMMMMM   0 0 5 5  "/3355M$O;;+o55#(??-+%5>5=QQQmc#:;; )mC((F3KKr%   config_namec                 &    | j         |         j        S r7   )rm   r   )r"   r   s     r#   get_typezConfigModule.get_type5  s    |K(33r%   c                 x    t          | dg           }t          j        |                     |          d          S )z Convert config to a pickled blob_save_config_ignorer      )protocol)r   pickledumpsr   )r"   r   s     r#   save_configzConfigModule.save_config8  sA    t%:B??|NNN55
 
 
 	
r%   T)ignore_private_configsr   c                   g }|r|                     d           |                    t          | dg                      |                     |          }t          | dg           D ]b}||v r\||         T ||                     }t	          |d          r|                                ||<   Ft          d| d||          d	          c|S )
z!Convert config to portable format__cache_config_ignore_prefix)r   _cache_config_factory_keysNuuidzConfig 'z' is set to zO which does not implement uuid(). Implement uuid() for cache key participation.)appendextendr   r   r]   r   RuntimeError)r"   r   prefixesrh   re   instances         r#   save_config_portablez!ConfigModule.save_config_portable@  s     ! 	!OOC   &CRHHIII::4!=rBB 
	 
	Cf}}!8&6#;==8V,, "*--//F3KK&*3 * *F3K * * *  
 r%   c                 @  	
 t                      
dt          dt          dt          fddt          ddf
fddt          t           z  dt          t                   ffddt
          dt          fd		dt          f	fd
}g }| j        }|                     t          | dg           d          	                                D ]%\  }}|
                     ||||                     &
D ]}|                    dd|            d                    |          S )zConvert config to Python statements that replicate current config.
        This does NOT include config settings that are at default values.
        funcadd_dotr   c                 >    | j         }|dk    rd}|r|dk    r|dz  }|S )Nbuiltinsrj   rU   )r.   )r   r   r   s      r#   get_module_namez4ConfigModule.codegen_config.<locals>.get_module_name^  s;    /Kj((  #;",,s"r%   Nc                 R     | d          }|r                     |           d S d S )NF)r   )r   r   r   importss     r#   
add_importz/ConfigModule.codegen_config.<locals>.add_importf  s>    )/$66K )K((((() )r%   vc                      fd| D             S )Nc                 :    g | ]} |d            |j          S )T)r-   )r   itemr   s     r#   
<listcomp>zTConfigModule.codegen_config.<locals>.list_of_callables_to_string.<locals>.<listcomp>l  s2    RRRtT22CDMCCRRRr%   r5   )r   r   s    r#   list_of_callables_to_stringz@ConfigModule.codegen_config.<locals>.list_of_callables_to_stringk  s    RRRRPQRRRRr%   c                 `    t          |           ot          | d          ot          | d          S )Nr.   r-   )callabler]   )r   s    r#   importable_callablez8ConfigModule.codegen_config.<locals>.importable_callablen  s,    A;;V71l#;#;V:@V@VVr%   c                     |          r& |           |  d| d |d           |j          S t          |t          t          f          rst	          fd|D                       rX|D ]} |            |          }t          |t                    r
|  d| d| S |  d| dd                    |           dS |  d| d|S )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 }
            rU   z = Tc              3   .   K   | ]} |          V  d S r7   r5   )r   r   r   s     r#   r   zGConfigModule.codegen_config.<locals>.get_config_line.<locals>.<genexpr>  s@       4 4.2##D))4 4 4 4 4 4r%   z = { z, z })r-   r(   r*   rL   alljoin)	modkr   r   v_listr   r   r   r   s	        r#   get_config_linez4ConfigModule.codegen_config.<locals>.get_config_liner  sK    #"1%% ,
1LLLLooa&>&>L
LLLAc{++ , 4 4 4 4674 4 4 1 1 ,  % %DJt$$$$44Q77a&& D!22A22&222!CCACCTYYv->->CCCC++++a+++r%   r   T)r   r   r   zimport 
)rL   r   r3   r)   r*   r   r-   r   r   r[   r   insertr   )r"   r   linesr   r   r   import_namer   r   r   r   r   s          @@@@@r#   codegen_configzConfigModule.codegen_configV  s    %%	( 	T 	c 	 	 	 		)X 	)$ 	) 	) 	) 	) 	) 	) 	)
	S4#: 	S$s) 	S 	S 	S 	S 	S 	S	W3 	W4 	W 	W 	W 	W	,# 	, 	, 	, 	, 	, 	, 	, 	, 	,6 mNN '<bAAPT # 
 

%''	5 	5DAq LLa334444" 	5 	5KLL3k334444yyr%   c                 f   | j         s| j        |                     t          | j                            }t          t          |                                                    }t          j	        |
                    d          d                                          | _        d| _         | j        S )z/Hashes the configs that are not compile_ignoredNr   rs   F)usedforsecurity)rJ   rK   r   r*   rn   reprsortedr[   hashlibmd5rz   digest)r"   dict_to_hashstring_to_hashs      r#   get_hashzConfigModule.get_hash  s    > 	#T.6>>tD<V7W7W>XXL!&););)=)=">">??N '%%g..! ! !fhh  #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                 *    |                                  S r7   get_config_copyr!   s    r#   to_dictz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                 *    |                                  S r7   r  r!   s    r#   shallow_copy_dictzConfigModule.shallow_copy_dict  r  r%   maybe_pickled_configc                     t          |t                    st          j        |          }n|}|                                D ]8\  }}|| j        v rt          | ||            ddlm}  |d| d| d           9dS )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   loadsr[   rm   rc   torch._dynamo.utilsr  )r"   r  rh   r   r   r  s         r#   load_configzConfigModule.load_config  s    .55 	*\"677FF)FLLNN 	V 	VDAqDL  a####999999	TTTTTTUUUU	V 	Vr%   c                 *    |                                  S r7   )r   r!   s    r#   r  zConfigModule.get_config_copy  s    ~~r%   c                 L    |                      t          | dg                     S )Nr   r   )r   r   r!   s    r#   get_serializable_config_copyz)ConfigModule.get_serializable_config_copy  s$    ~~749NPR+S+S~TTTr%   arg1arg2kwargsContextDecoratorc                    |c|)t          |t                    st          d          ||in&t          |t                    st          d          ||rt          d          n||t          d          t          t                    st          dt	                               |  G fddt
                    } |            S )	a  
        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):
                ...
        NzGfirst 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                   4    e Zd Zd fdZdfdZfdZdS )'ConfigModule.patch.<locals>.ConfigPatchr   Nc                 r    | _         t          j         dt          |            dd          | _        d S )Nz.ConfigPatch[]r5   r   )changesr   r-   id_prior)r"   r+  rh   s    r#   r   z0ConfigModule.patch.<locals>.ConfigPatch.__init__  sF    &FP@@RXX@@@G G Gr%   c                 ~   i }| j         D ]}                    |          ||<   | j                                        }| j                            g ||R            	 | j                                         D ]\  }}                    ||           d S # t          $ r | j                            |            w xY wr7   )r+  r   r-  rC   rL   r[   r   	Exception)r"   priorre   prior_stackr   r   rh   s         r#   	__enter__z1ConfigModule.patch.<locals>.ConfigPatch.__enter__  s    (*< 9 9C!'!3!3C!8!8E#JJ"koo// 5+ 5u 5 5666 $ 2 2 4 4 1 11**1a00001 1    KOOK000s   5B &B<c                    | j                                         }|st          d          |d         }| j                             |d d                    |                                D ]\  }}                    ||           d S )Nz2prior should not be empty when exiting ConfigPatchrt   )r-  rC   r    rL   r[   r   )	r"   exc_typeexc_valexc_tbr1  r0  r   r   rh   s	           r#   __exit__z0ConfigModule.patch.<locals>.ConfigPatch.__exit__  s    "koo//" (L   $BCRC 0111!KKMM - -DAq&&q!,,,,- -r%   r,   )r-   r.   r/   r   r2  r7  )r+  rh   s   r#   ConfigPatchr(    so                   	- 	- 	- 	- 	- 	- 	-r%   r8  )r(   r)   r    r  r+   r%  )r"   r"  r#  r$  r8  r+  rh   s        @@r#   patchzConfigModule.patch  s8   . !$,, (a    ,!$-- (e    $P   G$b   '4(( 	I !GW!G!GHHH	- 	- 	- 	- 	- 	- 	- 	-* 	- 	- 	-B {}}r%   r+  c                 H      j         dt          g df         f fd}|S )aV  
        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                      fdD                                              D ]*\  } }j        |          j                            |           +dfd}|S )Nc                 P    i | ]"}||         j                                         #S r5   )r   rC   )r   r   rh   s     r#   
<dictcomp>zFConfigModule._make_closure_patcher.<locals>.change.<locals>.<dictcomp>5  s.    GGG!Qq	/3355GGGr%   r   c                                                       D ]*\  } }j        |          j                            |           +d S r7   r[   rm   r   rL   )r   r   r0  r"   s     r#   revertzBConfigModule._make_closure_patcher.<locals>.change.<locals>.revert9  sH    !KKMM 9 9DAqLO155a88889 9r%   r,   r?  )r   r   r@  r0  r+  rh   r"   s      @r#   changez2ConfigModule._make_closure_patcher.<locals>.change4  s    GGGGwGGGE 5 51Q-11!44449 9 9 9 9 9 9 Mr%   )rm   r   )r"   r+  rA  rh   s   `` @r#   _make_closure_patcherz"ConfigModule._make_closure_patcher   sM    $ 		T* 		 		 		 		 		 		 		 		 r%   r,   )NNF)NN))r-   r.   r/   r  r)   r`   r2   rL   r3   bytesr   r   r1   r   r   r   r   tupler   r   r   r   r   r*   r   r+   r   r   r   r  r  r   r   r  r  r  r  r!  r9  rB  __classcell__ro   s   @r#   rk   rk   n  s         #|#$$$$c(s8###OOO$,
 
 
 


. 
.\ 
.d 
. 
. 
. 
.$ $F $t $ $ $ $ $ $"%R %R %R %R %R %RN' ' ' ' ' '%!%	z3	$	&% % % %L S    ,L ,s ,t , , , ,C C C C C C4 *.-1"	3 33i$&3 s)d*3 	3
 
c3h3 3 3 3j4C 4D 4 4 4 4
U 
 
 
 
 15  )-	c3h   ,?  ?  ?  ?  ? B	!% 	! 	! 	! 	! Z	8 	  &c3h & & & & Z	8 	  &4S> & & & &VS#X0F V4 V V V V c3h        Ud38n U U U U
 -1V VDcN"T)V V sCx.	V
 
V V V VptCH~ #        r%   rk   c                   R     e Zd ZdZddZdefdZdeegef         def fdZ	 xZ
S )	r%  z[
    Same as contextlib.ContextDecorator, but with support for
    `unittest.TestCase`
    r   Nc                      t          d          NNYIr   r!   s    r#   r2  zContextDecorator.__enter__H      !%(((r%   c                      t          d          rI  rK  )r"   r4  r5  r6  s       r#   r7  zContextDecorator.__exit__K  rL  r%   r   c                     t          |t                    rPt          |t          j                  r6 G  fdd|          }|j        |_        |j        |_        |j        |_        |S t                      	                    |          S )Nc                   R     e Zd Zed fd            Zed fd            Z xZS ),ContextDecorator.__call__.<locals>._TestCaser   Nc                                                       	 t                                                       d S # t          $ r                     d d d             w xY wr7   )r2  r   
setUpClassr/  r7  clsro   r"   s    r#   rR  z7ContextDecorator.__call__.<locals>._TestCase.setUpClassR  sh    NN$$$**,,,,,$   dD$777s	    9 #Ac                     	 t                                                                           d d d            d S #                     d d d            w xY wr7   )r   tearDownClassr7  rS  s    r#   rV  z:ContextDecorator.__call__.<locals>._TestCase.tearDownClass[  sV    8--///dD$77777dD$7777s	    < Ar,   )r-   r.   r/   classmethodrR  rV  rE  )ro   r"   s   @r#   	_TestCaserP  Q  s|               8 8 8 8 8 8 8 8 8 8 8r%   rX  )
r(   r+   r^   unittestTestCaser-   r/   r.   r   __call__)r"   r   rX  ro   s   `  r#   r[  zContextDecorator.__call__N  s    dD!! 	jx7H&I&I 	8 8 8 8 8 8 8D 8 8 8" "&I%)%6I"#'?I ww%%%r%   r,   )r-   r.   r/   r0   r2  r
   r7  r   r   r[  rE  rF  s   @r#   r%  r%  B  s         
) ) ) ))X ) ) ) )&XseSj1 &c & & & & & & & & & &r%   r%  c                   d     e Zd ZdZdededdf fdZdededdfd	Zdedefd
Z	deddfdZ
 xZS )rb   zn
    Shim to redirect to main config.
    `config.triton.cudagraphs` maps to _config["triton.cudagraphs"]
    rh   rQ   r   Nc                     t                                          d|           t                                          d|           d S )Nrm   _prefix)r   r   )r"   rh   rQ   ro   s      r#   r   zSubConfigProxy.__init__q  s=    Iv...Iv.....r%   r;   rD   c                 H    | j                             | j        |z   |          S r7   )rm   r   r^  )r"   r;   rD   s      r#   r   zSubConfigProxy.__setattr__v  s!    |''t(;UCCCr%   c                 F    | j                             | j        |z             S r7   )rm   r   r^  r   s     r#   r   zSubConfigProxy.__getattr__y      |''t(;<<<r%   c                 F    | j                             | j        |z             S r7   )rm   r   r^  r   s     r#   r   zSubConfigProxy.__delattr__|  ra  r%   )r-   r.   r/   r0   r1   r)   r   r   r   r   r   rE  rF  s   @r#   rb   rb   k  s         
/v /s /t / / / / / /
D DF Dt D D D D= = = = = == = = = = = = = = =r%   rb   c                 d    t           j                            |           }|dk    rdS |dk    rdS |S r=   r@   )r;   r   rD   s      r#   get_tristate_envrd    s6    JNN4  E||t||uNr%   c                       fd}|S )Nc                     j                                         D ]4\  }}|                    d          s|| j         vrt          | ||           5| S )Nr   )rZ   r[   r\   rc   )	child_clsr   r   
parent_clss      r#   wrapperz$inherit_fields_from.<locals>.wrapper  s_    '--// 	) 	)DAq<<$$ ))2D)D)D	1a(((r%   r5   )rh  ri  s   ` r#   inherit_fields_fromrj    s#         Nr%   r7   )8
contextlibr   r
  r   rX   rx   rA   r   rw   rY  collections.abcr   contextvarsr   dataclassesr   typesr   r   rT   r   r	   r
   r   r   r   typing_extensionsr   torch._utils_internalr   intfloatr3   r+   r)   r*   rL   rD  r  r_   r   r   r1   r   r   r9   rE   rq   r   rl   r`   rk   r%  rb   rd  rj  r5   r%   r#   <module>rt     s              				 				    $ $ $ $ $ $ " " " " " " ! ! ! ! ! ! * * * * * * * * K K K K K K K K K K K K K K K K ( ( ( ( ( ( 1 1 1 1 1 1 UD$$t**c4eTJ tTT$ZZeD  GCsU{T)C/$6<uDtKdRSSS &(( 4O O O O Ogaj O 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 J J JZ , "* "S " " " "J H H H H H H H HVQ Q Q Q Q: Q Q Qh&& && && && &&z2 && && &&R= = = = = = = =* 3  t        r%   