
    קgJ                        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mZm	Z	m
Z
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 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 Z-d Z.dej/        j0        fdZ1d Z2d<de3de3de3fdZ4de3de3fdZ5d Z6ej7        d ej8        dej9        de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)iZFd* eFG                                D             ZHd+ ZIe jJ        e jK        ejL        ejM        ejN        ejO        ejP        eIeQejR        jS        jT        ejR        jS        jU        ejR        jS        jV        ejR        jS        jW        d,ZXd- ZYd. ZZd/ej        j)        deej        j[        ee3         f         fd0Z\d1ee3e3f         d2ej        j]        de3fd3Z^d2ej        j]        fd4Z_ G d5 d6          Z` G d7 d8e`          Zaed9             Zb G d: d;          ZcdS )=    N)contextmanager)AnyDictListOptionalSequenceSetTupleUnion)_C)'replace_quantized_ops_with_standard_ops)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          S/var/www/html/ai-engine/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+++,1I,F,F" -G - -)KM 
$%@AAAuy;;EBBGGIIII:
 
 	

 	!!r+   r6   r7   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   rA   graphAttributeErrorr5   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_lintr0   listvaluesr   r!   r1   	enumeratesetDebugName)r6   r7   flattened_argsr;   rF   efreezed_modulemoduleparamsr"   r#   r$   r'   r(   
state_dictgraph_inputsuser_input_numparam_namesiinps                       r)   _create_jit_graphr`   H   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_addrf   z   s    q5Lr+   c                     | |gz   S rb   rc   )	containerelements     r)   list_appendrj   ~   s    y  r+   c                 H    |d|         }||d         } | g |||R i |S )z
    subgraph: GraphModule from sub-block.
    iter_idx: The index of interation.
    len_loop_local_arguments: The number of loop local arguments in args.
    Nrc   )subgraphiter_idxlen_loop_local_argumentsr7   kwargsloop_local_argsglobal_argss          r)   execute_subgraph_from_prim_looprr      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 rb   )r   rx   ry   rz   r{   )r   r   r   r   s       r)   replacementz2inplace_optimize_sym_size_div.<locals>.replacement   s)    y~.222s;;u$$r+   )r   replace_pattern)rs   r   r   replaced_patternss       r)   inplace_optimize_sym_size_divr      s=      % % % *9"g{SSr+   c                     t          |           dk    rt          d          | d                                         rdS dS )Nr   zEmpty argument name for codegenFT)r!   r5   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 rb   )get_attrplaceholder)fx_graphr   is_top_level_graphs      r)   #get_node_as_placeholder_or_get_attrr      s2     '  &&&%%%r+                           	   
               c                     i | ]\  }}||	S rc   rc   ).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_ENUMr5   )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::stridec                     |                                                                  |                                                                 }}|                     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+   rF   c                 f    i i i fdfd |             |            S )aL  
    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.
    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   rR   addr   rB   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_attrs5  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+   rc   )rF   r   r   r   r   r   s    @@@@@r)   get_block_to_lifted_attrsr     s      >@ *, )+0 0 0 0 0 0 0        2 U###&&&!!r+   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_attrW  s4    ((((..:$:::;;;r+   prim::SetAttrr   z7Unexpected node kind when getting attribute fqn. node:  r   )r   r   nextr   r   r   r5   r   )r   r   r   
input_namer   root_attr_nameattr_fqns   `      r)   get_attribute_fqn_from_ts_noder   T  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getattrrx   default	Exceptionr5   r   )
r   
schema_strr   nsop_nameoverrideop_overload_modop_overload_packetop_overloadrV   s
             r)   get_op_overloadr   m  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                   0   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         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d/Z6d0ej        j        fd1Z7d	ej        j        fd2Z8d	ej        j        fd3Z9d	ej        j        fd4Z:d	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;ZAd< ZBd=S )>TS2FXGraphConverterts_graphname_to_paramname_to_bufferr   name_to_non_tensor_attributename_to_constantc                     | _         | _        | _        t          j                                         _        g  _        g  _        i  _	        | _
        i  _        i  _        | _        i  _        | _        t                                           D ]%}t%          |          }t'           | fd           &t)                       _        d S )Nc                 .                         |           S rb   )_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   kind_to_standard_operatorsr1   r   setattrr   #name_update_from_subblock_to_parent)	r	  r  r  r  r   r  r  khandler_func_names	   `        r)   __init__zTS2FXGraphConverter.__init__  s     !*,(-(8(8,..0  	 1A 68" 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 rb   )r  r  r  rB   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 rb   )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_noderl   subgraph_names               r)   _convert_block_to_subgraphz.TS2FXGraphConverter._convert_block_to_subgraph  s   .0"+[[]] 	; 	;E!4"#+%" " 8<7Q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 rb   )rB   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	  rl   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 rb   )r   r   r   
kwarg_onlyget_fx_value_by_ir_valuer   r    rE   )r	  r   r   r7   ro   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 t          d| d          )NzInput r   )	r   r  r  rB   r   r  r   r   r   )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<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)   get_fx_value_by_fqnz'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 rb   )convert_graph_inputsr  r   convert_nodeconvert_graph_outputsr   r  GraphModuler  r  r  r  r  r   r   rF   lint)r	  r   rs   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@  rA  
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  rB   r   r  
CUSTOM_OBJr   r   	ClassType
USER_INPUTr   r  )r	  graph_inputr   normalized_namer6  s        r)   r9  z(TS2FXGraphConverter.convert_graph_inputsF  s   =//11 <	. <	.K((**Dt)))"0"6"6 ''!+*@@@#     >M4)@)@)B)B  ,,,"0"6"6 ''!(*@@@##'	     >M4)@)@)B)B  ...!)$/1C  @ @?@ @ @ #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 rc   r/  r   r_   r	  s     r)   
<listcomp>z:TS2FXGraphConverter.convert_aten_Float.<locals>.<listcomp>  4     
 
 
36D))#..
 
 
r+   )r   r   call_functionrE   r  r   r   )r	  r   rQ  inp_listr6  s   `    r)   convert_aten_Floatz&TS2FXGraphConverter.convert_aten_Float  s    	2 	2 	2
 
 
 
:>++--
 
 
 ---(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 rb   )rB   r{   )r   rd   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)r7   ro   	to_tensors     r)   rA  z7TS2FXGraphConverter.convert_aten_tensor.<locals>.target  s>    &  VG_%@"6vg"Gw9d-f---r+   N)r1  r   rx   ry   r   r   _schemaboolall_refsr   r   r   rW  r  )	r	  r   r7   ro   r  rA  output_namer6  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 rb   rS  rT  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warnrE   r   r   rW  rj   r  r   r   inputsAtr   opr  r   )r	  r   r7   r6  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   rP  lifted_tensor_ivalzUnsupported constant type: )r   r   hasAttributekindOfr^   ro  r   r   r   r  rP  rq  r   r  )r	  r   r   r   constant_kind
alias_namer6  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 rc   rS  rT  s     r)   rU  z?TS2FXGraphConverter.convert_prim_CallMethod.<locals>.<listcomp>  rV  r+   r   )r   r   call_methodr   rE   r  r   r   )r	  r   rX  r6  s   `   r)   convert_prim_CallMethodz+TS2FXGraphConverter.convert_prim_CallMethod  s    
 
 
 
:>++--
 
 
 -++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  re  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 rb   )r   r   r   r   r   r  r   r   r  r  r  )r	  r   r   re  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 :  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   rE   r   r/  r  r   r   rW  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   r1  ra  r   rW  outputsSizer   r   r  rS   outputsoperatorgetitem)
r	  r   rA  r7   ro   r6  re  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 rb   _convert_prim_iteratorr	  r   s     r)   convert_prim_TupleConstructz/TS2FXGraphConverter.convert_prim_TupleConstruct0      ##D)))))r+   c                 0    |                      |           d S rb   r  r  s     r)   convert_prim_ListConstructz.TS2FXGraphConverter.convert_prim_ListConstruct3  r  r+   c                     g }|                                 D ]*}|                    |                     |                     +|                                                                }|| j        |<   d S rb   )r   r    r/  r   r   r  )r	  r   output_listr_   re  s        r)   r  z*TS2FXGraphConverter._convert_prim_iterator6  sq    ;;== 	C 	CCt<<SAABBBB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).)rS   r   r/  r   r   r  )r	  r   output_dictr  vr^   r_   re  s           r)   convert_prim_DictConstructz.TS2FXGraphConverter.convert_prim_DictConstruct>  s    1.. 	" 	"FAs 1uzz11#6611#66Mamm? '4mm!"A!11 I!))T $)) kkmm--//)4+&&&r+   c                 0    |                      |           d S rb   _convert_prim_unpack_iteratorr  s     r)   convert_prim_ListUnpackz+TS2FXGraphConverter.convert_prim_ListUnpackU      **400000r+   c                 0    |                      |           d S rb   r  r  s     r)   convert_prim_TupleUnpackz,TS2FXGraphConverter.convert_prim_TupleUnpackX  r  r+   c                 ,   t          |                                          D ]q\  }}|                                }|                     |                                          }| j                            t          j        ||f          }|| j	        |<   rd S rb   )
rS   r  r   r/  r   r   rW  r  r  r  )r	  r   r^   r  	outp_namer_   r6  s          r)   r  z1TS2FXGraphConverter._convert_prim_unpack_iterator[  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 rb   rS  r   r   r	  s     r)   r]  z7TS2FXGraphConverter.convert_aten_Int.<locals>.<genexpr>f  1      UUeT22599UUUUUUr+   r   )r   rx   ry   _to_copyr   rE   r   r   rW  int32_local_scalar_denser   r   r  )r	  r   rA  r7   to_copy_noder6  re  s   `      r)   convert_aten_Intz$TS2FXGraphConverter.convert_aten_Intc  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 rb   rS  r  s     r)   r]  z?TS2FXGraphConverter.convert_prim_NumToTensor.<locals>.<genexpr>{  r  r+   r   )r   rx   ry   r|   rE   r   r   rW  longr   r   r  r	  r   rA  r7   r6  re  s   `     r)   convert_prim_NumToTensorz,TS2FXGraphConverter.convert_prim_NumToTensors  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   re  s      r)   convert_prim_CreateObjectz-TS2FXGraphConverter.convert_prim_CreateObject  s.    kkmm--//24";///r+   c                    t           j        j        j        j        }|                     ||j                  \  }}| j                            |||          }|	                                
                                }|| j        |<   d S rb   )r   rx   ry   convolutionr   r1  ra  r   rW  r   r   r  )r	  r   rA  r7   ro   r6  re  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   ra  r1  r   r   r  rB   r   r   numelrQ   rO  r   rW  rx   ry   r}   r~   rE   r   r   r  r  )r	  r   rA  r   r7   ro   	arg1_nametensor_constantupdated_argsr6  re  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 rb   rS  r  s     r)   r]  z?TS2FXGraphConverter.convert_aten___getitem__.<locals>.<genexpr>  sB       '
 '
5:D))%00'
 '
 '
 '
 '
 '
r+   )	rE   r   r   rW  r  r  r   r   r  )r	  r   input_containerindexr6  re  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 rc   )user)r   uses     r)   rU  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)   rU  z7TS2FXGraphConverter.convert_aten_to.<locals>.<listcomp>  sA       ##%%66  	**666r+   c              3   .   K   | ]}|j         j        V  d S rb   )ra  
is_mutable)r   rA  s     r)   r]  z6TS2FXGraphConverter.convert_aten_to.<locals>.<genexpr>  s8       % %.4)% % % % % %r+   r   Tr   )r   r1  ra  r   rx   ry   rM  r   
prim_dtyper   usesanyr!   rQ   r   rW  rE   cloner   r   r  r  )r	  r   rA  r7   ro   
user_nodesuser_targetshas_mutable_targetnew_argsr6  
clone_nodere  s               r)   convert_aten_toz#TS2FXGraphConverter.convert_aten_to  s    &&++D&.AAf 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 determind the target for )r   rB   rk  r   r   ListTyperx   ry   r   rP  r5   r   r1  ra  r   r   r   rW  rf   r  r  )r	  r   rA  r7   ro   re  s         r)   convert_aten_addz$TS2FXGraphConverter.convert_aten_add  s7   ;;==M))$--**//115>BB Qza  %%''H H Q +-"#O#O#OPPP$T**FUY^')))  //fnEELD&++--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   )rQ   r   r   r  r5   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 rc   r   )r   r_   s     r)   rU  z9TS2FXGraphConverter.convert_prim_Loop.<locals>.<listcomp>  s     FFFCFFFr+   r   r   c                 :    g | ]}                     |          S rc   r7  r   r   r	  s     r)   rU  z9TS2FXGraphConverter.convert_prim_Loop.<locals>.<listcomp>0  s7     
 
 
 $$T**
 
 
r+   )rQ   r   r  r/  r'  r   r   r   r%  r!   r   r  ranger   rW  rr   r  rS   r  r   r  r  r  r  )r	  r   r   num_iterationsloop_local_argumentsglobal_argumentsr   r  r  r   fx_block_argsrm   	loop_noder^   r  re  r   global_argument_indexs   `                 r)   convert_prim_Loopz%TS2FXGraphConverter.convert_prim_Loop  s6   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+ ((***-BB ,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   r5   )r	  r  r   r   s       r)   _check_set_attr_in_if_blockz/TS2FXGraphConverter._check_set_attr_in_if_block^  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 rc   r  r  s     r)   rU  z7TS2FXGraphConverter.convert_prim_If.<locals>.<listcomp>{  s'    NNND11$77NNNr+   )r  rQ   r   r!   r/  r'  r   r   r   r%  rE   r   rW  r   condr  r   r   r  rS   r  r  r  )r	  r   r   	predicater   r   r  r(   r  r7   	cond_nodere  r^   r   r  s   `              r)   convert_prim_Ifz#TS2FXGraphConverter.convert_prim_Ifh  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 rb   )_convert_as_noopr  s     r)   convert_aten_Boolz%TS2FXGraphConverter.convert_aten_Bool  s    d#####r+   c                     d S rb   rc   r  s     r)   convert_prim_Enterz&TS2FXGraphConverter.convert_prim_Enter  s	    
 	r+   c                     d S rb   rc   r  s     r)   convert_prim_Exitz%TS2FXGraphConverter.convert_prim_Exit  s    r+   c                     t          |          }|j        }|                     ||          \  }}|                                                                }|d         | j        |<   d S )Nr   )r   ra  r1  r   r   r  )r	  r   rA  r   r7   ro   re  s          r)   r  z$TS2FXGraphConverter._convert_as_noop  sa     !&&++D&99fkkmm--//)-a+&&&r+   c                      t           j        j        j        }t	           fd|                                D                       } j                            ||           d S )Nc              3   B   K   | ]}                     |          V  d S rb   rS  r  s     r)   r]  zMTS2FXGraphConverter.convert_profiler__record_function_exit.<locals>.<genexpr>  r  r+   )r   rx   profiler_record_function_exitrE   r   r   rW  )r	  r   rA  r7   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   ry  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 rb   )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 rb   rS  r  s     r)   r]  zBTS2FXGraphConverter._convert_standard_operators.<locals>.<genexpr>  r  r+   )	r  r   rE   r   r   rW  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   r5   )r	  r   	node_kindr  handler_funcnode_strrV   s          r)   r:  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 rc   r  )r   r  s     r)   rU  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  rQ   r  r  r   rB   r   r  Noderl  r   rW  r  r    r  r   r   USER_OUTPUTr   r  r   r   r!   r   )r	  r7   outp_name_listre  r6  s        r)   r;  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   Blockr   r   r   r	   r   r  r  r  r   r%  r'  r   r  r1  Valuer/  r7  r  r<  r  r9  rY  rf  rm  rv  rz  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  r:  r;  rc   r+   r)   r   r     sD       <C67<C C-.<C S%,./	<C
 !%UX^SX%= ><C '+38n<C sCx.<C <C <C <C|
 
 
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                   $    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         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 rb   )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 rb   )r%  __contains__r&  __getitem__)r	  r   r(  s     r)   r+  z0ExplainTS2FXGraphConverter._DictMock.__getitem__  s?     77'',, '&77&&s+++r+   c                     dS NTrc   )r	  r   s     r)   r*  z1ExplainTS2FXGraphConverter._DictMock.__contains__%  s    4r+   )r  r  r  r  r+  r*  __classcell__r(  s   @r)   	_DictMockr#    s`        	) 	) 	) 	) 	)	, 	, 	, 	, 	,	 	 	 	 	 	 	r+   r0  r  r  r  r   r  r  c                     t                                          ||||||           g | _        t                              | j        t          j                            d ddd di                     | _        d S )NmockrW  c                      d S rb   rc   rc   r+   r)   r
  z5ExplainTS2FXGraphConverter.__init__.<locals>.<lambda>E  s     r+   rc   )	r%  r  unsupported_node_listr!  r0  r  r   r  r  )r	  r  r  r  r   r  r  r(  s          r)   r  z#ExplainTS2FXGraphConverter.__init__(  s     	"(	
 	
 	
 ;=" 7@@HMM 
 
r+   c                     |                                   | j                                        D ]}|                     |           |                                  d S rb   )r9  r  r   r:  r;  r  s     r)   explainz"ExplainTS2FXGraphConverter.explainK  s`    !!###M'')) 	$ 	$Dd####""$$$$$r+   c                     	 t                                          |           d S # t          $ r%}| j                            |           Y d }~d S d }~ww xY wrb   )r%  r:  r   r4  r    )r	  r   rV   r(  s      r)   r:  z'ExplainTS2FXGraphConverter.convert_nodeQ  sn    	4GG  &&&&& 	4 	4 	4&--d333333333	4s   !& 
AAA)r  r  r  __doc__dictr0  r   r   r   r   r  r   r   r   r	   r   r  r6  r:  r.  r/  s   @r)   r!  r!    s             D   !
67!
 C-.!
 S%,./	!

 !%UX^SX%= >!
 '+38n!
 sCx.!
 !
 !
 !
 !
 !
F% % %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<  X  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 rb   )shaperc  )r   paramr   s     r)   r]  z*TS2EPConverter.__init__.<locals>.<genexpr>z  sN        |u{22 u_))++2222 r+   )r?  r`   r  rY   r@  rA  r  r  rB   r   r   rC   rQ   
parametersrZ   itemsr  name_to_non_tensor_attributesr  lift_get_attr)r	  r?  r@  rA  r(   
param_listr  r   s          @r)   r  zTS2EPConverter.__init__d  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_programrB   r?  r   r   rC   rZ   rG  ri  rj  )r	  r   graph_converterrs   epr  r   s          r)   r  zTS2EPConverter.convert  s}   
	
 
	
 
	
 	,dm<<<!:4=!I!I-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  r6  r!   r4  rS   r   r   r   r   print)r	  rL  r   rP  explain_strr^   nr  s           r)   r6  zTS2EPConverter.explain  s   !:4=!I!I4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+   rs   r  c                    t           j        j                            || j        dd          }|j                            d |                                D                        |D ]}|j        	                    |d            t          |j        j                  D ]~\  }}|j        t          j        k    rd|j        |v r[t#          ||j                 t           j                  s%J t'          ||j                            d            t          j        |_        |                                                    |           |S )NFT)r-   pre_dispatchc                 f    i | ].\  }}t          |t          j        t          j        f          +||/S rc   )rB   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   export_trace_exportr@  
_constantsupdaterG  rZ   poprS   graph_signaturer  r   r   rE  rA  rB   r   r   CONSTANT_TENSORverifiercheck)r	  rs   r  rQ  r  r^   specs          r)   rO  z*TS2EPConverter.retrace_as_exported_program  sc    \ ((	 ) 
 
 	 ,2244  	
 	
 	
 " 	' 	'AMa&&&& !3!?@@ 	6 	6GAtyI,,,@P1P1P!$T[15<  b b+DK899aaab b b &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   rB   r   r   r  r  r  rH  r   )r   r   re  r   r   r  _dfs_get_attrr   rh  r   r	  s         r)   rj  z3TS2EPConverter.lift_get_attr.<locals>._dfs_get_attr  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	  rj  r   rh  r   s   `@@@@r)   rI  zTS2EPConverter.lift_get_attr  s    " 13	# 	 	 	 	 	 		%(- 	 	 	 	 	 		, 	, 	, 	, 	, 	, 	, 	, 	,0 	dm$$$$$r+   rb   )T)r  r  r  r   r   r   rD   rC   r
   r   r   r   r   r  r   r  r<  r  r6  r  r<  rO  rI  rc   r+   r)   r>  r>  b  s        37	" "	.	0HHI" 38_"  S#X/	" " " "H/ / / / /b _S   .$H $ sCx.$ $ $ $L9% 9% 9% 9% 9%r+   r>  )r   )dbuiltinsloggingr  rJ   ri  
contextlibr   r   r   r   r   r   r	   r
   r   r   torch.export._tracer   Atorch._export.passes.replace_quantized_ops_with_standard_ops_passr   torch.export.exported_programr   torch.export.graph_signaturer   r   r   r   r   r   r   torch.fxr   	getLoggerr  r  r*   r=   nnModuler   rC   r   rD   r`   rf   rj   rr   r  r<  r   r   r   r   r   r   uint8int8int16r  int64float16float32float64	complex32	complex64
complex128rb  qint8quint8bfloat16r   rG  r_  r   maxminr  is_is_notnot_containsr!   rx   ry   	sym_numelrz   sym_storage_offset
sym_strider  r   r   r  r   r  r   r   r   r!  r<  r>  rc   r+   r)   <module>r     s        % % % % % % I I I I I I I I I I I I I I I I I I I I                 : 9 9 9 9 9                  ' & & & & & g!!	 	 	" " "8/*%)"::;/*CKC=/*
5;[)39K0LLM/* /* /* /*d  ! ! !H H H(Teh&: T T T T"    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-  &0 0 0) ) )J"UX^ J"UX^SQTX=U8V J" J" J" J"ZS>16   2%(-    ,L' L' L' L' L' L' L' L'^C4 C4 C4 C4 C4!4 C4 C4 C4L      N% N% N% N% N% N% N% N% N% N%r+   