U
    zh                  
   @   s  U d dl Z d dlZd dlZd dlmZmZ d dl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Zi i i i i i i di i i i i i i i ddZe
ee
ee	f f ed	< G d
d deZG dd dZeee	df ef Zdd ZedddZeddG dd dZi Ze
eef ed< e Zee ed< i Ze
eee f ed< i Z e
eee f ed< eddddZ!dd  Z"d!d" Z#d#d$ Z$d%d& Z%eed'd(d)Z&dS )*    N)	dataclassfield)Enum)AnyDictListOptionalSetTupleUnion)
ModuleType)Zcondzdynamic-shapezescape-hatchmapzdynamic-valueoperatorZmutation)assertbuiltinclosurezcontext-managerzcontrol-flowzdata-structurezstandard-libraryzobject-model)torchpython_TAGSc                   @   s   e Zd ZdZdZdZdS )SupportLevelz[
    Indicates at what stage the feature
    used in the example is handled in export.
       r   N)__name__
__module____qualname____doc__	SUPPORTEDZNOT_SUPPORTED_YET r   r   G/var/www/html/venv/lib/python3.8/site-packages/torch/_export/db/case.pyr   #   s   r   c                   @   s   e Zd ZdZdd ZdS )
ExportArgsargskwargsc                 O   s   || _ || _d S Nr   )selfr    r!   r   r   r   __init__0   s    zExportArgs.__init__N)r   r   r   	__slots__r$   r   r   r   r   r   -   s   r   .c                 C   s$   t | ttfs tdt|  d S )Nz@Expecting inputs type to be either a tuple, or ExportArgs, got: )
isinstancer   tuple
ValueErrortypexr   r   r   check_inputs_type8   s    r,   )tagc                 C   sb   |  d}t}|D ]J}t|ttjd ks:td| ||krL|| }qtd|  dqd S )N.-z!Tag contains invalid characters: zTag z! is not found in registered tags.)splitr   setstringascii_lowercaseAssertionErrorr(   )r-   partstpartr   r   r   _validate_tag?   s    

r8   T)frozenc                   @   s   e Zd ZU eed< eed< ejjed< eed< dZ	e
e ed< eedZee ed< ejZeed	< dZe
eeef  ed
< dd ZdS )
ExportCaseexample_inputsdescriptionmodelnameNextra_inputs)default_factorytagssupport_leveldynamic_shapesc                 C   sb   t | j | jd k	rt | j | jD ]}t| q$t| jtrLt| jdkr^t	d| j dd S )Nr   zInvalid description: "")
r,   r;   r?   rA   r8   r&   r<   strlenr(   )r#   r-   r   r   r   __post_init__X   s    




zExportCase.__post_init__)r   r   r   
InputsType__annotations__rE   r   nnModuler?   r   r   r1   rA   r	   r   r   rB   rC   r   r   rG   r   r   r   r   r:   L   s   
r:   _EXAMPLE_CASES_MODULES_EXAMPLE_CONFLICT_CASES_EXAMPLE_REWRITE_CASES)casereturnc                 C   sH   | j tkr:| j tkr&t| j  gt| j < t| j  |  dS | t| j < dS )zA
    Registers a user provided ExportCase into example bank.
    N)r>   rL   rN   append)rP   r   r   r   register_db_casej   s    

rS   c                 C   s    t dd| } t dd|  S )Nz(.)([A-Z][a-z]+)z\1_\2z([a-z0-9])([A-Z]))resublower)r>   r   r   r   to_snake_casew   s    rW   c                 C   s^   t | tjjstd|  } d|krJ| jd k	s<td|  |d| ji}tf || |dS )Nz.Export case class should be a torch.nn.Module.r<   z9Could not find description or docstring for export case: )r=   r>   )
issubclassr   rJ   rK   	TypeErrorr   r4   r:   )mr>   configsr   r   r   _make_export_case|   s    r\   c                     s    fdd}|S )zK
    Decorator for registering a user provided case into example bank.
    c                    s    }t | }|tkrtd|d k	s*tt| t| j}|jdd }||kr|td|j dd| j d| d t	| ||}t
| |S )	Nz6export_case should only be used once per example file.r.   zModule name "z(" is inconsistent with exported program zname "z ". Please rename the module to "z".)inspect	getmodulerM   RuntimeErrorr4   addrW   r   r0   r\   rS   )rZ   r[   modulenormalized_namemodule_namerP   r!   r   r   wrapper   s"    


zexport_case.<locals>.wrapperr   r!   rf   r   re   r   export_case   s    rh   c                     s    fdd}|S )Nc                    s`    }| d}t|tst|j}|tkr2g t|< |j|d< t| t| j	|}t| 
| |S )Nparentr;   )popr&   r:   r4   r>   rO   r;   r\   rW   r   rR   )rZ   r[   ri   keyrP   re   r   r   rf      s    

z$export_rewrite_case.<locals>.wrapperr   rg   r   re   r   export_rewrite_case   s    rl   )r+   rQ   c                 C   s$   t | trt|  S t | ts t| S r"   )r&   r'   r   r4   r*   r   r   r   normalize_inputs   s    
rm   )'r^   rT   r2   dataclassesr   r   enumr   typingr   r   r   r   r	   r
   r   typesr   r   r   rE   rI   r   r   rH   r,   r8   r:   rL   r1   rM   rN   rO   rS   rW   r\   rh   rl   rm   r   r   r   r   <module>   sV    $

