U
    ªÊ¹j”  ã                	   @   s®   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
 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                    s^   G dd„ dt ƒ}‡ ‡‡‡fdd„‰tƒ ‰ 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   úY/var/www/html/bwave/python/venv/lib/python3.8/site-packages/torch/_dynamo/config_utils.pyÚConfigModuleInstance   s   r   c              	      sÚ   t | j ¡ ƒD ]Æ\}}| d¡st|ttfƒr0q|› |› �}t|tƒrj|ˆ |< |ˆ|< |ˆkrÔtˆ|ƒ qt|t	ƒr´|j
ˆjks„t‚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   ÚCONFIG_TYPESÚdelattrÚtyper	   r   ÚAssertionErrorÚSubConfigProxyÚsetattr)ÚsourceÚdestÚprefixÚkeyÚvalueÚnameÚproxy©ÚconfigÚdefaultÚmoduleÚvisitr   r   r*      s    

z$install_config_module.<locals>.visitÚ N)ÚConfigModuleÚdictÚ_configÚ_defaultr   ÚkeysÚ_allowed_keysÚ	__class__)r)   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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„ Zdd„ Zddd„Z‡  ZS )r,   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 krtƒ  ||¡ n,|| jk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:   D   s
    

zConfigModule.__setattr__c                 C   s<   z| j | W S  tk
r6   t| j› d|› d�ƒ‚Y nX d S r8   )r.   ÚKeyErrorr;   r   ©r6   r$   r   r   r   Ú__getattr__L   s    zConfigModule.__getattr__c                 C   s   | j |= d S ©N©r.   r?   r   r   r   Ú__delattr__S   s    zConfigModule.__delattr__c                 C   s4   t | jƒ}| dd¡D ]}| |¡ qtj|dd�S )z Convert config to a pickled blobÚ_save_config_ignorer   é   )Úprotocol)r-   r.   ÚgetÚpopÚpickleÚdumps)r6   r'   r"   r   r   r   Úsave_configX   s    
zConfigModule.save_configc                 C   sf   g }| j }| j ¡ D ]F\}}|| j dd¡kr0q|| j| kr@q| |› d|› d|›�¡ qd |¡S )z•Convert config to Python statements that replicate current config.
        This does NOT include config settings that are at default values.
        rD   r   r   z = Ú
)r   r.   r   rG   r/   ÚappendÚjoin)r6   ÚlinesÚmodÚkÚvr   r   r   Úcodegen_config_   s    zConfigModule.codegen_configc                 C   s   |   ¡  t |¡¡ dS )z*Restore from a prior call to save_config()N)Úto_dictÚupdaterI   Úloads)r6   Údatar   r   r   Úload_configm   s    zConfigModule.load_configc                 C   s   | j S rA   rB   r5   r   r   r   rT   q   s    zConfigModule.to_dictc                 C   s   t  | j¡S rA   )ÚcopyÚdeepcopyr.   r5   r   r   r   Úget_config_copyt   s    zConfigModule.get_config_copyNc                    sz   |dk	r(|dk	r||i‰ n|‰ |r8t ‚n|‰ |dks8t ‚tˆ tƒsTt 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t ‚ˆ  ¡ D ]}ˆj| ˆ|< qˆj ˆ ¡ d S rA   )r   r0   r.   rU   )r6   r"   ©Úchangesr'   Úpriorr   r   Ú	__enter__™   s    z1ConfigModule.patch.<locals>.ConfigPatch.__enter__c                    s   ˆ j  ˆ¡ ˆ ¡  d S rA   )r.   rU   Úclear)r6   Úexc_typeÚexc_valÚexc_tb)r'   r^   r   r   Ú__exit__    s    z0ConfigModule.patch.<locals>.ConfigPatch.__exit__N)r   r	   r
   r_   rd   r   r\   r   r   ÚConfigPatch˜   s   re   )r   r   r-   r   ÚContextDecorator)r6   Zarg1Zarg2Úkwargsre   r   r\   r   Úpatchw   s    

zConfigModule.patch)NN)r   r	   r
   r   Ústrr   Ú__annotations__r   r7   r:   r@   rC   rK   rS   rX   rT   r[   rh   Ú__classcell__r   r   r=   r   r,   4   s   
r,   c                       s    e Zd ZdZ‡ fdd„Z‡  ZS )rf   z[
    Same as contextlib.ContextDecorator, but with support for
    `unittest.TestCase`
    c                    sR   t |tƒrFt|tjƒrFG ‡ fdd„d|ƒ}|j|_|j|_|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k
r:   ˆ d d d ¡ ‚ Y nX d S rA   )r_   r9   Ú
setUpClassÚ	Exceptionrd   ©Úcls©r2   r6   r   r   rl   ±   s    z7ContextDecorator.__call__.<locals>._TestCase.setUpClassc                    s$   ztƒ  ¡  W 5 ˆ  d d d ¡ X d S rA   )rd   r9   ÚtearDownClassrn   rp   r   r   rq   º   s    z:ContextDecorator.__call__.<locals>._TestCase.tearDownClass)r   r	   r
   Úclassmethodrl   rq   rk   r   r5   r=   r   Ú	_TestCase°   s   rs   )
r   r   Ú
issubclassÚunittestZTestCaser   r
   r	   r9   Ú__call__)r6   Úfuncrs   r=   r5   r   rv   ­   s    zContextDecorator.__call__)r   r	   r
   Ú__doc__rv   rk   r   r   r=   r   rf   §   s   rf   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:   ry   r<   r   r   r   r:   Õ   s    zSubConfigProxy.__setattr__c                 C   s   | j  | j| ¡S rA   )r.   r@   ry   r?   r   r   r   r@   Ø   s    zSubConfigProxy.__getattr__c                 C   s   | j  | j| ¡S rA   )r.   rC   ry   r?   r   r   r   rC   Û   s    zSubConfigProxy.__delattr__)	r   r	   r
   rx   r7   r:   r@   rC   rk   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,   rh   r   Úobject)Úobjr$   r#   r   r   r   Úpatch_objectß   s    
r|   )Ú
contextlibrY   rI   ru   Útypesr   r   Útypingr   r   r   r   ÚintÚfloatÚboolr   ri   r   r   Útupler-   r   r3   r,   rf   r   r|   r   r   r   r   Ú<module>   s   &s#