
    Ph1              	          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 d dlmZ eee ed      eeeeef	Zd ZdZd Z  G d d	e      Z! G d
 de jD                        Z" G d d      Z#d Z$y)    N)FunctionType
ModuleType)AnyDictOptionalSetTupleUnion)mockc                      G d dt               } fdt               t               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     eC:\Users\daisl\Desktop\realtime-object-detection\venv\Lib\site-packages\torch/utils/_config_module.pyConfigModuleInstancer      s    K89r   r   c                 *   t        | j                  j                               D ]  \  }}|j                  d      s1t	        |t
        t        f      st        |d      r|j                  dk(  rI| | }t	        |t              r||<   ||<   |	u snt        	|       {t	        |t              rE|j                  	j                  k(  sJ t        	| d      } 
||| d       t        |||       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)sourcedestprefixkeyvaluenameproxyconfigdefaultmodulevisits          r   r6   z$install_config_module.<locals>.visit   s   v4467JCt$ej,%?@E<0U5E5E5QXcU#D%.$t %6>FC(E4(''6??:::&v$qz:eUtfAJ/c5)$'8QugRU}TU%VWW+ 8r    TN)ConfigModuledict-get_assignments_with_compile_ignored_comments_config_defaultr   keys_allowed_keys_compile_ignored_keys	__class__r   r   )r5   r   compile_ignored_keysr3   r4   r6   s   `  @@@r   install_config_modulerB      s}    :| :X2 "VF"fGHP	&&"FNFOv{{}-F#7F +FFFr   z@compile_ignoredc                 r   t        j                  |       }t               }t        j                  t	        j
                  |j                  d            j                        }d}d}d}|D ]7  }|j                  t        j                  k(  rt|j                  j                         }t        |v sD|dk(  sJ dt                ||j                  d   f}|j                  d   |d   k(  s~|j                  |d          d}|j                  t        j                  k(  r|j                  }|j                  t        j                   k(  s|j                  dk(  s||j                  d   f}t        |d   v s|d   |j                  d   dz
  k(  s%|j                  |       d}: |dk(  sJ dt                |S )Nutf-8)r7   r7   zunconsumed r      r   )inspect	getsourcer   tokenizeioBytesIOencodereadliner(   COMMENTstringstripCOMPILE_IGNORED_MARKERstartaddNAMEOP)	r5   source_codeassignmentstokenscurrent_comment	prev_nameprev_assignedtokenmaybe_currents	            r   r:   r:   I   s   ##F+K%K rzz+*<*<W*EFOOPFOIM::)))!LL..0M%6& +  : !!7 89:  #0Q"?;;q>]1%55  OOM!$45&,OZZ8==(IZZ8;;&5<<3+>%u{{1~5M '/!*<<#A&%++a.1*<<	*"(3 4 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 Z fd	Zd
 Zd Zde
fdZdefdZdeeef   deeeef   e
f   fdZdeeef   de
fdZde
fdZ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fdZ xZS )r8   r<   r;   r>   r   r?   r   r   c                 (    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   c                     || j                   v rt        | 	  ||       y || j                  vrt	        | j
                   d| d      || j                  |<   y Nr   z does not exist)r   super__setattr__r>   AttributeErrorr   r;   )rb   r1   r0   r@   s      r   rg   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re   )r;   KeyErrorrh   r   )rb   r1   es      r   __getattr__zConfigModule.__getattr__   sH    	R<<%% 	R DMM?!D6!IJPQQ	Rs    	;6;c                     | j                   |= y Nr;   rb   r1   s     r   __delattr__zConfigModule.__delattr__   s     LLr   returnc                     t        | j                        }|j                  dd      D ]  }|j                  |        t	        j
                  |d      S )z Convert config to a pickled blob_save_config_ignorer      )protocol)r9   r;   getpoppickledumps)rb   r3   r/   s      r   save_configzConfigModule.save_config   sB    dll#::3R8CJJsO 9||FQ//r   c                    g }| j                   }| j                  j                         D ]P  \  }}|| j                  j                  dd      v r%|| j                  |   k(  r8|j                  | d| d|       R dj                  |      S )zConvert config to Python statements that replicate current config.
        This does NOT include config settings that are at default values.
        rt   r   r   z = 
)r   r;   r"   rw   r<   appendjoin)rb   linesmodkvs        r   codegen_configzConfigModule.codegen_config   s     mmLL&&(DAqDLL$$%:B??DMM!$$LLC5!Cu-. ) yyr   updatesc                     t         fd|D              rt        d       j                  j                         D ci c]  \  }}| j                  vs|| }}}|j                  |        j                  |      }||fS c c}}w )zCHashes the configs that are not compile_ignored, along with updatesc              3   :   K   | ]  }|j                   v   y wrn   )r?   ).0r   rb   s     r   	<genexpr>z@ConfigModule.get_config_and_hash_with_updates.<locals>.<genexpr>   s     @1qD...s   z&update keys cannot be @compile_ignored)any
ValueErrorr;   r"   r?   update	_get_hash)rb   r   r   r   cfghasheds   `     r    get_config_and_hash_with_updatesz-ConfigModule.get_config_and_hash_with_updates   s     @@@EFF!\\//1
1TQQd>X>X5XAqD1 	 
 	

7$F{
s   BBr3   c                     t        t        |j                                     }t        j                  |j                  d            j                         S )NrD   )reprsortedr"   hashlibmd5rL   digest)rb   r3   string_to_hashs      r   r   zConfigModule._get_hash   s:    fV\\^45{{>009:AACCr   c                    | j                   s| j                  X| j                  j                         D ci c]  \  }}|| j                  vr|| }}}| j                  |      | _        d| _         | j                  S c c}}w )z/Hashes the configs that are not compile_ignoredF)r   r   r;   r"   r?   r   )rb   r   r   dict_to_hashs       r   get_hashzConfigModule.get_hash   s    >>T..6 !LL..00DAqD666 10  
 !%| <D"DN   s   A=c                 V    t        j                  dt               | j                         S )Nzconfig.to_dict() has been deprecated. It may no longer change the underlying config. use config.shallow_copy_dict() or config.get_config_copy() instead)warningswarnDeprecationWarningshallow_copy_dictra   s    r   to_dictzConfigModule.to_dict   s(    R	

 %%''r   c                     i | j                   S rn   ro   ra   s    r   r   zConfigModule.shallow_copy_dict   s    $,,r   maybe_pickled_configNc                     t        |t              st        j                  |      }n|}| j                  j                  |       y)zARestore from a prior call to save_config() or shallow_copy_dict()N)r$   r9   ry   loadsr;   r   )rb   r   r3   s      r   load_configzConfigModule.load_config   s3    .5\\"67F)FF#r   c                 @    t        j                  | j                        S rn   )copydeepcopyr;   ra   s    r   get_config_copyzConfigModule.get_config_copy   s    }}T\\**r   arg1arg2c                    |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 fdZfdZy)'ConfigModule.patch.<locals>.ConfigPatchc                     rJ j                         D ]"  }j                  |   |<   |j                  v$ j                  j                         _        y rn   )r=   r;   r?   r   r   )rb   r/   changesr3   dirtypriors     r   	__enter__z1ConfigModule.patch.<locals>.ConfigPatch.__enter__  sY      y"<<>C!'!4E#Jv'C'CCE * %%g.#( r   c                 j    j                   j                         _        j                          y rn   )r;   r   r   clear)rb   exc_typeexc_valexc_tbr3   r   r   s       r   __exit__z0ConfigModule.patch.<locals>.ConfigPatch.__exit__  s&    %%e,#( r   N)r   r   r   r   r   )r   r3   r   r   s   r   ConfigPatchr     s    )r   r   )r$   strr9   r(   ContextDecorator)	rb   r   r   kwargsr   r   r3   r   r   s	        @@@@r   patchzConfigModule.patch   s    . !$,,,,!$---: G<<'4(P,@g*PP( "	 	* 	" }r   )NN)r   r   r   r   r   r   __annotations__r   boolr   bytesrc   rg   rl   rq   r{   r   r	   r   r   r   r   r   r
   r   r   r   __classcell__r@   s   @r   r8   r8   q   sn   
 38n #s(^s8c(s8#O5/!

'R
0U 0   CH~	tCH~u$	%DS#X D5 D
!% 
!(c3h ( 4S>  $eT#s(^6K0L $QU $+c3h +
 6:;uS$sCx.012; ;r   r8   c                   .     e Zd ZdZd Zd Z fdZ xZS )r   z[
    Same as contextlib.ContextDecorator, but with support for
    `unittest.TestCase`
    c                     t        d      NNYIr`   ra   s    r   r   zContextDecorator.__enter__&      !%((r   c                     t        d      r   r   )rb   r   r   r   s       r   r   zContextDecorator.__exit__)  r   r   c                      t        |t              r\t        |t        j                        rB G  fdd|      }|j
                  |_        |j                  |_        |j                  |_        |S t         %  |      S )Nc                   B     e Zd Ze fd       Ze fd       Z xZS ),ContextDecorator.__call__.<locals>._TestCasec                     j                          	 t        | 	          y # t        $ r j	                  d d d         w xY wrn   )r   rf   
setUpClass	Exceptionr   clsr@   rb   s    r   r   z7ContextDecorator.__call__.<locals>._TestCase.setUpClass0  s?    NN$*,$ dD$7s	   " A c                 z    	 t         |           j                  d d d        y # j                  d d d        w xY wrn   )rf   tearDownClassr   r   s    r   r   z:ContextDecorator.__call__.<locals>._TestCase.tearDownClass9  s4    8-/dD$7dD$7s   % :)r   r   r   classmethodr   r   r   )r@   rb   s   @r   	_TestCaser   /  s)      8 8r   r   )
r$   r(   
issubclassunittestTestCaser   r   r   rf   __call__)rb   funcr   r@   s   `  r   r   zContextDecorator.__call__,  sf    dD!jx7H7H&I8D 8" "&I%)%6%6I"#'??I w%%r   )r   r   r   __doc__r   r   r   r   r   s   @r   r   r      s    
))& &r   r   c                   4     e Zd ZdZ fdZd Zd Zd Z xZS )r)   zn
    Shim to redirect to main config.
    `config.triton.cudagraphs` maps to _config["triton.cudagraphs"]
    c                 F    t         |   d|       t         |   d|       y )Nr;   _prefix)rf   rg   )rb   r3   r.   r@   s      r   rc   zSubConfigProxy.__init__O  s!    Iv.Iv.r   c                 T    | j                   j                  | j                  |z   |      S rn   )r;   rg   r   )rb   r1   r0   s      r   rg   zSubConfigProxy.__setattr__T  s"    ||''t(;UCCr   c                 R    | j                   j                  | j                  |z         S rn   )r;   rl   r   rp   s     r   rl   zSubConfigProxy.__getattr__W       ||''t(;<<r   c                 R    | j                   j                  | j                  |z         S rn   )r;   rq   r   rp   s     r   rq   zSubConfigProxy.__delattr__Z  r   r   )	r   r   r   r   rc   rg   rl   rq   r   r   s   @r   r)   r)   I  s    
/
D==r   r)   c                     t        | t              r| j                  ||      S t        j                  j	                  | ||      S )z@
    Workaround `mock.patch.object` issue with ConfigModule
    )r$   r8   r   r   object)objr1   r0   s      r   patch_objectr   ^  s8     #|$yyu%%::S$..r   )%
contextlibr   r   rG   rJ   ry   rI   r   r   typesr   r   r   r   r   r   r   r	   r
   r   intfloatr   r(   r   r    r   tupler9   r&   rB   rQ   r:   r8   r   r)   r   r   r   r   <module>r      s        	     * 9 9  UD$t*c4eTJ/d , %Pl: l^&&z22 &&R= =*/r   