L i\4ddlZddlZddlZddlZddlZddlmZddlmZm Z m Z m Z m Z ddl Z ddlmZddlmZddlmZGddej(ZGd d eZd e e j.j0e fd e e j.j0e ffd Zy)N) FunctionType)AnyCallablecastOptionalUnion)normalize_source_lines)Tracer)GraphcZeZdZdZej j defdZdZ dZ y) AST_Rewriterax Take a FunctionType object representing a `forward` method, then perform an AST rewrite to swap out nodes that are not symbolically traceable with a callsite to the FX alternative. To support swapping out an AST node, define a new `visit` method on that node. For more details, see: https://docs.python.org/3/library/ast.html#ast.NodeTransformer fncPtj|\}}t|}dj|}t j |}t j|}t j|j|}t|dd}tj|j} t| j} t|| t!t| j| z } t#| dk(sJ| | d} d} | | |jS)Nexecrct|j||j|j|j}t j ||}tj|j|_|S)z?Based on https://stackoverflow.com/a/13503277/2988730 (@unutbu))nameargdefsclosure) r__code____name__ __defaults__ __closure__ functoolsupdate_wrappercopy__kwdefaults__)fglobalsgs d/mnt/ssd/data/python-lab/Trading/venv/lib/python3.12/site-packages/torch/fx/experimental/rewriter.pychange_func_globalsz1AST_Rewriter.rewrite..change_func_globals6s] ZZ A((A.A#yy)9)9:A H)r )inspectgetsourcelinesr jointextwrapdedentastparsefix_missing_locationsvisitcompiler __globals__setkeysrlistlen)selfr sourcelines_sourcenormalized_str source_astdest_astcode globals_dict keys_beforenew_keys fn_compiledr#s r"rewritezAST_Rewriter.rewrite s!//3 Q,[9 %!0YY~. ,,TZZ -CDxV,yy0 ,++-.  T< L--/0;>?8}!!!"8A;/   #;GGr$ctjdd}t|tjsJ|j}t|tj sJ|j r |j ntjdd}|j|g|_ tj|}tj||S)z Swap out the Assert node (Python's `assert`) with a callsite to the symbolically-traceable torch._assert function ztorch._assert()eval)moderN)valuekind)rD) r*r+ isinstance ExpressionbodyCallmsgConstanttestargsExpr copy_location)r4noden call_noderJ expr_wrappers r" visit_AssertzAST_Rewriter.visit_AssertHs II'f 5!S^^,,,FF )SXX...((dhh 2D(I))S) xxi0   t44r$c tj|jgtjtjdtj |j |jggS)a Swap out Python's AnnAssign with an Assign node where the annotation function is called. Example: Original: y: Tensor_Type(1,2,3, Dyn) = f2(x) Output: y = annotate(f2(x),Tensor_Type((1,2,3,Dyn))) annotate)idctx)funcrMkeywords)targetsrD)r*AssigntargetrINameLoadrD annotation)r4rPs r"visit_AnnAssignzAST_Rewriter.visit_AnnAssign\sQzz[[M((XX<jj$//2  r$N) r __module__ __qualname____doc__torch_dynamodisablerr@rTrar$r"r r s: ]]%H,%H%HN5( r$r creZdZ ddeej j efdee e e fde ffd Z xZS)RewritingTracerroot concrete_argsreturnc6t|t||SN)supertrace_rewrite)r4rkrl __class__s r"rqzRewritingTracer.traceps w}Xd^];;r$ro)rrbrcrrennModulerrdictstrrr rq __classcell__)rss@r"rjrjosM37<EHHOOX-.< S#X/<  <.rewrite_module..RewrittenModulecDt||jjD]t\}}t |t j jr)tj||j|<Stj||j|<vyro) rp__init____dict__itemsrFrertrur)r4origkvrsrewrite_modules r"rzB_rewrite..rewrite_module..RewrittenModule.__init__srG$& $ 3 3 5<1%a9/3yy9J/KDMM!,/3yy|DMM!, .rewrite_module}sI <%((// <'3n&<&<\199-'O ##1% %r$)rFrertrur r@rr)rrs @r"rrrrxsR"ehhoo& &ehhoo &b!!~%%d<&<==r$)r*rrr%r(typesrtypingrrrrrretorch._sourcesr torch.fx._symbolic_tracer torch.fx.graphr NodeTransformerr rjrtrurrrhr$r"rs 77 1+ [ 3&&[ |uxx01>eEHHOOXr$