
    a,j7                     B   U d dl Z d dlZd dlZd dlZd dlZd dlmZmZ d dlm	Z	 d dlm
Z
 d dlZd dlZd dlmZ d dlmZ d dlmZmZ d dlmZ d d	lmZmZmZmZmZmZmZ d d
lmZ  ej        e           Z!d Z"d Z#dej$        j%        ej&        j'        z  dee
         de(ej)        e*d         e
ej+        dz  f         fdZ,d Z-d Z.d Z/dej0        j1        fdZ2d Z3d@de4de4de4fdZ5de4de4fdZ6d Z7e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*ejF        d+iZGd, eGH                                D             ZId- ZJe jK        e jL        ejM        ejN        ejO        ejP        ejQ        eJeRejS        jT        jU        ejS        jT        jV        ejS        jT        jW        ejS        jT        jX        d.ZYeZe4ed/e
f         f         e[d0<   d1 Z\d2 Z]d3ej        j)        de(eZej        j^        e_e4         f         eZe4e4f         f         fd4Z`d5eZe4e4f         d6ej        ja        de4fd7Zbd6ej        ja        fd8Zc G d9 d:          Zd G d; d<ed          Zee	d=             Zf G d> d?          ZgdS )A    N)CallableSequence)contextmanager)Any)_C)'replace_quantized_ops_with_standard_ops)_tree_map_with_pathDim)ExportedProgram)ConstantArgumentCustomObjArgument	InputKind	InputSpec
OutputKind
OutputSpecTensorArgument)subgraph_rewriterc                 X   g }t          |                                 |          D ]\  }}dt          |                                          v rEt          j                            |          \  }}|                    t          |                     m|                    |d u           |S )NPackedParams)	zipinputsstrtypetorchjit_flattenappendlen)method_graphargs_paramsparam_count_listinput_arg_params_in_vars_s          W/var/www/html/banglarbhumi/venv/lib/python3.11/site-packages/torch/_export/converter.py_get_param_count_listr'   "   s    "<#6#6#8#8+FF = =S////++K88JGQ##CLL1111##Kt$;<<<<    c                    t           j                            |                                           }t          j                    }t          j        d           t           j                            | |ddd          \  }}}t          j        |           |t           j                            |                                           k    rt          d          ||fS )NFT)strict_force_outplace_return_inputs_stateszXstate_dict changed after running the tracer; something weird is happening in your model!)r   r   _unique_state_dictkeysis_autocast_cache_enabledset_autocast_cache_enabled_get_trace_graphRuntimeError)modelargsorig_state_dict_keysprev_autocast_cache_enabledtrace_graph	torch_out_inputs_statess          r&   _trace_and_get_graph_from_modelr:   .   s     !977>>CCEE
 #("A"C"C	$U+++-2Y-G-G" .H . .*KN 
$%@AAAuy;;EBBGGIIII:
 
 	

 	!!r(   r3   r4   returnz	_C.IValuec                 D   t          | t          j        j        t          j        j        f          rt          t          j                            t          |                    d                   }d }t          | t          j        j                  r)	 | j        j        }n"# t          $ r}t          d          |d }~ww xY wt          j        |           t          j        t          j        t          j        | j                  d          }t          j        |          \  }}|                    d          j        }	t          |          t          |          z   }
t'          |	|
          }t          j                            |
          \  }}t          j        |	t          |          |dd          }||||fS g }| j        }t          j        |           t'          ||          }t          j        |||dd          }|||d fS t+          | |          \  }}t          j        |           t          j                            |           }t1          |                                          }t1          |                                          }t7          |          t7          |          z
  }t1          |                                          }t;          |          D ])\  }}||k    r|                    |||z
                      *t          j        |           |||d fS )Nr   z('forward' method must be a script methodT)preserveParametersforwardF)
isinstancer   r   ScriptFunctionScriptModuletupler   r>   graphAttributeErrorr2   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)r3   r4   flattened_argsr8   rC   efreezed_modulemoduleparamsr   r    r!   r$   r%   
state_dictgraph_inputsuser_input_numparam_namesiinps                       r&   _create_jit_graphr]   J   s    %%)2EI4JKLL .uy11%++>>qABB	eUY344 	4V+! V V V"#MNNTUUV3E:::.BOUX664  N  ?OONFF!--i88>L++f5K4\;OO++K88JGQ9eGnn.>u E &)V33 
/6660==5>#3UE
 
 fi--6udCCE95!!!--e44J*##%%&&F''L&&Z8Nz(())KL)) > >3[^);<===+E222&)T))s   B! !
C +B;;C c                     | |z   S N )abs     r&   list_addrc   |   s    q5Lr(   c                     | |gz   S r_   r`   )	containerelements     r&   list_appendrg      s    y  r(   c                 H    |d|         }||d         } | g |||R i |S )z
    subgraph: GraphModule from sub-block.
    iter_idx: The index of interaction.
    len_loop_local_arguments: The number of loop local arguments in args.
    Nr`   )subgraphiter_idxlen_loop_local_argumentsr4   kwargsloop_local_argsglobal_argss          r&   execute_subgraph_from_prim_loopro      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_intry   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 r_   )r   ru   rv   rw   rx   )r~   r   r   r   s       r&   replacementz2inplace_optimize_sym_size_div.<locals>.replacement   s)    y~.222s;;u$$r(   )r   replace_pattern)rp   r   r   s      r&   inplace_optimize_sym_size_divr      s=      % % % %b';?????r(   c                     t          |           dk    rt          d          | d                                         rdS dS )Nr   zEmpty argument name for codegenFT)r   r2   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 r_   )get_attrplaceholder)fx_graphr   is_top_level_graphs      r&   #get_node_as_placeholder_or_get_attrr      s2     '  &&&%%%r(                           	   
               c                     i | ]\  }}||	S r`   r`   ).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_ENUMr2   )tensorr   s     r&   get_dtype_as_intr      s9     LE(((777888&&r(   )z	prim::maxz	prim::minzprim::TupleIndexzaten::__is__zaten::__isnot__zaten::__not__zaten::__contains__zprim::dtypez	aten::lenzaten::numelz
aten::sizezaten::storage_offsetzaten::stride.kind_to_standard_operatorsc                     |                                                                  |                                                                 }}|                     d          }|||fS )Nr   )input	debugNameoutputs)nodeirv_parent_nameirv_name	attr_names       r&   &get_ir_value_parent_name_and_attr_namer      sO     $

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

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

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

MdMMM
 
 	
 vIXj))N2@O...9...iHOr(   c                 "   |                                  }|dk    rt          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 )schemaAssertionErrorr   r   parse_schemar   r   r   overload_namegetattrru   default	Exceptionr2   r   )
r   
schema_strr   nsop_nameoverrideop_overload_modop_overload_packetop_overloadrS   s
             r&   get_op_overloadr   r  s   J]"";T;;<<<&+h&;&;J&G&GFfk""((..KB#H
!%)R00$_g>> 	5!"4h??KK,4K   Ptyy{{PPPP
 
	
 s   >AC 
D:DDc                   :   e Zd Zdej        j        ej        j        z  deeej	        f         deeej	        f         deej        j        e
e         f         deeef         deeef         deeef         fdZd	 Zd
ej        j        dee         fdZd Zd ZdefdZd
ej        j        fdZdej        j        fdZd Zdej        j        fdZd Zd
ej        j        fdZd
ej        j        fdZd
ej        j        fdZd
ej        j        fdZd
ej        j        fdZ d
ej        j        fdZ!d
ej        j        fdZ"d
ej        j        fdZ#d
ej        j        fdZ$d
ej        j        fd Z%d
ej        j        fd!Z&d
ej        j        fd"Z'd
ej        j        fd#Z(d
ej        j        fd$Z)d
ej        j        fd%Z*d
ej        j        fd&Z+d
ej        j        fd'Z,d
ej        j        fd(Z-d
ej        j        fd)Z.d
ej        j        fd*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/ Z4d
ej        j        fd0Z5d1ej        j        fd2Z6d
ej        j        fd3Z7d
ej        j        fd4Z8d
ej        j        fd5Z9d
ej        j        fd6Z:d
ej        j        fd7Z;d
ej        j        fd8Z<d
ej        j        fd9Z=d
ej        j        fd:Z>d
ej        j        fd;Z?d
ej        j        fd<Z@d= ZAd>S )?TS2FXGraphConverterts_graphname_to_paramname_to_bufferr   name_to_non_tensor_attributename_to_constantr   c                 v    | _         | _        | _        t          j                                         _        g  _        g  _        i  _	        | _
        | _        i  _        | _        i  _        | _        t           D ]%}t#          |          }	t%           |	 fd           &t'                       _        d S )Nc                 .                         |           S r_   )_convert_standard_operators)r   selfs    r&   <lambda>z.TS2FXGraphConverter.__init__.<locals>.<lambda>  s    T==dCC r(   )r   r   r  r   fxr   r   input_specsoutput_specsname_to_noder  r   !name_to_non_tensor_attribute_noder  	subgraphsr   r   r   setattrr   #name_update_from_subblock_to_parent)
r  r   r   r  r   r  r  r   khandler_func_names
   `         r&   __init__zTS2FXGraphConverter.__init__  s     !*,(-(8(8,..0
  	
 1A 6K" BD.
 =Y):< '=# , 	 	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 r_   )r  r   r  r?   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 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_noderi   subgraph_names               r&   _convert_block_to_subgraphz.TS2FXGraphConverter._convert_block_to_subgraph  s   .0"+[[]] 	; 	;E!4"#+%*" " ' N N	,:9,E,E)#5#>#J#J-$ $  >N"/	::)1133H --h77M!!$-"8"8"G"GHHH&&'9::::222r(   c                    t                      }|                                D ]}|                                D ]}|                                D ]_}|                                | j        v rB|                                | j        vr'|                    |                                           `|                    | 	                    |                    }|S )aW  
        Identify inputs from the innermost sub-block. This is needed
        for nested sub-blocks when the input is hidden in the nested sub-block.
        E.g., example IR of input is hidden in the nested sub-block.
        Graph[x.1]
        %1 = ...
            Block[]
                Block[x.1]
                    %2 = x.1 ...
        )
r   r   r   r   r   r  r   r   r   _identify_inputs_as_arguments)r  r   r   r   
block_nodeblock_node_ins         r&   r$  z1TS2FXGraphConverter._identify_inputs_as_arguments  s     "ee	\\^^ 
	 
	E#kkmm 	 	
%/%6%6%8%8 A AM%//11T5FFF)3355T=WWW!m&=&=&?&?@@@%OO66zBB 			 r(   c                 J    t          | j        t          j        j                  S r_   )r?   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  ri   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 r_   )r   r   r   
kwarg_onlyget_fx_value_by_ir_valuer   r   rB   )r  r   r   r4   rl   r   
schema_args          r&   get_args_kwargsz#TS2FXGraphConverter.get_args_kwargs  s    !$T[[]]F4D!E!E 	B 	BE:$ B*.*G*G*N*Nz''D99%@@AAAAT{{F""r(   r   c                 |   |                                 }|| j        v r| j        |         }|S || j        v rLt          | j        |         t          j                  r| j                            |          S | j        |         S || j        v r | 	                    | j        |                   S t          d| d          )NzInput r   )r   r  r  r?   r   r  r   r   r   get_fx_value_by_fqnr   )r  r   
value_name
input_nodes       r&   r,  z,TS2FXGraphConverter.get_fx_value_by_ir_value   s    __&&
****:6J4000$/
;U=OPP :}--j999(444555++D,Fz,RSSS<j<<<===r(   c                     || j         v r| j         |         }nX|| j        v r| j        |         }nA|| j        v r| j        |         }n*|| j        v r| j        |         }nt	          d| d          |S r   )r  r  r  r  r   )r  r   fx_nodes      r&   r0  z'TS2FXGraphConverter.get_fx_value_by_fqn/  s    4$$$'-GGT***+D1GGT;;;<TBGGT6667=GG:$:::;;;r(   c                    |                                   | j                                        D ]}|                     |           |                                  t
          j                            i | j        | j	        | j
        | j        | j        | j                  }t          |           |j                                         |S r_   )convert_graph_inputsr   r   convert_nodeconvert_graph_outputsr   r	  GraphModuler  r   r  r  r  r   r   rC   lint)r  r   rp   s      r&   r  zTS2FXGraphConverter.convert<  s    !!###M'')) 	$ 	$Dd####""$$$ X!!.$ % 3	
 ' M	
 	
 	&b)))
	r(   c           
      n   | j                                         D ]}|                                }|| 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*t)          dt+          | j        |                              t	          |          }| j                            t          t          j        t/          ||          |d                     t          | j        ||                                           }nt#          |                                t$          j                  r"t	          |d	          }| j                            t          t          j        t          |          |                     | j                            |          }|| j        |<   d S )
Nr   argtargetT)r=  r>  
persistentz0Input conversion only handles ScriptObject, got )r   	class_fqnFr   )r   )r   r   r   r   r   r
  r   r   r   	PARAMETERr   r   r   r   r  BUFFERr  r?   r   r  r   r   
CUSTOM_OBJr   	ClassType
USER_INPUTr   r  )r  graph_inputr   normalized_namer4  s        r&   r6  z(TS2FXGraphConverter.convert_graph_inputsV  s   =//11 =	. =	.K((**Dt)))"0"6"6 ''!+*@@@#     >M4)@)@)B)B  ,,,"0"6"6 ''!(*@@@##'	     >M4)@)@)B)B  ...!$"7"=u?QRR (n4PTPefjPkKlKlnn   #1"6"6 ''!,-!0O    $#(  	 	 	 >M4)@)@)B)B  K,,..@@ E"0g"F"F"F ''!,*@@@#     -33ODD&-Dd##{=	. =	.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 r`   r,  r   r\   r  s     r&   
<listcomp>z:TS2FXGraphConverter.convert_aten_Float.<locals>.<listcomp>  '    PPP3D11#66PPPr(   )r   r   call_functionrB   r  r   r   )r  r   rN  inp_listr4  s   `    r&   convert_aten_Floatz&TS2FXGraphConverter.convert_aten_Float  s    	2 	2 	2 QPPP$++--PPP---(OO
 
 8?$++--1133444r(   c                    |                      |t          j        j        j        j        j                  \  }}|D ] }|dk    rt          ||                   ||<   !t          d |D                       rt          j        nt          j	        j        fd}|
                                                                }| j                            |||          }|| j        |<   dS )z9aten::tensor creates a constant tensor ad-hoc --> GetAttrrequires_gradc              3   @   K   | ]}t          |t                    V  d S r_   )r?   rx   )r   ra   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)r4   rl   	to_tensors     r&   r>  z7TS2FXGraphConverter.convert_aten_tensor.<locals>.target  s>    &  VG_%@"6vg"Gw9d-f---r(   N)r.  r   ru   rv   r   r   _schemaboolall_refsr   r   r   rT  r  )	r  r   r4   rl   r  r>  output_namer4  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                 X    t          j        d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!r   
stacklevelc              3   B   K   | ]}                     |          V  d S r_   rP  rQ  s     r&   rZ  z:TS2FXGraphConverter.convert_aten_append.<locals>.<genexpr>  s1      QQCT22377QQQQQQr(   r   r   )warningswarnrB   r   r   rT  rg   r  r   r   inputsAtr   opr  r   )r  r   r4   r4  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   rM  lifted_tensor_ivalzUnsupported constant type: )r   r   hasAttributekindOfr[   rn  r   r   r   r  rM  rp  r   r  )r  r   r   r   constant_kind
alias_namer4  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 r`   rP  rQ  s     r&   rR  z?TS2FXGraphConverter.convert_prim_CallMethod.<locals>.<listcomp>  rS  r(   r   )r   r   call_methodr   rB   r  r   r   )r  r   rU  r4  s   `   r&   convert_prim_CallMethodz+TS2FXGraphConverter.convert_prim_CallMethod  sz    PPPP$++--PPP-++FF6NN(OO
 
 8?$++--1133444r(   c                 l   |                                                                 }|                    t          j        j                                                  rF|                                }|                                	                                }|| j
        |<   d S t          d| d          )NzUnsupported JitType (z) when get device)r   r   isSubtypeOfr   r   
TensorTypegetdevicer   r   r  r   )r  r   
input_typer~  rb  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 r_   )r   r   r   r   r   r  r   r   r  r  r  )r  r   r   rb  s       r&   convert_prim_GetAttrz(TS2FXGraphConverter.convert_prim_GetAttr  s   1$2LdSSkkmm--//2:";/""$$ 	M%%h//  261G1G1Q1Q!+...4#III9(C :8D 261W2!+... %%h// M151B81L!+...M Mr(   c                 v   t          | j        |          }t          |                                          d         }|                     |          }|                     |          rH| j                            |          }| j                            t          j
        j        ||f           d S || j        |<   d S Nr   )r   r   rB   r   r,  r  r   r   rT  r   r}   copy_r  )r  r   r   
attr_valuets_graph_tensor_inputfx_attr_nodes         r&   convert_prim_SetAttrz(TS2FXGraphConverter.convert_prim_SetAttr  s    1$2LdSS4;;==))!,
 $ = =j I I!!(++ 	U=11(;;LM''"\3H$I     @UD28<<<r(   c                    t          |          }|                     ||j                  \  }}| j                            |||          }|                                dk    r2|                                                                }|| j        |<   d S t          |
                                          D ]J\  }}|                                }| j                            t          j        ||f          }	|	| j        |<   Kd S r  )r   r.  r^  r   rT  outputsSizer   r   r  rP   outputsoperatorgetitem)
r  r   r>  r4   rl   r4  rb  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 r_   _convert_prim_iteratorr  r   s     r&   convert_prim_TupleConstructz/TS2FXGraphConverter.convert_prim_TupleConstruct>      ##D)))))r(   c                 0    |                      |           d S r_   r  r  s     r&   convert_prim_ListConstructz.TS2FXGraphConverter.convert_prim_ListConstructA  r  r(   c                       fd|                                 D             }|                                                                }| j        |<   d S )Nc                 :    g | ]}                     |          S r`   rP  rQ  s     r&   rR  z>TS2FXGraphConverter._convert_prim_iterator.<locals>.<listcomp>E  s'    SSSct44S99SSSr(   )r   r   r   r  )r  r   output_listrb  s   `   r&   r  z*TS2FXGraphConverter._convert_prim_iteratorD  sP    SSSST[[]]SSSkkmm--//)4+&&&r(   c                    i }d\  }}t          |                                          D ]V\  }}|dz  dk    r|                     |          }$|                     |          }||t          d          |||<   d\  }}W||t          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).)rP   r   r,  r   r   r   r  )r  r   output_dictr  vr[   r\   rb  s           r&   convert_prim_DictConstructz.TS2FXGraphConverter.convert_prim_DictConstructJ  s    1.. 
	" 
	"FAs 1uzz11#6611#669	()UVVV!"A!11=AM Y   kkmm--//)4+&&&r(   c                 0    |                      |           d S r_   _convert_prim_unpack_iteratorr  s     r&   convert_prim_ListUnpackz+TS2FXGraphConverter.convert_prim_ListUnpacka      **400000r(   c                 0    |                      |           d S r_   r  r  s     r&   convert_prim_TupleUnpackz,TS2FXGraphConverter.convert_prim_TupleUnpackd  r  r(   c                 ,   t          |                                          D ]q\  }}|                                }|                     |                                          }| j                            t          j        ||f          }|| j	        |<   rd S r_   )
rP   r  r   r,  r   r   rT  r  r  r  )r  r   r[   r  	outp_namer\   r4  s          r&   r  z1TS2FXGraphConverter._convert_prim_unpack_iteratorg  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 r_   rP  r   r   r  s     r&   rZ  z7TS2FXGraphConverter.convert_aten_Int.<locals>.<genexpr>r  1      UUeT22599UUUUUUr(   r   )r   ru   rv   _to_copyr   rB   r   r   rT  int32_local_scalar_denser   r   r  )r  r   r>  r4   to_copy_noder4  rb  s   `      r&   convert_aten_Intz$TS2FXGraphConverter.convert_aten_Into  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 r_   rP  r  s     r&   rZ  z?TS2FXGraphConverter.convert_prim_NumToTensor.<locals>.<genexpr>  r  r(   r   )r   ru   rv   ry   rB   r   r   rT  longr   r   r  r  r   r>  r4   r4  rb  s   `     r&   convert_prim_NumToTensorz,TS2FXGraphConverter.convert_prim_NumToTensor  s     -UUUUt{{}}UUUUU---fdWej<QRRkkmm--//)0+&&&r(   c                 f    |                                                                 }d| j        |<   d S )N )r   r   r   r  r   rb  s      r&   convert_prim_CreateObjectz-TS2FXGraphConverter.convert_prim_CreateObject  s.    kkmm--//24";///r(   c                    t           j        j        j        j        }|                     ||j                  \  }}| j                            |||          }|	                                
                                }|| j        |<   d S r_   )r   ru   rv   convolutionr   r.  r^  r   rT  r   r   r  )r  r   r>  r4   rl   r4  rb  s          r&   convert_aten__convolutionz-TS2FXGraphConverter.convert_aten__convolution  ss     +3++D&.AAf---fdFCCkkmm--//)0+&&&r(   c                    t          |          }|j        }|                     ||          \  }}|j        dk    r|d         j        }|| j        v rt          | j        |         t          j                  r| j        |         }|	                                dk    rt          |          }| j        |                                         |d<   | j                            t          j        j        j        j        t%          |          |          }	|                                                                }
|	| j        |
<   d S |                     |           d S )NTensor_moder   )r   r^  r.  r   r   r  r?   r   r}   numelrN   rL  r   rT  ru   rv   rz   r{   rB   r   r   r  r  )r  r   r>  r   r4   rl   	arg1_nametensor_constantupdated_argsr4  rb  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 r_   rP  r  s     r&   rZ  z?TS2FXGraphConverter.convert_aten___getitem__.<locals>.<genexpr>  sB       '
 '
5:D))%00'
 '
 '
 '
 '
 '
r(   )	rB   r   r   rT  r  r  r   r   r  )r  r   input_containerindexr4  rb  s   `     r&   convert_aten___getitem__z,TS2FXGraphConverter.convert_aten___getitem__  s    !& '
 '
 '
 '
>Bkkmm'
 '
 '
 "
 "
 ---6
 
 kkmm--//)0+&&&r(   c                    t          |          }|                     ||j                  \  }}|t          j        j        j        j        u s|t          j        j        j        j        u rEd |	                                
                                D             }d |D             }t          d |D                       }|rt          |          dk     rt          dt          |                     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 r`   )user)r   uses     r&   rR  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&   rR  z7TS2FXGraphConverter.convert_aten_to.<locals>.<listcomp>  sA       ##%%66  	**666r(   c              3   .   K   | ]}|j         j        V  d S r_   )r^  
is_mutable)r   r>  s     r&   rZ  z6TS2FXGraphConverter.convert_aten_to.<locals>.<genexpr>  s8       % %.4)% % % % % %r(   r   zexpected at least 4 args, got Tr   )r   r.  r^  r   ru   rv   rJ  r   
prim_dtyper   usesanyr   r   rN   r   rT  rB   cloner   r   r  r  )r  r   r>  r4   _kwargs
user_nodesuser_targetshas_mutable_targetnew_argsr4  
clone_noderb  s               r&   convert_aten_toz#TS2FXGraphConverter.convert_aten_to  s    &&,,T6>BBg UY^&,,,%).:K:V0V0VCCdkkmm.@.@.B.BCCCJ !+  L
 "% % %8D% % % " " " t99q==()U#d)))U)UVVV::"-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	        u rn|                     ||j                  \  }}|                                                                }| j                            t$          |          | j        |<   d S |                     |           d S )Nr   r   r   z$unable to determined the target for )r   r?   rj  r   r   ListTyperu   rv   r   rM  r2   r   r.  r^  r   r   r   rT  rc   r  r  )r  r   r>  r4   r  rb  s         r&   convert_aten_addz$TS2FXGraphConverter.convert_aten_add  s7   ;;==M))$--**//115>BB Rza  %%''H H R +-"#P$#P#PQQQ$T**FUY^'))) !00v~FFMD'++--1133K-1]-H-HSW-X-XDk***))$/////r(   c                    t          |                                          }|d                                         | j        vrt	          d          t          |                                          }t          |                                                                          }|                                D ]}|	                                dk    r9|
                                                                |k    rt	          d          |	                                dk    r>|                                D ])}|                                |k    rt	          d          *d S )Nr   zKprim::Loop currently cannot run with dynamic value of number of iterations.r   z@prim::Loop currently cannot run with dynamic value of condition.r   )rN   r   r   r  r2   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    rt          dt          |                     |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 r`   r   )r   r\   s     r&   rR  z9TS2FXGraphConverter.convert_prim_Loop.<locals>.<listcomp>$  s     FFFCFFFr(   r   r   zexpected 1 subgraph node, got c                 :    g | ]}                     |          S r`   r0  r   r   r  s     r&   rR  z9TS2FXGraphConverter.convert_prim_Loop.<locals>.<listcomp>>  s7     
 
 
 $$T**
 
 
r(   )rN   r   r  r,  r$  r   r   r   r"  r   r   r   r  ranger   rT  ro   r  rP   r  r   r  r  r  r  )r  r   r   num_iterationsloop_local_argumentsglobal_argumentsr   r  r  r  fx_block_argsrj   	loop_noder[   r  rb  r   global_argument_indexs   `                 r&   convert_prim_Loopz%TS2FXGraphConverter.convert_prim_Loop  sH   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"/
 /
++ ~!## !W#nBUBU!W!WXXX03&&(( 	8>>&J  4
 
 
 
,/??
 
 
 n-- )	 )	H33/ #1%,-- #	  
 
I !!Q&&(88 	F 	FGAt"&.."2"2K59]5P5P (%E6 6D%k2 (,'8'EM!$$ %"F   4 +/-*E*E$!D,,...2+ +!$' )9(>(>t(D(D%%d+ a$"2"2"4"447LLMM9)	 )	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   r2   )r  r  r   r   s       r&   _check_set_attr_in_if_blockz/TS2FXGraphConverter._check_set_attr_in_if_blockm  sp    ^^%% 	 	E  99;;/11&-   2	 	r(   c                                           |           t          |                                          }t          |          dk    rt	          dt          |                                          |d                   }                     |          }|                                D ]"}|                     j	        |                   }#t          |          } 
                    ||          \  }}t          |          dk    rt	          dt          |                      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   z#expected 1 input for prim::If, got r   r   zexpected 2 subgraph nodes, got c                 :    g | ]}                     |          S r`   r  r  s     r&   rR  z7TS2FXGraphConverter.convert_prim_If.<locals>.<listcomp>  s'    NNND11$77NNNr(   )r  rN   r   r   r   r,  r$  r   r   r   r"  rB   r   rT  r   condr  r   r   r  rP   r  r  r  )r  r   r   	predicater   r   r  r%   r  r4   	cond_noderb  r[   r   r  s   `              r&   convert_prim_Ifz#TS2FXGraphConverter.convert_prim_Ifw  sJ   ((...dkkmm$$v;;! !Ts6{{!T!TUUU11&)<<	 66t<<	 [[]] 	L 	LE!(CE(JKKIIOO	 ;;D)LL~!## G#n2E2EGG   O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 r_   )_convert_as_noopr  s     r&   convert_aten_Boolz%TS2FXGraphConverter.convert_aten_Bool  s    d#####r(   c                     d S r_   r`   r  s     r&   convert_prim_Enterz&TS2FXGraphConverter.convert_prim_Enter  s	    
 	r(   c                     d S r_   r`   r  s     r&   convert_prim_Exitz%TS2FXGraphConverter.convert_prim_Exit  s    r(   c                     t          |          }|j        }|                     ||          \  }}|                                                                }|d         | j        |<   d S )Nr   )r   r^  r.  r   r   r  )r  r   r>  r   r4   r  rb  s          r&   r  z$TS2FXGraphConverter._convert_as_noop  sa     !&&,,T6::gkkmm--//)-a+&&&r(   c                      t           j        j        j        }t	           fd|                                D                       } j                            ||           d S )Nc              3   B   K   | ]}                     |          V  d S r_   rP  r  s     r&   rZ  zMTS2FXGraphConverter.convert_profiler__record_function_exit.<locals>.<genexpr>  r  r(   )r   ru   profiler_record_function_exitrB   r   r   rT  )r  r   r>  r4   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   rx  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 r_   )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 r_   rP  r  s     r&   rZ  zBTS2FXGraphConverter._convert_standard_operators.<locals>.<genexpr>  r  r(   )	r   r   rB   r   r   rT  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   r2   )r  r   	node_kindr  handler_funcnode_strrS   s          r&   r7  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 r`   r  )r   r  s     r&   rR  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  rN   r  r  r   r?   r   r	  Noderk  r   rT  r  r   r  r   r   USER_OUTPUTr   r  r   r   r   r   )r  r4   outp_name_listrb  r4  s        r&   r8  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)Br  
__module____qualname__r   r   r   Blockdictr   r}   r   r   r  r  r  rN   r"  r$  r   r  r.  Valuer,  r0  r	  r9  r  r6  rV  rc  rl  ru  ry  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  r7  r8  r`   r(   r&   r   r     s]       DC(.58>1DC C-.DC S%,./	DC
 !%UX^SX%= >DC '+38nDC sCx.DC  $CH~DC DC DC DCL
 
 
3ux} 3c 3 3 3 34  29 9 9    
	#EHM 	# 	# 	# 	#>ehn > > > >  -    4>. >. >.@	?ux} 	? 	? 	? 	?1 1 1 1 18W W W W W.,%(- , , , ,8?EHM ? ? ? ?T T T T TM M M M M8
U 
U 
U 
U 
U>UX] > > > >** * * * **ux} * * * *558= 5 5 5 55ux} 5 5 5 5.1EHM 1 1 1 11UX] 1 1 1 13%(- 3 3 3 31UX] 1 1 1 1 1UX] 1 1 1 15ehm 5 5 5 5	1ehm 	1 	1 	1 	1,UX] , , , ,B1UX] 1 1 1 1%,EHM %, %, %, %,N0UX] 0 0 0 0(  6Nehm N N N N`58=    *9EHM *9 *9 *9 *9X$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j        j        ej        j	        z  dee
ej        f         dee
ej        f         deej        j	        ee
         f         dee
ef         d	ee
ef         d
ee
e
f         f fdZd Z fdZ xZS )ExplainTS2FXGraphConverterz
    Run TS2FXGraphConverter in an explain mode. It collects all failed operators conversions
    and provide that information to users. In order to collect all failed conversions, it
    also mocks some internal attributes (e.g., name_to_node).
    c                   .     e Zd Z fdZ fdZd Z xZS )$ExplainTS2FXGraphConverter._DictMockc                 X    t                                          |           || _        d S r_   )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 r_   )r'  __contains__r(  __getitem__)r  r   r*  s     r&   r-  z0ExplainTS2FXGraphConverter._DictMock.__getitem__1  s?     77'',, '&77&&s+++r(   c                     dS NTr`   )r  r   s     r&   r,  z1ExplainTS2FXGraphConverter._DictMock.__contains__8  s    4r(   )r  r  r  r  r-  r,  __classcell__r*  s   @r&   	_DictMockr%  ,  s`        	) 	) 	) 	) 	)	, 	, 	, 	, 	,	 	 	 	 	 	 	r(   r2  r   r   r  r   r  r  r   c                     t                                          |||||||           g | _        t                              | j        t          j                            d ddd di                     | _        d S )NmockrT  c                      d S r_   r`   r`   r(   r&   r  z5ExplainTS2FXGraphConverter.__init__.<locals>.<lambda>Z  s     r(   r`   )	r'  r  unsupported_node_listr#  r2  r  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 r_   )r6  r   r   r7  r8  r  s     r&   explainz"ExplainTS2FXGraphConverter.explain`  s`    !!###M'')) 	$ 	$Dd####""$$$$$r(   c                     	 t                                          |           d S # t          $ r | j                            |           Y d S w xY wr_   )r'  r7  r   r6  r   )r  r   r*  s     r&   r7  z'ExplainTS2FXGraphConverter.convert_nodef  sa    	4GG  &&&&& 	4 	4 	4&--d333333	4s   !& $AA)r  r  r  __doc__r   r2  r   r   r   r  r   r}   r   r   r  r8  r7  r0  r1  s   @r&   r#  r#  %  s-            D   #
(.58>1#
 C-.#
 S%,./	#

 !%UX^SX%= >#
 '+38n#
 sCx.#
  $CH~#
 #
 #
 #
 #
 #
J% % %4 4 4 4 4 4 4 4 4r(   r#  c              #   V   K   | j         }d| _         	 d V  || _         d S # || _         w xY wr/  )disabled)r  r<  s     r&   disable_loggingr=  m  s@      |HCL xs    	(c            	           e Zd Z	 ddej        j        ej        j        z  deedf         de	e
ef         dz  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 r_   )shaper`  )r   paramr   s     r&   rZ  z*TS2EPConverter.__init__.<locals>.<genexpr>  sN        |u{22 u_))++2222 r(   )r@  r]   r   rV   rA  rB  r   r  r?   r   r   r@   rN   
parametersrW   itemsr  name_to_non_tensor_attributesr  lift_get_attr)r  r@  rA  rB  r%   
param_listr  r   s          @r&   r  zTS2EPConverter.__init__y  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 ]2\  }}||j        vr$t)          j        d| dd	
           ||j        |<   3|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   re  )r  infor   r   r   r   r  rI  r  r  r   print_readableretrace_as_exported_programr?   r@  r   r   r@   rW   rH  rh  ri  )r  r   r   graph_converterrp   epr  r   s           r&   r  zTS2EPConverter.convert  s   
	
 
	
 
	
 	,dm<<<8QM9
 9
5 5 .M".!!
 
 $$&& 	0333"B$5$55$5$I$IJJJ--,
 
 	r
 $-)@AA 	.!]5577==?? . .	6BM))M~Q~~~#$    (.BM!$	r(   Tc           	         t          | j                  \  }}t          | j        | j        | j        || j        | j        |          }|                                 t          |j	                  dk    r{d}t          |j	                  D ]c\  }}d                    t          |                              d          d d                   }|d| d|                                 d| d	z  }dnd
}|rt          |           |S )Nr   z2Unsupported nodes are found in the following list:r  r  r   z

    z. z []zSuccess!)r   r   r#  r   r  rI  r  r8  r   r6  rP   r   r   r   r   print)	r  rM  r   r   rQ  explain_strr[   nr  s	            r&   r8  zTS2EPConverter.explain  s%   8QM9
 9
5 5 5M".!!
 
 	!!!45599NK!/"GHH G G1773q66<<#5#5bqb#9::F!FFqvvxxFF8FFFFG %K 	+r(   rp   r  c                    t          d | j                  }t          j        j                            || j        |dd          }|j                            d |                                D                        |D ]}|j	        
                    |d            |j        j        D ]}|j        t          j        k    rp|j        |v rgt#          ||j                 t          j                  s*t'          t)          ||j                            d          t          j        |_        d |_        |                                                    |           |S )Nc                 ~    t          |t          j                  r"t          j        g|                                z  nd S r_   )r?   r   r}   r
   AUTOr   )pathxs     r&   r  z<TS2EPConverter.retrace_as_exported_program.<locals>.<lambda>  s1    (21el(C(CM
QUUWW$$ r(   FT)dynamic_shapesr*   pre_dispatchc                 f    i | ].\  }}t          |t          j        t          j        f          +||/S r`   )r?   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	   rA  r   export_trace_export
_constantsupdaterH  rW   popgraph_signaturer
  r   r   rB  r>  r?   r}   r   r   CONSTANT_TENSORr?  verifiercheck)r  rp   r  r]  rR  r  specs          r&   rP  z*TS2EPConverter.retrace_as_exported_program  sy   
 -  	
 
 \ (() ) 
 
 	 ,2244  	
 	
 	
 " 	' 	'AMa&&&&&2 	' 	'DyI,,,@P1P1P!"24;"?NN ( 0 =>>fff   &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  rW  r  s       r&   r   z.TS2EPConverter.lift_get_attr.<locals>.get_attr0  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_fqn7  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   r?   r   r}   r  r  r  rI  r   )r   r   rb  r   r   r  _dfs_get_attrr   rn  r   r  s         r&   rp  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  rp  r   rn  r   s   `@@@@r&   rJ  zTS2EPConverter.lift_get_attr  s    " 13	# 	 	 	 	 	 		%(- 	 	 	 	 	 		, 	, 	, 	, 	, 	, 	, 	, 	,0 	dm$$$$$r(   r_   )T)r  r  r  r   r   rA   r@   rB   r   r   r   r  r   r  r=  r  r8  r	  r9  rP  rJ  r`   r(   r&   r?  r?  w  s         04	" ")(59+CC" 38_" CH~,	" " " "H3 3 3 3 3j _S   4.H . sCx.. . . .`9% 9% 9% 9% 9%r(   r?  )r   )hbuiltinsloggingr  rG   rh  collections.abcr   r   
contextlibr   r   r   torch.export._tracer   Atorch._export.passes.replace_quantized_ops_with_standard_ops_passr   torch.export.dynamic_shapesr	   r
   torch.export.exported_programr   torch.export.graph_signaturer   r   r   r   r   r   r   torch.fxr   	getLoggerr  r  r'   r:   nnModuler   r@   rB   r   rN   rA   r]   rc   rg   ro   r	  r9  r   r   r   r   r   r   uint8int8int16r  int64float16float32float64	complex32	complex64
complex128r_  qint8quint8bfloat16r   rH  r\  r   maxminr  is_is_notnot_containsr   ru   rv   	sym_numelrw   sym_storage_offset
sym_strider   r   __annotations__r   r   r  r   r   r  r   r   r   r#  r=  r?  r`   r(   r&   <module>r     sT        . . . . . . . . % % % % % %                       A @ @ @ @ @ @ @ 9 9 9 9 9 9                  ' & & & & & g!!	 	 	" " "8/*8?UY55/*=Ec]/*
5;[)30BT0IIJ/* /* /* /*d  ! ! !H H H(@eh&: @ @ @ @"    c     ,s ,s , , , ,& & & 
K	J	K	K	K	M1	M1	M1	OQ	OQ	b	J	K	L"	NB $ SR5I5O5O5Q5QRRR 	' 	' 	'   (L]"+# 9>+).)!IN=IN-= = DhsCx&8!89   &0 0 0) ) )M58>M5
4C()4S>9:M5 M5 M5 M5`S>16   2%(-    .Y' Y' Y' Y' Y' Y' Y' Y'xE4 E4 E4 E4 E4!4 E4 E4 E4P      _% _% _% _% _% _% _% _% _% _%r(   