
    [Th                        S SK r S SKrS SKrS SKrS SKrS SKJr  S SKJr  S SKJ	r	J
r
Jr  S SKrS SKrS SKJr  S SKJr  S SKJrJr  S SKJr  S S	KJrJrJrJrJrJrJr  S S
KJr  \R@                  " \!5      r"S r#S r$S\\RJ                  RL                  \RN                  RP                  4   S\\	   S\)\RT                  \+S   \	\
\RX                     4   4S jr-S r.S r/S r0S\Rb                  Rd                  4S jr3S r4S<S\5S\5S\54S jjr6S\5S\54S jr7S r8\Rr                  S \Rt                  S\Rv                  S\Rx                  S\Rz                  S \R|                  S!\R~                  S"\R                  S#\R                  S$\R                  S%\R                  S&\R                  S'\R                  S(\R                  S)\R                  S*0rH\HR                  5        V Vs0 s H  u  pX_M	     snn rJS+ rK\ R                  \ R                  \R                  \R                  \R                  \R                  \R                  \K\S\R                  R                  R                  \R                  R                  R                  \R                  R                  R                  \R                  R                  R                  S,.rZS- r[S. r\S/\R                  RT                  S\)\]\R                  R                  \_\5   4   \]\5\54   4   4S0 jr`S1\]\5\54   S2\R                  R                  S\54S3 jrbS2\R                  R                  4S4 jrc " S5 S65      rd " S7 S8\d5      re\S9 5       rf " S: S;5      rggs  snn f )=    N)Sequence)contextmanager)AnyOptionalUnion)_C)'replace_quantized_ops_with_standard_ops)_tree_map_with_pathDim)ExportedProgram)ConstantArgumentCustomObjArgument	InputKind	InputSpec
OutputKind
OutputSpecTensorArgument)subgraph_rewriterc                 *   / n[        U R                  5       U5       Hr  u  p4S[        UR                  5       5      ;   a=  [        R
                  R                  U5      u  pVUR                  [        U5      5        M_  UR                  US L5        Mt     U$ )NPackedParams)	zipinputsstrtypetorchjit_flattenappendlen)method_graphargs_paramsparam_count_listinput_arg_params_in_vars_s          O/var/www/auris/envauris/lib/python3.13/site-packages/torch/_export/converter.py_get_param_count_listr(   "   s|    "<#6#6#8+FS//++K8JG##CL1##Kt$;<  G     c                    [         R                  R                  U 5      R                  5       n[         R                  " 5       n[         R
                  " S5        [         R                  R                  U USSSS9u  pEn[         R
                  " U5        U[         R                  R                  U 5      R                  5       :w  a  [        S5      eXE4$ )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     !9977>CCE
 #("A"A"C	$$U+-2YY-G-G" .H .*KN 
$$%@Auyy;;EBGGII:
 	

 !!r)   r4   r5   returnz	_C.IValuec                    [        U [        R                  R                  [        R                  R                  45      (       Ga  [        [        R                  R                  [        U5      5      S   5      nS n[        U [        R                  R                  5      (       Ga   U R                  R                  n[        R                  " U5        [        R                  " [        R                  " [        R                  U R                   5      SS9n[        R"                  " U5      u  pxUR%                  S5      R                  n	[        U5      [        U5      -   n
['        X5      n[        R                  R                  U
5      u  p[        R(                  " U	[        U5      USS5      nXHX74$ / nU R                  n[        R                  " U5        ['        XA5      n[        R(                  " XBUSS5      nXHUS 4$ [+        X5      u  pC[        R,                  " U5        [        R                  R/                  U 5      n[1        UR3                  5       5      n[1        UR5                  5       5      n[7        U5      [7        U5      -
  n[1        UR9                  5       5      n[;        U5       H%  u  nnUU:  d  M  UR=                  UUU-
     5        M'     [        R                  " U5        XHUS 4$ ! [         a  n[        S5      UeS nAff = f)Nr   z('forward' method must be a script methodT)preserveParametersforwardF)
isinstancer   r   ScriptFunctionScriptModuletupler   r?   graphAttributeErrorr3   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   r/   	enumeratesetDebugName)r4   r5   flattened_argsr9   rD   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{    %%))22EII4J4JKLLuyy11%+>qAB	eUYY3344V++ 33E:..BOOUXX64N  ??ONF!--i8>>L+f5K4\O++K8JG99eGn.>uE )33 
//60=55#3UE
 i--6uCE5!--e4J*##%&F'L&Z8Nz()KL)3[^);<= * ++E2)T))K " V"#MNTUUVs   &K1 1
L;LLc                 
    X-   $ N )abs     r'   list_addrd   |   s	    5Lr)   c                     X/-   $ r`   ra   )	containerelements     r'   list_appendrh      s    y  r)   c                 2    USU nX2S nU " / UQUPUQ70 UD6$ )z
subgraph: GraphModule from sub-block.
iter_idx: The index of interation.
len_loop_local_arguments: The number of loop local arguments in args.
Nra   )subgraphiter_idxlen_loop_local_argumentsr5   kwargsloop_local_argsglobal_argss          r'   execute_subgraph_from_prim_looprp      s<     445O
 01KG[G(G_GGGr)   gmc                 >    S nS n[         R                  " XU5        g )Nc                    [         R                  R                  R                  R	                  X5      n[         R                  R                  R                  U5      n[         R                  R                  R                  R                  XBSS9n[         R                  R                  R                  R                  U5      nU$ )Ntrunc)rounding_mode)
r   opsatensym_sizeintscalar_tensordivScalar_modeIntTensor)imdimscalesym_size_intrz   div_scalar_mode
int_tensors          r'   pattern.inplace_optimize_sym_size_div.<locals>.pattern   s    yy~~..222;		44\B))..,,88 9 
 YY^^''..?
r)   c                 p    [         R                  R                  R                  R	                  X5      nX2-  $ r`   )r   rv   rw   rx   ry   )r   r   r   r   s       r'   replacement2inplace_optimize_sym_size_div.<locals>.replacement   s)    yy~~..222;$$r)   )r   replace_pattern)rq   r   r   s      r'   inplace_optimize_sym_size_divr      s    % %%b;?r)   c                 j    [        U 5      S:X  a  [        S5      eU S   R                  5       (       a  gg)Nr   zEmpty argument name for codegenFT)r   r3   isdigitnames    r'   is_valid_for_codegenr      s0    
4yA~<==Awr)   r   prefixc                 X    U R                  SS5      n [        U 5      (       a  U $ U SU  3$ )N.r&   )replacer   )r   r   s     r'   normalize_namer      s3    <<S!DD!!XQtfr)   c                 L    U R                  S5      nSSR                  U5      -   $ )zprim::If -> convert_prim_If::convert_r&   )splitjoin)r   	name_lists     r'   ir_name_to_func_namer      s$    

4 I+++r)   c                 T    U(       a  U R                  U5      $ U R                  U5      $ r`   )get_attrplaceholder)fx_graphr   is_top_level_graphs      r'   #get_node_as_placeholder_or_get_attrr      s'      &&%%r)                           	   
               c                 \    U R                   nU[        ;  a  [        SU 35      e[        U   $ )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_ENUMr3   )tensorr   s     r'   get_dtype_as_intr      s4     LLE((/w7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::stridec                     U R                  5       R                  5       U R                  5       R                  5       p!U R                  S5      nX!U4$ Nr   )input	debugNameoutputs)nodeirv_parent_nameirv_name	attr_names       r'   &get_ir_value_parent_name_and_attr_namer      s?     $

 6 6 8$++-:Q:Q:SXvIi//r)   c                     / nX;   a  UR                  X    5        X   n X;   a  M  SR                  [        U5      5      $ Nr   )r   r   reversed)irref_mapname_mapr   s       r'   construct_fqnr     s@    I
-&[ - 88HY'((r)   rD   c                 b   ^^^^^ 0 m0 m0 mUUU4S jmUUUU4S jmT" U 5        T" U 5        TT4$ )af  
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                    > U R                  5        HO  nUR                  5       S:X  a  [        U5      u  nnnUTU'   UTU'   UR                  5        H  nT" U5        M     MQ     g)z9
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   ;get_block_to_lifted_attrs.<locals>._dfs_get_attr_dependency*  si     KKMDyy{o-
 ;4@	#/>"8,.7!(+(/ ' "r)   c                   > [        5       nU R                  5        H  nUR                  5        H  nUR                  T" U5      5      nM     UR	                  5       S:X  d  MG  UR                  5       R                  5       nU[        TR                  5       5      ;  d  M  UR                  [        UTT5      5        M     [        U [        R                  R                  5      (       d  UTU '   U$ )zd
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   rP   addr   r@   r   r   Graph)	r   	argumentsr   r   r   _map_blocks_to_lifted_attrsblocks_to_lifted_attrsr   r   s	        r'   r   >get_block_to_lifted_attrs.<locals>._map_blocks_to_lifted_attrs:  s    
 "e	KKMD%OO,G,NO	 ' yy{o-;;=224 3'9'@'@'B#CCMM%h0BDUV " %00,5"5)r)   ra   )rD   r   r   r   r   r   s    @@@@@r'   get_block_to_lifted_attrsr   	  sI    & >@ *, )+0  2 U#&!#444r)   name_to_attribute_fqnr   c                 v  ^  S[         4U 4S jjnUR                  5       S:X  a(  [        UR                  5       5      R	                  5       nOBUR                  5       S:X  a  UR                  5       R	                  5       nO[        SU S35      eUR                  S5      nU" U5      nU(       a	  U SU 3nU$ UnU$ )Nr   c                 8   > U T;   a  TU    $ [        SU  S35      eNz
Attribute 
 not found)
ValueError)r   r   s    r'   r   0get_attribute_fqn_from_ts_node.<locals>.get_attr\  s+    (((..z$z:;;r)   prim::SetAttrr   z7Unexpected node kind when getting attribute fqn. node:  r   )r   r   nextr   r   r   r3   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
		'ZZ\++-
EdV1M
 	
 vIj)N2@.!9+.HO GPHOr)   c                    U R                  5       nUS:w  d
   SU  35       e[        R                  R                  U5      n[	        UR
                  5      R                  S5      u  p4UR                  n [        [        R                  U5      n[        Xd5      nU(       a  [        Xu5      nU$ UR                  n U$ ! [         a3  n	[        SU R                  5        SU R                  5        35      U	eS n	A	ff = f)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getattrrv   default	Exceptionr3   r   )
r   
schema_strr   nsop_nameoverrideop_overload_modop_overload_packetop_overloadrT   s
             r'   get_op_overloadr   r  s    J&F*?v(FF&&+hh&;&;J&GFfkk"((.KB##H
!%))R0$_>!"4?K  -44K   &tyy{m=P
	s   37B; ,B; ;
C8.C33C8c                   	   \ rS rSrS\\R                  R                  \R                  R                  4   S\	\
\R                  4   S\	\
\R                  4   S\	\R                  R                  \\
   4   S\	\
\4   S\	\
\4   S\	\
\
4   4S	 jrS
 rS\R                  R                   S\\
   4S jrS rS rS\
4S jrS\R                  R                   4S jrS\R                  R.                  4S jrS rS\R4                  R6                  4S jrS rS\R                  R                   4S jrS\R                  R                   4S jrS\R                  R                   4S jr S\R                  R                   4S jr!S\R                  R                   4S jr"S\R                  R                   4S jr#S\R                  R                   4S jr$S\R                  R                   4S jr%S\R                  R                   4S  jr&S\R                  R                   4S! jr'S\R                  R                   4S" jr(S\R                  R                   4S# jr)S\R                  R                   4S$ jr*S\R                  R                   4S% jr+S\R                  R                   4S& jr,S\R                  R                   4S' jr-S\R                  R                   4S( jr.S\R                  R                   4S) jr/S\R                  R                   4S* jr0S\R                  R                   4S+ jr1S\R                  R                   4S, jr2S\R                  R                   4S- jr3S\R                  R                   4S. jr4S\R                  R                   4S/ jr5S0 r6S\R                  R                   4S1 jr7S2\R                  R                   4S3 jr8S\R                  R                   4S4 jr9S\R                  R                   4S5 jr:S\R                  R                   4S6 jr;S\R                  R                   4S7 jr<S\R                  R                   4S8 jr=S\R                  R                   4S9 jr>S\R                  R                   4S: jr?S\R                  R                   4S; jr@S\R                  R                   4S< jrAS\R                  R                   4S= jrBS> rCS?rDg@)ATS2FXGraphConverteri  ts_graphname_to_paramname_to_bufferr   name_to_non_tensor_attributename_to_constantr   c                   ^  UT l         UT l        UT l        [        R                  R                  5       T l        / T l        / T l        0 T l	        UT l
        UT l        0 T l        UT l        0 T l        UT l        [         R#                  5        H  n[%        U5      n	['        T U	U 4S j5        M!     [)        5       T l        g )Nc                 &   > TR                  U 5      $ r`   )_convert_standard_operators)r   selfs    r'   <lambda>.TS2FXGraphConverter.__init__.<locals>.<lambda>  s    T==dCr)   )r   r   r   r   fxr   r   input_specsoutput_specsname_to_noder  r   !name_to_non_tensor_attribute_noder  	subgraphsr   kind_to_standard_operatorsr/   r   setattrr   #name_update_from_subblock_to_parent)
r  r   r   r   r   r  r  r   khandler_func_names
   `         r'   __init__TS2FXGraphConverter.__init__  s     !*,(-(8,..0
  	
 1A 6K" BD.
 =Y):< '=# ,002A 4Q 7 !C	 3 >AU0r)   c                     XR                   ;   =(       dQ    XR                  ;   =(       d<    XR                  ;   =(       a'    [        U R                  U   [        R
                  5      $ r`   )r   r   r  r@   r   ScriptObject)r  fqns     r'   _is_get_attr_node%TS2FXGraphConverter._is_get_attr_node  sX    &&& ((( ,,, Ot44S95;M;MN	
r)   r   r   c           
         / / pCUR                  5        H  n[        UU R                  U R                  U R                  0 U R
                  U R                  5      nU H7  n[        U5      nUR                  R                  U5      n	XR                  U'   M9     UR                  5       n
U R                  U
5      nUR                  U R                  R                  U5      5        UR                  U5        M     X44$ r`   )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_noderj   subgraph_names               r'   _convert_block_to_subgraph.TS2FXGraphConverter._convert_block_to_subgraph  s    .0"+[[]E!4""##++%%**" '	,:9,E)#5#>#>#J#J-$  >N//	: ' *113H --h7M!!$--"8"8"GH&&'9:+ #, 22r)   c                    [        5       nUR                  5        H  nUR                  5        H  nUR                  5        Hb  nUR	                  5       U R
                  ;   d  M#  UR	                  5       U R                  ;  d  MC  UR                  UR	                  5       5        Md     UR                  U R                  U5      5      nM     M     U$ )a  
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(  1TS2FXGraphConverter._identify_inputs_as_arguments  s     "e	\\^E#kkm
%/%6%6%8M%//1T5F5FF)335T=W=WW!m&=&=&?@ &9 &OO66zB	 , $ r)   c                 ^    [        U R                  [        R                  R                  5      $ r`   )r@   r   r   r   r   )r  s    r'   r   &TS2FXGraphConverter.is_top_level_graph  s    $--88r)   r<   c                 R    S[        U R                  5       3nXR                  U'   U$ )N	subgraph_)r   r  )r  rj   r   s      r'   r   TS2FXGraphConverter.add_subgraph  s)    3t~~./0'tr)   c                    / n0 n[        UR                  5       UR                  5       HU  u  pVUR                  (       a  U R	                  U5      XFR
                  '   M5  UR                  U R	                  U5      5        MW     [        U5      U4$ r`   )r   r   r   
kwarg_onlyget_fx_value_by_ir_valuer   r   rC   )r  r   r   r5   rm   r   
schema_args          r'   get_args_kwargs#TS2FXGraphConverter.get_args_kwargs  su    !$T[[]F4D4D!EE$$*.*G*G*N'D99%@A	 "F T{F""r)   valuec                    UR                  5       nX R                  ;   a  U R                  U   nU$ X R                  ;   aV  [        U R                  U   [        R
                  5      (       a  U R                  R                  U5      $ U R                  U   $ X R                  ;   a  U R                  U R                  U   5      $ [        SU S35      e)NzInput r   )r   r  r  r@   r   r  r   r   r   get_fx_value_by_fqnr   )r  r7  
value_name
input_nodes       r'   r3  ,TS2FXGraphConverter.get_fx_value_by_ir_value  s    __&
*****:6J000$//
;U=O=OPP}}--j99((44555++D,F,Fz,RSSvj\<==r)   c                     XR                   ;   a  U R                   U   nU$ XR                  ;   a  U R                  U   nU$ XR                  ;   a  U R                  U   nU$ XR                  ;   a  U R                  U   nU$ [	        SU S35      er   )r  r  r  r  r   )r  r   fx_nodes      r'   r9  'TS2FXGraphConverter.get_fx_value_by_fqn.  s    $$$''-G  ***++D1G  ;;;<<TBG
 	 66677=G  z$z:;;r)   c                    U R                  5         U R                  R                  5        H  nU R                  U5        M     U R	                  5         [
        R                  R                  0 U R                  EU R                  EU R                  EU R                  EU R                  EU R                  5      n[        U5        UR                  R!                  5         U$ r`   )convert_graph_inputsr   r   convert_nodeconvert_graph_outputsr   r	  GraphModuler  r   r   r  r  r   r   rD   lint)r  r   rq   s      r'   r  TS2FXGraphConverter.convert;  s    !!#MM'')Dd# * 	""$ XX!!..$$ %% 33	
 '' MM	
 	&b)
	r)   c                    U R                   R                  5        GHO  nUR                  5       nX R                  ;   aj  [	        U5      nU R
                  R                  [        [        R                  [        US9US95        [        U R                  X R                  5       5      nGOX R                  ;   ak  [	        U5      nU R
                  R                  [        [        R                  [        US9USS95        [        U R                  X R                  5       5      nGO:X R                   ;   a  [#        U R                   U   [$        R&                  5      (       d   S5       e[	        U5      nU R
                  R                  [        [        R(                  [+        X3S9USS95        [        U R                  X R                  5       5      nO[#        UR-                  5       [$        R.                  5      (       a  GM  [	        USS	9nU R
                  R                  [        [        R0                  [        US9US95        U R                  R3                  U5      nX@R4                  U'   GMR     g )
Nr   argtargetT)rI  rJ  
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  r@   r   r  
CUSTOM_OBJr   r   	ClassType
USER_INPUTr   r  )r  graph_inputr   normalized_namer>  s        r'   rA  (TS2FXGraphConverter.convert_graph_inputsU  s   ==//1K((*D)))"0"6  ''!++*@# >MM4)@)@)B ,,,"0"6  ''!((*@##'	 >MM4)@)@)B ...!))$/1C1C  @?@  #1"6  ''!,,-!0  $#(	 >MM4)@)@)B K,,.@@"0g"F  ''!,,*@# --33OD&-d#y 2r)   c                    S nUR                  5        Vs/ s H  o0R                  U5      PM     nnU R                  R                  U[	        U5      5      nXPR
                  UR                  5       R                  5       '   g s  snf )Nc                 X    U R                  [        R                  S9R                  5       $ )N)r   )tor   floatitem)ts    r'   to_float_tensor?TS2FXGraphConverter.convert_aten_Float.<locals>.to_float_tensor  s     44ekk4*//11r)   )r   r3  r   call_functionrC   r  r   r   )r  r   r[  r]   inp_listr>  s         r'   convert_aten_Float&TS2FXGraphConverter.convert_aten_Float  sx    	2 ;?++-
:G3))#.- 	 
 ----(O
 8?$++-1134
s   Bc                   ^ U R                  U[        R                  R                  R                  R
                  R                  5      u  p#U H  nUS:X  d  M  [        X4   5      X4'   M     [        S U 5       5      (       a  [        R                  O[        R                  R                  mU4S jnUR                  5       R                  5       nU R                  R                  XRU5      nXpR                  U'   g)z9aten::tensor creates a constant tensor ad-hoc --> GetAttrrequires_gradc              3   B   #    U  H  n[        U[        5      v   M     g 7fr`   )r@   ry   ).0rb   s     r'   	<genexpr>:TS2FXGraphConverter.convert_aten_tensor.<locals>.<genexpr>  s     4t!:a%%ts   c                  J   > SU;   a  US   b  [         US      US'   T" U 0 UD6$ )Nr   )_TORCH_ENUM_TO_DTYPE)r5   rm   	to_tensors     r'   rJ  7TS2FXGraphConverter.convert_aten_tensor.<locals>.target  s6    & VG_%@"6vg"Gwd-f--r)   N)r5  r   rv   rw   r   r   _schemaboolall_refsr   r   r   r]  r  )	r  r   r5   rm   r  rJ  output_namer>  ri  s	           @r'   convert_aten_tensor'TS2FXGraphConverter.convert_aten_tensor  s    ++D%))..2G2G2O2O2W2WXAO# O	  4t444 LL## 		. kkm--/----fFC)0+&r)   c                 *  ^  [         R                  " S5        [        U 4S jUR                  5        5       5      nT R                  R                  [        U5      nUT R                  UR                  5       R                  5       '   UT R                  UR                  S5      R                  5       '   T R                  5       (       dM  US   R                  S:X  a9  T R                  R                  UR                  S5      R                  5       5        g g g )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   F   >#    U  H  nTR                  U5      v   M     g 7fr`   r3  )rd  r]   r  s     r'   re  :TS2FXGraphConverter.convert_aten_append.<locals>.<genexpr>  s     Q=CT22377=   !r   r   )warningswarnrC   r   r   r]  rh   r  r   r   inputsAtr   opr  r   )r  r   r5   r>  s   `   r'   convert_aten_append'TS2FXGraphConverter.convert_aten_append  s     	|	

 Q4;;=QQ----k4@7>$++-1134 ;B$--*4467 &&((T!WZZ=-H4488q9I9S9S9UV .I(r)   c                 8   UR                  5       R                  5       nS nUR                  S5      (       a  UR                  S5      nUS:X  a  UR	                  S5      nOUS:X  a  UR                  S5      nOUS:X  a  UR                  S5      nO}US:X  a@  SU 3nU R                  R                  U5      nX`R                  U'   XQR                  S5      p2O7US:X  a  UR                  S5      nO[        SUR                  S5       35      eS nX0R                  U'   g )	Nr7  r\   fr   rZ  lifted_tensor_ivalzUnsupported constant type: )r   r   hasAttributekindOfr\   r~  r   r   r   r  rZ  r  r   r  )r  r   r   r7  constant_kind
alias_namer>  s          r'   convert_prim_Constant)TS2FXGraphConverter.convert_prim_Constant  s   {{}&&(W%% KK0M#w#%w#%w#%$TF+  --00<*1!!$'(&&/e&(		'* #>t{{7?S>T!UVVE&+d#r)   c                 &   UR                  5        Vs/ s H  o R                  U5      PM     nnU R                  R                  UR	                  S5      [        U5      5      nX@R                  UR                  5       R                  5       '   g s  snf r   )	r   r3  r   call_methodr   rC   r  r   r   )r  r   r]   r^  r>  s        r'   convert_prim_CallMethod+TS2FXGraphConverter.convert_prim_CallMethod  sy    :>++-
:G3))#.- 	 
 --++FF6N(O
 8?$++-1134
s   Bc                 N   UR                  5       R                  5       nUR                  [        R                  R
                  R                  5       5      (       a=  UR                  5       nUR                  5       R                  5       nX0R                  U'   g [        SU S35      e)NzUnsupported JitType (z) when get device)r   r   isSubtypeOfr   r   
TensorTypegetdevicer   r   r  r   )r  r   
input_typer  ro  s        r'   convert_prim_device'TS2FXGraphConverter.convert_prim_device  s    ZZ\&&(
!!%(("5"5"9"9";<<&&(F++-113K17!!+.4ZL@QRSSr)   c                 &   [        U R                  U5      nUR                  5       R                  5       nX R                  U'   U R	                  5       (       a  U R                  U5      (       a)  U R                  R                  U5      U R                  U'   g X R                  ;  a  U R                  U   U R                  U'   U R                  U   U R                  U'   g U R                  U5      (       a  U R                  U   U R                  U'   g g r`   )r   r   r   r   r   r  r   r   r  r  r  )r  r   r   ro  s       r'   convert_prim_GetAttr(TS2FXGraphConverter.convert_prim_GetAttr  s    1$2L2LdSkkm--/2:"";/""$$%%h// 261G1G1Q!!+.#I#II 99(C ::  261W1W2!!+. %%h//151B1B81L!!+. 0r)   c                 t   [        U R                  U5      n[        UR                  5       5      S   nU R	                  U5      nU R                  U5      (       aQ  U R                  R                  U5      nU R                  R                  [        R                  R                  XT45        g X@R                  U'   g Nr   )r   r   rC   r   r3  r  r   r   r]  r   r~   copy_r  )r  r   r   
attr_valuets_graph_tensor_inputfx_attr_nodes         r'   convert_prim_SetAttr(TS2FXGraphConverter.convert_prim_SetAttr  s    1$2L2LdS4;;=)!,
 $ = =j I!!(++==11(;LMM''""\$I @U228<r)   c                    [        U5      nU R                  XR                  5      u  p4U R                  R	                  X#U5      nUR                  5       S:X  a-  UR                  5       R                  5       nXPR                  U'   g [        UR                  5       5       HN  u  pxUR                  5       nU R                  R	                  [        R                  XW45      n	XR                  U'   MP     g r  )r   r5  rk  r   r]  outputsSizer   r   r  rQ   outputsoperatorgetitem)
r  r   rJ  r5   rm   r>  ro  r\   outpnext_fx_nodes
             r'   convert_call_function_op,TS2FXGraphConverter.convert_call_function_op*  s     &++D..A----fFC
 "++-113K-4k*$T\\^4"nn.#}}::$$wl  2>!!+. 5r)   c                 &    U R                  U5        g r`   _convert_prim_iteratorr  r   s     r'   convert_prim_TupleConstruct/TS2FXGraphConverter.convert_prim_TupleConstruct?      ##D)r)   c                 &    U R                  U5        g r`   r  r  s     r'   convert_prim_ListConstruct.TS2FXGraphConverter.convert_prim_ListConstructB  r  r)   c                     UR                  5        Vs/ s H  o R                  U5      PM     nnUR                  5       R                  5       nX0R                  U'   g s  snf r`   )r   r3  r   r   r  )r  r   r]   output_listro  s        r'   r  *TS2FXGraphConverter._convert_prim_iteratorE  sM    EI[[]S]c44S9]Skkm--/)4+& Ts   Ac                 J   0 nSu  p4[        UR                  5       5       HG  u  pVUS-  S:X  a  U R                  U5      nM!  U R                  U5      nUb  Uc   S5       eXBU'   Su  p4MI     Uc  Ub   S5       eUR                  5       R	                  5       nX R
                  U'   g )N)NNr   r   z*DictConstruct has an empty key value pair.zGDictConstruct has an odd number of elements (violating our assumption).)rQ   r   r3  r   r   r  )r  r   output_dictr  vr\   r]   ro  s           r'   convert_prim_DictConstruct.TS2FXGraphConverter.convert_prim_DictConstructK  s    .FA 1uz11#611#6Mam@?@3!"A!1 / I!)	UT	U# kkm--/)4+&r)   c                 &    U R                  U5        g r`   _convert_prim_unpack_iteratorr  s     r'   convert_prim_ListUnpack+TS2FXGraphConverter.convert_prim_ListUnpackb      **40r)   c                 &    U R                  U5        g r`   r  r  s     r'   convert_prim_TupleUnpack,TS2FXGraphConverter.convert_prim_TupleUnpacke  r  r)   c                    [        UR                  5       5       Hm  u  p#UR                  5       nU R                  UR	                  5       5      nU R
                  R                  [        R                  XR45      nX`R                  U'   Mo     g r`   )
rQ   r  r   r3  r   r   r]  r  r  r  )r  r   r\   r  	outp_namer]   r>  s          r'   r  1TS2FXGraphConverter._convert_prim_unpack_iteratorh  sg     0GA(I//

=Cmm11(2B2BSHMG+2i(	 1r)   c                   ^  [         R                  R                  R                  R                  n[        U 4S jUR                  5        5       5      nT R                  R                  X#S[         R                  05      nT R                  R                  [         R                  R                  R                  R                  U45      nUR                  5       R                  5       nUT R                  U'   g )Nc              3   F   >#    U  H  nTR                  U5      v   M     g 7fr`   rt  rd  r   r  s     r'   re  7TS2FXGraphConverter.convert_aten_Int.<locals>.<genexpr>s       U}eT22599}rv  r   )r   rv   rw   _to_copyr   rC   r   r   r]  int32_local_scalar_denser   r   r  )r  r   rJ  r5   to_copy_noder>  ro  s   `      r'   convert_aten_Int$TS2FXGraphConverter.convert_aten_Intp  s    ((00Ut{{}UU}}226'5;;AWX----IINN..66
 kkm--/)0+&r)   c                 F  ^  [         R                  R                  R                  n[	        U 4S jUR                  5        5       5      nT R                  R                  X#S[         R                  05      nUR                  5       R                  5       nUT R                  U'   g )Nc              3   F   >#    U  H  nTR                  U5      v   M     g 7fr`   rt  r  s     r'   re  ?TS2FXGraphConverter.convert_prim_NumToTensor.<locals>.<genexpr>  r  rv  r   )r   rv   rw   rz   rC   r   r   r]  longr   r   r  r  r   rJ  r5   r>  ro  s   `     r'   convert_prim_NumToTensor,TS2FXGraphConverter.convert_prim_NumToTensor  sq     --Ut{{}UU----fWejj<QRkkm--/)0+&r)   c                 ^    UR                  5       R                  5       nSU R                  U'   g )N )r   r   r   r  r   ro  s      r'   convert_prim_CreateObject-TS2FXGraphConverter.convert_prim_CreateObject  s&    kkm--/24"";/r)   c                 *   [         R                  R                  R                  R                  nU R                  XR                  5      u  p4U R                  R                  X#U5      nUR                  5       R                  5       nXPR                  U'   g r`   )r   rv   rw   convolutionr   r5  rk  r   r]  r   r   r  )r  r   rJ  r5   rm   r>  ro  s          r'   convert_aten__convolution-TS2FXGraphConverter.convert_aten__convolution  sk     ++33++D..A----fFCkkm--/)0+&r)   c                    [        U5      nUR                  nU R                  X5      u  pEUR                  S:X  Ga  US   R                  nX`R
                  ;   a  [        U R
                  U   [        R                  5      (       a  U R
                  U   nUR                  5       S:X  a  [        U5      nU R
                  U   R                  5       US'   U R                  R                  [        R                  R                  R                   R"                  [%        U5      U5      n	UR'                  5       R)                  5       n
XR*                  U
'   g U R-                  U5        g )NTensor_moder   )r   rk  r5  r   r   r  r@   r   r~   numelrO   rY  r   r]  rv   rw   r{   r|   rC   r   r   r  r  )r  r   rJ  r   r5   rm   	arg1_nametensor_constantupdated_argsr>  ro  s              r'   convert_aten_div$TS2FXGraphConverter.convert_aten_div  s$    &++D9 =0QI111j%%i0%,,7 7 #'"7"7	"B"((*a/#':L&*&;&;I&F&K&K&MLO"mm99		**66l+G #'++-"9"9";K5<%%k2%%d+r)   c                    ^  [        U 4S jUR                  5        5       5      u  p#T R                  R                  [        R
                  X#45      nUR                  5       R                  5       nUT R                  U'   g )Nc              3   F   >#    U  H  nTR                  U5      v   M     g 7fr`   rt  r  s     r'   re  ?TS2FXGraphConverter.convert_aten___getitem__.<locals>.<genexpr>  s"      '
>KUD))%00mrv  )	rC   r   r   r]  r  r  r   r   r  )r  r   input_containerindexr>  ro  s   `     r'   convert_aten___getitem__,TS2FXGraphConverter.convert_aten___getitem__  sm    !& '
>Bkkm'
 "
 ----6
 kkm--/)0+&r)   c                 &   [        U5      nU R                  XR                  5      u  p4U[        R                  R
                  R                  R                  :X  d3  U[        R                  R
                  R                  R                  :X  Gai  UR                  5       R                  5        Vs/ s H  oUR                  PM     nnU Vs/ s H$  nUR                  5       S:w  d  M  [        U5      PM&     nn[        S U 5       5      n	U	(       a  [        U5      S:  d   e[        U5      n
SU
S'   U R                   R#                  [        R                  R
                  R                  R                  [%        U
5      5      nU R                   R#                  [        R                  R
                  R&                  R(                  U45      nUR                  5       R+                  5       nXR,                  U'   g U R/                  U5        g s  snf s  snf )Nr   c              3   L   #    U  H  oR                   R                  v   M     g 7fr`   )rk  
is_mutable)rd  rJ  s     r'   re  6TS2FXGraphConverter.convert_aten_to.<locals>.<genexpr>  s      %8Df))s   "$r   Tr   )r   r5  rk  r   rv   rw   rW  r   
prim_dtyper   usesuserr   anyr   rO   r   r]  rC   cloner   r   r  r  )r  r   rJ  r5   _kwargsuse
user_nodes	user_nodeuser_targetshas_mutable_targetnew_argsr>  
clone_nodero  s                 r'   convert_aten_to#TS2FXGraphConverter.convert_aten_to  s    &,,T>>B UYY^^&&,,,%))..:K:K:V:V0V.2kkm.@.@.BC.Bs((.BJC ",!+I##%6 +	*!+  
 "% %8D% " "4yA~%~:"--55IINN%%++U8_
 "]]88IINN((007*
 #kkm5571;!!+.%%d+5 Ds   .H		H%Hc                    UR                  5       S:X  a  [        UR                  S5      R                  5       [        R
                  5      (       ak  [        UR                  S5      R                  5       [        R
                  5      (       a/  [        R                  R                  R                  R                  nO[        SU 35      e[        U5      nU[        R                  R                  R                  R                  :X  ai  U R                  XR                  5      u  p4UR                  5       R                  5       nU R                   R#                  [$        U5      U R&                  U'   g U R)                  U5        g )Nr   r   r   z#unable to determind the target for )r   r@   ry  r   r   ListTyperv   rw   r   rZ  r3   r   r5  rk  r   r   r   r]  rd   r  r  )r  r   rJ  r5   r  ro  s         r'   convert_aten_add$TS2FXGraphConverter.convert_aten_add  s   ;;=M)$--*//15>>BBza %%'H H ++--"%H#OPP$T*FUYY^^''))) !00~~FMD++-113K-1]]-H-HSW-XDk*))$/r)   c                 V   [        UR                  5       5      nUS   R                  5       U R                  ;  a  [	        S5      e[        UR                  5       5      n[        UR                  5       5      R                  5       nUR                  5        H  nUR                  5       S:X  a-  UR                  5       R                  5       U:X  a  [	        S5      eUR                  5       S:  d  MZ  UR                  5        H"  nUR                  5       U:X  d  M  [	        S5      e   M     g )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   )rO   r   r   r  r3   r   r   r  r   r  r   )r  r   r   subblockcondition_output_namer  s         r'   _check_prim_loop_support,TS2FXGraphConverter._check_prim_loop_support  s    dkkm$ !9 (=(==] 
 & $X%5%5%7 8 B B DNN$D  "a'KKM++-1FF"V  !Q& LLND~~'+@@*^  + %r)   c           	         [        UR                  5       5      nU R                  U5        U R                  US   5      nUSS   Vs/ s H  oDR	                  5       PM     nnU R                  U5      nUR                  5        H!  nUR                  U R                  U   5      nM#     [        U5      nU R                  X5      u  p[        U5      S:X  d   eU	S   n
U R                  5       (       d*  U R                  R                  U
R                  5      U l        XV-    Vs/ s H  nU R                  U5      PM     nn[        U5       GHk  nU R                  R!                  ["        US   U[        U5      /UQ70 5      nUR%                  5       S:  a  ['        UR)                  5       5       Hc  u  nnUR	                  5       nU R                  R!                  [*        R,                  UUS-   45      U R.                  U'   U R.                  U   X'   Me     ['        U
R                  5       H  u  pU R                  R!                  [*        R,                  UXR%                  5       -   S-   45      U R.                  U'   UR1                  U5      nU R.                  U   UXR%                  5       -   U-   '   M     GMn     g s  snf s  snf )Nr   r   r   )rO   r   r	  r3  r   r(  r   r   r   r%  r   r   r  r9  ranger   r]  rp   r  rQ   r  r  r  r  r  )r  r   r   num_iterationsr]   loop_local_argumentsglobal_argumentsr   r  r  r   r   fx_block_argsrk   	loop_noder\   r  ro  global_argument_indexs                      r'   convert_prim_Loop%TS2FXGraphConverter.convert_prim_Loop  s   dkkm$%%d+66vayA <B!":F:C:F==dC [[]E/55++E2  #
   01.2.M.M/
+ >"a'''03&&((88>>&JJ 4 -?
? $$T*? 	 
 n-H33/ #1%,- #	 
I !Q&(8GAt"&.."2K59]]5P5P ((%E6D%%k2 (,'8'8'EM$  9 %"FF +/--*E*E$$!,,..2+!!$' )9(>(>t(D% %%d+ ((**-BB7 .;  G2
s   J9 J>if_nodec                     UR                  5        H9  nUR                  5        H"  nUR                  5       S:X  d  M  [        S5      e   M;     g )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   r3   )r  r  r   r   s       r'   _check_set_attr_in_if_block/TS2FXGraphConverter._check_set_attr_in_if_blockk  sC    ^^%E99;/1&-  & &r)   c                    U R                  U5        [        UR                  5       5      n[        U5      S:X  d   eU R	                  US   5      nU R                  U5      nUR                  5        H!  nUR                  U R                  U   5      nM#     [        U5      nU R                  X5      u  pg[        U5      S:X  d   eU Vs/ s H  oR                  U5      PM     n	nUUS   US   [        U	5      4n
U R                  R                  [        R                  U
0 5      nUR!                  5       S:X  a-  UR#                  5       R%                  5       nXR&                  U'   g UR!                  5       S:  al  [)        UR+                  5       5       HN  u  pUR%                  5       nU R                  R                  [,        R.                  X45      nXR&                  U'   MP     g g s  snf )Nr   r   r   )r  rO   r   r   r3  r(  r   r   r   r%  r9  rC   r   r]  r   condr  r   r   r  rQ   r  r  r  )r  r   r   	predicater   r   r  r&   r   r  r5   	cond_nodero  r\   r   r  s                   r'   convert_prim_If#TS2FXGraphConverter.convert_prim_Ifu  s   ((.dkkm$6{a11&)<	 66t<	 [[]E!(C(CE(JKI # O	 ;;DL>"a'''DMNID11$7IN 11- 	
 MM//

D"E	 "++-113K-6k*!#&t||~6	$..0--55h6F6FW18!!+. 7 $ Os   	G'c                 &    U R                  U5        g r`   )_convert_as_noopr  s     r'   convert_aten_Bool%TS2FXGraphConverter.convert_aten_Bool  s    d#r)   c                     g r`   ra   r  s     r'   convert_prim_Enter&TS2FXGraphConverter.convert_prim_Enter  s    
 	r)   c                     g r`   ra   r  s     r'   convert_prim_Exit%TS2FXGraphConverter.convert_prim_Exit  s    r)   c                     [        U5      nUR                  nU R                  X5      u  pEUR                  5       R	                  5       nUS   U R
                  U'   g )Nr   )r   rk  r5  r   r   r  )r  r   rJ  r   r5   r  ro  s          r'   r   $TS2FXGraphConverter._convert_as_noop  sQ     !&,,T:kkm--/)-a+&r)   c                    ^  [         R                  R                  R                  n[	        U 4S jUR                  5        5       5      nT R                  R                  X#5        g )Nc              3   F   >#    U  H  nTR                  U5      v   M     g 7fr`   rt  r  s     r'   re  MTS2FXGraphConverter.convert_profiler__record_function_exit.<locals>.<genexpr>  r  rv  )r   rv   profiler_record_function_exitrC   r   r   r]  )r  r   rJ  r5   s   `   r'   &convert_profiler__record_function_exit:TS2FXGraphConverter.convert_profiler__record_function_exit  sB     ##99Ut{{}UU##F1r)   c                     SnU R                  [        UR                  5       5      5      4nU R                  R	                  X#5      nUR                  5       R                  5       nX@R                  U'   g )Ntolist)r3  r   r   r   r  r   r   r  r  s         r'   convert_prim_tolist'TS2FXGraphConverter.convert_prim_tolist  s]     --d4;;=.ABD--++F9kkm--/)0+&r)   c                     UR                  5       R                  5       n[        R                  " 5       U R                  U'   g r`   )r   r   r   r~   r  r  s      r'   convert_prim_Uninitialized.TS2FXGraphConverter.convert_prim_Uninitialized  s.    
 kkm--/-2\\^k*r)   c                 
  ^  [         UR                  5          n[        U 4S jUR                  5        5       5      nT R                  R                  X#5      nUR                  5       R                  5       nUT R                  U'   g )Nc              3   F   >#    U  H  nTR                  U5      v   M     g 7fr`   rt  r  s     r'   re  BTS2FXGraphConverter._convert_standard_operators.<locals>.<genexpr>  r  rv  )	r  r   rC   r   r   r]  r   r   r  r  s   `     r'   r  /TS2FXGraphConverter._convert_standard_operators  sa    +DIIK8Ut{{}UU----f;kkm--/)0+&r)   c                 T   UR                  5       n[        U5      n[        XU R                  5      nSR	                  [        U5      R                  S5      S S 5      n[        R                  SUR                  U5         U" U5        g ! [         a  n[        SU 35      UeS nAff = f)Nr  
r   z[%s] converts [%s]zTS2EPConverter failed for node )r   r   r   r  r   r   r   logdebug__name__r   r3   )r  r   	node_kindr  handler_funcnode_strrT   s          r'   rB   TS2FXGraphConverter.convert_node  s    IIK	
 1;t8U8UV
 773t9??40!45		&(=(=xH	U 	U!@LMSTT	Us    B	 	
B'B""B'c                    / nU R                   R                  5        Vs/ s H  o"R                  5       PM     sn[        U R                  5      -   nU GHi  nX@R
                  ;   a  U R
                  U   nU R                  5       (       dd  [        U[        R                  R                  5      (       a;  UR                  S:X  a+  U R                  R                  [        R                  U45      nUR                  U5        U R                   R                  [#        [$        R&                  [)        US9US95        M  X@R*                  ;   ag  UR                  U R*                  U   5        U R                   R                  [#        [$        R&                  [-        X@R*                  U   S9US95        GM]  [/        SU S35      e   [1        U5      S:X  a  U R                  R3                  / 5        g [1        U5      S:X  a  U R                  R3                  US   5        g [1        U5      S:  a  U R                  R3                  U5        g U R                  R3                  U5        g s  snf )	Nr   r   rH  )r   r7  zOutput r   r   r   )r   r  r   rO   r  r  r   r@   r   r	  Noderz  r   r]  r  r   r  r   r   USER_OUTPUTr   r  r   r   r   r   )r  r5   r  outp_name_listro  r>  s         r'   rC  )TS2FXGraphConverter.convert_graph_outputs  s   7;}}7L7L7NO7Nt..*7NORV44S
 
 *K///++K8 //11"7EHHMM::

m3"mm99%++zRGG$!!(("..*<*  5 55D11+>?!!(("..,!,4I4I+4V  + !7;-z!BCC? *B t9>MM  $Y!^MM  Q Y]MM  
 MM  &c Ps   I!)r   r   r
  r   r   r  r  r  r  r   r  r  r  r   N)ErA  
__module____qualname____firstlineno__r   r   r   r   Blockdictr   r~   r   r   r  r  rG  rO   r%  r(  r   r  r5  Valuer3  r9  r	  rD  r  rA  r_  rp  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   r0  r4  r7  r  rB  rC  __static_attributes__ra   r)   r'   r   r     s-   DC67DC C-.DC S%,,./	DC
 !%UXX^^SX%= >DC '+38nDC sCx.DC  $CH~DCL
3uxx}} 3c 3429 
	#EHHMM 	#>ehhnn >-- 4=.~?uxx}} ?1 18W W,,%((-- ,8?EHHMM ?T TM M8
U 
U>UXX]] >** **uxx}} *5588== 55uxx}} 5.1EHHMM 11UXX]] 13%((-- 31UXX]] 1 1UXX]] 15ehhmm 5	1ehhmm 	1,UXX]] ,B1UXX]] 1$,EHHMM $,L0UXX]] 0(6L,ehhmm L,\588== &9EHHMM &9P$ehhmm $uxx}} ehhmm 	1UXX]] 	12588== 21 1<uxx}} <1 1U U&3'r)   r   c                   `  ^  \ rS rSrSr " S S\5      rS\\R                  R                  \R                  R                  4   S\\\R                  4   S\\\R                  4   S\\R                  R                  \\   4   S	\\\4   S
\\\4   S\\\4   4U 4S jjrS rU 4S jrSrU =r$ )ExplainTS2FXGraphConverteri  z
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                   :   ^  \ rS rSrU 4S jrU 4S jrS rSrU =r$ )$ExplainTS2FXGraphConverter._DictMocki&  c                 0   > [         TU ]  U5        X l        g r`   )superr  
mock_value)r  	dict_datarX  	__class__s      r'   r  -ExplainTS2FXGraphConverter._DictMock.__init__'  s    GY'(Or)   c                 b   > [         TU ]  U5      (       d  U R                  $ [         TU ]  U5      $ r`   )rW  __contains__rX  __getitem__)r  keyrZ  s     r'   r^  0ExplainTS2FXGraphConverter._DictMock.__getitem__+  s/     7',,&7&s++r)   c                     gNTra   )r  r_  s     r'   r]  1ExplainTS2FXGraphConverter._DictMock.__contains__2  s    r)   )rX  )	rA  rK  rL  rM  r  r^  r]  rQ  __classcell__rZ  s   @r'   	_DictMockrU  &  s    	)	,	 	r)   rf  r   r   r   r   r  r  r   c                    > [         TU ]  UUUUUUU5        / U l        [        R	                  U R
                  [        R                  R                  S SSS S0 5      5      U l        g )Nmockr]  c                      g r`   ra   ra   r)   r'   r  5ExplainTS2FXGraphConverter.__init__.<locals>.<lambda>T  s    r)   ra   )	rW  r  unsupported_node_listrS  rf  r  r   r	  rG  )	r  r   r   r   r   r  r  r   rZ  s	           r'   r  #ExplainTS2FXGraphConverter.__init__5  sq     	"(!	
 ;=" 7@@HHMM
r)   c                     U R                  5         U R                  R                  5        H  nU R                  U5        M     U R	                  5         g r`   )rA  r   r   rB  rC  r  s     r'   explain"ExplainTS2FXGraphConverter.explainZ  s?    !!#MM'')Dd# *""$r)   c                 |   >  [         TU ]  U5        g ! [         a    U R                  R	                  U5         g f = fr`   )rW  rB  r   rk  r   )r  r   rZ  s     r'   rB  'ExplainTS2FXGraphConverter.convert_node`  s8    	4G & 	4&&--d3	4s    %;;)r  rk  )rA  rK  rL  rM  __doc__rO  rf  r   r   r   r   rN  r   r~   r   r   r  rn  rB  rQ  rd  re  s   @r'   rS  rS    s    D #
67#
 C-.#
 S%,,./	#

 !%UXX^^SX%= >#
 '+38n#
 sCx.#
  $CH~#
J%4 4r)   rS  c              #   ^   #    U R                   nSU l          S v   Xl         g ! Xl         f = f7frb  )disabled)r?  rt  s     r'   disable_loggingru  g  s'     ||HCL xs   -" -*-c            
          \ rS rSr SS\\R                  R                  \R                  R                  4   S\	\
S4   S\\\\
4      4S jjrS\4S	 jr\" \5      SS
 j5       rS\R(                  R*                  S\\\
4   4S jrS rSrg)TS2EPConverteriq  Nts_modelsample_args.sample_kwargsc                   ^ Xl         [        X5      u  U l        U l          nX l        X0l        0 U l        0 U l        [        U R                   [        R                  R                  5      (       d#  [        U R                   R                  5       5      O/ n[        U R                   [        R                  R                  5      (       dl  U R                   R                  5       R                  5        H@  u  nm[!        U4S jU 5       5      (       a  TU R                  U'   M1  TU R                  U'   MB     0 U l        0 U l        U R'                  5         g )Nc              3      >#    U  H4  nTR                   UR                   :X  d  M  TU:H  R                  5       v   M6     g 7fr`   )shaperm  )rd  paramr   s     r'   re  *TS2EPConverter.__init__.<locals>.<genexpr>  s:      !+||u{{2 ,Vu_))++!+s   ??)rx  r^   r   rW   ry  rz  r   r   r@   r   r   rA   rO   
parametersrX   itemsr  name_to_non_tensor_attributesr  lift_get_attr)r  rx  ry  rz  r&   
param_listr  r   s          @r'   r  TS2EPConverter.__init__s  s    !+<X+S(t{Aq&*6879 dmmUXX-D-DEE ))+, 	
 $--)@)@AA!]]557==?	6 !+  
 -3D&&q)-3D''* @ >@*02r)   r<   c           	      >   [         R                  S5        [         R                  SU R                  5        [        U R                  5      u  p[	        U R                  U R
                  U R                  UU R                  U R                  U5      nUR                  5       n[        U5        [         R                  SUR                  SS95        U R                  UUR                  5      n[         R                  SU5        [        U R                  [        R                   R"                  5      (       dj  U R                  R%                  5       R'                  5        H>  u  pgXeR$                  ;  d  M  [(        R*                  " SU S35        XuR$                  U'   M@     U$ )	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   r  r  r  r	   print_readableretrace_as_exported_programr@   rx  r   r   rA   rX   r  rw  rx  )r  r   r   graph_converterrq   epr  r   s           r'   r  TS2EPConverter.convert  sU   
	
 	,dmm<8QMM9
5 .MM"..!!!
 $$& 	03"B$5$55$5$IJ--,,
 	r
 $--)@)@AA!]]557==?	MM)MM,QC/}~ (.MM!$ @ 	r)   c           	         [        U R                  5      u  p#[        U R                  U R                  U R                  UU R
                  U R                  U5      nUR                  5         [        UR                  5      S:  aj  Sn[        UR                  5       HN  u  pgSR                  [        U5      R                  S5      S S 5      nUSU SUR                  5        SU S	3-  nMP     OS
nU(       a  [        U5        U$ )Nr   z2Unsupported nodes are found in the following list:r  r>  r   z

    z. z []zSuccess!)r   r   rS  r   r   r  r  rn  r   rk  rQ   r   r   r   r   print)	r  r  r   r   r  explain_strr\   nrD  s	            r'   rn  TS2EPConverter.explain  s    8QMM9
5 5MM"..!!!
 	!4459NK!/"G"GH773q6<<#5bq#9:!Bqvvxj8*AFF I %K+r)   rq   r  c                 l   [        S U R                  5      n[        R                  R                  R                  UU R                  USSS9nUR                  R                  UR                  5        VVs0 s H8  u  pV[        U[        R                  [        R                  45      (       d  M6  XV_M:     snn5        U H  nUR                  R                  US 5        M!     UR                  R                   H  nUR                   ["        R$                  :X  d  M#  UR&                  U;   d  M5  [        X'R&                     [        R                  5      (       d   [)        X'R&                     5       S35       e["        R*                  Ul        M     UR-                  5       R/                  U5        U$ s  snnf )Nc                     [        U[        R                  5      (       a"  [        R                  /UR                  5       -  $ S $ r`   )r@   r   r~   r   AUTOr   )pathxs     r'   r  <TS2EPConverter.retrace_as_exported_program.<locals>.<lambda>  s.    (21ell(C(C
QUUW$MMr)   FT)dynamic_shapesr+   pre_dispatchz& has been erroneously marked as buffer)r
   ry  r   export_trace_export
_constantsupdater  r@   r~   r  rX   popgraph_signaturer
  r   r   rN  rJ  r   CONSTANT_TENSORverifiercheck)r  rq   r  r  r  r  r  specs           r'   r  *TS2EPConverter.retrace_as_exported_program  sy   
 - 	
 \\  (() ) 
 	 -2244DAa%,,0B0B!CD 4	
 "AMMa& " &&22DyyI,,,@P1P!$[[15<<  b+KK89::`ab  &55	 3 	B	%s   55F0
.F0
c                    ^ ^^^^ 0 mS[         4U 4S jjmS[        R                  R                  4U4S jjmUUUUU 4S jmT" T R                  5        g )Nr  c                 j   > U R                  S5      nTR                  nU H  n[        X#5      nM     U$ r   )r   rx  r   )r  r   r  r  r  s       r'   r   .TS2EPConverter.lift_get_attr.<locals>.get_attr'  s1    99S>DAAM Hr)   r   c                    > U R                  S5      nU R                  5       R                  5       nTU   nU(       a	  U SU 3nU$ UnU$ )Nr   r   )r   r   r   )r   r   r   r   r   r   s        r'   get_fqn-TS2EPConverter.lift_get_attr.<locals>.get_fqn.  sT    vI//1J2:>N:H.)9+6HO OXHOr)   c                   > U R                  5        GH.  nUR                  5       S:X  a#  UR                  5       R                  5       nST	U'   UR                  5       S:X  a  T" U5      nT" U5      nUR                  5       R                  5       nUT	U'   [	        U[
        R                  5      (       a   UT
R                  ;  a  UT
R                  U'   ON[	        U[
        R                  5      (       a   UT
R                  ;  a  UT
R                  U'   OUT
R                  U'   UR                  5        H  nT" U5        M     GM1     g )Nzprim::CreateObjectr  r   )r   r   r   r   r@   r   r~   r   r  r  r  r   )r   r   ro  r   r7  r  _dfs_get_attrr   r  r   r  s         r'   r  3TS2EPConverter.lift_get_attr.<locals>._dfs_get_attr5  s   99;"66"&++-"9"9";K9;)+699;/1&t}H$X.E"&++-"9"9";K9A)+6!%66#4+>+>><AD//9#E5+=+=>>#4+@+@@>CD11(;GL::8D $H!(+ !.) &r)   )r   r   r   rG  r   )r  r  r   r  r   s   `@@@@r'   r  TS2EPConverter.lift_get_attr  sC    " 13	# 		%((-- 		, 	,0 	dmm$r)   )	r   r  r  r   rW   ry  rz  r   rx  r`   )T)rA  rK  rL  rM  r   r   r   rB   rA   rC   r   r   rO  r   r  r   r  ru  r?  rn  r	  rD  r  r  rQ  ra   r)   r'   rw  rw  q  s     37	"		..		0H0HHI" 38_"  S#X/	"H2 2h S 4,HH  , sCx.,\9%r)   rw  )rename)hbuiltinsloggingr  rH   rw  collections.abcr   
contextlibr   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   	getLoggerrA  r?  r(   r;   nnModuler   rA   rC   r   rO   rB   r^   rd   rh   rp   r	  rD  r   r   r   r   r   r   uint8int8int16r  int64float16float32float64	complex32	complex64
complex128rl  qint8quint8bfloat16r   r  rh  r   maxminr  is_is_notnot_containsr   rv   rw   	sym_numelrx   sym_storage_offset
sym_strider  r   r   rO  rN  r   r   rG  r   r   r   rS  ru  rw  )r_  r7  s   00r'   <module>r     sH        $ % ' '    A 9   ' !	"8/*%))":"::;/*CKC=/*
5;;[)39K9K0LLM/*d!H(@ehh&:&: @" c  ,s ,s ,& 
KK	JJ	KK	KK	KK	MM1	MM1	MM1	OOQ	OOQ	b	JJ	KK	LL"	NNB $ 6J5O5O5QR5Qzs
5QR 	'   ((LL]]"++# 99>>++))..))!IINN==IINN-- &0)M588>>M5
4C()4S>9:M5`S>162%((-- ,T' T'nE4!4 E4P    \% \%w$ Ss   "M5