a
    h                     @   s  U d dl Z d dlZd dlmZ d dlmZ d dlmZmZm	Z	 ddl
mZ ddlmZ ddlmZ g d	Zi aeeef ed
< daeddG dd deZeddG dd dZedded(ddZeddee dddZedddd Zedddd Zeddee dddZeddedddZedded)d!d"Z eddeeef dd#d$Z!eddeeeef d%d&d'Z"dS )*    N)contextmanager)Enum)AnyOptionalUnion   )compatibility)Graph)Node)preserve_node_metahas_preserved_node_metaset_stack_traceset_grad_fn_seq_nrreset_grad_fn_seq_nrformat_stackset_current_metaget_current_meta
NodeSourceNodeSourceActionget_graph_provenance_jsoncurrent_metaF)Zis_backward_compatiblec                   @   s   e Zd ZdZdZdS )r   createreplaceN)__name__
__module____qualname__CREATEZREPLACE r   r   @/var/www/auris/lib/python3.9/site-packages/torch/fx/traceback.pyr      s   r   c                   @   s   e Zd ZU dZG dd dZeed< ed ed< ed  ed< ed ed< dee	 eee
ded f  dddZeedddZeedddZeedddZdd Zdd ZdddZedddZd
S ) r   z
    NodeSource is a data structure that contains the provenance information of a node.
    If node `a` is created from node `b`, then `a.meta["from_node"]` may contain NodeSource(b).
    c                   @   s   e Zd ZeeedddZdS )zNodeSource.NodeInfonametargetgraph_idc                 C   s   || _ || _|| _d S Nr   )selfr    r!   r"   r   r   r   __init__-   s    zNodeSource.NodeInfo.__init__N)r   r   r   strintr%   r   r   r   r   NodeInfo,   s   r(   	pass_namer   action	from_node	node_info N)noder)   r*   c                 C   s   || _ |d u rg }nt|ts$|g}|D ]}t|ts(J q(|| _|r| j|jt|jt	|j
d| _d|jv rt|jd ng | _nd | _g | _d S )Nr   r+   )r)   
isinstancelistr   r*   r(   r    r&   r!   idgraphr,   metacopydeepcopyr+   )r$   r.   r)   r*   ar   r   r   r%   7   s$    
zNodeSource.__init__returnc                 C   s   | j r| j jS dS Nr-   )r,   r    r$   r   r   r   r    S   s    zNodeSource.namec                 C   s   | j r| j jS dS r9   )r,   r!   r:   r   r   r   r!   W   s    zNodeSource.targetc                 C   s   | j r| j jS dS )N)r,   r"   r:   r   r   r   r"   [   s    zNodeSource.graph_idc                 C   s   |   S r#   )print_readabler:   r   r   r   __repr___   s    zNodeSource.__repr__c                 C   s   d dd | jD S )N+c                 S   s   g | ]}|j  qS r   )r    lower).0r6   r   r   r   
<listcomp>c       z1NodeSource._get_action_string.<locals>.<listcomp>)joinr*   r:   r   r   r   _get_action_stringb   s    zNodeSource._get_action_stringr   c                 C   sn   |dkrdS d}|   }|d| d d| j d| j d| d| j d		 7 }| jD ]}|||d
 7 }qR|S )N	   r-       z(name=z, pass_name=z	, action=z, graph_id=z)
r   )rD   r    r)   r"   r+   r<   )r$   indentresultaction_stringitemr   r   r   r<   e   s    
"
zNodeSource.print_readablec                 C   s.   |   }| j| j| j| j|dd | jD dS )Nc                 S   s   g | ]}|  qS r   to_dict)r@   r.   r   r   r   rA   {   rB   z&NodeSource.to_dict.<locals>.<listcomp>)r    r!   r"   r)   r*   r+   )rD   r    r!   r"   r)   r+   )r$   rJ   r   r   r   rM   r   s    zNodeSource.to_dict)r-   N)r   )r   r   r   __doc__r(   r&   __annotations__r0   r   r
   r   r%   propertyr    r!   r'   r"   r=   rD   r<   dictrM   r   r   r   r   r   %   s.   
  
r   Tc                 c   s>   | sd V  n.t }t }zda d V  W |a |an
|a |a0 d S )NT)should_preserve_node_metar   r4   )enableZsaved_should_preserve_node_metaZsaved_current_metar   r   r   r      s    r   stackc                 C   s   t r| rd| td< d S )Nr-   stack_trace)rR   rC   r   rT   r   r   r   r      s    r   c                 C   s2   t r.tdg | g td< tddd td< d S )Ngrad_fn_seq_nr
in_grad_fnr   r   rR   r   get)Zseq_nrr   r   r   r      s
    

r   c                  C   sV   t rRtdd} | dksJ | dkr2td= td= n | d td< td d d td< d S )NrX   r   r   rW   r;   rY   )Zcurrent_levelr   r   r   r      s    r   r7   c                   C   s,   t rtddgS tt d d S d S )NrV   r-   r;   )rR   r   rZ   	tracebackformat_listextract_stackr   r   r   r   r      s    r   c                   C   s   t S r#   )rR   r   r   r   r   r      s    r   r-   c                 c   sN   t rD| jrDt}z,| j at| |tjgtd< d V  W |aqJ|a0 nd V  d S )Nr+   )rR   r3   r   r4   r   r   r   )r.   r)   Z
saved_metar   r   r   r      s    

r   c                   C   s   t S r#   )r   r   r   r   r   r      s    r   )r2   r8   c                 C   sF   i }| j D ]6}|jdkr
d|jv r6dd |jd D ng ||j< q
|S )za
    Given an fx.Graph, return a json that contains the provenance information of each node.
    call_functionr+   c                 S   s   g | ]}|  qS r   rL   )r@   sourcer   r   r   rA      rB   z-get_graph_provenance_json.<locals>.<listcomp>)nodesopr3   r    )r2   Zprovenance_tracking_jsonr.   r   r   r   r      s    


r   )T)r-   )#r4   r[   
contextlibr   enumr   typingr   r   r   Z_compatibilityr   r2   r	   r.   r
   __all__r   rQ   r&   rO   rR   r   r   r   r0   r   r   r   r   boolr   r   r   r   r   r   r   r   <module>   sD   
Y

