
    VhE                     6   U 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 d dl	Z	d dl
mZ d dl	mZ d dlm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 d dlmZ d dlmZ d dlmZm Z  d dl!m"Z"m#Z# d dl$m%Z& d dl'm(Z(m)Z) dgZ*eZ+eZ,edef   Z-ee	j                  j\                  gee    f   Z/e	j`                  e	jb                  e	jd                  e	jf                  e	jh                  e	jj                  e	jl                  hZ7e8e   e9d<    G d de:      Z; G d de      Z<y)    N)nullcontext)AnyCallableOptionalUnion)_unstack_pytree)fx)enable_python_dispatcher)NodeMetadata)
ProxyValue)
FakeTensorUnsupportedFakeTensorException)FakeTensorMode)	traceback)PythonKeyTracer)CodeGen)PassBase
PassResult)_extract_tensor_metadataTensorMetadata)_pytree)PropagateUnbackedSymIntscompute_unbacked_bindings!_ExportPassBaseDeprecatedDoNotUse._TORCH_SYM_OPSc                       e Zd Zy)ExportPassBaseErrorN)__name__
__module____qualname__     G/home/dcms/DCMS/lib/python3.12/site-packages/torch/_export/pass_base.pyr   r   -   s    r"   r   c                      e Zd ZdZed        Z G d de      Z G d dej                        Z
d*d	Zd
edej                  j                  j                  deedf   deeef   dedefdZdej                  j,                  dee   fdZdeddfdZdedededefdZdeedf   deeef   dedefdZdedeedf   dedefdZdedej                  j,                  dej                  j,                  dee   dedefdZdej                  j,                  d ee   d!ee   dedef
d"Zd#ed$e dedefd%Z!d&ee   dedefd'Z"dej,                  deedf   de#fd(Z$dej,                  de#fd)Z%y)+r   zl
    Interpreter-based pass class to help users maintain the IR spec while writing
    transformations.
    c                  b    t        ddj                  t        j                  d            i      S )Nstack_trace    )limit)r   joinr   format_stackr!   r"   r#   _create_dummy_node_metadataz=_ExportPassBaseDeprecatedDoNotUse._create_dummy_node_metadata7   s'    ]BGGI4J4JQR4S,TUVVr"   c                        e Zd Zdddeddf fdZddZdedej                  j                  f fd	Z
d
ej                  j                  deddfdZ xZS )._ExportPassBaseDeprecatedDoNotUse.ExportTracercallbackr   codegenreturnNc                    t         |           || _        t        j                  j                         | _        t        j                  j                         | _	        | j                  j                  |       i | _        d | _        i | _        y N)super__init__r/   torchnnModulerootr	   Graphgraphset_codegentensor_attrsfake_tensor_mode
submodules)selfr/   r0   	__class__s      r#   r5   z7_ExportPassBaseDeprecatedDoNotUse.ExportTracer.__init__=   sb    G$DM)DI)DJJJ""7+9;D>BD!:<DOr"   c                     t        d      )Nz%ExportTracer doesn't support trace().r   r@   s    r#   tracez4_ExportPassBaseDeprecatedDoNotUse.ExportTracer.traceG   s    %&MNNr"   ac                    t        |t        j                  j                        rR|| j                  vrdt        | j                         }| j                  j                  ||       || j                  |<   nCt        |t              r3t        |d      r|j                  t        d| d      |j                  }t        | 5  |      }t        |t        j                        rjt        |t        j                  j                         rF|j"                  dk(  r7| j%                  ||       | j&                  j)                  t+        ||             |S )N
submodule_constantzCannot add z
 to graph.get_attr)
isinstancer6   r7   r8   r?   lenr9   
add_moduler   hasattrrI   r   r4   
create_argTensorr	   Nodeopset_metadatar/   on_attrr   )r@   rF   name_submodulenoderA   s       r#   rO   z9_ExportPassBaseDeprecatedDoNotUse.ExportTracer.create_argJ   s    !UXX__-DOO+'1#doo2F1G%HNII((;)7DOOA&Az*q*-1C-A3j.IJJJJ7%a(D1ell+tUXX]]3GGz)!!$*%%jD&9:Kr"   rV   valuec                 |    dt         dt        t        t        j                  t        j
                  t        j                  t        t        t        t        d f	   f fd}t        j                  ||      |j                  d<   dt         dt        t           f fd}t        j                  ||      |j                  d<   y )Nxr1   c           
      X   t        | t              r| S t        | t        j                        r| j                  rt        j
                  |       } 	 j                  J t        | t        j                  j                        rj                  j                  | d      }|S j                  j                  |       }	 |S t        | t        j                  t        j                  t        j                  t        t         t"        t$        f      r| S y # t        $ r t        d       d }Y |S w xY w)NT)static_shapeszvFakeifying a Tensor subclass is not supported                             right now. Instead a TensorMetadata is used.)rK   r   r6   rP   is_quantized
dequantizer>   r7   	Parameterfrom_tensorr   printSymIntSymFloatSymBoolintfloatboolstr)rY   fake_tensorr@   s     r#   make_valzM_ExportPassBaseDeprecatedDoNotUse.ExportTracer.set_metadata.<locals>.make_valb   s    a,H5<<0~~!,,Q/+#44@@@ &a););<*.*?*?*K*K ! +L +K '& +/*?*?*K*KA*NK '&ELL%..%--QTV[]acf#ghH : + J '+&&+s   AD !D D)(D)valc                 .   t        | t              sit        | t        j                        rO| j                  rt        j
                  |       } 	 j                  J j                  j                  |       }d }|S y # t        $ r t        |       }Y |S w xY wr3   )
rK   r   r6   rP   r\   r]   r>   r_   r   r   )rY   _tensor_metar@   s      r#   make_tensor_metazU_ExportPassBaseDeprecatedDoNotUse.ExportTracer.set_metadata.<locals>.make_tensor_meta   s    !!Z0Z5<<5P~~!,,Q/B#44@@@ 11==a@&*
 '& : B '?q&A&&	Bs   +A< <BBrm   )Argumentr   r   r6   ra   rb   rc   rd   re   rf   rg   pytreetree_mapmetar   r   )r@   rV   rW   ri   rn   s   `    r#   rS   z;_ExportPassBaseDeprecatedDoNotUse.ExportTracer.set_metadata^   s        z5<<PSUZ\`begkkl  D  &x?DIIe H  .1I  $ (.7G'ODIIm$r"   r1   N)r   r   r    r   r5   rE   ro   r6   r	   rQ   rO   rS   __classcell__rA   s   @r#   ExportTracerr.   <   sj    	=%H 	=SZ 	=_c 	=	O	 	UXX]] 	(;	P;	P.6;	P;	Pr"   rv   c                   @    e Zd Zdddej                  ddf fdZdedeed	f   d
e	eef   de
f fdZdej                  j                  j                  deed	f   d
e	eef   de
fdZdej                  j                  j                  deed	f   d
e	eef   de
fdZdedeed	f   d
e	eef   def fdZdej                  j                  j                  deed	f   d
e	eef   ddfdZdedeed	f   d
e	eef   ddfdZdej                  j(                  def fdZ xZS )3_ExportPassBaseDeprecatedDoNotUse.ExportInterpreterr/   r   gmr1   Nc                     t         |   |       || _        t        t	        |j
                  j                              | _        y r3   )r4   r5   r/   nextiterr;   nodesrV   )r@   r/   ry   rA   s      r#   r5   z<_ExportPassBaseDeprecatedDoNotUse.ExportInterpreter.__init__   s0    GR $DM'+D,@'ADIr"   targetargs.kwargsc                     t         |   |||      }| j                  j                  ||t        | j                  j
                              S r3   )r4   placeholderr/   r   rV   rr   )r@   r~   r   r   argrA   s        r#   r   z?_ExportPassBaseDeprecatedDoNotUse.ExportInterpreter.placeholder   s>     '%fdF;C==,,VS,tyy~~:VWWr"   c                     | j                   j                  |d   t        | j                  j                              j
                  S )Nr   )r/   outputr   rV   rr   datar@   r~   r   r   s       r#   r   z:_ExportPassBaseDeprecatedDoNotUse.ExportInterpreter.output   s2     ==''Qdiinn1MNSSSr"   c                 
   t        | j                  j                        }|t        j                  k(  r"|\  }}| j
                  j                  |||      S t        |dd       dv r*t        |      sJ | j
                  j                  |||      S |t        v r*t        |      sJ | j
                  j                  |||      S t        |t        j                  j                  t        j                  j                  f      r| j
                  j!                  ||||      S |t        j"                  j$                  j&                  k(  r&|\  }}}	}
| j
                  j)                  |||	|
|      S |t        j"                  j$                  j*                  k(  r$|\  }}}| j
                  j-                  ||||      S t        |t        j                  j.                        r| j
                  j1                  d||||      S t3        d|       )Nr   >   mathbuiltins	_operatorcall_functionzUnsupported target type: )r   rV   rr   operatorgetitemr/   call_getitemgetattrcallablecall_symr   rK   r6   _ops
OpOverloadOpOverloadPacketcall_operatoropshigher_ordercond	call_condmap_implcall_mapHigherOrderOperator_fxr   )r@   r~   r   r   rr   rW   keypredtrue_fnfalse_fninputsfmapped_argsoperandss                 r#   r   zA_ExportPassBaseDeprecatedDoNotUse.ExportInterpreter.call_function   s     		/D)))!
s}}11%dCCt48YY'''}}--fdDAA>)'''}}--fdDAAFUZZ%:%:EJJ<W<W$XY}}22	  5991166626/gx}}..tWhPTUU59911:::+/(;}}--ahMMFEJJ$B$BC}}((#  *,EfX*NOOr"   c                 &    t         |   |||      S r3   )r4   rJ   )r@   r~   r   r   rA   s       r#   rJ   z<_ExportPassBaseDeprecatedDoNotUse.ExportInterpreter.get_attr   s     7#FD&99r"   c                     t        d      )Nzcall_module is not supported.rC   r   s       r#   call_modulez?_ExportPassBaseDeprecatedDoNotUse.ExportInterpreter.call_module   s     &&EFFr"   c                     t        d      )Nzcall_method is not supported.rC   r   s       r#   call_methodz?_ExportPassBaseDeprecatedDoNotUse.ExportInterpreter.call_method   s     &&EFFr"   nc                 n    || _         |j                         | j                  _        t        |   |      S r3   )rV   format_noder/   node_debug_strr4   run_node)r@   r   rA   s     r#   r   z<_ExportPassBaseDeprecatedDoNotUse.ExportInterpreter.run_node   s,    DI+,==?DMM(7#A&&r"   )r   r   r    r	   GraphModuler5   rg   tuplero   dictr   r   r6   rV   Targetr   r   rJ   r   r   rQ   r   rt   ru   s   @r#   ExportInterpreterrx      s   	B%H 	Bbnn 	Bae 	B
	X	X #&	X h'		X
 	X	THHMM((	T #&	T h'		T
 	T(	PHHMM(((	P #&(	P h'	(	P
 (	PT	:	:%*8S=%9	:CGXCV	:	:
	GHHMM((	G #&	G h'		G
 	G	G	G%*8S=%9	GCGXCV	G	G
	'ehhmm 	' 	' 	'r"   r   r1   Nc                 8   t        t        j                  j                  t        j                  j                         t        j                  j                                     | _        | j                  | t                     | _
        d | _        d| _        d | _        y )NT)r   r6   r	   r   r7   r8   r:   interpreterrv   r   tracerr>   _initializedr   rD   s    r#   r5   z*_ExportPassBaseDeprecatedDoNotUse.__init__   si    3HH  !2EHHNN4DE
 ''gi8:> 48r"   kindr~   r   .r   rr   c                    t        j                  t        d ||f      \  }} t        | j                  |      |||      }t        j                  t        d ||f      \  }	}
d }t        |t        j                  j                        r9| j                  j                  j                  |j                  j                        }| j                  j                  |||	|
|      }|j                  j                   j#                  |j$                         | j&                  r?| j&                  j(                  x}r't+        ||      x}r||j                  j                   d<   | j                  j-                  |j                  |       t        ||      S )Nc                     | j                   S r3   r   rY   s    r#   <lambda>z7_ExportPassBaseDeprecatedDoNotUse._fx.<locals>.<lambda>  s
    !&& r"   c                     | j                   S r3   )proxyr   s    r#   r   z7_ExportPassBaseDeprecatedDoNotUse._fx.<locals>.<lambda>	  s
    !'' r"   )nameunbacked_bindings)rp   tree_map_onlyr   r   r   rK   r6   r   r   r   r;   _target_to_stroverloadpacketr   create_proxyrV   rr   updater   r>   	shape_envr   rS   )r@   r   r~   r   r   rr   	args_datakwargs_datares_data
args_proxykwargs_proxyr   	res_proxyr   symbol_to_paths                  r#   r   z%_ExportPassBaseDeprecatedDoNotUse._fx   sM    "(!5!5(4."
	; 374++T269kR#)#7#7)D&>$
 
L fejj334;;$$33F4I4I4R4RSDKK,,T6:|Z^,_	""499-  43H3H3R3R&Ri&R!:9h!OO~O;I	##$78  :(I..r"   graph_modulec                 0    j                   j                  dd       x}t        |      S dt        j                  j
                  dt        t           f fd}j                  j                  D cg c]  }|j                  dk(  r ||       c}S c c}w )Nr   rV   r1   c           
         d| j                   v r5| j                   d   }t        |d      r|j                  |j                  S |S | j                   j                  d      x}rxj                  J t        j                  t        j                  |j                  |j                  d|j                  |j                        t        j                  d            S t        | j                        dk(  ry t        d d	      )
Nrj   rI   rm   rr   )dtypedevicerequires_gradmemory_formatcpur   z,Cannot construct an input for graph module: .)rr   rN   rI   getr>   r   r6   emptyshaper   r   r   r   rL   usersr   )rV   fakerm   r   r@   s      r#   extract_inputz?_ExportPassBaseDeprecatedDoNotUse.inputs.<locals>.extract_input  s    		!yy'4,1J==( $		m <<<,,888!))KK#)))//%&1&?&?&1&?&? LL'
 
 TZZA%%>|nAN r"   r   )rr   r   listr6   r	   rQ   r   r   r;   r}   rR   )r@   r   r   r   rV   s   ``   r#   r   z(_ExportPassBaseDeprecatedDoNotUse.inputs  s     !%%))&$77DD:	 	(:2F 	6 %**00
ww-' $
 	
 
s   2Battrc                      y r3   r!   )r@   r   s     r#   rT   z)_ExportPassBaseDeprecatedDoNotUse.on_attr=  s    r"   r   r   c                     | j                   j                  d|di       }|j                  |j                  _        | j                   j                  |j                  |       t        ||      S )Nr   r!   )r   r   r   rV   rr   rS   r   )r@   r   r   rr   	arg_proxys        r#   r   z-_ExportPassBaseDeprecatedDoNotUse.placeholder@  sQ    KK,,]D"bI	"ii	  5#y))r"   c                 ,    | j                  d||||      S Nr   r   )r@   rR   r   r   rr   s        r#   r   z/_ExportPassBaseDeprecatedDoNotUse.call_operatorF  s     xxT64@@r"   c                 ,    | j                  d||i |      S r   r   )r@   r~   r   rr   s       r#   r   z*_ExportPassBaseDeprecatedDoNotUse.call_symO  s     xxr4@@r"   r   r   r   r   c           
      .   | j                  |t        |            }| j                  |t        |            }|J |J | j                  dt        j                  j
                  j                  ||j                  |j                  t        |      fi |      S r   )	call_submoduler   r   r6   r   r   r   r   r   )r@   r   r   r   r   rr   true_branchfalse_branchs           r#   r   z+_ExportPassBaseDeprecatedDoNotUse.call_condW  s     ))'5=A**8U6]C&&&'''xxII""'';++\-F-FVU
 	
r"   r   r   r   c           
      ^   t        |D cg c]  }|j                   c}      d   }| j                  |t        ||D cg c]  }|j                   c}z               }|J | j	                  dt
        j                  j                  j                  |j                  ||fi |      S c c}w c c}w )Nr   r   )
r   r   r   r   r   r6   r   r   r   r   )r@   r   r   r   rr   r   xsf_branchs           r#   r   z*_ExportPassBaseDeprecatedDoNotUse.call_mapk  s     +>3chh>?B&&q%(5S3chh5S0S*TU###xxII""++""K:
 	
 ?5Ss
   B%B*rW   r   c                 L    | j                  dt        j                  ||fi |      S r   )r   r   r   )r@   rW   r   rr   s       r#   r   z._ExportPassBaseDeprecatedDoNotUse.call_getitem}  s%     xx)9)9E3<TRRr"   resultsc                 .    | j                  dd|fi |      S )Nr   r   )r@   r   rr   s      r#   r   z(_ExportPassBaseDeprecatedDoNotUse.output  s    xx(WJDAAr"   c                 F   | j                   | j                  | |j                  j                        c}| _         |j                  | j                   _        | j                  | |      }| j                  t        j                  j                  t        j                  j                  t        j                  j                         t        j                  j                                     c}| _        t        j                  t         d |      }t#        j$                         5   |j&                  |  d d d        t        j                  j                  | j                   j(                  | j                   j                        }|| _         || _        t+        |d      S # 1 sw Y   kxY w)Nc                     | j                   S r3   r   r   s    r#   r   zB_ExportPassBaseDeprecatedDoNotUse.call_submodule.<locals>.<lambda>  s
     r"   T)r   rv   r;   _codegenr>   r   r   r6   r	   Interpreterr   r7   r8   r:   rp   r   r   fx_tracebackpreserve_node_metarunr9   r   )r@   r   r   prev_tracerr   prev_interpreterinputs_datanew_graph_modules           r#   r   z0_ExportPassBaseDeprecatedDoNotUse.call_submodule  s=    $(;;0A0A,$$--1
 T[ (3'C'C$,,T<@-1-=-=uxx?S?SHH  !2EHHNN4DE@
*$* **:7GP,,. 	*KOO[)	* !88//0@0@$++BSBST!+
 	
	* 	*s   FF c                 D   t        | dd      st        d      | j                  |      }d }|D ]6  }t        |t              s|||j
                  u sJ d       |j
                  }8 |0t        d      | j                  _        t               }t               }n"d|_
        || j                  _        t               }| j                  j                  | _        |5  |5  | j                  |t        |            }d d d        d d d        S # 1 sw Y   xY w# 1 sw Y   S xY w)Nr   Fz.ExportPass is not initialized with __init__().z#Multiple fake tensor mode detected.T)allow_non_fake_inputs)r   r   r   rK   r   	fake_moder   r   r>   r   r   r
   r   r   )r@   r   r   r>   idispatcher_moderesults          r#   callz&_ExportPassBaseDeprecatedDoNotUse.call  s&   t^U3%@  \* 	/A!Z($,0@AKK0O989O#$;; 	/ #+9PT+UDKK(*})mO592+;DKK(68O $ < < 	F 	F((uV}EF	F 	F 	F 	F 	F s$   DD	7D	D	DDrs   )&r   r   r    __doc__staticmethodr,   r   rv   r	   r   r   r5   rg   r6   rV   r   r   ro   r   r   r   r   r   r   r   rT   r   r   Fnr   r   r   rd   r   r   r   r   r  r!   r"   r#   r   r   1   s   
 W W]P ]P~V'BNN V'p9// $$/ HcM"	/
 S(]#/ / 
/8#
588#7#7 #
DN #
JJ 4 * *( *, *: *A HcM"A S(]#	A
 A 
AAA HcM"A 	A
 
A

 %%
 ((&&	

 X
 
 

(
88
 *%
 z"	

 
 

$SS&)S1=S	S
Bd8n BL BZ B
NN
49(C-4H
	
0 J r"   )=r   r   typing
contextlibr   r   r   r   r   r6   #functorch.experimental.control_flowr   r	   torch._dispatch.pythonr
   &torch._export.pass_infra.node_metadatar   $torch._export.pass_infra.proxy_valuer   torch._subclassesr   r   torch._subclasses.fake_tensorr   torch.fxr   "torch.fx.experimental.proxy_tensorr   torch.fx.graphr   torch.fx.passes.infra.pass_baser   r   torch.fx.passes.shape_propr   r   torch.utilsr   rp   %torch.fx.experimental.symbolic_shapesr   r   __all__ro   Valuer  r   PassTypesym_int	sym_floatsym_itesym_maxsym_minsym_notsym_sqrtr   set__annotations__RuntimeErrorr   r   r!   r"   r#   <module>r$     s       " 1 1  ?  ; ? ; H 8 . > " @ O ) e /
/ c3hUXX))*HZ,@@A 
MM	OO	MM	MM	MM	MM	NN!H 	, 	H Hr"   