
    Vhs                     6   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
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mZmZ d dl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deeee de"e#e$e%e&f	   	      Z( e)       Z*e G d
 dee(                Z+er>e*dddddfdee(e)f   dee"   deee"e#e"   f      deee"e#e"   f      dee!   dee"   de(fdZ,n@e*dddddfdee(e)f   dee"   deee"e#e"   f      deee"e#e"   f      dee!   dee"   de+e(   fdZ,de"deee e"f      fdZ-deddfdZ.dZ/dede$e"   fdZ0e G d d             Z1 G d de      Z2 G d d e jf                        Z3 G d! d"      Z4d#e)de"d$e)de)fd%Z5d'de"dedee    fd&Z6y)(    N)	dataclass)FunctionType
ModuleType)AnyCallableGenericNoReturnOptionalTYPE_CHECKINGTypeVarUnion)
deprecated)mock)justknobs_checkT)boundc                   4   e Zd ZU dZeeef   ed<   dZe	e
   ed<   dZe	ee
      ed<   dZe	ee
      ed<   dZe	e
   ed<   edddddfdeeef   de	e
   de	ee
ee
   f      de	ee
ee
   f      de	e   de	e
   fd	Zed
e	ee
ee
   f      de	ee
      fd       Zy)_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 precendence 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.
        env_name_default: If set, this environment variable will override everything
            after this.
            If multiple env variables are given, the precendence order is from
            left to right.
        justknob: If this pytorch installation supports justknobs, that will
            override defaults, but will not override the user_override precendence.
        default: This value is the lowest precendance, 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alias
value_typec                     || _         || _        t        j                  |      | _        t        j                  |      | _        || _        || _        | j                  |t        u r|||J d       y y )NzCif alias is set, none of {default, justknob and env var} can be set)	r   r   r    string_or_list_of_string_to_listr   r   r   r   _UNSET_SENTINEL)selfr   r   r   r   r   r   s          J/home/dcms/DCMS/lib/python3.12/site-packages/torch/utils/_config_module.py__init__z_Config.__init__W   s       ' H H!
 &FF~V$
::!?*$$,"*	U
 UU+ + "    valreturnc                 V    | y t        | t              r| gS t        | t              sJ | S N)
isinstancestrlist)r"   s    r   r   z(_Config.string_or_list_of_string_to_listq   s2     ;c35L#t$$$
r!   )__name__
__module____qualname____doc__r   r   object__annotations__r   r
   r'   r   r(   r   r   r   typer    staticmethodr    r!   r   r   r   )   s.   $L 1f9"Hhsm",0htCy)0*.NHT#Y'.E8C= %4"&<@:>%)#Uq&y!U 3-U #5d3i#89	U
 !sDI~!67U TNU }U4 eCcN+,	$s)	 r!   r   r   r   r   r   r   r   r#   c                      y r%   r1   r   r   r   r   r   r   s         r   Configr4      s     	r!   c                 "    t        | |||||      S r%   )r   r3   s         r   r4   r4      s     X/U
 	
r!   namec                 \    t         j                  j                  |       }|dk(  ry|dk(  ry|S N1T0Fosenvironget)r6   values     r   _read_env_variabler@      s-    JJNN4 E||Lr!   modulec                      G d dt               }dt        t        t        f   dt        t        t        f   dt
        ddf fdi t               }   d	        _        | _        | _	        d
 _
        d _        y)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y)3install_config_module.<locals>.ConfigModuleInstance>   	_is_dirty_hash_digestr.   N)r)   r*   r+   set_bypass_keysr1   r!   r   ConfigModuleInstancerD      s    KLr!   rI   sourcedestprefixr#   Nc                    t         j                  dd dk  rt        | di       }nt        j                  |       }t        | j                  j                               D ]  \  }}|j                  d      sQt        |t        t        f      s;t        |d      r|j                  dk(  s t        |t              rt        |t               rj| | }|j#                  |d      }t        |t$              r+t'        t!        ||            	|<   |
u st)        
|       t        |t               r6||j*                  ||_        t'        |      	|<   |
u st)        
|       t        |t              r[|j                  
j,                  k(  sJ t/        
| d	      } ||| d	       |
u rt1        |||       ]||j                  |<   nt3        d
| d| dt        |       d       y)z?Walk the module structure and move everything to module._configN   )   
   r.   __r*   typing)r   r   .zUnhandled config =z ())sysversion_infogetattrinspectget_annotationsr(   __dict__items
startswithr&   r   r   hasattrr*   r/   
issubclassr   r>   CONFIG_TYPES_ConfigEntrydelattrr   r)   SubConfigProxysetattrAssertionError)rJ   rK   rL   
type_hintskeyr?   r6   annotated_typeproxyconfigrA   visits            r   rk   z$install_config_module.<locals>.visit   s    BQ') ):B?J 008Jv4467 $	XJCt$ej,%?@E<0U5E5E5Qud+
5'0JXcU#D'^^C6N%.+EnE t 6>FC(E7+!-%2B2B2J'5E$+E2t6>FC(E4(''6??:::&v$qz:eUtfAJ/6>D#u-).DMM#&$'8QugRU}TU%VWWI$	Xr!    T)ConfigModuler   r   r/   rc   r'   -get_assignments_with_compile_ignored_comments_config_compile_ignored_keys	__class__rE   rF   )rA   rI   compile_ignored_keysrj   rk   s   `  @@r   install_config_modulers      s    M| M.Xj$&'.XJ./.X .X 
	.X` ')FHP	&&"FN#7F +FFFr!   z@compile_ignoredc                    t        j                  |       }t               }t        j                  t	        j
                  |j                  d            j                        }d}d}|D ]  }|j                  t        j                  k(  rJd}|j                  j                         }t        |v sE|dk(  sJ dt                ||j                  d   f}j|j                  t        j                  k(  r|r|j                  }|j                  t        j                  k(  s|j                  dk(  st        |d   v r+|d   |j                  d   dz
  k(  r|j!                  |       d}d} |dk(  sJ dt                |S )Nutf-8)rl   rl   zunconsumed r   rT      )rY   	getsourcerG   tokenizeioBytesIOencodereadliner/   COMMENTstringstripCOMPILE_IGNORED_MARKERstartNAMEOPadd)rA   source_codeassignmentstokenscurrent_comment	prev_nametokenmaybe_currents           r   rn   rn      si   ##F+K%K rzz+*<*<W*EFOOPFOI ::)))I!LL..0M%6& +  : !!7 89:  #0Q"?ZZ8==( !LL	ZZ8;;&5<<3+> '/!*<<#A&%++a.1*<<	*"(I12 h&N+6L5M(NN&r!   c                       e Zd ZU eed<   eed<   eZeed<   dZe	e
   ed<   eZeed<   eZeed<   dZeed	<   dZe	e
   ed
<   defdZy)ra   r   r   user_overrideNr   env_value_forceenv_value_defaultFhider   rj   c                    |j                   | _         |j                  |j                  nt        | j                         | _        |j                  | _        |j                  | _        |j
                  '|j
                  D ]  }t        |      x}|| _         n |j                  '|j                  D ]  }t        |      x}|| _	         n | j                  ;| j                   /t        | j                   t              sJ d| j                    d       | j                  _|j
                  |j                  F| j                  t        t        t        t           t        t           fv sJ d| j                   d       y y y )Nz!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&   boolr'   r
   )r   rj   r"   	env_values       r   r    z_ConfigEntry.__init__2  s   ~~!'!2!2!>FDDV 	 \\
""... !3C!88IE-6D*   ,,, !3C!88IE+4D( ==$)Ad S24<<.@QRS  ??&##/63H3H3T??	'  k
 NdooM^^ijk  4U 'r!   )r)   r*   r+   r   r.   r/   r   r   r   r
   r'   r   r   r   r   r   r   r    r1   r!   r   ra   ra     sf     L )M3("Hhsm"*OS*,s, D$E8C=kw kr!   ra   c                   z    e Zd ZU eeef   ed<   ee   ed<   ee   ed<   eed<   e	e
   ed<   d-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ef      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	 	 	 d.de	ee      de	ee      dedeeef   fdZdedefdZde
fdZ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ef   f   ddfd$Z$deeef   fd%Z%	 	 d/d&e	e#eeeef   f      d'ed(eeef   dd)fd*Z&d+eeef   defd,Z' xZ(S )0rm   ro   rH   rp   rE   rF   r#   Nc                 (    t        dt         d      )Nzuse z-.install_config_module(sys.modules[__name__]))NotImplementedErrorr)   r   s    r   r    zConfigModule.__init__`  s    !8*IJ
 	
r!   r6   r?   c                 f   || j                   v rt        | 	  ||       y || j                  vrt	        | j
                   d| d      | j                  |   j                   | j                  | j                  |   |       y || j                  |   _        d| _	        d| j                  |   _
        y )NrS    does not existTF)rH   super__setattr__ro   AttributeErrorr)   r   _set_alias_valr   rE   r   )r   r6   r?   rq   s      r   r   zConfigModule.__setattr__e  s    4$$$Ge,% DMM?!D6!IJJ\\$%%1T 2E:/4DLL,!DN&+DLL#r!   c                    	 | j                   |   }|j                  rt        | j                   d| d      | j	                  |      }|t
        ur|S |j                  t
        ur|j                  S |j                  t
        ur|j                  S |j                  t
        ur|j                  S |j                  !t        |j                  |j                        S t        |j                  t        t        t        f      r0t!        j"                  |j                        |_        |j                  S |j                  S # t$        $ r!}t        | j                   d| d      |d }~ww xY w)NrS   r   )r6   r   )ro   r   r   r)   _get_alias_valr   r   r   r   r   r   r   r&   r(   rG   dictcopydeepcopyKeyError)r   r6   rj   	alias_vales        r   __getattr__zConfigModule.__getattr__q  s7   !	R\\$'F{{$av_%MNN++F3I/  %%_<---##?:+++''>///*&FOOV^^TT
 &..4d*;<'+}}V^^'D$+++>>! 	R DMM?!D6!IJPQQ	Rs=   AD; D; 1D; D; -,D; AD; /D; ;	E%E  E%c                 j    d| _         t        | j                  |   _        d| j                  |   _        y NT)rE   r   ro   r   r   r   r6   s     r   __delattr__zConfigModule.__delattr__  s-     ,;T("&Tr!   entryc                     |j                   }|y |j                  dd      \  }}	 t        j                  |      }||fS # t        $ r}t        d      |d }~ww xY w)NrS   rw   z#config alias {alias} does not exist)r   rsplit	importlibimport_moduleImportErrorr   )r   r   r   module_nameconstant_namerA   r   s          r   _get_alias_module_and_namez'ConfigModule._get_alias_module_and_name  so     =%*\\#q%9"]	O,,[9F }$$  	O !FGQN	Os   ? 	AAAc                 Z    | j                  |      }|t        S |\  }}t        ||      }|S r%   )r   r   rX   )r   r   datarA   r   constant_values         r   r   zConfigModule._get_alias_val  s9    ..u5<"" $ 7r!   r"   c                 R    | j                  |      }|J |\  }}t        |||       y r%   )r   rd   )r   r   r"   r   rA   r   s         r   r   zConfigModule._set_alias_val  s4    ..u5 $s+r!   c                    | j                   |   }|j                  t        u xs |j                  |j                  k(  }|j                  t        u xs |j                  |j                  k(  }|j
                  t        u }t        |j                  t        t        t        f      r|xs |j
                  |j                  k(  }|xr |xr |S )z
        Returns true if the config is at its default value.
        configs overriden by the env are not considered default.
        )
ro   r   r   r   r   r   r&   r(   rG   r   )r   r6   
config_valnot_set_env_defaultnot_set_env_forceunsets         r   _is_defaultzConfigModule._is_default  s    
 \\$'

 ((O; B++z/A/AA 	
 &&/9 @))Z-?-?? 	
 ((O;j((4d*;<KZ559K9KKEB,B1BBr!   ignored_keysignored_prefixesskip_defaultc                 
   i }| j                   D ]p  |r|v r
|rt        fd|D              r!|r| j                        r5| j                      j                  Ot	        j
                  t        |             |<   r |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.
        c              3   @   K   | ]  }j                  |        y wr%   )r]   ).0rL   rg   s     r   	<genexpr>z)ConfigModule._get_dict.<locals>.<genexpr>  s     M&s~~f-Ms   )ro   anyr   r   r   r   rX   )r   r   r   r   rj   rg   s        @r   	_get_dictzConfigModule._get_dict  s    , "$<< 
	<C| 3M<LMM 0 0 5||C &&2--c(:;F3K
	< r!   config_namec                 4    | j                   |   j                  S r%   )ro   r   )r   r   s     r   get_typezConfigModule.get_type  s    ||K(333r!   c                 j    t        | dg       }t        j                  | j                  |      d      S )z Convert config to a pickled blob_save_config_ignorer   rN   )protocol)rX   pickledumpsr   )r   r   s     r   save_configzConfigModule.save_config  s3    t%:B?||NNN5
 	
r!   c                 d    dg}|j                  t        | dg              | j                  |      S )z!Convert config to portable format__cache_config_ignore_prefix)r   )extendrX   r   )r   prefixess     r   save_config_portablez!ConfigModule.save_config_portable  s0    5&CRHI~~x~88r!   c                   	
 t               
dt        dt        dt        fddt        ddf
fddt        t
        t         f   dt
        t           ffddt        dt        fd		dt        f	fd
}g }| j                  }| j                  t        | dg       d      j                         D ]  \  }}|j                   ||||               
D ]  }|j                  dd|         dj                  |      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                 D    | j                   }|dk(  rd}|r
|dk7  r|dz  }|S )Nbuiltinsrl   rS   )r*   )r   r   r   s      r   get_module_namez4ConfigModule.codegen_config.<locals>.get_module_name  s2    //Kj( ;",s"r!   Nc                 @     | d      }|rj                  |       y y )NF)r   )r   r   r   importss     r   
add_importz/ConfigModule.codegen_config.<locals>.add_import  s#    )$6KK( r!   vc                 X    | D cg c]  } |d       |j                     c}S c c}w r   )r)   )r   itemr   s     r   list_of_callables_to_stringz@ConfigModule.codegen_config.<locals>.list_of_callables_to_string  s,    PQRtT23DMM?CRRRs   'c                 P    t        |       xr t        | d      xr t        | d      S )Nr*   r)   )callabler^   )r   s    r   importable_callablez8ConfigModule.codegen_config.<locals>.importable_callable  s$    A;V71l#;V:@VVr!   c                 \    |      r% |       |  d| d |d       |j                    S t        |t        t        f      r_t	        fd|D              rK|D ]
  } |         |      }t        |t              r
|  d| d| S |  d| ddj                  |       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 }
            rS   z = Tc              3   .   K   | ]  } |        y wr%   r1   )r   r   r   s     r   r   zGConfigModule.codegen_config.<locals>.get_config_line.<locals>.<genexpr>/  s      4.2#D)4s   z = { z, z })r)   r&   r(   rG   alljoin)	modkr   r   v_listr   r   r   r   s	        r   get_config_linez4ConfigModule.codegen_config.<locals>.get_config_line!  s     #1%1as#oa&>%?

|LLAc{+ 4674 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 
)rG   r   r   r'   r   r(   r   r)   r   rX   r\   appendinsertr   )r   r   linesr   r   r   import_namer   r   r   r   r   s          @@@@@r   codegen_configzConfigModule.codegen_config  s    %	( 	T 	c 		)X 	)$ 	)
	S5s+; 	SS	 	S	W3 	W4 	W	,# 	, 	,6 mmNN '<bAPT # 

%'	5DAq LLa34	5 # 	5KLLgk]34	5yyr!   c                 X   | j                   s| j                  | j                  t        | j                              }t        t        |j                                     }t        j                  |j                  d      d      j                         | _        d| _         | j                  S )z/Hashes the configs that are not compile_ignoredr   ru   F)usedforsecurity)rE   rF   r   r(   rp   reprsortedr\   hashlibmd5r|   digest)r   dict_to_hashstring_to_hashs      r   get_hashzConfigModule.get_hashF  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                 "    | j                         S r%   get_config_copyr   s    r   to_dictzConfigModule.to_dictQ       ##%%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                 "    | j                         S r%   r  r   s    r   shallow_copy_dictzConfigModule.shallow_copy_dictZ  r  r!   maybe_pickled_configc                     t        |t              st        j                  |      }n|}|j	                         D ]6  \  }}|| j
                  v rt        | ||       "ddlm}  |d| d| d       8 y)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&   r   r   loadsr\   ro   rd   torch._dynamo.utilsr
  )r   r  rj   r   r   r
  s         r   load_configzConfigModule.load_configc  so    .5\\"67F)FLLN 	VDAqDLL a#9D<s2STU	Vr!   c                 "    | j                         S r%   )r   r   s    r   r  zConfigModule.get_config_copyq  s    ~~r!   arg1arg2kwargsContextDecoratorc                     |1|t        |t              sJ ||int        |t              sJ ||rJ ||J t        t              sJ dt                      i |  G fddt              } |       S )a  
        Decorator and/or context manager to make temporary changes to a config.

        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):
                ...
        zexpected `dict` got c                   *    e Zd Zd fdZfdZy)'ConfigModule.patch.<locals>.ConfigPatchNc                     rJ j                         D ]  }j                  |      |<    j                         D ]  \  }}j                  ||        y r%   )keysr   r\   r   )r   rg   r   r   changesrj   priors       r   	__enter__z1ConfigModule.patch.<locals>.ConfigPatch.__enter__  s_      y"<<> 9C!'!3!3C!8E#J9 $MMO -DAq&&q!,-r!   c                 z    j                         D ]  \  }}j                  ||        j                          y r%   )r\   r   clear)r   exc_typeexc_valexc_tbr   r   rj   r  s         r   __exit__z0ConfigModule.patch.<locals>.ConfigPatch.__exit__  s5    !KKM -DAq&&q!,-r!   r#   N)r)   r*   r+   r  r   )r  rj   r  s   r   ConfigPatchr    s    -r!   r"  )r&   r'   r   r/   r  )r   r  r  r  r"  r  rj   r  s        @@@r   patchzConfigModule.patcht  s    . !$,,,,!$---: G<<'4(P,@g*PP( "	 	* 	 }r!   r  c                 J      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                      D  ci c]  } | |    j                    c} j                         D ]  \  } }|j                  |    _          dfd}|S c c} w )Nc                  ^    j                         D ]  \  } }|j                  |    _         y r%   )r\   ro   r   )r   r   r  r   s     r   revertzBConfigModule._make_closure_patcher.<locals>.change.<locals>.revert  s,    !KKM 6DAq45DLLO16r!   r!  )r   r\   ro   )r   r   r'  r  r  rj   r   s      @r   changez2ConfigModule._make_closure_patcher.<locals>.change  s]    9@AAQq	///AE 2101Q-26 M Bs   A)ro   r   )r   r  r(  rj   s   `` @r   _make_closure_patcherz"ConfigModule._make_closure_patcher  s*    $ 		T* 		 r!   r!  )NNF)NN))r)   r*   r+   r   r'   ra   r.   rG   r   r
   bytesr    r-   r   r   r   r   tupler   r   r   r   r   r(   r   r/   r   r   r   r   r   r   FutureWarningr  r  r   r  r  r#  r)  __classcell__rq   s   @r   rm   rm   T  s    #|#$$c(s8#O5/!


, 
,F 
,t 
,"R "R "RH' ' '%!%	%
C(	)%L S ,L ,s ,t ,C C C4 -104"	#tCy)# #49-# 	#
 
c3h#J4C 4D 4
U 
9d38n 9?  ? B	!% 	! 	8 	&c3h && 	8 	&4S> &&VeT#s(^6K0L VQU V c3h  
 6:7uS$sCx.0127 7 sCx.	7
 
7rtCH~ # r!   rm   c                   L     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#   c                     t        d      NNYIr   r   s    r   r  zContextDecorator.__enter__      !%((r!   c                     t        d      r1  r3  )r   r  r  r  s       r   r   zContextDecorator.__exit__  r4  r!   r   c                      t        |t              r\t        |t        j                        rB G  fdd|      }|j
                  |_        |j                  |_        |j                  |_        |S t         %  |      S )Nc                   F     e Zd Zed fd       Zed fd       Z xZS ),ContextDecorator.__call__.<locals>._TestCasec                     j                          	 t        | 	          y # t        $ r j	                  d d d         w xY wr%   )r  r   
setUpClass	Exceptionr   clsrq   r   s    r   r:  z7ContextDecorator.__call__.<locals>._TestCase.setUpClass  s?    NN$*,$ dD$7s	   " A c                 z    	 t         |           j                  d d d        y # j                  d d d        w xY wr%   )r   tearDownClassr   r<  s    r   r?  z:ContextDecorator.__call__.<locals>._TestCase.tearDownClass  s4    8-/dD$7dD$7s   % :r!  )r)   r*   r+   classmethodr:  r?  r-  )rq   r   s   @r   	_TestCaser8    s)      8 8r!   rA  )
r&   r/   r_   unittestTestCaser)   r+   r*   r   __call__)r   r   rA  rq   s   `  r   rD  zContextDecorator.__call__  sf    dD!jx7H7H&I8D 8" "&I%)%6%6I"#'??I w%%r!   r!  )r)   r*   r+   r,   r  r	   r   r   r   rD  r-  r.  s   @r   r  r    s<    
))X )&XseSj1 &c & &r!   r  c                   `     e Zd ZdZdede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 )rc   zn
    Shim to redirect to main config.
    `config.triton.cudagraphs` maps to _config["triton.cudagraphs"]
    rj   rL   c                 F    t         |   d|       t         |   d|       y )Nro   _prefix)r   r   )r   rj   rL   rq   s      r   r    zSubConfigProxy.__init__  s!    Iv.Iv.r!   r6   r?   r#   Nc                 T    | j                   j                  | j                  |z   |      S r%   )ro   r   rG  )r   r6   r?   s      r   r   zSubConfigProxy.__setattr__  s"    ||''t(;UCCr!   c                 R    | j                   j                  | j                  |z         S r%   )ro   r   rG  r   s     r   r   zSubConfigProxy.__getattr__       ||''t(;<<r!   c                 R    | j                   j                  | j                  |z         S r%   )ro   r   rG  r   s     r   r   zSubConfigProxy.__delattr__	  rJ  r!   )r)   r*   r+   r,   r-   r'   r    r   r   r   r   r-  r.  s   @r   rc   rc     s_    
/v /s /
D DF Dt D= = == = =r!   rc   objr?   c                     t        | t              r| j                  ||      S t        j                  j	                  | ||      S )z@
    Workaround `mock.patch.object` issue with ConfigModule
    )r&   rm   r#  r   r-   )rL  r6   r?   s      r   patch_objectrN    s8     #|$yyu%%::S$..r!   c                 \    t         j                  j                  |       }|dk(  ry|dk(  ry|S r8   r;   )r6   r   r?   s      r   get_tristate_envrP    s-    JJNN4 E||Nr!   r%   )7
contextlibr   r   r   rY   rz   r<   r   rV   ry   rB  dataclassesr   typesr   r   rR   r   r   r   r	   r
   r   r   r   typing_extensionsr   r   torch._utils_internalr   intfloatr   r/   r'   r(   rG   r+  r   r`   r   r-   r   r   r4   r@   rs   r   rn   ra   rm   r  rc   rN  rP  r1   r!   r   <module>rX     s        	 	  
   ! *	 	 	 )  1 UD$t*c4eTJ CuS%tS$UDPQR ( Pgaj P Pn  %4"&<@:>%)#q&y!3- #5d3i#89 !sDI~!67	
 TN } 
 %4"&<@:>%)#

q&y!

3-

 #5d3i#89

 !sDI~!67	


 TN

 }

 


S XeD#I.>%? D* D DN , #* #S #L :k :k :kzx: xv&&z22 &&R= =*/f /C / /6 /3   r!   