a
    d'                  	   @   s   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	 d dlm
Z
 eeeedeeeeef	Zdd ZG dd deZG d	d
 d
e jZG dd dZdd ZdS )    N)FunctionType
ModuleType)AnyDictSet)mockc                    sR   G dd dt   fddt d _t _ _dS )z@
    Converts a module-level config into a `ConfigModule()`
    c                   @   s   e Zd Ze ZdS )z3install_config_module.<locals>.ConfigModuleInstanceN)__name__
__module____qualname__set_bypass_keys r   r   c/var/www/html/stable-diffusion-webui/venv/lib/python3.9/site-packages/torch/_dynamo/config_utils.pyConfigModuleInstance   s   r   c              	      s  t | j D ]\}}|dst|ttfr0q| | }t|trr|u rrt| t	 ||  j
| qt|tr||< |u rt| qt|tr|jjksJ t| d}||| d t	||| qtd| d| dt| dqdS )z?Walk the module structure and move everything to module._config__.zUnhandled config =z ()N)list__dict__items
startswith
isinstancer   r   propertydelattrsetattrr   addCONFIG_TYPEStyper	   r   SubConfigProxyAssertionError)sourcedestprefixkeyvaluenameproxyr   configmodulevisitr   r   r+      s$    


z$install_config_module.<locals>.visit N)ConfigModuledict_configr   keys_allowed_keys	__class__)r*   r   r(   r   install_config_module   s    r3   c                       s   e Zd ZU eeef ed< ee ed< ee ed< dd Z fddZ	dd	 Z
d
d Zdd Zdd Zdd ZdddZ  ZS )r-   r/   r1   r   c                 C   s   t dt dd S )Nzuse z-.install_config_module(sys.modules[__name__]))NotImplementedErrorr   selfr   r   r   __init__:   s    
zConfigModule.__init__c                    sJ   || j v rt || n,|| jvr<t| j d| dn
|| j|< d S Nr   z does not exist)r   super__setattr__r1   AttributeErrorr   r/   r6   r&   r%   r2   r   r   r:   ?   s
    

zConfigModule.__setattr__c                 C   s:   z| j | W S  ty4   t| j d| dY n0 d S r8   )r/   KeyErrorr;   r   r6   r&   r   r   r   __getattr__G   s    zConfigModule.__getattr__c                 C   s   | j |= d S Nr/   r?   r   r   r   __delattr__N   s    zConfigModule.__delattr__c                 C   s4   t | j}|ddD ]}|| qtj|ddS )z Convert config to a pickled blobZ_save_config_ignorer      )protocol)r.   r/   getpoppickledumps)r6   r)   r$   r   r   r   save_configS   s    
zConfigModule.save_configc                 C   s   |   t| dS )z*Restore from a prior call to save_config()N)to_dictupdaterH   loads)r6   datar   r   r   load_configZ   s    zConfigModule.load_configc                 C   s   | j S rA   rB   r5   r   r   r   rK   ^   s    zConfigModule.to_dictNc                    sz   |dur(|dur||i n| |r8J n| |du s8J t  tsTJ dt  i | G  fd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):
                ...
        Nzexpected `dict` got c                       s*   e Zd Z fddZfddZdS )z'ConfigModule.patch.<locals>.ConfigPatchc                    s4   rJ    D ]}j| |< qj  d S rA   )r0   r/   rL   )r6   r$   changesr)   priorr   r   	__enter__   s    z1ConfigModule.patch.<locals>.ConfigPatch.__enter__c                    s    j    d S rA   )r/   rL   clear)r6   exc_typeexc_valexc_tb)r)   rR   r   r   __exit__   s    z0ConfigModule.patch.<locals>.ConfigPatch.__exit__N)r   r	   r
   rS   rX   r   rP   r   r   ConfigPatch   s   rY   )r   r.   r   ContextDecorator)r6   Zarg1Zarg2kwargsrY   r   rP   r   patcha   s    

zConfigModule.patch)NN)r   r	   r
   r   strr   __annotations__r   r7   r:   r@   rC   rJ   rO   rK   r\   __classcell__r   r   r=   r   r-   5   s   
r-   c                       s    e Zd ZdZ fddZ  ZS )rZ   z[
    Same as contextlib.ContextDecorator, but with support for
    `unittest.TestCase`
    c                    sB   t |tr6t|tjr6G  fddd|}|j|_|S t |S )Nc                       s4   e Zd Ze fddZe fddZ  ZS )z,ContextDecorator.__call__.<locals>._TestCasec                    s>      zt   W n" ty8   d d d   Y n0 d S rA   )rS   r9   
setUpClass	ExceptionrX   clsr2   r6   r   r   r`      s    z7ContextDecorator.__call__.<locals>._TestCase.setUpClassc                    s2   zt    W d d d  nd d d  0 d S rA   )r9   tearDownClassrX   rb   rd   r   r   re      s    z:ContextDecorator.__call__.<locals>._TestCase.tearDownClass)r   r	   r
   classmethodr`   re   r_   r   r5   r=   r   	_TestCase   s   rg   )r   r   
issubclassunittestZTestCaser   r9   __call__)r6   funcrg   r=   r5   r   rj      s
    zContextDecorator.__call__)r   r	   r
   __doc__rj   r_   r   r   r=   r   rZ      s   rZ   c                       s8   e Zd ZdZ fddZdd Zdd Zdd	 Z  ZS )
r   zn
    Shim to redirect to main config.
    `config.triton.cudagraphs` maps to _config["triton.cudagraphs"]
    c                    s    t  d| t  d| d S )Nr/   _prefix)r9   r:   )r6   r)   r#   r=   r   r   r7      s    zSubConfigProxy.__init__c                 C   s   | j | j| |S rA   )r/   r:   rm   r<   r   r   r   r:      s    zSubConfigProxy.__setattr__c                 C   s   | j | j| S rA   )r/   r@   rm   r?   r   r   r   r@      s    zSubConfigProxy.__getattr__c                 C   s   | j | j| S rA   )r/   rC   rm   r?   r   r   r   rC      s    zSubConfigProxy.__delattr__)	r   r	   r
   rl   r7   r:   r@   rC   r_   r   r   r=   r   r      s
   r   c                 C   s&   t | tr| ||S tj| ||S )z@
    Workaround `mock.patch.object` issue with ConfigModule
    )r   r-   r\   r   object)objr&   r%   r   r   r   patch_object   s    
rp   )
contextlibrH   ri   typesr   r   typingr   r   r   r   intfloatboolr   r]   r   r   tupler.   r   r3   r-   rZ   r   rp   r   r   r   r   <module>   s   (\ 