U
    zh'                     @   s  d dl Z d dlZd dlmZ d dlmZmZmZ d dlZd dl	m
Z
 d dlmZ d dlmZ d dlmZ dd	lmZ dd
lmZ edd Zedd Zedd Zedd Zedddd Zdd Zeee
ddZeded eeddZeded dd  Zed ed eed!Zed"ed G d#d$ d$e Z!G d%d& d&e Z"eej#j$d'd(d)Z%eej#j$d'd*d+Z&eej#j$d'd,d-Z'eej#j$d'd.d/Z(e j)G d0d1 d1Z*ej#j$d'd2d3Z+G d4d5 d5Z,dS )6    N)import_module)AnyListOptional)#min_cut_rematerialization_partition)_guards)config)
ts_compile   )aot_autograd)register_debug_backendc                 C   s   | j S N)forwardgmfake_tensor_inputs r   R/var/www/html/venv/lib/python3.8/site-packages/torch/_dynamo/backends/debugging.pyeager   s    r   c                    s    fdd}|S )Nc               
      sB   z
 |  W S  t k
r< } ztjjd|W 5 d }~X Y nX d S )Nz7Unexpected exception when running generated GraphModule)	ExceptiontorchZ_dynamoexcZTorchDynamoException)argser   r   r   inner   s    
zeager_noexcept.<locals>.innerr   r   r   r   r   r   r   eager_noexcept   s    r   c                    s4   ddl m}  fdd}||dd| }|  |S )Nr   )make_fxc                     s   t j j|  S r   r   fxInterpreterrunr   r   r   r   runnable_gm.   s    z'pre_dispatch_eager.<locals>.runnable_gmT)Zpre_dispatch)Z"torch.fx.experimental.proxy_tensorr   Zprint_readable)r   r   r   r$   Zpre_dispatch_gmr   r   r   pre_dispatch_eager*   s
    r%   c                    s   ddl m   fdd}|S )Nr   )SchemaCheckModec               
      s0       t jj|  W  5 Q R  S Q R X d S r   r   r#   r&   r   r   r   r   >   s    zeager_debug.<locals>.inner)Z#torch._subclasses.schema_check_moder&   r   r   r'   r   eager_debug7   s    r(   ts)namec                 C   s   t j| S r   )r   Zjitscriptr   r   r   r   torchscriptE   s    r,   c                    s    fdd}d|_ |S )Nc                    s   t j | S r   )r   r    r!   Z	boxed_runr#   fx_gr   r   r"   L   s    zboxed_nop.<locals>.runT)Z_boxed_call)r.   example_inputsr"   r   r-   r   	boxed_nopK   s    r0   T)fw_compilerpartition_fnkeep_inference_input_mutations	aot_eager)r*   Zcompiler_fn)r1   r3   aot_eager_default_partitionerc              
   C   sH   t jdd2 tttdd tjtddd| |W  5 Q R  S Q R X d S )NT)Zunlift_effect_tokensc                   S   s   t d S )Nztorch._inductor.compile_fx)r   Zselect_decomp_tabler   r   r   r   <lambda>o   s   z,aot_eager_decomp_partition.<locals>.<lambda>Zinductor)compiler)r1   Zbw_compilerZdecompositionsr2   )functorch_configpatchr   r0   	functoolspartialr   r   r   r   r   aot_eager_decomp_partitionh   s      r<   )r1   aot_tsc                   @   s   e Zd ZdS )ReluCompileErrorN__name__
__module____qualname__r   r   r   r   r>      s   r>   c                   @   s   e Zd ZdS )TestingOnlyCompileErrorNr?   r   r   r   r   rC      s   rC   r   c                 C   s"   | j jD ]}|jtjkrtq| S r   )graphnodestargetr   relur>   r   r/   noder   r   r   relu_compile_error_TESTING_ONLY   s    rJ   c                 C   s4   | j jD ]}|jtjkrtj|_d|_q|   | S )N)FZReluRuntimeError)rD   rE   rF   r   rG   Z_assertr   	recompilerH   r   r   r   relu_runtime_error_TESTING_ONLY   s    rL   c                 C   s>   | j jD ](}|jtjkrtj|_|jd df|_q|   | S )Nr   r
   )rD   rE   rF   r   rG   addr   rK   rH   r   r   r    relu_accuracy_error_TESTING_ONLY   s    rN   c                 C   s8   | j jD ]}|jdkr q q| S |D ]}|js$tq$| S )Ncall_function)rD   rE   opZis_leafrC   )r   r/   rI   tr   r   r   #non_leaf_compile_error_TESTING_ONLY   s    
rR   c                   @   s   e Zd ZU dZeejj ed< e	ed< e	ed< ee
 ed< e	ed< dZeeejj  ed< dZeeej  ed	< dZee ed
< dd ZdS )ExplainOutputzu
    This is the output of :func:`torch._dynamo.explain()`
    There is no reason to create this class directly.
    graphsgraph_countgraph_break_countbreak_reasonsop_countNops_per_graph
out_guardscompile_timesc           	      C   s^  d| j  d}|d| j d7 }|d| j d7 }|d7 }t| jD ]R\}}|d|d  d7 }|d	|j d7 }|d
7 }|jD ]}|d| d7 }qqD| jd k	r|d7 }t| jD ]6\}}|d|d  d7 }|D ]}|d| d7 }qq| jd k	r<|d7 }t| jD ]0\}}|d|d  d7 }|dt	| 7 }q
| j
d k	rZ|d| j
 d7 }|S )NzGraph Count: 
zGraph Break Count: z
Op Count: zBreak Reasons:
z  Break Reason r
   z:
z    Reason: z    User Stack:
z      zOps per Graph:
z  Ops z    zOut Guards:
z  Guard zCompile Times: )rU   rV   rX   	enumeraterW   reasonZ
user_stackrY   rZ   strr[   )	selfoutputidxZbreak_reasonframe_summaryopsrP   iguardr   r   r   __str__   s0    

zExplainOutput.__str__)r@   rA   rB   __doc__r   r   r    GraphModule__annotations__intr   rY   r   NoderZ   r   ZGuardr[   r_   rg   r   r   r   r   rS      s   
rS   c                 C   sT   | |  dd | jjD }|t|7 }| | | jjrF| | j | ||||fS )a  
    This function is a utility which processes a torch.fx.GraphModule and
    accumulates information about its ops, graph breaks, and other details. It
    is intended to be used by the ExplainWithBackend class and
    `torch._dynamo.explain()` to provide details from Dynamo's graph capture.

    Parameters:
        gm (torch.fx.GraphModule): The GraphModule to be processed.
        graphs (list): A list that accumulates all the GraphModules processed.
        op_count (int): The total count of operations in all GraphModules processed so far.
        ops_per_graph (list): A list that accumulates the operations of each GraphModule.
        break_reasons (list): A list that accumulates the reasons for breaks in each GraphModule.

    Returns:
        tuple: A tuple containing the processed GraphModule, the updated lists of graphs,
               operations per graph, and break reasons, and the updated operation count.
    c                 S   s   g | ]}|j d kr|jqS )rO   )rP   rF   ).0rI   r   r   r   
<listcomp>  s     
 z)_explain_graph_detail.<locals>.<listcomp>)appendrD   rE   lenZcompile_subgraph_reasonZgraph_break)r   rT   rX   rY   rW   rd   r   r   r   _explain_graph_detail   s    

rq   c                   @   s8   e Zd ZdZdd ZejjdddZe	ddd	Z
d
S )ExplainWithBackenda  
    This class is intended to be used as a backend for `torch.compile`. It is
    composable with other backends. When used in this way, it accumulates
    information about graph breaks, ops, and other info and provides a string
    representation summarizing this information.

    Attributes:
        backend (str): The name of the backend to use for optimization.
        graphs (list): A list of the graphs captured by TorchDynamo.
        op_count (int): The total number of operations in all optimized graphs.
        break_reasons (list): A list of graph break reasons with stack traces.

    Example Usage:
        def fn(x):
            x = torch.sigmoid(x)
            return x

        torch._dynamo.reset()
        eb = ExplainWithBackend("inductor")
        optimized_fn = torch.compile(fn, backend=eb)
        result = optimized_fn(torch.randn(5))
        print(eb.output())
    c                 C   s,   ddl m} ||| _g | _d| _g | _d S )Nr
   )lookup_backendr   )registryrs   backendrT   rX   rW   )r`   ru   rs   r   r   r   __init__#  s
    
zExplainWithBackend.__init__r   c                 C   s2   t || j| jg | j\}| _| _}| _| ||S r   )rq   rT   rX   rW   ru   )r`   r   r/   _r   r   r   __call__+  s        zExplainWithBackend.__call__)returnc                 C   s(   t | j}t| j||d | j| j}|S )Nr
   )rp   rT   rS   rW   rX   )r`   rU   ra   r   r   r   ra   1  s    
zExplainWithBackend.outputN)r@   rA   rB   rh   rv   r   r    ri   rx   rS   ra   r   r   r   r   rr   
  s   rr   )-dataclassesr:   	importlibr   typingr   r   r   r   Zfunctorch.compiler   r   Ztorch._functorchr   r8   Ztorch._functorch.compilersr	   commonr   rt   r   Zregister_backendr   r   r%   r(   r,   r0   r4   r5   r<   r=   r   r>   rC   r    ri   rJ   rL   rN   rR   	dataclassrS   rq   rr   r   r   r   r   <module>   sr   





  	 
	
1