o
     Ǝi                     @   s   d dl Z d dlZd dlmZ d dlmZmZ d dlZd dlm	  m
Z d dlmZmZmZ d dlmZ d dlmZmZ d dlmZmZ d dlmZmZ G d	d
 d
ejjZedddgZdejjdedejj f fddZ!dS )    N)
namedtuple)AnyCallable)	FrameInfofullgraph_captureget_compile_id)argument_names)dynamo_timedget_metrics_context)compile_contextCompileContext)_PyTreeCodeGen_PyTreeInfoc                       s<   e Zd Zdededdf fddZdeddfd	d
Z  ZS )ModuleToTracefooin_specreturnNc                    s   t    || _|| _d S N)super__init___export_rootr   )selfr   r   	__class__ [/home/jeff/fluffinator/venv/lib/python3.10/site-packages/torch/_dynamo/functional_export.pyr      s   

zModuleToTrace.__init__	flat_argsExportTracerOutputc                 G   s:   t || j\}}| j|i |}t |\}}t||S r   )pytreetree_unflattenr   r   tree_flattenr   )r   r   argskwargsresout_flatout_specr   r   r   forward   s   
zModuleToTrace.forward)__name__
__module____qualname__r   r   r&   __classcell__r   r   r   r   r      s    r   r   r   r%   modr   .c                    s"   dt dt dtjjf fdd}|S )z
    This is lower level API that is used for export to capture dynamo level
    torch IR.

    Notable TODOs:
    1. Are we actually gonna run the bytecode?
    2. Need to attach guards
    r!   r"   r   c            !         s^  t | |f\}}t |}t|j}|j| }|  d|i|j}t	|jj
j|jj
j|tdd}tjjdd}	ttti N t 9 td# |	 t|dd}
|
jjjd uscJ |
jjjj}|j}|j}|j}|
jj }i }|D ]}|| }t!|tjj"j#sJ t$|||j%< qzdd	 t&|j'j(D }t)d
d t&|j'j(D }t$|dkr|d n|}i }|j'*|2 t+t$|D ]#}|j',d| }||v r|||   |||  j-. |_-|||< qW d    n1 sw   Y  g }|D ]0}|| \}}|dkr|/|j0d |  |dkr"|j%}|/||  |dkr,|/| qt1|f|_0|2 D ]\}}|| }|| }|3| |j'4| q7ddl5m6}  | 7| W d    n	1 sfw   Y  W d    n	1 svw   Y  W d    n	1 sw   Y  W d    n	1 sw   Y  t8t9t:|| ||||j'_;|<  |S )Nr   r   )closurelog_graph_in_out_metadataTr   ) _is_export_deprecated_do_not_usec                 S   s   g | ]	}|j d kr|qS )placeholderop.0nr   r   r   
<listcomp>^   s    zC_dynamo_graph_capture_for_export.<locals>.inner.<locals>.<listcomp>c                 s   s    | ]
}|j d kr|V  qdS )outputNr0   r2   r   r   r   	<genexpr>_   s    zB_dynamo_graph_capture_for_export.<locals>.inner.<locals>.<genexpr>r   arg_	graph_outinputconstant)_LazyGraphModule)=r   r    r   inspect	signaturer&   bindapply_defaults	argumentsr   __func____code____globals__builtinstorch_dynamoconfigpatchr   r   r   r
   r	   r   dynamo_outputtracer_outputoutput_graphexport_metadatagraph_input_idx_to_local_sourceoutput_return_typer%   backend_inputgraph_module
isinstancesourceGetItemSourcelenindexlistgraphnodesnextinserting_beforeranger/   metacopyappendr!   tupleitemsreplace_all_uses_with
erase_nodetorch.fx._lazy_graph_moduler<   force_recompiler   r   r   _codegen	recompile)!r!   r"   flat_inputsr   module_to_tracer>   bound_argumentsf_localsframedynamo_config_ctxoutrM   graph_inputsrO   r%   rX   graph_input_orderinprS   placeholdersr6   anchorinp_to_nodeinode_newnew_argstypeval	input_idxsrc_idxoldnewr<   r+   r   r   inner+   s   








   A
z/_dynamo_graph_capture_for_export.<locals>.inner)r   rF   fxGraphModule)r+   r   r   r~   r    _dynamo_graph_capture_for_export   s   cr   )"rE   r=   collectionsr   typingr   r   rF   torch.utils._pytreeutils_pytreer   torch._dynamo.convert_framer   r   r   torch._dynamo.eval_framer   torch._dynamo.utilsr	   r
   torch._guardsr   r   torch.fx.graphr   r   nnModuler   r   r   r   r   r   r   r   r   <module>   s$    