
    `i                     Z   U d dl Z d dlZ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Zd dlZd dlmZ d dlmZ d dlmZmZ d dlmZ d d	lmZmZmZmZmZmZmZ d d
lm Z   ej!        e"          Z#d Z$d Z%deej&        j'        ej(        j)        f         dee	         de*ej+        e,d         e	eej-                 f         fdZ.d Z/d Z0d Z1dej2        j3        fdZ4d Z5d@de6de6de6fdZ7de6de6fdZ8d Z9ej:        d ej;        dej<        dej=        d ej>        d!ej?        d"ej@        d#ejA        d$ejB        d%ejC        d&ejD        d'ejE        d(ejF        d)ejG        d*ejH        d+iZId, eIJ                                D             ZKd- ZLe jM        e jN        ejO        ejP        ejQ        ejR        ejS        eLeTejU        jV        jW        ejU        jV        jX        ejU        jV        jY        ejU        jV        jZ        d.Z[e\e6e
d/e	f         f         e]d0<   d1 Z^d2 Z_d3ej        j+        de*e\ej        j`        eae6         f         e\e6e6f         f         fd4Zbd5e\e6e6f         d6ej        jc        de6fd7Zdd6ej        jc        fd8Ze G d9 d:          Zf G d; d<ef          Zged=             Zh G d> d?          ZidS )A    N)Sequence)contextmanager)AnyCallableOptionalUnion)_C)'replace_quantized_ops_with_standard_ops)_tree_map_with_pathDim)ExportedProgram)ConstantArgumentCustomObjArgument	InputKind	InputSpec
OutputKind
OutputSpecTensorArgument)subgraph_rewriterc                 X   g }t          |                                 |          D ]\  }}dt          |                                          v rEt          j                            |          \  }}|                    t          |                     m|                    |d u           |S )NPackedParams)	zipinputsstrtypetorchjit_flattenappendlen)method_graphargs_paramsparam_count_listinput_arg_params_in_vars_s          k/home/jaya/work/projects/VOICE-AGENT/VIET/agent-env/lib/python3.11/site-packages/torch/_export/converter.py_get_param_count_listr)   "   s    "<#6#6#8#8+FF = =S////++K88JGQ##CLL1111##Kt$;<<<<    c                    t           j                            |                                           }t          j                    }t          j        d           t           j                            | |ddd          \  }}}t          j        |           |t           j                            |                                           k    rt          d          ||fS )NFT)strict_force_outplace_return_inputs_stateszXstate_dict changed after running the tracer; something weird is happening in your model!)r   r   _unique_state_dictkeysis_autocast_cache_enabledset_autocast_cache_enabled_get_trace_graphRuntimeError)modelargsorig_state_dict_keysprev_autocast_cache_enabledtrace_graph	torch_out_inputs_statess          r(   _trace_and_get_graph_from_modelr<   .   s     !977>>CCEE
 #("A"C"C	$U+++-2Y-G-G" .H . .*KN 
$%@AAAuy;;EBBGGIIII:
 
 	

 	!!r*   r5   r6   returnz	_C.IValuec                 D   t          | t          j        j        t          j        j        f          rt          t          j                            t          |                    d                   }d }t          | t          j        j                  r)	 | j        j        }n"# t          $ r}t          d          |d }~ww xY wt          j        |           t          j        t          j        t          j        | j                  d          }t          j        |          \  }}|                    d          j        }	t          |          t          |          z   }
t'          |	|
          }t          j                            |
          \  }}t          j        |	t          |          |dd          }||||fS g }| j        }t          j        |           t'          ||          }t          j        |||dd          }|||d fS t+          | |          \  }}t          j        |           t          j                            |           }t1          |                                          }t1          |                                          }t7          |          t7          |          z
  }t1          |                                          }t;          |          D ])\  }}||k    r|                    |||z
                      *t          j        |           |||d fS )Nr   z('forward' method must be a script methodT)preserveParametersforwardF)
isinstancer   r   ScriptFunctionScriptModuletupler   r@   graphAttributeErrorr4   r	   $_jit_pass_onnx_function_substitution_freeze_moduletypingcast_c_jit_onnx_list_model_parameters_get_methodr)   "_propagate_and_assign_input_shapesr<   _jit_pass_onnx_lintr/   listvaluesr   r    r0   	enumeratesetDebugName)r5   r6   flattened_argsr:   rE   efreezed_modulemoduleparamsr!   r"   r#   r&   r'   
state_dictgraph_inputsuser_input_numparam_namesiinps                       r(   _create_jit_graphr_   J   s    %%)2EI4JKLL .uy11%++>>qABB	eUY344 	4V+! V V V"#MNNTUUV3E:::.BOUX664  N  ?OONFF!--i88>L++f5K4\;OO++K88JGQ9eGnn.>u E &)V33 
/6660==5>#3UE
 
 fi--6udCCE95!!!--e44J*##%%&&F''L&&Z8Nz(())KL)) > >3[^);<===+E222&)T))s   B! !
C +B;;C c                     | |z   S N )abs     r(   list_addre   |   s    q5Lr*   c                     | |gz   S ra   rb   )	containerelements     r(   list_appendri      s    y  r*   c                 H    |d|         }||d         } | g |||R i |S )z
    subgraph: GraphModule from sub-block.
    iter_idx: The index of interaction.
    len_loop_local_arguments: The number of loop local arguments in args.
    Nrb   )subgraphiter_idxlen_loop_local_argumentsr6   kwargsloop_local_argsglobal_argss          r(   execute_subgraph_from_prim_looprq      sP     4445O
 /001K8G[G(G_GGGGGGr*   gmc                 >    d }d }t          j        | ||           d S )Nc                 L   t           j        j        j                            | |          }t           j        j                            |          }t           j        j        j                            ||d          }t           j        j        j        	                    |          }|S )Ntrunc)rounding_mode)
r   opsatensym_sizeintscalar_tensordivScalar_modeIntTensor)imdimscalesym_size_intr{   div_scalar_mode
int_tensors          r(   patternz.inplace_optimize_sym_size_div.<locals>.pattern   s    y~.222s;;	44\BB).,885 9 
 
 Y^'..??
r*   c                 `    t           j        j        j                            | |          }||z  S ra   )r   rw   rx   ry   rz   )r   r   r   r   s       r(   replacementz2inplace_optimize_sym_size_div.<locals>.replacement   s)    y~.222s;;u$$r*   )r   replace_pattern)rr   r   r   s      r(   inplace_optimize_sym_size_divr      s=      % % % %b';?????r*   c                     t          |           dk    rt          d          | d                                         rdS dS )Nr   zEmpty argument name for codegenFT)r    r4   isdigitnames    r(   is_valid_for_codegenr      s@    
4yyA~~<===Aw u4r*   renamer   prefixc                 ^    |                      dd          } t          |           r| S | d|  S )N.r'   )replacer   )r   r   s     r(   normalize_namer      s>    <<S!!DD!! tr*   c                 \    |                      d          }dd                    |          z   S )zprim::If -> convert_prim_If::convert_r'   )splitjoin)r   	name_lists     r(   ir_name_to_func_namer      s*    

4  I++++r*   c                 Z    |r|                      |          S |                     |          S ra   )get_attrplaceholder)fx_graphr   is_top_level_graphs      r(   #get_node_as_placeholder_or_get_attrr      s2     '  &&&%%%r*                           	   
               c                     i | ]\  }}||	S rb   rb   ).0keyvalues      r(   
<dictcomp>r      s    RRRzsEsRRRr*   c                 `    | j         }|t          vrt          d|           t          |         S )z
    prim::dtype has the signature "Tensor a) -> int", where it gets the dtype of
    the tensor and returns the integer corresponding to this dtype based on the
    enum in ScalarType.h
    zUnsupported dtype )dtype_TORCH_DTYPE_TO_ENUMr4   )tensorr   s     r(   get_dtype_as_intr      s9     LE(((777888&&r*   )z	prim::maxz	prim::minzprim::TupleIndexzaten::__is__zaten::__isnot__zaten::__not__zaten::__contains__zprim::dtypez	aten::lenzaten::numelz
aten::sizezaten::storage_offsetzaten::stride.kind_to_standard_operatorsc                     |                                                                  |                                                                 }}|                     d          }|||fS )Nr   )input	debugNameoutputs)nodeirv_parent_nameirv_name	attr_names       r(   &get_ir_value_parent_name_and_attr_namer      sO     $

 6 6 8 8$++--:Q:Q:S:SXOvI_i//r*   c                     g }| |v r'|                     ||                     ||          } | |v 'd                    t          |                    S Nr   )r   r   reversed)irref_mapname_mapr   s       r(   construct_fqnr     sX    I
--"&&&R[ -- 88HY''(((r*   rE   c                 j    i i i fdfd |             |            fS )a  
    Perform two passes to get a mapping of blocks to a set of FQNs of its lifted attributes.
    When a graph has control flow, the graph will be divided into multiple blocks. We want to convert
    each block to a graph which will be passed into torch.cond. A restriction for torch.cond is that model
    parameters/buffers are expected to be lifted as inputs to the subgraphs. Before converting the model,
    we will run this pass which will:
        1. Figure out which params/buffers are used within blocks through tracing the GetAttr calls.
        2. Process the graph bottom up to find the lifted attributes of each block by taking the union
        of the attributes used in the current block, and the lifted attributes of all its child blocks.

    Returns:
        A mapping of blocks to a set of FQNs of its lifted attributes, and a
        mapping of node names to the FQNs of its lifted attributes.
    c                     |                                  D ]Y}|                                dk    rt          |          \  }}}||<   ||<   |                                D ]} |           ZdS )zI
        First DFS path to construct reference map and name map.
        prim::GetAttrN)nodeskindr   blocks)	entryr   r   r   r   block_dfs_get_attr_dependencynode_to_attr_namenode_to_parent_maps	         r(   r   z;get_block_to_lifted_attrs.<locals>._dfs_get_attr_dependency*  s     KKMM 
	0 
	0Dyy{{o--
 ;4@@	#/>"8,.7!(+ 0 0((////0
	0 
	0r*   c                    t                      }|                                 D ]}|                                D ] }|                     |                    }!|                                dk    rm|                                                                }|t                                                    vr$|                    t          |                     t          | t          j        j                  s|| <   |S )z|
        Walk the graph in a bottom-up fashion to build the expected to be
        lifted arguments for each block.
        r   )setr   r   unionr   r   r   rQ   addr   rA   r   r	   Graph)	r   	argumentsr   r   r   _map_blocks_to_lifted_attrsblocks_to_lifted_attrsr   r   s	        r(   r   z>get_block_to_lifted_attrs.<locals>._map_blocks_to_lifted_attrs:  s    
 "ee	KKMM 	 	D P P%OO,G,G,N,NOO		yy{{o--;;==2244 3'9'@'@'B'B#C#CCCMM%h0BDUVV   %00 	6,5"5)r*   rb   )rE   r   r   r   r   r   s    @@@@@r(   get_block_to_lifted_attrsr   	  s    & >@ *, )+0 0 0 0 0 0 0        2 U###&&&!#444r*   name_to_attribute_fqnr   c                     dt           f fd}|                                dk    r4t          |                                                                          }nR|                                dk    r'|                                                                }nt          d| d          |                    d          } ||          }|r| d| n|}|S )Nr   c                 B    | v r|          S t          d|  d          Nz
Attribute 
 not found)
ValueError)r   r   s    r(   r   z0get_attribute_fqn_from_ts_node.<locals>.get_attr\  s4    ((((..:$:::;;;r*   prim::SetAttrr   z7Unexpected node kind when getting attribute fqn. node:  r   )r   r   nextr   r   r   r4   r   )r   r   r   
input_namer   root_attr_nameattr_fqns   `      r(   get_attribute_fqn_from_ts_noder   Y  s    <s < < < < < < yy{{o%%$++--((2244

		'	'ZZ\\++--

MdMMM
 
 	
 vIXj))N2@O...9...iHOr*   c                    |                                  }|dk    sJ d|              t          j                            |          }t	          |j                                      d          \  }}|j        }	 t          t          j	        |          }t          ||          }|rt          ||          }n|j
        }nL# t          $ r?}	t          d|                                  d|                                             |	d }	~	ww xY w|S )N(no schema)zgot empty schema for r   zUnable to find operator z with schema )schemar   r	   parse_schemar   r   r   overload_namegetattrrw   default	Exceptionr4   r   )
r   
schema_strr   nsop_nameoverrideop_overload_modop_overload_packetop_overloadrU   s
             r(   get_op_overloadr   r  s   J&&&(F(F(F&&&&+h&;&;J&G&GFfk""((..KB#H
!%)R00$_g>> 	5!"4h??KK,4K   Ptyy{{PPPP
 
	
 s   9AB> >
D:DDc                   D   e Zd Zdeej        j        ej        j        f         dee	ej
        f         dee	ej
        f         deej        j        ee	         f         dee	ef         dee	ef         dee	e	f         fdZd	 Zd
ej        j        dee	         fdZd Zd Zde	fdZd
ej        j        fdZdej        j        fdZd Zdej        j        fdZd Zd
ej        j        fdZd
ej        j        fdZd
ej        j        fdZd
ej        j        fdZ d
ej        j        fdZ!d
ej        j        fdZ"d
ej        j        fdZ#d
ej        j        fdZ$d
ej        j        fdZ%d
ej        j        fd Z&d
ej        j        fd!Z'd
ej        j        fd"Z(d
ej        j        fd#Z)d
ej        j        fd$Z*d
ej        j        fd%Z+d
ej        j        fd&Z,d
ej        j        fd'Z-d
ej        j        fd(Z.d
ej        j        fd)Z/d
ej        j        fd*Z0d
ej        j        fd+Z1d
ej        j        fd,Z2d
ej        j        fd-Z3d
ej        j        fd.Z4d/ Z5d
ej        j        fd0Z6d1ej        j        fd2Z7d
ej        j        fd3Z8d
ej        j        fd4Z9d
ej        j        fd5Z:d
ej        j        fd6Z;d
ej        j        fd7Z<d
ej        j        fd8Z=d
ej        j        fd9Z>d
ej        j        fd:Z?d
ej        j        fd;Z@d
ej        j        fd<ZAd= ZBd>S )?TS2FXGraphConverterts_graphname_to_paramname_to_bufferr   name_to_non_tensor_attributename_to_constantr   c                     | _         | _        | _        t          j                                         _        g  _        g  _        i  _	        | _
        | _        i  _        | _        i  _        | _        t                                           D ]%}t%          |          }	t'           |	 fd           &t)                       _        d S )Nc                 .                         |           S ra   )_convert_standard_operators)r   selfs    r(   <lambda>z.TS2FXGraphConverter.__init__.<locals>.<lambda>  s    T==dCC r*   )r   r  r  r   fxr   r   input_specsoutput_specsname_to_noder  r   !name_to_non_tensor_attribute_noder  	subgraphsr   r   r0   r   setattrr   #name_update_from_subblock_to_parent)
r  r   r  r  r   r  r  r   khandler_func_names
   `         r(   __init__zTS2FXGraphConverter.__init__  s     !*,(-(8(8,..0
  	
 1A 6K" BD.
 =Y):< '=# ,0022 	 	A 4Q 7 7 !CCCC    >AUU000r*   c                     || j         v p6|| j        v p-|| j        v o$t          | j        |         t          j                  S ra   )r  r  r  rA   r   ScriptObject)r  fqns     r(   _is_get_attr_nodez%TS2FXGraphConverter._is_get_attr_node  sR    4&& d(( t,, Ot4S95;MNN	
r*   r   r   c           
         g g }}|                                 D ]}t          || j        | j        | j        i | j        | j                  }|D ]5}t          |          }|j        	                    |          }	|	|j
        |<   6|                                }
|                     |
          }|                    | j                            |                     |                    |           ||fS ra   )r   r   r  r  r   r  r   r   r   r   r  convertadd_subgraphr   r   )r  r   r   subgraph_nodessubgraph_convertersr   subgraph_converter	block_argnormalized_block_arg_nameplaceholder_noderk   subgraph_names               r(   _convert_block_to_subgraphz.TS2FXGraphConverter._convert_block_to_subgraph  s   .0"+[[]] 	; 	;E!4"#+%*" " ' N N	,:9,E,E)#5#>#J#J-$ $  >N"/	::)1133H --h77M!!$-"8"8"G"GHHH&&'9::::222r*   c                    t                      }|                                D ]}|                                D ]}|                                D ]_}|                                | j        v rB|                                | j        vr'|                    |                                           `|                    | 	                    |                    }|S )aW  
        Identify inputs from the innermost sub-block. This is needed
        for nested sub-blocks when the input is hidden in the nested sub-block.
        E.g., example IR of input is hidden in the nested sub-block.
        Graph[x.1]
        %1 = ...
            Block[]
                Block[x.1]
                    %2 = x.1 ...
        )
r   r   r   r   r   r  r   r   r   _identify_inputs_as_arguments)r  r   r   r   
block_nodeblock_node_ins         r(   r%  z1TS2FXGraphConverter._identify_inputs_as_arguments  s     "ee	\\^^ 
	 
	E#kkmm 	 	
%/%6%6%8%8 A AM%//11T5FFF)3355T=WWW!m&=&=&?&?@@@%OO66zBB 			 r*   c                 J    t          | j        t          j        j                  S ra   )rA   r   r   r	   r   )r  s    r(   r   z&TS2FXGraphConverter.is_top_level_graph  s    $-888r*   r=   c                 H    dt          | j                   }|| j        |<   |S )N	subgraph_)r    r  )r  rk   r   s      r(   r  z TS2FXGraphConverter.add_subgraph  s*    03t~..00'tr*   c                     g }i }t          |                                |j                  D ]R\  }}|j        r|                     |          ||j        <   *|                    |                     |                     St          |          |fS ra   )r   r   r   
kwarg_onlyget_fx_value_by_ir_valuer   r   rD   )r  r   r   r6   rn   r   
schema_args          r(   get_args_kwargsz#TS2FXGraphConverter.get_args_kwargs  s    !$T[[]]F4D!E!E 	B 	BE:$ B*.*G*G*N*Nz''D99%@@AAAAT{{F""r*   r   c                 |   |                                 }|| j        v r| j        |         }|S || j        v rLt          | j        |         t          j                  r| j                            |          S | j        |         S || j        v r | 	                    | j        |                   S t          d| d          )NzInput r   )r   r  r  rA   r   r  r   r   r   get_fx_value_by_fqnr   )r  r   
value_name
input_nodes       r(   r-  z,TS2FXGraphConverter.get_fx_value_by_ir_value  s    __&&
****:6J4000$/
;U=OPP :}--j999(444555++D,Fz,RSSS<j<<<===r*   c                     || j         v r| j         |         }nX|| j        v r| j        |         }nA|| j        v r| j        |         }n*|| j        v r| j        |         }nt	          d| d          |S r   )r  r  r  r  r   )r  r   fx_nodes      r(   r1  z'TS2FXGraphConverter.get_fx_value_by_fqn.  s    4$$$'-GGT***+D1GGT;;;<TBGGT6667=GG:$:::;;;r*   c                    |                                   | j                                        D ]}|                     |           |                                  t
          j                            i | j        | j	        | j
        | j        | j        | j                  }t          |           |j                                         |S ra   )convert_graph_inputsr   r   convert_nodeconvert_graph_outputsr   r
  GraphModuler  r  r  r  r  r   r   rE   lint)r  r   rr   s      r(   r  zTS2FXGraphConverter.convert;  s    !!###M'')) 	$ 	$Dd####""$$$ X!!.$ % 3	
 ' M	
 	
 	&b)))
	r*   c           
      .   | j                                         D ]y}|                                }|| j        v r{t	          |          }| j                            t          t          j	        t          |          |                     t          | j        ||                                           }n|| j        v r|t	          |          }| j                            t          t          j        t          |          |d                     t          | j        ||                                           }nO|| j        v rt#          | j        |         t$          j                  s
J d            t	          |          }| j                            t          t          j        t+          ||          |d                     t          | j        ||                                           }nt#          |                                t$          j                  rt	          |d	          }| j                            t          t          j        t          |          |                     | j                            |          }|| j        |<   {d S )
Nr   argtargetT)r>  r?  
persistentz*Input conversion only handles ScriptObject)r   	class_fqnFr   )r   )r   r   r   r  r   r  r   r   r   	PARAMETERr   r   r   r   r  BUFFERr  rA   r   r  
CUSTOM_OBJr   r   	ClassType
USER_INPUTr   r  )r  graph_inputr   normalized_namer5  s        r(   r7  z(TS2FXGraphConverter.convert_graph_inputsU  s   =//11 <	. <	.K((**Dt)))"0"6"6 ''!+*@@@#     >M4)@)@)B)B  ,,,"0"6"6 ''!(*@@@##'	     >M4)@)@)B)B  ...!$"7"=u?QRR  @ R #1"6"6 ''!,-!0O    $#(  	 	 	 >M4)@)@)B)B  K,,..@@ E"0g"F"F"F ''!,*@@@#     -33ODD&-Dd##y<	. <	.r*   c                      d } fd|                                 D             } j                            |t          |                    }| j        |                                                                <   d S )Nc                 f    |                      t          j                                                  S )N)r   )tor   floatitem)ts    r(   to_float_tensorz?TS2FXGraphConverter.convert_aten_Float.<locals>.to_float_tensor  s$    44ek4**//111r*   c                 :    g | ]}                     |          S rb   r-  r   r^   r  s     r(   
<listcomp>z:TS2FXGraphConverter.convert_aten_Float.<locals>.<listcomp>  '    PPP3D11#66PPPr*   )r   r   call_functionrD   r  r   r   )r  r   rO  inp_listr5  s   `    r(   convert_aten_Floatz&TS2FXGraphConverter.convert_aten_Float  s    	2 	2 	2 QPPP$++--PPP---(OO
 
 8?$++--1133444r*   c                    |                      |t          j        j        j        j        j                  \  }}|D ] }|dk    rt          ||                   ||<   !t          d |D                       rt          j        nt          j	        j        fd}|
                                                                }| j                            |||          }|| j        |<   dS )z9aten::tensor creates a constant tensor ad-hoc --> GetAttrrequires_gradc              3   @   K   | ]}t          |t                    V  d S ra   )rA   rz   )r   rc   s     r(   	<genexpr>z:TS2FXGraphConverter.convert_aten_tensor.<locals>.<genexpr>  s,      44!:a%%444444r*   c                  X    d|v r|d         t           |d                  |d<    | i |S )Nr   )_TORCH_ENUM_TO_DTYPE)r6   rn   	to_tensors     r(   r?  z7TS2FXGraphConverter.convert_aten_tensor.<locals>.target  s>    &  VG_%@"6vg"Gw9d-f---r*   N)r/  r   rw   rx   r   r   _schemaboolall_refsr   r   r   rU  r  )	r  r   r6   rn   r  r?  output_namer5  r^  s	           @r(   convert_aten_tensorz'TS2FXGraphConverter.convert_aten_tensor  s    ++D%).2G2O2WXXf 	, 	,AO## OOq	 44t44444$ELL# 		. 	. 	. 	. 	. kkmm--//---fdFCC)0+&&&r*   c                 T    t          j        d           t           fd|                                D                       } j                            t          |          }| j        |                                	                                <   | j        |
                    d          	                                <                                    sR|d         j        dk    rC j                            |
                    d          	                                           d S d S d S )NzConverting aten::append.t, which is a inplace mutation of the list. This makes the converter non-functional: the result depends on the order of the append nodes being converter!c              3   B   K   | ]}                     |          V  d S ra   rQ  rR  s     r(   r[  z:TS2FXGraphConverter.convert_aten_append.<locals>.<genexpr>  s1      QQCT22377QQQQQQr*   r   r   )warningswarnrD   r   r   rU  ri   r  r   r   inputsAtr   opr  r   )r  r   r6   r5  s   `   r(   convert_aten_appendz'TS2FXGraphConverter.convert_aten_append  s    	|	
 	
 	

 QQQQ4;;==QQQQQ---k4@@7>$++--11334 ;B$--**44667 &&(( 	WT!WZ=-H-H488q9I9I9S9S9U9UVVVVV	W 	W-H-Hr*   c                 z   |                                                                 }d }|                    d          r|                    d          }|dk    r|                    d          }n|dk    r|                    d          }n|dk    r|                    d          }n|dk    rAd| }| j                            |          }|| j	        |<   ||
                    d          }}nC|dk    r|                    d          }n't          d|                    d                     d }|| j        |<   d S )	Nr   r]   fr   rN  lifted_tensor_ivalzUnsupported constant type: )r   r   hasAttributekindOfr]   rm  r   r   r   r  rN  ro  r   r  )r  r   r   r   constant_kind
alias_namer5  s          r(   convert_prim_Constantz)TS2FXGraphConverter.convert_prim_Constant  sH   {{}}&&((W%% 	 KK00M##w#%%w#%%w#%%+T++  -00<<*1!$'($&&//e&((		'** !Ut{{7?S?S!U!UVVVE&+d###r*   c                      fd|                                 D             } j                            |                    d          t	          |                    }| j        |                                                                <   d S )Nc                 :    g | ]}                     |          S rb   rQ  rR  s     r(   rS  z?TS2FXGraphConverter.convert_prim_CallMethod.<locals>.<listcomp>  rT  r*   r   )r   r   call_methodr   rD   r  r   r   )r  r   rV  r5  s   `   r(   convert_prim_CallMethodz+TS2FXGraphConverter.convert_prim_CallMethod  sz    PPPP$++--PPP-++FF6NN(OO
 
 8?$++--1133444r*   c                 l   |                                                                 }|                    t          j        j                                                  rF|                                }|                                	                                }|| j
        |<   d S t          d| d          )NzUnsupported JitType (z) when get device)r   r   isSubtypeOfr   r	   
TensorTypegetdevicer   r   r  r   )r  r   
input_typer}  rc  s        r(   convert_prim_devicez'TS2FXGraphConverter.convert_prim_device  s    ZZ\\&&((
!!%("5"9"9";";<< 	T&&((F++--1133K17D!+...RZRRRSSSr*   c                    t          | j        |          }|                                                                }|| j        |<   |                                 rn|                     |          r$| j                            |          | j        |<   d S || j	        vr| j
        |         | j	        |<   | j	        |         | j        |<   d S |                     |          r| j        |         | j        |<   d S d S ra   )r   r   r   r   r   r  r   r   r  r  r  )r  r   r   rc  s       r(   convert_prim_GetAttrz(TS2FXGraphConverter.convert_prim_GetAttr  s   1$2LdSSkkmm--//2:";/""$$ 	M%%h//  261G1G1Q1Q!+...4#III9(C :8D 261W2!+... %%h// M151B81L!+...M Mr*   c                 v   t          | j        |          }t          |                                          d         }|                     |          }|                     |          rH| j                            |          }| j                            t          j
        j        ||f           d S || j        |<   d S Nr   )r   r   rD   r   r-  r  r   r   rU  r   r   copy_r  )r  r   r   
attr_valuets_graph_tensor_inputfx_attr_nodes         r(   convert_prim_SetAttrz(TS2FXGraphConverter.convert_prim_SetAttr  s    1$2LdSS4;;==))!,
 $ = =j I I!!(++ 	U=11(;;LM''"\3H$I     @UD28<<<r*   c                    t          |          }|                     ||j                  \  }}| j                            |||          }|                                dk    r2|                                                                }|| j        |<   d S t          |
                                          D ]J\  }}|                                }| j                            t          j        ||f          }	|	| j        |<   Kd S r  )r   r/  r_  r   rU  outputsSizer   r   r  rR   outputsoperatorgetitem)
r  r   r?  r6   rn   r5  rc  r]   outpnext_fx_nodes
             r(   convert_call_function_opz,TS2FXGraphConverter.convert_call_function_op&  s     &&++D&.AAf---fdFCC
 ""++--1133K-4Dk***$T\\^^44 > >4"nn..#}::$wl    2>!+..> >r*   c                 0    |                      |           d S ra   _convert_prim_iteratorr  r   s     r(   convert_prim_TupleConstructz/TS2FXGraphConverter.convert_prim_TupleConstruct;      ##D)))))r*   c                 0    |                      |           d S ra   r  r  s     r(   convert_prim_ListConstructz.TS2FXGraphConverter.convert_prim_ListConstruct>  r  r*   c                       fd|                                 D             }|                                                                }| j        |<   d S )Nc                 :    g | ]}                     |          S rb   rQ  rR  s     r(   rS  z>TS2FXGraphConverter._convert_prim_iterator.<locals>.<listcomp>B  s'    SSSct44S99SSSr*   )r   r   r   r  )r  r   output_listrc  s   `   r(   r  z*TS2FXGraphConverter._convert_prim_iteratorA  sP    SSSST[[]]SSSkkmm--//)4+&&&r*   c                 v   i }d\  }}t          |                                          D ]Q\  }}|dz  dk    r|                     |          }$|                     |          }||
J d            |||<   d\  }}R||
J d            |                                                                }|| j        |<   d S )N)NNr   r   z*DictConstruct has an empty key value pair.zGDictConstruct has an odd number of elements (violating our assumption).)rR   r   r-  r   r   r  )r  r   output_dictr  vr]   r^   rc  s           r(   convert_prim_DictConstructz.TS2FXGraphConverter.convert_prim_DictConstructG  s    1.. 	" 	"FAs 1uzz11#6611#66}@ *76 "#A!11yQYYU 'Y& kkmm--//)4+&&&r*   c                 0    |                      |           d S ra   _convert_prim_unpack_iteratorr  s     r(   convert_prim_ListUnpackz+TS2FXGraphConverter.convert_prim_ListUnpack^      **400000r*   c                 0    |                      |           d S ra   r  r  s     r(   convert_prim_TupleUnpackz,TS2FXGraphConverter.convert_prim_TupleUnpacka  r  r*   c                 ,   t          |                                          D ]q\  }}|                                }|                     |                                          }| j                            t          j        ||f          }|| j	        |<   rd S ra   )
rR   r  r   r-  r   r   rU  r  r  r  )r  r   r]   r  	outp_namer^   r5  s          r(   r  z1TS2FXGraphConverter._convert_prim_unpack_iteratord  s     00 	3 	3GAt((I//

==Cm11(2BS!HMMG+2Di((		3 	3r*   c                     t           j        j        j        j        }t           fd|                                D                       } j                            ||dt           j	        i          } j                            t           j        j        j
        j        |f          }|                                                                }| j        |<   d S )Nc              3   B   K   | ]}                     |          V  d S ra   rQ  r   r   r  s     r(   r[  z7TS2FXGraphConverter.convert_aten_Int.<locals>.<genexpr>o  1      UUeT22599UUUUUUr*   r   )r   rw   rx   _to_copyr   rD   r   r   rU  int32_local_scalar_denser   r   r  )r  r   r?  r6   to_copy_noder5  rc  s   `      r(   convert_aten_Intz$TS2FXGraphConverter.convert_aten_Intl  s    (0UUUUt{{}}UUUUU}2264'5;AWXX---IN.6
 
 kkmm--//)0+&&&r*   c                 >    t           j        j        j        }t	           fd|                                D                       } j                            ||dt           j        i          }|	                                
                                }| j        |<   d S )Nc              3   B   K   | ]}                     |          V  d S ra   rQ  r  s     r(   r[  z?TS2FXGraphConverter.convert_prim_NumToTensor.<locals>.<genexpr>  r  r*   r   )r   rw   rx   r{   rD   r   r   rU  longr   r   r  r  r   r?  r6   r5  rc  s   `     r(   convert_prim_NumToTensorz,TS2FXGraphConverter.convert_prim_NumToTensor|  s     -UUUUt{{}}UUUUU---fdWej<QRRkkmm--//)0+&&&r*   c                 f    |                                                                 }d| j        |<   d S )N )r   r   r   r  r   rc  s      r(   convert_prim_CreateObjectz-TS2FXGraphConverter.convert_prim_CreateObject  s.    kkmm--//24";///r*   c                    t           j        j        j        j        }|                     ||j                  \  }}| j                            |||          }|	                                
                                }|| j        |<   d S ra   )r   rw   rx   convolutionr   r/  r_  r   rU  r   r   r  )r  r   r?  r6   rn   r5  rc  s          r(   convert_aten__convolutionz-TS2FXGraphConverter.convert_aten__convolution  ss     +3++D&.AAf---fdFCCkkmm--//)0+&&&r*   c                    t          |          }|j        }|                     ||          \  }}|j        dk    r|d         j        }|| j        v rt          | j        |         t          j                  r| j        |         }|	                                dk    rt          |          }| j        |                                         |d<   | j                            t          j        j        j        j        t%          |          |          }	|                                                                }
|	| j        |
<   d S |                     |           d S )NTensor_moder   )r   r_  r/  r   r   r  rA   r   r   numelrP   rM  r   rU  rw   rx   r|   r}   rD   r   r   r  r  )r  r   r?  r   r6   rn   	arg1_nametensor_constantupdated_argsr5  rc  s              r(   convert_aten_divz$TS2FXGraphConverter.convert_aten_div  s=    &&++D&99f =00QID111j%i0%,7 71 #'"7	"B"((**a//#'::L&*&;I&F&K&K&M&MLO"m99	*6l++ G #'++--"9"9";";K5<D%k2F%%d+++++r*   c                     t           fd|                                D                       \  }} j                            t          j        ||f          }|                                                                }| j        |<   d S )Nc              3   B   K   | ]}                     |          V  d S ra   rQ  r  s     r(   r[  z?TS2FXGraphConverter.convert_aten___getitem__.<locals>.<genexpr>  sB       '
 '
5:D))%00'
 '
 '
 '
 '
 '
r*   )	rD   r   r   rU  r  r  r   r   r  )r  r   input_containerindexr5  rc  s   `     r(   convert_aten___getitem__z,TS2FXGraphConverter.convert_aten___getitem__  s    !& '
 '
 '
 '
>Bkkmm'
 '
 '
 "
 "
 ---6
 
 kkmm--//)0+&&&r*   c                 X   t          |          }|                     ||j                  \  }}|t          j        j        j        j        k    s |t          j        j        j        j        k    r(d |	                                
                                D             }d |D             }t          d |D                       }|rt          |          dk    sJ t          |          }d|d<   | j                            t          j        j        j        j        t!          |                    }	| j                            t          j        j        j        j        |	f          }
|	                                                                }|
| j        |<   d S |                     |           d S )Nc                     g | ]	}|j         
S rb   )user)r   uses     r(   rS  z7TS2FXGraphConverter.convert_aten_to.<locals>.<listcomp>  s    CCCs#(CCCr*   c                 \    g | ])}|                                 d k    t          |          *S )r   )r   r   )r   	user_nodes     r(   rS  z7TS2FXGraphConverter.convert_aten_to.<locals>.<listcomp>  sA       ##%%66  	**666r*   c              3   .   K   | ]}|j         j        V  d S ra   )r_  
is_mutable)r   r?  s     r(   r[  z6TS2FXGraphConverter.convert_aten_to.<locals>.<genexpr>  s8       % %.4)% % % % % %r*   r   Tr   )r   r/  r_  r   rw   rx   rK  r   
prim_dtyper   usesanyr    rP   r   rU  rD   cloner   r   r  r  )r  r   r?  r6   _kwargs
user_nodesuser_targetshas_mutable_targetnew_argsr5  
clone_noderc  s               r(   convert_aten_toz#TS2FXGraphConverter.convert_aten_to  s    &&,,T6>BBg UY^&,,,%).:K:V0V0VCCdkkmm.@.@.B.BCCCJ !+  L
 "% % %8D% % % " " " 4yyA~~~~::"-55IN%+U8__ 
 "]88IN(07* 
 #kkmm55771;!+.%%d+++++r*   c                    |                                 dk    rt          |                    d                                          t          j                  r[t          |                    d                                          t          j                  rt          j        j        j        j	        }n!t          d|           t          |          }|t          j        j        j        j	        k    rn|                     ||j                  \  }}|                                                                }| j                            t$          |          | j        |<   d S |                     |           d S )Nr   r   r   z$unable to determined the target for )r   rA   ri  r   r   ListTyperw   rx   r   rN  r4   r   r/  r_  r   r   r   rU  re   r  r  )r  r   r?  r6   r  rc  s         r(   convert_aten_addz$TS2FXGraphConverter.convert_aten_add  s7   ;;==M))$--**//115>BB Rza  %%''H H R +-"#P$#P#PQQQ$T**FUY^'))) !00v~FFMD'++--1133K-1]-H-HSW-X-XDk***))$/////r*   c                    t          |                                          }|d                                         | j        vrt	          d          t          |                                          }t          |                                                                          }|                                D ]}|	                                dk    r9|
                                                                |k    rt	          d          |	                                dk    r>|                                D ])}|                                |k    rt	          d          *d S )Nr   zKprim::Loop currently cannot run with dynamic value of number of iterations.r   z@prim::Loop currently cannot run with dynamic value of condition.r   )rP   r   r   r  r4   r   r   r  r   r  r   )r  r   r   subblockcondition_output_namer  s         r(   _check_prim_loop_supportz,TS2FXGraphConverter._check_prim_loop_support  sZ   dkkmm$$ !9  (===]  
 && $X%5%5%7%7 8 8 B B D DNN$$ 	 	D  ""a''KKMM++--1FFF"V   !!Q&& LLNN  D~~''+@@@*^   A	 	r*   c           	          t          |                                          }                     |                                |d                   }d |dd          D             }                     |          }|                                D ]"}|                     j        |                   }#t          |          }                     ||          \  }}t          |          dk    sJ |d         }	 
                                s$ j                            |	j                   _         fd||z   D             }
t          |          D ]p} j                            t          |d         |t          |          g|
R i           }|                                dk    r}t#          |                                          D ][\  }}|                                } j                            t(          j        ||dz   f           j        |<    j        |         |
|<   \t#          |	j                  D ]\  }} j                            t(          j        |||                                z   dz   f           j        |<   |                    |          } j        |         |
||                                z   |z   <   rd S )Nr   c                 6    g | ]}|                                 S rb   r   )r   r^   s     r(   rS  z9TS2FXGraphConverter.convert_prim_Loop.<locals>.<listcomp>   s     FFFCFFFr*   r   r   c                 :    g | ]}                     |          S rb   r1  r   r   r  s     r(   rS  z9TS2FXGraphConverter.convert_prim_Loop.<locals>.<listcomp>9  s7     
 
 
 $$T**
 
 
r*   )rP   r   r  r-  r%  r   r   r   r#  r    r   r  ranger   rU  rq   r  rR   r  r   r  r  r  r  )r  r   r   num_iterationsloop_local_argumentsglobal_argumentsr   r  r  r  fx_block_argsrl   	loop_noder]   r  rc  r   global_argument_indexs   `                 r(   convert_prim_Loopz%TS2FXGraphConverter.convert_prim_Loop  s/   dkkmm$$%%d+++66vayAA  GF6!"":FFF==dCC [[]] 	 	E/55+E2      011.2.M.M"/
 /
++ >""a''''03&&(( 	8>>&J  4
 
 
 
,/??
 
 
 n-- (	 (	H33/ #1%,-- #	  
 
I !!Q&&(88 	F 	FGAt"&.."2"2K59]5P5P (%E6 6D%k2 (,'8'EM!$$ %"F   4 +/-*E*E$!D,,...2+ +!$' )9(>(>t(D(D%%d+ a$"2"2"4"447LLMM7(	 (	r*   if_nodec                     |                                 D ]@}|                                D ])}|                                dk    rt          d          *Ad S )Nr   zDuring converting prim::If to torch.cond, found prim::SetAttr op which is not supported yet. Please file an issue if you come across this error.)r   r   r   r4   )r  r  r   r   s       r(   _check_set_attr_in_if_blockz/TS2FXGraphConverter._check_set_attr_in_if_blockg  sp    ^^%% 	 	E  99;;/11&-   2	 	r*   c                 ,                          |           t          |                                          }t          |          dk    sJ                      |d                   }                     |          }|                                D ]"}|                     j        |                   }#t          |          } 	                    ||          \  }}t          |          dk    sJ  fd|D             }||d         |d         t          |          f}	 j                            t          j        |	i           }
|                                dk    r2|                                                                }|
 j        |<   d S |                                dk    rlt'          |                                          D ]L\  }}|                                } j                            t*          j        |
|f          }| j        |<   Kd S d S )Nr   r   r   c                 :    g | ]}                     |          S rb   r  r  s     r(   rS  z7TS2FXGraphConverter.convert_prim_If.<locals>.<listcomp>  s'    NNND11$77NNNr*   )r  rP   r   r    r-  r%  r   r   r   r#  rD   r   rU  r   condr  r   r   r  rR   r  r  r  )r  r   r   	predicater   r   r  r'   r  r6   	cond_noderc  r]   r   r  s   `              r(   convert_prim_Ifz#TS2FXGraphConverter.convert_prim_Ifq  s   ((...dkkmm$$6{{a11&)<<	 66t<<	 [[]] 	L 	LE!(CE(JKKIIOO	 ;;D)LL>""a''''NNNNINNN 11-  	
 M//
D"EE	 ""++--1133K-6Dk***!##&t||~~66 9 9	6$..00-55h6FTUWW18!+..	 $#9 9r*   c                 0    |                      |           d S ra   )_convert_as_noopr  s     r(   convert_aten_Boolz%TS2FXGraphConverter.convert_aten_Bool  s    d#####r*   c                     d S ra   rb   r  s     r(   convert_prim_Enterz&TS2FXGraphConverter.convert_prim_Enter  s	    
 	r*   c                     d S ra   rb   r  s     r(   convert_prim_Exitz%TS2FXGraphConverter.convert_prim_Exit  s    r*   c                     t          |          }|j        }|                     ||          \  }}|                                                                }|d         | j        |<   d S )Nr   )r   r_  r/  r   r   r  )r  r   r?  r   r6   r  rc  s          r(   r  z$TS2FXGraphConverter._convert_as_noop  sa     !&&,,T6::gkkmm--//)-a+&&&r*   c                      t           j        j        j        }t	           fd|                                D                       } j                            ||           d S )Nc              3   B   K   | ]}                     |          V  d S ra   rQ  r  s     r(   r[  zMTS2FXGraphConverter.convert_profiler__record_function_exit.<locals>.<genexpr>  r  r*   )r   rw   profiler_record_function_exitrD   r   r   rU  )r  r   r?  r6   s   `   r(   &convert_profiler__record_function_exitz:TS2FXGraphConverter.convert_profiler__record_function_exit  sZ     #9UUUUt{{}}UUUUU##FD11111r*   c                 
   d}|                      t          |                                                    f}| j                            ||          }|                                                                }|| j        |<   d S )Ntolist)r-  r   r   r   rw  r   r   r  r  s         r(   convert_prim_tolistz'TS2FXGraphConverter.convert_prim_tolist  sr     --d4;;==.A.ABBD-++FD99kkmm--//)0+&&&r*   c                     |                                                                 }t          j                    | j        |<   d S ra   )r   r   r   r   r  r  s      r(   convert_prim_Uninitializedz.TS2FXGraphConverter.convert_prim_Uninitialized  s6    
 kkmm--//-2\^^k***r*   c                 6    t           |                                         }t           fd|                                D                       } j                            ||          }|                                                                }| j        |<   d S )Nc              3   B   K   | ]}                     |          V  d S ra   rQ  r  s     r(   r[  zBTS2FXGraphConverter._convert_standard_operators.<locals>.<genexpr>  r  r*   )	r   r   rD   r   r   rU  r   r   r  r  s   `     r(   r  z/TS2FXGraphConverter._convert_standard_operators  s    +DIIKK8UUUUt{{}}UUUUU---fd;;kkmm--//)0+&&&r*   c                    |                                 }t          |          }t          | || j                  }d                    t          |                              d          d d                   }t                              d|j	        |           	  ||           d S # t          $ r}t          d|           |d }~ww xY w)Nr  
r   z[%s] converts [%s]zTS2EPConverter failed for node )r   r   r   r  r   r   r   logdebug__name__r   r4   )r  r   	node_kindr  handler_funcnode_strrU   s          r(   r8  z TS2FXGraphConverter.convert_node  s    IIKK	
 1;;t%68UVV
 773t99??400!455		&(=xHHH	UL 	U 	U 	ULLLMMSTT	Us   B& &
C0CCc                    g }d | j                                         D             t          | j                  z   }|D ]_}|| j        v r| j        |         }|                                 sPt          |t          j        j	                  r1|j
        dk    r&| j                            t          j        |f          }|                    |           | j                            t!          t"          j        t'          |          |                     || j        v rp|                    | j        |                    | j                            t!          t"          j        t+          || j        |                   |                     Nt-          d| d          t/          |          dk    r| j                            g            d S t/          |          d	k    r"| j                            |d                    d S t/          |          d	k    r| j                            |           d S | j                            |           d S )
Nc                 6    g | ]}|                                 S rb   r  )r   r  s     r(   rS  z=TS2FXGraphConverter.convert_graph_outputs.<locals>.<listcomp>  s"    OOOt$..**OOOr*   r   r   r=  )r   r   zOutput r   r   r   )r   r  rP   r  r  r   rA   r   r
  Noderj  r   rU  r  r   r  r   r   USER_OUTPUTr   r  r   r   r    r   )r  r6   outp_name_listrc  r5  s        r(   r9  z)TS2FXGraphConverter.convert_graph_outputs  s   OOt}7L7L7N7NOOORV4S
 S
 
 * 	D 	DKd///+K8 //11S"7EHM::S  
m33"m99%+zRRGG$$$!((".*<<<*       555D1+>???!((".,!,D4I+4V    +      !!B;!B!B!BCCCt99>>M  $$$$$YY!^^M  Q     YY]]M      
 M  &&&&&r*   N)Cr  
__module____qualname__r   r   r	   r   Blockdictr   r   r   r   r  r  r  rP   r#  r%  r   r  r/  Valuer-  r1  r
  r:  r  r7  rW  rd  rk  rt  rx  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r
  r  r  r8  r9  rb   r*   r(   r   r     sb       DC67DC C-.DC S%,./	DC
 !%UX^SX%= >DC '+38nDC sCx.DC  $CH~DC DC DC DCL
 
 
3ux} 3c 3 3 3 34  29 9 9    
	#EHM 	# 	# 	# 	#>ehn > > > >  -    4=. =. =.~	?ux} 	? 	? 	? 	?1 1 1 1 18W W W W W,,%(- , , , ,8?EHM ? ? ? ?T T T T TM M M M M8
U 
U 
U 
U 
U>UX] > > > >** * * * **ux} * * * *558= 5 5 5 55ux} 5 5 5 5.1EHM 1 1 1 11UX] 1 1 1 13%(- 3 3 3 31UX] 1 1 1 1 1UX] 1 1 1 15ehm 5 5 5 5	1ehm 	1 	1 	1 	1,UX] , , , ,B1UX] 1 1 1 1$,EHM $, $, $, $,L0UX] 0 0 0 0(  6Lehm L L L L\58=    &9EHM &9 &9 &9 &9P$ehm $ $ $ $ux}    ehm    	1UX] 	1 	1 	1 	1258= 2 2 2 21 1 1 1 1<ux} < < < <1 1 1 1 1U U U U U&3' 3' 3' 3' 3'r*   r   c                   8    e Zd ZdZ G d de          Zdeej        j	        ej        j
        f         deeej        f         deeej        f         deej        j
        ee         f         deeef         d	eeef         d
eeef         f fdZd Z fdZ xZS )ExplainTS2FXGraphConverterz
    Run TS2FXGraphConverter in an explain mode. It collects all failed operators conversions
    and provide that information to users. In order to collect all failed conversions, it
    also mocks some internal attributes (e.g., name_to_node).
    c                   .     e Zd Z fdZ fdZd Z xZS )$ExplainTS2FXGraphConverter._DictMockc                 X    t                                          |           || _        d S ra   )superr  
mock_value)r  	dict_datar'  	__class__s      r(   r  z-ExplainTS2FXGraphConverter._DictMock.__init__#  s&    GGY'''(DOOOr*   c                     t                                          |          s| j        S t                                          |          S ra   )r&  __contains__r'  __getitem__)r  r   r)  s     r(   r,  z0ExplainTS2FXGraphConverter._DictMock.__getitem__'  s?     77'',, '&77&&s+++r*   c                     dS NTrb   )r  r   s     r(   r+  z1ExplainTS2FXGraphConverter._DictMock.__contains__.  s    4r*   )r  r  r  r  r,  r+  __classcell__r)  s   @r(   	_DictMockr$  "  s`        	) 	) 	) 	) 	)	, 	, 	, 	, 	,	 	 	 	 	 	 	r*   r1  r   r  r  r   r  r  r   c                     t                                          |||||||           g | _        t                              | j        t          j                            d ddd di                     | _        d S )NmockrU  c                      d S ra   rb   rb   r*   r(   r	  z5ExplainTS2FXGraphConverter.__init__.<locals>.<lambda>P  s     r*   rb   )	r&  r  unsupported_node_listr"  r1  r  r   r
  r  )	r  r   r  r  r   r  r  r   r)  s	           r(   r  z#ExplainTS2FXGraphConverter.__init__1  s     	"(!	
 	
 	
 ;=" 7@@HMM 
 
r*   c                     |                                   | j                                        D ]}|                     |           |                                  d S ra   )r7  r   r   r8  r9  r  s     r(   explainz"ExplainTS2FXGraphConverter.explainV  s`    !!###M'')) 	$ 	$Dd####""$$$$$r*   c                     	 t                                          |           d S # t          $ r | j                            |           Y d S w xY wra   )r&  r8  r   r5  r   )r  r   r)  s     r(   r8  z'ExplainTS2FXGraphConverter.convert_node\  sa    	4GG  &&&&& 	4 	4 	4&--d333333	4s   !& $AA)r  r  r  __doc__r  r1  r   r   r	   r   r  r   r   r   r   r  r7  r8  r/  r0  s   @r(   r"  r"    s2            D   #
67#
 C-.#
 S%,./	#

 !%UX^SX%= >#
 '+38n#
 sCx.#
  $CH~#
 #
 #
 #
 #
 #
J% % %4 4 4 4 4 4 4 4 4r*   r"  c              #   V   K   | j         }d| _         	 d V  || _         d S # || _         w xY wr.  )disabled)r  r;  s     r(   disable_loggingr<  c  s@      |HCL xs    	(c            
           e Zd Z	 ddeej        j        ej        j        f         dee	df         de
eee	f                  fdZdefdZ ee          dd
            Zdej        j        deee	f         fdZd ZdS )TS2EPConverterNts_modelsample_args.sample_kwargsc                 r   || _         t          ||          \  | _        | _        }}|| _        || _        i | _        i | _        t          | j         t          j
        j                  s&t          | j                                                   ng }t          | j         t          j
        j                  sa| j                                                                         D ]5\  }t!          fd|D                       r| j        |<   +| j        |<   6i | _        i | _        |                                  d S )Nc              3   h   K   | ],}j         |j         k    |k                                    V  -d S ra   )shapera  )r   paramr   s     r(   r[  z*TS2EPConverter.__init__.<locals>.<genexpr>  sN        |u{22 u_))++2222 r*   )r?  r_   r   rX   r@  rA  r  r  rA   r   r	   rB   rP   
parametersrY   itemsr  name_to_non_tensor_attributesr  lift_get_attr)r  r?  r@  rA  r'   
param_listr  r   s          @r(   r  zTS2EPConverter.__init__o  sP    !+<X{+S+S(t{Aq&*6879 dmUX-DEED))++,,, 	
 $-)@AA 
	4!]5577==?? 	4 	4	6    !+     4
 -3D&q))-3D'**=?*02r*   r=   c           	         t                               d           t                               d| j                   t          | j                  \  }}t	          | j        | j        | j        || j        | j        |          }|	                                }t          |           t                               d|                    d                     |                     ||j                  }t                               d|           t          | j        t          j        j                  s\| j                                                                        D ]0\  }}||j        vr"t)          j        d| d           ||j        |<   1|S )	Nz
TS2EPConverter logging starts from here.

INFO: (TORCH_LOGS="export" <cmd>)
    * Log TorchScript IR.

DEBUG: (TORCH_LOGS="+export" <cmd>), additionally
    * Log conversion IR by IR in a format of [<conversion handler name>] converts [<IR>].
        zTorchScript graph

%s
zGraphModule: %sF)print_outputz%szManually populate zN into state_dict ExportedProgram, but it is never used by the ExportedProgram.)r  infor   r   r   r  r  rH  r  r  r
   print_readableretrace_as_exported_programrA   r?  r   r	   rB   rY   rG  rg  rh  )r  r   r   graph_converterrr   epr  r   s           r(   r  zTS2EPConverter.convert  s   
	
 
	
 
	
 	,dm<<<8QM9
 9
5 5 .M".!!
 
 $$&& 	0333"B$5$55$5$I$IJJJ--,
 
 	r
 $-)@AA 	.!]5577==?? . .	6BM))M~Q~~~   (.BM!$	r*   Tc           	         t          | j                  \  }}t          | j        | j        | j        || j        | j        |          }|                                 t          |j	                  dk    r{d}t          |j	                  D ]c\  }}d                    t          |                              d          d d                   }|d| d|                                 d| d	z  }dnd
}|rt          |           |S )Nr   z2Unsupported nodes are found in the following list:r  r  r   z

    z. z []zSuccess!)r   r   r"  r  r  rH  r  r7  r    r5  rR   r   r   r   r   print)	r  rL  r   r   rP  explain_strr]   nr  s	            r(   r7  zTS2EPConverter.explain  s%   8QM9
 9
5 5 5M".!!
 
 	!!!45599NK!/"GHH G G1773q66<<#5#5bqb#9::F!FFqvvxxFF8FFFFG %K 	+r*   rr   r  c                    t          d | j                  }t          j        j                            || j        |dd          }|j                            d |                                D                        |D ]}|j	        
                    |d            |j        j        D ]}|j        t          j        k    rk|j        |v rbt#          ||j                 t          j                  s%J t'          ||j                            d            t          j        |_        d |_        |                                                    |           |S )Nc                 ~    t          |t          j                  r"t          j        g|                                z  nd S ra   )rA   r   r   r   AUTOr   )pathxs     r(   r	  z<TS2EPConverter.retrace_as_exported_program.<locals>.<lambda>  s1    (21el(C(CM
QUUWW$$ r*   FT)dynamic_shapesr,   pre_dispatchc                 f    i | ].\  }}t          |t          j        t          j        f          +||/S rb   )rA   r   r   r  )r   r  r  s      r(   r   z>TS2EPConverter.retrace_as_exported_program.<locals>.<dictcomp>  sH       Aqa%,0B!CDD1  r*   z& has been erroneously marked as buffer)r   r@  r   export_trace_export
_constantsupdaterG  rY   popgraph_signaturer  r   r   rC  r?  rA   r   r   CONSTANT_TENSORr@  verifiercheck)r  rr   r  r\  rQ  r  specs          r(   rO  z*TS2EPConverter.retrace_as_exported_program  sy   
 -  	
 
 \ (() ) 
 
 	 ,2244  	
 	
 	
 " 	' 	'AMa&&&&&2 	' 	'DyI,,,@P1P1P!"24;"?NN  ,T[9::bbb N &5	"&
B	r*   c                      i dt           f fddt          j        j        ffd fd  j                   d S )Nr  c                 j    |                      d          }j        }|D ]}t          ||          }|S r   )r   r?  r   )r  r   r  rV  r  s       r(   r   z.TS2EPConverter.lift_get_attr.<locals>.get_attr$  s<    99S>>DA " "AqMMHr*   r   c                     |                      d          }|                                                                 }|         }|r| d| n|}|S )Nr   r   )r   r   r   )r   r   r   r   r   r   s        r(   get_fqnz-TS2EPConverter.lift_get_attr.<locals>.get_fqn+  sW    vI//11J2:>N:HW.669666iHOr*   c                    |                                  D ]'}|                                dk    r+|                                                                }d	|<   |                                dk    r |          } |          }|                                                                }|	|<   t	          |t
          j                  r|
j        vr
|
j        |<   n8t	          |t
          j                  r|
j	        vr
|
j	        |<   n
|
j
        |<   |                                D ]} |           )d S )Nzprim::CreateObjectr  r   )r   r   r   r   rA   r   r   r  r  r  rH  r   )r   r   rc  r   r   r  _dfs_get_attrr   rm  r   r  s         r(   ro  z3TS2EPConverter.lift_get_attr.<locals>._dfs_get_attr2  sN    , ,99;;"666"&++--"9"9";";K9;)+699;;/11&wt}}H$HX..E"&++--"9"9";";K9A)+6!%66 M#4+>>><AD/9#E5+=>> M#4+@@@>CD1(;GL:8D $ , ,H!M(++++,), ,r*   )r   r   r	   r  r   )r  ro  r   rm  r   s   `@@@@r(   rI  zTS2EPConverter.lift_get_attr  s    " 13	# 	 	 	 	 	 		%(- 	 	 	 	 	 		, 	, 	, 	, 	, 	, 	, 	, 	,0 	dm$$$$$r*   ra   )T)r  r  r  r   r   r   rC   rB   rD   r   r   r  r   r  r   r  r<  r  r7  r
  r:  rO  rI  rb   r*   r(   r>  r>  m  s        37	" "	.	0HHI" 38_"  S#X/	" " " "H2 2 2 2 2h _S   4-H - sCx.- - - -^9% 9% 9% 9% 9%r*   r>  )r   )jbuiltinsloggingr  rI   rg  collections.abcr   
contextlibr   r   r   r   r   r   torch.export._tracer	   Atorch._export.passes.replace_quantized_ops_with_standard_ops_passr
   torch.export.dynamic_shapesr   r   torch.export.exported_programr   torch.export.graph_signaturer   r   r   r   r   r   r   torch.fxr   	getLoggerr  r  r)   r<   nnModuler   rB   rD   r   rP   rC   r_   re   ri   rq   r
  r:  r   r   r   r   r   r   uint8int8int16r  int64float16float32float64	complex32	complex64
complex128r`  qint8quint8bfloat16r   rG  r]  r   maxminr  is_is_notnot_containsr    rw   rx   	sym_numelry   sym_storage_offset
sym_strider   r  __annotations__r   r   r  r   r   r  r   r   r   r"  r<  r>  rb   r*   r(   <module>r     se        $ $ $ $ $ $ % % % % % % 1 1 1 1 1 1 1 1 1 1 1 1                 A @ @ @ @ @ @ @ 9 9 9 9 9 9                  ' & & & & & g!!	 	 	" " "8/*%)"::;/*CKC=/*
5;[)39K0LLM/* /* /* /*d  ! ! !H H H(@eh&: @ @ @ @"    c     ,s ,s , , , ,& & & 
K	J	K	K	K	M1	M1	M1	OQ	OQ	b	J	K	L"	NB $ SR5I5O5O5Q5QRRR 	' 	' 	'   (L]"+# 9>+).)!IN=IN-= = DhsCx&8!89   &0 0 0) ) )M58>M5
4C()4S>9:M5 M5 M5 M5`S>16   2%(-    ,P' P' P' P' P' P' P' P'fE4 E4 E4 E4 E4!4 E4 E4 E4P      ]% ]% ]% ]% ]% ]% ]% ]% ]% ]%r*   