o
    Zh                     @   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dee fddZedddd Zedddd Zedddee fddZedddefddZedded)d!d"Z edddeeef fd#d$Z!eddd%edeeef f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   A/var/www/auris/lib/python3.10/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dee	 dedee
ded f  fddZedefddZedefddZedefddZdd Zdd ZdddZdef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dededefddZdS )zNodeSource.NodeInfonametargetgraph_idc                 C   s   || _ || _|| _d S Nr   r    r!   )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nodec                 C   s   || _ |d u r
g }nt|ts|g}|D ]	}t|tsJ q|| _|rH| j|jt|jt	|j
d| _d|jv rCt|jd | _d S g | _d S 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      | j r| j jS dS Nr-   )r,   r   r$   r   r   r   r   S      zNodeSource.namec                 C   r8   r9   )r,   r    r:   r   r   r   r    W   r;   zNodeSource.targetc                 C   r8   )N)r,   r!   r:   r   r   r   r!   [   r;   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   s    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 }q)|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      g | ]}|  qS r   to_dict)rA   r.   r   r   r   rB   {       z&NodeSource.to_dict.<locals>.<listcomp>)r   r    r!   r)   r*   r+   )rD   r   r    r!   r)   r+   )r$   rJ   r   r   r   rN   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=   dictrN   r   r   r   r   r   %   s4   
 

r   Tc                 c   s@    | sd V  d S t }t }zda d V  W |a |ad S |a |aw )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 d S d S )Nr-   stack_trace)rT   rC   r   )rV   r   r   r   r      s   r   c                 C   s6   t rtdg | g td< tddd td< d S d S )Ngrad_fn_seq_nr
in_grad_fnr   r   rT   r   get)Zseq_nrr   r   r   r      s   

r   c                  C   s\   t r,tdd} | dksJ | dkrtd= td= d S | d td< td d d td< d S d S )NrY   r   r   rX   r<   rZ   )Zcurrent_levelr   r   r   r      s   
r   r7   c                   C   s(   t r	tddgS tt d d S )NrW   r-   r<   )rT   r   r[   	tracebackformat_listextract_stackr   r   r   r   r      s   r   c                   C      t S r"   )rT   r   r   r   r   r         r   r-   c                 c   sP    t r#| jr#t}z| j at| |tjgtd< d V  W |ad S |aw d V  d S )Nr+   )rT   r3   r   r4   r   r   r   )r.   r)   Z
saved_metar   r   r   r      s   


r   c                   C   r_   r"   )r   r   r   r   r   r      r`   r   r2   c                 C   sF   i }| j D ]}|jdkr d|jv rd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.
    Zcall_functionr+   c                 S   rL   r   rM   )rA   sourcer   r   r   rB      rO   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   rS   r&   rQ   rT   r   r   r   r0   r   r   r   r   boolr   r   r   r   r   r   r   r   <module>   sF   
Y

 