o
    ߗix                     @   s  U d dl Z 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
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eZeddG dd dZedde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fd%d&Z"dS )(    N)contextmanager)Enum)AnyDictListOptional   )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)is_backward_compatiblec                   @   s   e Zd ZdZdZdS )r   createreplaceN)__name__
__module____qualname__CREATEREPLACE r    r    P/home/ubuntu/transcripts/venv/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d 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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   sj   || _ || _|r-| j|jt|jt|jd| _d|j	v r(t
|j	d | _d S g | _d S d | _g | _d S )Nr&   r.   )r,   r-   r+   r"   r)   r#   idgraphr/   metacopydeepcopyr.   )r'   r1   r,   r-   r    r    r!   r(   8   s   

zNodeSource.__init__returnc                 C      | j r| j jS dS Nr0   )r/   r"   r'   r    r    r!   r"   M      zNodeSource.namec                 C   r8   r9   )r/   r#   r:   r    r    r!   r#   Q   r;   zNodeSource.targetc                 C   r8   )N)r/   r$   r:   r    r    r!   r$   U   r;   zNodeSource.graph_idc                 C   s   |   S r%   )print_readabler:   r    r    r!   __repr__Y   s   zNodeSource.__repr__r   c                 C   sh   |dkrdS d}|d| d d| j  d| j d| j d| j d		 7 }| jD ]}|||d
 7 }q&|S )N	   r0       z(name=z, pass_name=z	, action=z, graph_id=z)
r   )r"   r,   r-   r$   r.   r=   )r'   indentresultitemr    r    r!   r=   \   s   
$
zNodeSource.print_readablec                 C   s(   | j | j| j| j| jdd | jD dS )Nc                 S      g | ]}|  qS r    to_dict).0r1   r    r    r!   
<listcomp>p       z&NodeSource.to_dict.<locals>.<listcomp>r"   r#   r$   r,   r-   r.   rK   r:   r    r    r!   rG   h   s   zNodeSource.to_dict)r0   N)r   )r   r   r   __doc__r+   r)   __annotations__r   r   r   r(   propertyr"   r#   r*   r$   r>   r=   dictrG   r    r    r    r!   r   &   s2   
 

r   c                  c   s2    t } t }zda d V  W | a |ad S | a |aw )NT)should_preserve_node_metar   r5   )saved_should_preserve_node_metasaved_current_metar    r    r!   r   t   s   r   stackc                 C   s"   t r| rd| td< d S d S d S )Nr0   stack_trace)rP   joinr   )rS   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   rP   r   get)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 )NrW   r   r   rV   r<   rX   )current_levelr    r    r!   r      s   
r   r7   c                   C   s(   t r	tddgS tt d d S )NrT   r0   r<   )rP   r   rY   	tracebackformat_listextract_stackr    r    r    r!   r      s   r   c                   C      t S r%   )rP   r    r    r    r!   r         r   r0   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.   )rP   r4   r   r5   r   r   r   )r1   r,   
saved_metar    r    r!   r      s   


r   c                   C   r_   r%   )r   r    r    r    r!   r      r`   r   r3   c                 C   sL   i }| j D ]}|jdkr d|jv rdd |jd D ng ||j< qt|S )zh
    Given an fx.Graph, return a json string that contains the provenance information of each node.
    call_functionr.   c                 S   rE   r    rF   )rH   sourcer    r    r!   rI      rJ   z-get_graph_provenance_json.<locals>.<listcomp>)nodesopr4   r"   jsondumps)r3   provenance_tracking_jsonr1   r    r    r!   r      s   



r   )r0   )#r5   rf   r\   
contextlibr   enumr   typingr   r   r   r   _compatibilityr	   r3   r
   r1   r   __all__r   r)   rM   rP   r   r   r   r   r   r   r   boolr   r   r   r   r    r    r    r!   <module>   sH   
M

