
    PhHY                        d dl Z d dlZd dlZd dlmZmZmZmZmZm	Z	m
Z
mZmZmZ er
d dlZd dlmZ d dlZd dlmc mZ d dlmc 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#m$Z$m%Z%m&Z&m'Z'm(Z(m)Z)m*Z*m+Z+ g d
Z,eej&                  jZ                  ge	e   f   Z.ej^                   G d d             Z0ej^                   G d d             Z1d Z2 G d d      Z3dej&                  jZ                  ddfdZ4y)    N)
AnyCallableDictIteratorListOptionalTupleTypeTYPE_CHECKINGUnion)ValueRanges)compatibilitymaybe_disable_fake_tensor_mode)
PassResult)PassManager   )
_sig_to_specsArgumentSpecConstantArgumentExportGraphSignature	InputKind	InputSpec
OutputKind
OutputSpecSymIntArgumentTensorArgument)ExportedProgramModuleCallEntryModuleCallSignaturec                   j    e Zd ZU ee   ed<   ee   ed<   ej                  ed<   ej                  ed<   y)r    inputsoutputsin_specout_specN)__name__
__module____qualname__r   r   __annotations__pytreeTreeSpec     hC:\Users\daisl\Desktop\realtime-object-detection\venv\Lib\site-packages\torch/export/exported_program.pyr    r    ;   s,    ,__oor-   r    c                   ,    e Zd ZU eed<   dZee   ed<   y)r   fqnN	signature)r&   r'   r(   strr)   r1   r   r    r,   r-   r.   r   r   C   s    	H/3Ix+,3r-   r   c                 B     t        j                          fd       }|S )Nc                  T    t               5   | i |cd d d        S # 1 sw Y   y xY wNr   )argskwargsfns     r.   wrapperz/_disable_prexisiting_fake_mode.<locals>.wrapperJ   s"    +-t&v& .--s   ')	functoolswraps)r8   r9   s   ` r.   _disable_prexisiting_fake_moder<   I   s%    __R' ' Nr-   c                   V   e Zd ZdZ	 	 	 d1deej                  j                  ee	e
f   f   dej                  j                  dedee	eej                  ej                  j                  f   f   ddd	eee
e
f      d
ee   deeee
df   ee	e
f   f      deee
      deee	ej                  f      fdZe ed      d               Ze ed      d               Ze ed      d               Ze ed      d               Z ed      deej                  j                     fd       Z ed      deee	ej                  j                  f      fd       Z ed      deej                     fd       Z ed      deee	ej                  f      fd       Z e ed      d               Z!e ed      d               Z"e ed      d               Z#e ed      d               Z$e ed      d               Z%e ed      de
fd               Z&e ed      de	fd!              Z'e ed      d"               Z(d#e
d$e
de
fd%Z)de	fd&Z*d'd(d)e+dej                  j                  fd*Z,e-	 d2d+eeej\                  j^                  e0f      dd fd,       Z1d-e2dd fd.Z3d/ Z4d0 Z5y)3r   a  
    Package of a program from :func:`export`. It contains
    an :class:`torch.fx.Graph` that represents Tensor computation, a state_dict containing
    tensor values of all lifted parameters and buffers, and various metadata.

    You can call an ExportedProgram like the original callable traced by
    :func:`export` with the same calling convention.

    To perform transformations on the graph, use ``.module`` property to access
    an :class:`torch.fx.GraphModule`. You can then use
    `FX transformation <https://pytorch.org/docs/stable/fx.html#writing-transformations>`_
    to rewrite the graph. Afterwards, you can simply use :func:`export`
    again to construct a correct ExportedProgram.
    Nrootgraphgraph_signature
state_dictrange_constraintsDict[sympy.Symbol, Any]equality_constraintsmodule_call_graphexample_inputs.verifiertensor_constantsc                    ddl m} ddlm} t        j
                  j                  j                         |_         |||      | _	        t        |t        j
                  j                        r/| j                  j                  j                  |j                         || _        || _        || _        || _        || _        || _        |
xs i | _        ddlm} |	|}	t/        |	|      sJ |	| _        | j3                         j5                  |        y )Nr   )_create_graph_module_for_export)InputDim)Verifier)torch._export.exported_programrJ   @torch._export.passes.add_runtime_assertions_for_constraints_passrK   torchfxr?   CodeGen_codegen_graph_module
isinstanceGraphModulemetaupdate_graph_signature_state_dict_range_constraints_equality_constraints_module_call_graph_example_inputs_tensor_constantstorch._export.verifierrL   
issubclass	_verifierrG   check)selfr>   r?   r@   rA   rB   rD   rE   rF   rG   rH   rJ   rK   rL   s                 r.   __init__zExportedProgram.__init__b   s     	S	

 //1<T5IdEHH001##**49956E+5EV ! 	" :K-!1!7R3H(H---!d#r-   F)is_backward_compatiblec                     | j                   S r5   )rS   rc   s    r.   graph_modulezExportedProgram.graph_module   s     !!!r-   c                 .    | j                   j                  S r5   )rh   r?   rg   s    r.   r?   zExportedProgram.graph   s       &&&r-   c                     | j                   S r5   )rX   rg   s    r.   r@   zExportedProgram.graph_signature   s     $$$r-   c                     | j                   S r5   )rY   rg   s    r.   rA   zExportedProgram.state_dict   s     r-   returnc              #   D   K   | j                         D ]	  \  }}|  yw)zH
        Returns an iterator over original module's parameters.
        N)named_parameters)rc   _params      r.   
parameterszExportedProgram.parameters   s$     
 --/HAuK 0    c              #   h   K   | j                   j                  D ]  }|| j                  |   f  yw)z
        Returns an iterator over original module parameters, yielding
        both the name of the parameter as well as the parameter itself.
        N)r@   rq   rA   )rc   
param_names     r.   rn   z ExportedProgram.named_parameters   s2      ..99Jdooj999 :   02c              #   D   K   | j                         D ]	  \  }}|  yw)zC
        Returns an iterator over original module buffers.
        N)named_buffers)rc   ro   bufs      r.   bufferszExportedProgram.buffers   s$     
 ((*FAsI +rr   c              #   h   K   | j                   j                  D ]  }|| j                  |   f  yw)z
        Returns an iterator over original module buffers, yielding
        both the name of the buffer as well as the buffer itself.
        N)r@   ry   rA   )rc   buffer_names     r.   rw   zExportedProgram.named_buffers   s2       //77Kt{;;; 8ru   c                     | j                   S r5   )rZ   rg   s    r.   rB   z!ExportedProgram.range_constraints        &&&r-   c                     | j                   S r5   )r[   rg   s    r.   rD   z$ExportedProgram.equality_constraints   s     )))r-   c                     | j                   S r5   )r\   rg   s    r.   rE   z!ExportedProgram.module_call_graph   r}   r-   c                     | j                   S r5   )r]   rg   s    r.   rF   zExportedProgram.example_inputs   s     ###r-   c                 &   ddl m} t        | j                        dk(  r
 |d d       S | j                  d   j                  dk(  sJ  || j                  d   j
                  j                  | j                  d   j
                  j                        S )Nr   )CallSpec)r$   r%    )rM   r   lenrE   r0   r1   r$   r%   )rc   r   s     r.   	call_speczExportedProgram.call_spec   s     	<t%%&!+D488%%a(,,222**1-77??++A.88AA
 	
r-   c                     | j                   S r5   )ra   rg   s    r.   rG   zExportedProgram.verifier   s     ~~r-   c                 .    | j                   j                  S r5   )ra   dialectrg   s    r.   r   zExportedProgram.dialect   s     ~~%%%r-   c                     | j                   S r5   )r^   rg   s    r.   rH   z ExportedProgram.tensor_constants   s     %%%r-   r6   r7   c           	      
    dd l mc m}  j                  j                  5	 ||xs i f}t        j                  | j                  j                  d      }t         fd j                  j                  D              }t         fd j                  j                  D              }t         j                  d      r)t         fd	 j                  j                   D              }	nd
}	  j"                  g |||	|  t%        j&                  j)                   j*                        j,                  g |||	|ddi}
 j                  j.                  ߉ j                  j0                  } j                  j2                  }t5        |      t5        |      z   }|
d | } j                  j6                  }|'t9        t;        |j=                                     }|
d | }
|
|d  }
	 t        j>                  |
 j                  j.                        }
	  j                  jB                  D cg c]!  }|jD                  tF        jH                  k(  r|# }}tK        |      D ]  \  }} j                  jL                  |   jD                  tN        jP                  k(  r(jR                  J | jT                  jR                  <   djD                  tN        jV                  k(  r@jR                  J t9        fdtK        |      D              }||   jY                  |       t[        djD                          |
S |
S # t        $ r> t        j                        \  }}t        d j                  j                   d|       w xY w# t        $ rD t        j                  |
      \  }}|jA                  d j                  j.                   d|       w xY wc c}w #  j                  jB                  D cg c]!  }|jD                  tF        jH                  k(  r|# nc c}w }}tK        |      D ]  \  }} j                  jL                  |   jD                  tN        jP                  k(  r(jR                  J | jT                  jR                  <   djD                  tN        jV                  k(  r@jR                  J t9        fdtK        |      D              }||   jY                  |       t[        djD                          w xY w)Nr   T)exact_structural_matchz>Trying to flatten user inputs with exported input tree spec: 
z-
but actually got inputs with tree spec of: 
c              3   <   K   | ]  }j                   |     y wr5   rA   .0namerc   s     r.   	<genexpr>z+ExportedProgram.__call__.<locals>.<genexpr>  s      
.MdDOOD!.M   c              3   <   K   | ]  }j                   |     y wr5   r   r   s     r.   r   z+ExportedProgram.__call__.<locals>.<genexpr>	  s       
.JdDOOD!.Jr   lifted_tensor_constantsc              3   <   K   | ]  }j                   |     y wr5   )rH   r   s     r.   r   z+ExportedProgram.__call__.<locals>.<genexpr>  s$      -HD %%d+Hr   r,   enable_io_processingFz@Trying to flatten user outputs with exported output tree spec: 
z.
but actually got outputs with tree spec of: 
c              3   n   K   | ],  \  }}|j                   j                  j                  k(  r| . y wr5   )argr   target)r   ispecoutput_specs      r.   r   z+ExportedProgram.__call__.<locals>.<genexpr>E  s3      %+A4#xx}}0B0BB +As   25zUnexpected kind: ).torch._export.error_exporterrorr   r$   	fx_pytreetree_flatten_spec	Exceptionr*   tree_flatten	TypeErrortupler@   rq   ry   hasattrr   _check_input_constraintsrO   rP   Interpreterrh   runr%   buffers_to_mutateuser_inputs_to_mutater   assertion_dep_tokennextiterkeystree_unflattenInternalErrorinput_specskindr   
USER_INPUT	enumerateoutput_specsr   BUFFER_MUTATIONr   rA   USER_INPUT_MUTATIONcopy_AssertionError)rc   r6   r7   r   	user_argsro   received_specordered_paramsordered_buffersordered_tensor_constantsresbuffer_mutationuser_input_mutationnum_mutatedmutated_valuesr   assertion_dep_token_indexr   user_inputsr   valueindexr   s   `                     @r.   __call__zExportedProgram.__call__   s   ++>>!!-!6<R0	 22t~~55d  
.2.B.B.M.M
 
    
.2.B.B.J.J 
 
 4'')BC', - 00HH- ($
 (*$%%% 	
	
-	
0H	
KO	
 hh""4#4#4599 


 &
 	

 "'
 >>""."22DDO"&"6"6"L"Lo.5H1IIK +.N #'"6"6"J"J".,06I6N6N6P1Q,R)445kl#CU++C1H1HI !% 4 4 @ @ @yyI$8$88  @  
 !*. 9HAu"&"6"6"C"CA"FK"'':+E+EE*11===>C(:(:;$))Z-K-KK*11=== $ %+4[+A% !
 U))%0,/@AQAQ@R-STT !:  
s
c  #)#6#6y#A =U~~--. /D$o' f  #)#6#6s#; =))W~~../ 0E$o'  $ 4 4 @ @ @yyI$8$88  @ 
 !*. 9HAu"&"6"6"C"CA"FK"'':+E+EE*11===>C(:(:;$))Z-K-KK*11=== $ %+4[+A% !
 U))%0,/@AQAQ@R-STT !:s8   4L9 %*N (&O9AN AOO T1&PC.Tc           	          | j                   j                  d      j                  dd      }d| d| j                   d| j                   d| j
                   d	}|S )	NF)print_output
z
    zExportedProgram:
    z
Graph signature: z
Range constraints: z
Equality constraints: )rh   print_readablereplacer@   rB   rD   )rc   rh   strings      r.   __str__zExportedProgram.__str__P  s|    ((77U7KSS(
. !  $ 4 45 6""&"8"8!9 :%%)%>%>$?r	C 	 r-   T)flatr   c                >    ddl m} ddlm} |r ||       S  ||       S )z_
        Returns a self contained GraphModule with all the parameters/buffers inlined.
        r   )%unlift_exported_program_lifted_states)	unflatten)rM   r   torch._export.unflattenr   )rc   r   r   r   s       r.   modulezExportedProgram.module]  s#     	Y58>>T?"r-   decomp_tablec                 l   ddl m} ddlm}m} ddlm} ddlm} ddl	m
} d }|xs  |       } || j                        }	|	D 
cg c]  }
|
j                  d    }}
| j                  j                         D cg c]  \  }}|	 }}}|D ]  }t        | j                  |         || j                  ||d	
      \  }}d } ||      }t        |j                   j"                        d   j$                  d   }t'        | j(                  j*                        D cg c]:  \  }}t-        |j.                   ||j0                  ||         |j2                        < }}}t'        | j(                  j4                        D cg c]:  \  }}t7        |j.                   ||j0                  ||         |j2                        < }}}t9        |      t9        |	      k(  sJ t;        |	|      D ci c]  \  }}|j<                  |j<                   }}}t?        ||      }t;        |	|      D ]  \  }}tA        |j                  d   tB        jD                        s|j                  d   |j                  d<   |j2                  |jF                  v s|j2                  |jH                  v sz|j                  jK                         D ]  \  }}||j                  |<     |j                  jM                  | j                  j                         tO        |      }| jP                  D  cg c]E  \  }}  |||jR                     |jT                         ||| jR                     | jT                        fG }!}}  |||        ||       tW        ||j                   || jX                  ||!t[        j\                  | j^                        | j`                  | jb                  | jd                  
      }"t9        |      dkD  st9        |!      dkD  r|"jg                   |||!            }"|"S c c}
w c c}}w c c}}w c c}}w c c}}w c c} }w )aU  
        Run a set of decompositions on the exported program and returns a new
        exported program. By default we will run the Core ATen decompositions to
        get operators in the
        `Core ATen Operator Set <https://pytorch.org/docs/stable/torch.compiler_ir.html>`_.

        For now, we do not decompose joint graphs.
        r   )core_aten_decompositions)-_AddRuntimeAssertionsForInlineConstraintsPassrK   )lift_constant_tensor_pass)_replace_sym_size_ops_pass)aot_export_modulec                     g }| j                   j                  D ]%  }|j                  dk7  r |S |j                  |       ' |S )Nplaceholder)r?   nodesopappend)gmplaceholdersnodes      r.   _get_placeholdersz=ExportedProgram.run_decompositions.<locals>._get_placeholders  sF    L77m+ ##D) '  r-   valF)decompositionstrace_jointc                     t        | t              r| S t        | t              rt        |j                        S t        | t              rt	        |j                        S t        dt        |              )N)r   zType of old_arg not supported: )rT   r   r   r   r   RuntimeErrortype)old_argnew_phs     r.   
update_argz6ExportedProgram.run_decompositions.<locals>.update_arg  s[    '#34G^4%6;;77G^4%6;;77!@gPQQr-   r   r   )4torch._decompr   rN   r   rK   .torch._export.passes.lift_constant_tensor_passr   .torch._export.passes.replace_sym_size_ops_passr   torch._functorch.aot_autogradr   rh   rV   rw   delattrlistr?   r   r6   r   r@   r   r   r   r   r   r   r   r   zipr   r   rT   rO   Tensorinputs_to_parametersinputs_to_buffersitemsrW   _get_updated_range_constraintsrD   
input_namedimr   rA   copydeepcopyrE   rF   rG   rH   
_transform)#rc   r   r   r   rK   r   r   r   r   old_placeholdersr   	fake_argsr   ro   buffers_to_remover   r@   r   new_placeholdersnew_outputsr   r   r   r   old_nodenew_nodeold_new_placeholder_mapnew_graph_signaturekvnew_range_constraintsinp_dim1inp_dim2new_equality_constraintsexported_programs#                                      r.   run_decompositionsz"ExportedProgram.run_decompositionsi  s	    	;	
	
	
 	D	  $A'?'A,T->->?2BC2B$TYYu%2B	C151B1B1P1P1RS1RgdAT1RS%DD%%t, & 0ySX
O	R -R0288>>*2.33A6 %T%9%9%E%EF
F4 diiDHH6Fq6I!JDKKXF 	 
 %T%9%9%F%FG
G4 tyy*TXX{1~"FTG 	 

 #$,<(==== '**:<L&M#
&M"( MM8==(&M 	  #

 3#,
 #&&68H"IHhhmmE2ELLA'/}}U';e$ #6#K#KK??&9&K&KK$MM//1DAq'(HMM!$ 2 #J 	t((--. >r B '+&?&?$

 '@"( 01D1DEx||T01D1DEx||T '@ 	! $
 	""&9:"2&*HHOO!$MM$001MM!!
 $%)S1I-JQ-N/::=)+C   } DS,

#
<$
s%   P:P?P??P$)!P*A
P0passesc                 2   t        t        |            } || j                        }||j                  n| j                  }|J || j                  u r|j                  s| S dt        dt
        j                  j                  dt        fd}t        ||j                   || j                  |      | j                  t        |      t        j                  | j                        t        j                  | j                         | j"                  | j$                  | j&                  
      }|j                  j(                  j+                  | j                  j(                         |j                  j(                  j+                  |j                  j(                         |S )Nold_signaturenew_gmrl   c                    g }t        |j                  j                        D ]  \  }}|j                  dk7  r n|t	        | j
                        k  sJ d       | j
                  |   }t        |j                  t              r|j                  n$ t        |j                        |j                        }|j                  t        |j                  ||j                                t        |j                  j                        d   }|j                  dk(  sJ g }t        |j                   d         D ]  \  }}|t	        | j"                        k  sJ d       | j"                  |   }	t        |	j                  t              r|	j                  n$ t        |	j                        |j                        }|j                  t%        |	j                  ||	j                                t'        ||      }
|
S )zO
            Update the graph signature's user_input/user_outputs.
            r   z-Number of inputs changed after transformationr   outputr   z.Number of outputs changed after transformationr   )r   r?   r   r   r   r   rT   r   r   r   r   r   r   r   r   r   r6   r   r   r   )r  r  new_input_specsr   r   old_input_specr   output_nodenew_output_specsold_output_specnew_signatures              r.   _get_updated_graph_signaturez@ExportedProgram._transform.<locals>._get_updated_graph_signature  s    !O$V\\%7%78477m+3!--  CBC  "/!:!:1!= "."4"46FG #&&1n001$))< 
  &&n1138M8MN 9" v||11226K>>X---!$[%5%5a%8943!..  DCD  #0"<"<Q"? "/"5"57GH $''2o112499= 
 !''33S/:P:PQ : 1+:JM ! r-   )r   r   rh   modifiedr   rO   rP   rU   r   r?   r@   rA   r   r   r  rD   r\   rF   rG   rH   rV   rW   )rc   r  pmr   transformed_gmr   transformed_eps          r.   r  zExportedProgram._transform  sN   f&""#-0_))$BSBS)))T...s||K.	!/.	!HH((.	! ".	!` )  ()=)=~NOO*>:MM$334MM$112MM!!
 	##((//0A0A0F0FG##((//0@0@0E0EFr-   c                 f    ddl m}   || j                  | j                  | j                        |  y )Nr   )"_check_input_constraints_for_graph)torch._export.utilsr&  r?   rB   rD   )rc   r6   r&  s      r.   r   z(ExportedProgram._check_input_constraints7  s1    J	
*JJ..0I0I	
	r-   c                 B    | j                         j                  |        y r5   )rG   rb   rg   s    r.   	_validatezExportedProgram._validate>  s    d#r-   )NNNr5   )6r&   r'   r(   __doc__r   rO   nnModuler   r2   r   rP   Graphr   r   	Parameterr   r	   r   r   r
   rd   propertyr   rh   r?   r@   rA   r   rq   rn   ry   rw   rB   rD   rE   rF   r   rG   r   rH   r   r   boolr   r<   _opsOperatorBaser   r  PassTyper  r   r)  r,   r-   r.   r   r   R   s   0 LP(,>B*$EHHOOT#s(^34*$ xx~~*$ .	*$
 eELL%((2D2D$DEEF*$ 5*$ #5c?3*$  0*$ !uS#XS#X'F!GH*$ 49%*$ #4U\\(9#:;*$X %0" 1 " %0' 1 ' %0% 1 % %0  1   %0HUXX%7%78  1 %0:(5ehh6H6H1H+I"J : 1: %0%,,/  1 %0<xc5<<.?(@A < 1< %0' 1 ' %0* 1 * %0' 1 ' %0$ 1 $ %0	
 1 	
 %0#  1  %0& & 1 & %0& 1 &Zc ZS ZS Zx  &* 
#d 
#ehhoo 
# $PTA $T%***A*A8*K%LMA 	A  $A FH( H/@ HT$r-   r   r   rl   rC   c                     d } ||       }|i S |j                   j                         D ci c]  \  }}||j                  vr|| }}}|S c c}}w )Nc                 P   | j                   j                  D cg c]-  }|j                  j                  dd       |j                  d   / }}ddlm}  ||      }||j                  S |D ]4  }t        |t        j                        s|j                  j                  c S  y c c}w )Nr   r   )detect_fake_mode)r?   r   rV   gettorch._guardsr6  	shape_envrT   rO   SymIntr   )r   r   valsr6  	fake_moder  s         r.   get_shape_envz5_get_updated_range_constraints.<locals>.get_shape_envE  s     
&yy}}UD)5 IIe& 	 

 	3$T*	 &&&A!U\\*vv''' 
s   2B#)var_to_ranger   replacements)r   r=  r9  r  r  rB   s         r.   r   r   B  sr    ( b!I	 **0022DAqI*** 	
12  
 s   A)5r   dataclassesr:   typingr   r   r   r   r   r   r	   r
   r   r   sympytorch.utils._sympy.value_rangesr   rO   torch.fx._pytreerP   _pytreer   torch.utils._pytreeutilsr*   torch.fx._compatibilityr   "torch.fx.experimental.proxy_tensorr   torch.fx.passes.infra.pass_baser   "torch.fx.passes.infra.pass_managerr   r@   r   r   r   r   r   r   r   r   r   r   __all__rU   r3  	dataclassr    r   r<   r   r   r,   r-   r.   <module>rN     s         
 ;  $ $ $ $ 1 M 6 :   UXX))*HZ,@@A    4 4 4
m$ m$`r-   