
    Ǆg5              	       P   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
mZ d dlmZ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 deddfdZ!d	Z"dedee   fd
Z# G d de      Z$ G d de jJ                        Z% G d d      Z&de'dede'de'fdZ(y)    N)FunctionType
ModuleType)AnyCallableDictNoReturnOptionalSetUnion)
deprecated)mockmodulereturnc                 Z     G d dt               }dt        t        t        f   dt        t        t        f   dt
        ddf fdi i t               }   d	        _         _        t        j                                _        | _        | _        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ddh      Zy)3install_config_module.<locals>.ConfigModuleInstance	_is_dirty_hash_digestN)__name__
__module____qualname__set_bypass_keys     b/home/mcse/projects/flask_80/flask-venv/lib/python3.12/site-packages/torch/utils/_config_module.pyConfigModuleInstancer      s    K89r   r   sourcedestprefixr   Nc                 T   t        | j                  j                               D ]   \  }}|j                  d      s1t	        |t
        t        f      st        |d      r|j                  dk(  rJ| | }t	        |t              r||<   ||<   |	u sot        	|       |t	        |t              rY|j                  	j                  k(  sJ t        	| d      } 
||| d       |	u rt        |||       ||j                  |<   t        d| d| dt        |       d       y	)
z?Walk the module structure and move everything to module._config__r   typing.zUnhandled config =z ()N)list__dict__items
startswith
isinstancer   r   hasattrr   CONFIG_TYPESdelattrtyper   SubConfigProxysetattrAssertionError)r   r   r    keyvaluenameproxyconfigdefaultr   visits          r   r9   z$install_config_module.<locals>.visit   s)    v4467 	XJCt$ej,%?@E<0U5E5E5QXcU#D%.$t %6>FC(E4(''6??:::&v$qz:eUtfAJ/6>D#u-).DMM#&$'8QugRU}TU%VWW1	Xr    T)ConfigModuler   r   r/   r0   str-get_assignments_with_compile_ignored_comments_config_defaultr   keys_allowed_keys_compile_ignored_keys	__class__r   r   )r   r   compile_ignored_keysr7   r8   r9   s   `  @@@r   install_config_modulerE      s    :| :Xj$&'XJ./X X 
	X X@  F GHP	&&"FNFOv{{}-F#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)r:   r:   zunconsumed r   r%      )inspect	getsourcer   tokenizeioBytesIOencodereadliner/   COMMENTstringstripCOMPILE_IGNORED_MARKERstartNAMEOPadd)r   source_codeassignmentstokenscurrent_comment	prev_nametokenmaybe_currents           r   r=   r=   Q   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ef   ed<   eeef   ed<   ee   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
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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 )$r;   r?   r>   rA   r   rB   r   r   r   Nc                 (    t        dt         d      )Nzuse z-.install_config_module(sys.modules[__name__]))NotImplementedErrorr   selfs    r   __init__zConfigModule.__init__   s    !8*IJ
 	
r   r5   r4   c                     || j                   v rt        | 	  ||       y || j                  vrt	        | j
                   d| d      || j                  |<   y Nr$   z does not exist)r   super__setattr__rA   AttributeErrorr   r>   )rd   r5   r4   rC   s      r   ri   zConfigModule.__setattr__   sX    4$$$Ge,+++ DMM?!D6!IJJ!&DLLr   c                 |    	 | j                   |   S # t        $ r!}t        | j                   d| d      |d }~ww xY wrg   )r>   KeyErrorrj   r   )rd   r5   es      r   __getattr__zConfigModule.__getattr__   sH    	R<<%% 	R DMM?!D6!IJPQQ	Rs    	;6;c                     | j                   |= y Nr>   rd   r5   s     r   __delattr__zConfigModule.__delattr__   s     LLr   c                     t        | j                        }|j                  dd      D ]  }|j                  |        t	        j
                  |d      S )z Convert config to a pickled blob_save_config_ignorer      )protocol)dictr>   getpoppickledumpsrd   r7   r3   s      r   save_configzConfigModule.save_config   sG    dll#::3R8 	CJJsO	||FQ//r   c                     i }t        | j                        D ]H  j                  d      rt        fd| j                  d   D              r7| j                     |<   J |S )z!Convert config to portable format_c              3   @   K   | ]  }j                  |        y wrp   )r*   ).0rm   r3   s     r   	<genexpr>z4ConfigModule.save_config_portable.<locals>.<genexpr>   s      &'q!s   _cache_config_ignore_prefix)sortedr>   r*   anyr}   s     @r   save_config_portablez!ConfigModule.save_config_portable   sl    !#$,,' 	,C~~c" +/<<8U+V  ,,s+F3K	, r   c                 t   g }| j                   }| j                  j                         D ]}  \  }}|| j                  j                  dd      v r.|| j                  |   k7  rt        j                  d| d|        R|| j                  |   k(  re|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.
        ru   r   zSkipping serialization of z value r$   z = 
)	r   r>   r)   ry   r?   warningswarnappendjoin)rd   linesmodkvs        r   codegen_configzConfigModule.codegen_config   s     mmLL&&( 	/DAqDLL$$%:B??a((MM$>qc"LMDMM!$$LLC5!Cu-.	/ yyr   c                    | j                   s| j                  | j                  j                         D ci c]  \  }}|| j                  vr|| }}}t        t        |j                                     }t        j                  |j                  d            j                         | _        d| _         | j                  S c c}}w )z/Hashes the configs that are not compile_ignoredrG   F)r   r   r>   r)   rB   reprr   hashlibmd5rO   digest)rd   r   r   dict_to_hashstring_to_hashs        r   get_hashzConfigModule.get_hash   s    >>T..6 !LL..0AqD666 1L 
 "&););)=">?N 'N,A,A',J K R R TD"DN   s   C z`config.to_dict()` has been deprecated. It may no longer change the underlying config. use `config.shallow_copy_dict()` or `config.get_config_copy()` instead)categoryc                 "    | j                         S rp   )shallow_copy_dictrc   s    r   to_dictzConfigModule.to_dict   s     %%''r   c                     i | j                   S rp   rq   rc   s    r   r   zConfigModule.shallow_copy_dict   s    $,,r   maybe_pickled_configc                     t        |t              st        j                  |      }n|}| j                  j                  |       y)zARestore from a prior call to save_config() or shallow_copy_dict()N)r+   rx   r{   loadsr>   update)rd   r   r7   s      r   load_configzConfigModule.load_config   s3    .5\\"67F)FF#r   c                 @    t        j                  | j                        S rp   )copydeepcopyr>   rc   s    r   get_config_copyzConfigModule.get_config_copy   s    }}T\\**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 | d 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 Fc                   .    e Zd Zd fdZfdZy)'ConfigModule.patch.<locals>.ConfigPatchNc                     rJ j                         D ]"  }j                  |   |<   |j                  v$ j                  j                         _        y rp   )r@   r>   rB   r   r   )rd   r3   changesr7   dirtypriors     r   	__enter__z1ConfigModule.patch.<locals>.ConfigPatch.__enter__  s`      y"<<> DC!'!4E#Jv'C'CCED %%g.#( r   c                 j    j                   j                         _        j                          y rp   )r>   r   r   clear)rd   exc_typeexc_valexc_tbr7   r   r   s       r   __exit__z0ConfigModule.patch.<locals>.ConfigPatch.__exit__  s&    %%e,#( r   r   N)r   r   r   r   r   )r   r7   r   r   s   r   ConfigPatchr     s    ) )r   r   )r+   r<   rx   r/   r   )	rd   r   r   r   r   r   r7   r   r   s	        @@@@r   patchzConfigModule.patch   s    . !$,,,,!$---: G<<'4(P,@g*PP( "	 	* 	" }r   r   c                 F    | 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                  l    D  ci c]  } | |    
 c} j                         dfd}|S c c} w )Nc                  (     j                         y rp   r   )r7   r   s   r   revertzBConfigModule._make_closure_patcher.<locals>.change.<locals>.revert<  s    e$r   r   r   )r   r   r   r   r7   s     @r   changez2ConfigModule._make_closure_patcher.<locals>.change8  s8    +23aQq	\3EMM'"% M 4s   1)r>   r   )rd   r   r   r7   s    ` @r   _make_closure_patcherz"ConfigModule._make_closure_patcher$  s*    $ 	T* 	 r   r   )NN)r   r   r   r   r<   r   __annotations__r
   boolr	   bytesre   objectri   rn   rs   r~   r   r   r   r   FutureWarningr   r   r   r   r   r   r   __classcell__rC   s   @r   r;   r;   w   s   
 38n #s(^s8c(s8#O5/!

' 'F 't 'R R R  
0U 0d38n     !% ! 	R
(c3h (
( 4S>  $eT#s(^6K0L $QU $+c3h +
 6:;uS$sCx.012; ; sCx.	;
 
;ztCH~ # r   r;   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rb   rc   s    r   r   zContextDecorator.__enter__J      !%((r   c                     t        d      r   r   )rd   r   r   r   s       r   r   zContextDecorator.__exit__M  r   r   funcc                      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rp   )r   rh   
setUpClass	Exceptionr   clsrC   rd   s    r   r   z7ContextDecorator.__call__.<locals>._TestCase.setUpClassT  s?    NN$*,$ dD$7s	   " A c                 z    	 t         |           j                  d d d        y # j                  d d d        w xY wrp   )rh   tearDownClassr   r   s    r   r   z:ContextDecorator.__call__.<locals>._TestCase.tearDownClass]  s4    8-/dD$7dD$7s   % :r   )r   r   r   classmethodr   r   r   )rC   rd   s   @r   	_TestCaser   S  s)      8 8r   r   )
r+   r/   
issubclassunittestTestCaser   r   r   rh   __call__)rd   r   r   rC   s   `  r   r   zContextDecorator.__call__P  sf    dD!jx7H7H&I8D 8" "&I%)%6%6I"#'??I w%%r   r   )r   r   r   __doc__r   r   r   r   r   r   r   r   s   @r   r   r   D  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 )r0   zn
    Shim to redirect to main config.
    `config.triton.cudagraphs` maps to _config["triton.cudagraphs"]
    r7   r    c                 F    t         |   d|       t         |   d|       y )Nr>   _prefix)rh   ri   )rd   r7   r    rC   s      r   re   zSubConfigProxy.__init__s  s!    Iv.Iv.r   r5   r4   r   Nc                 T    | j                   j                  | j                  |z   |      S rp   )r>   ri   r   )rd   r5   r4   s      r   ri   zSubConfigProxy.__setattr__x  s"    ||''t(;UCCr   c                 R    | j                   j                  | j                  |z         S rp   )r>   rn   r   rr   s     r   rn   zSubConfigProxy.__getattr__{       ||''t(;<<r   c                 R    | j                   j                  | j                  |z         S rp   )r>   rs   r   rr   s     r   rs   zSubConfigProxy.__delattr__~  r   r   )r   r   r   r   r   r<   re   ri   r   rn   rs   r   r   s   @r   r0   r0   m  s_    
/v /s /
D DF Dt D= = == = =r   r0   objr5   r4   c                     t        | t              r| j                  ||      S t        j                  j	                  | ||      S )z@
    Workaround `mock.patch.object` issue with ConfigModule
    )r+   r;   r   r   r   )r   r5   r4   s      r   patch_objectr     s8     #|$yyu%%::S$..r   ))
contextlibr   r   rJ   rM   r{   rL   r   r   typesr   r   r#   r   r   r   r   r	   r
   r   typing_extensionsr   r   intfloatr   r/   r<   r'   r   tuplerx   r-   rE   rT   r=   r;   r   r0   r   r   r   r   r   <module>r      s        	     * F F F (  UD$t*c4eTJ6* 6 6r , #* #S #LJ: JZ&&z22 &&R= =*/f /C / /6 /r   