
    i>                        S SK r S SKJrJrJr  S SKJs  Js  Jr  S SK	J
s  Jr  S SKrS SKJr  S SKJrJrJrJrJrJrJrJrJrJrJrJrJrJrJrJrJ r J!r!  S SK"J#r#J$r$  S SK%J&r&J'r'  S SK(J)r)   " S S	5      r*\\\R@                     \\+   \\,   \\-   4   r.\\-\/\,\R@                  \*S4   r0\\0\.4   r1\'" S
S5      r2\2Rg                  S5        \&" \2SS5      S\R@                  S\R@                  4S j5       r4S\S\1S\\+   4S jr5S\S\Rl                  Rn                  4S jr8S\S\\Rl                  Rn                     4S jr9 " S S5      r:g)    N)ListOptionalUnion)exir)BoolBoolListDouble
DoubleListExecutionPlanIntIntListJumpFalseCall
KernelCallKernelTypesMoveCallNullOperatorOptionalTensorListProgramStringTensor
TensorList)get_scalar_typestride_from_dim_order)implLibrary)PyTreec                       \ rS rSrSrg)Uninitialized-    N)__name__
__module____qualname____firstlineno____static_attributes__r!       g/var/www/html/ai-image-ml/venv/lib/python3.13/site-packages/executorch/exir/verification/interpreter.pyr   r   -   s    r'   r   
executorchDEFzmove(Tensor self) -> TensormoveCPUselfreturnc                 .    [         R                  " U 5      $ N)torchcloner-   s    r(   	move_implr4   D   s    ;;tr'   val	input_valc                 6   [        U [        5      (       a  [        U[        U R                  5      5      $ [        U [        5      (       a  [        U[        U R
                  5      5      $ [        U [        5      (       a  [        U[        U R                  5      5      $ [        U [        5      (       a  [        U[        U R                  5      5      $ [        U [        5      (       a  [        U[        R                  5      $ [        U [        5      (       a(  [        U[        5      (       d  g[        S U 5       5      $ [        U [        5      (       a(  [        U[        5      (       d  g[        S U 5       5      $ [        U [         5      (       a(  [        U[        5      (       d  g[        S U 5       5      $ [        U ["        [$        45      (       a(  [        U[        5      (       d  g[        S U 5       5      $ [        U [&        5      (       a  [)        S5      eg)a@  
Compares a schema type (val) with Python type (input_val)
Map: Int -> int, Bool -> bool, Double -> float,
     String -> str, Tensor -> torch.Tensor, XList -> list[x]

Args:
`val`: value from value list with type from `schema.py`

`input_val`: value with Python type, normally from the result of executing an operation
Fc              3   B   #    U  H  n[        U[        5      v   M     g 7fr0   )
isinstanceint.0xs     r(   	<genexpr>comp_types.<locals>.<genexpr>a   s     9y!:a%%y   c              3   B   #    U  H  n[        U[        5      v   M     g 7fr0   )r9   boolr;   s     r(   r>   r?   e   s     :	1:a&&	r@   c              3   B   #    U  H  n[        U[        5      v   M     g 7fr0   )r9   floatr;   s     r(   r>   r?   i   s     ;A:a''r@   c              3   V   #    U  H  n[        U[        R                  5      v   M!     g 7fr0   )r9   r1   r   r;   s     r(   r>   r?   m   s     B	1:a..	s   ')z,Setting a value where there should be a NullN)r9   r   typeint_valr   bool_valr	   
double_valr   
string_valr   r1   r   listallr   r
   r   r   r   	TypeError)r5   r6   s     r(   
comp_typesrN   I   s    #s)T#++%677	C		)T#,,%788	C	 	 )T#..%9::	C	 	 )T#..%9::	C	 	 )U\\22	C	!	!)T**9y999	C	"	")T**:	:::	C	$	$)T**;;;;	C*&89	:	:)T**B	BBB	C		FGG 
r'   operatorc                     U R                   R                  S5      u  p[        [        [        [        R                  U5      U5      U R
                  5      nU$ )Nz::)namesplitgetattrr1   opsoverload)rO   	namespaceop_nameops       r(   
resolve_oprY   r   sB    !,,T2I	I6@(BSBS	TBIr'   execution_planc                 Z    U R                    Vs/ s H  n[        U5      PM     nnU$ s  snf r0   )	operatorsrY   )rZ   rO   operator_lists      r(   make_operators_listr^   y   s2     ;I:R:RS:RhZ):RMS Ts   (c                       \ rS rSrS\SS4S jrS\\   4S jrS\\	R                  R                     4S jrS\\   4S jrS	\SS4S
 jrS	\SS4S jrS	\S\SS4S jrS\SS4S jrS\	R                  S\4S jrSrg)Interpreter   programr.   Nc           	         [        UR                  5      S:X  d   eUR                  S   U l        UR                  S   R                  U l        UR                   Vs/ s H7  n[
        R                  " UR                  [        UR                  5      5      PM9     snU l        U R                  R                   Vs/ s H  n[        5       PM     snU l        [        U R                  5      U l        g s  snf s  snf )N   r   )lenrZ   container_meta_typecontainer_metatypeconstant_bufferbindings
DataBufferstoragedata_buffersvaluesr   _value_listr^   _operators_list)r-   rb   br5   s       r(   __init__Interpreter.__init__   s     7))*a///9@9O9OPQ9RAHAWAWB


 	 ,,8
 - 		3qyy>:,8
 (,':':'A'A-
'AMO'A-
 =P=
8
-
s   >C1:C6c                 B    [         R                  " U R                  5      $ r0   )copydeepcopyrn   r3   s    r(   get_value_listInterpreter.get_value_list   s    }}T--..r'   c                     U R                   $ r0   )ro   r3   s    r(   get_operators_listInterpreter.get_operators_list   s    ###r'   c           
         / nU R                   R                   H  nUR                  n[        U[        5      (       d  M&  UR
                  S:w  d  M8  [        R                  " U R                  UR
                     UR                  UR                  [        UR                  UR                  5      5      nUR                  U5        M     U$ )zo
No side effects on Interpreter's value list. List of constant tensors returned
without having to run program.
r   )rZ   rm   r5   r9   r   data_buffer_idxri   convert_to_tensorrl   scalar_typesizesr   	dim_orderappend)r-   tensorselemr5   tensors        r(   get_constant_tensors Interpreter.get_constant_tensors   s    
 ''..D((C#v&&3+>+>!+C "33%%c&9&9:OOII)#))S]]C	 v& / r'   idxc                     [        U R                  R                  U   R                  [        [
        45      (       d"  [        U R                  U   [        5      (       a  U R                  U5        gg)a+  
Given an index in the value list, if value is `Uninitialized` or is a mutable object,
like a Tensor List, calls `load` to load and initialize value into Interpreter's value_list.

Args:
`idx` : index in value lists that we want to load

Returns: No returned values - value list is updated in place
N)	r9   rZ   rm   r5   r   r   rn   r   load_from_value_list)r-   r   s     r(   
load_valueInterpreter.load_value   s^     &&s+//*>P1Q
 
((-}==%%c* >r'   c           	         US:  d   eU R                   R                  U   R                  n[        U[        5      (       a  UR
                  U R                  U'   GO[        U[        5      (       a  UR                  U R                  U'   GO[        U[        5      (       a  UR                  U R                  U'   GO[        U[        5      (       a  UR                  U R                  U'   GOn[        U[        [        [        45      (       a  / nUR                    H  n[        U["        5      (       d   e[        U R                   R                  U   R                  [        5      (       d   eUR%                  U R                   R                  U   R                  R
                  5        M     X0R                  U'   GO[        U[&        [(        45      (       am  / nUR                    HK  nUS:X  a  UR%                  S5        M  U R+                  U5        UR%                  U R                  U   5        MM     XPR                  U'   GO[        U[,        5      (       a  UR.                  S:X  a@  [0        R2                  " UR4                  [7        UR8                  5      S9U R                  U'   O[:        R<                  " U R>                  UR.                     UR8                  UR4                  [A        UR4                  URB                  5      5      nXpR                  U'   O@[        U[D        5      (       a  SU R                  U'   O[G        S[I        U5       SU S35      e[        U R                  U   [J        5      (       a   eg)a  
Accesses Execution Plan's value list at same index (see schema.py) to
load and initialize value into Interpreter's value list. Extracts the
necessary values depending on the type of the value. E.g. Tensor Lists
have indices into the value list, so they are recursively loaded.
If an Evalue is a Constant Tensor (denoted by allocation_info=None), it
converts the python obj to a torch tensor object.

Args:
`idx` : index in value lists that we want to load

Returns: No returned values - value list is updated in place
r   N)dtypeUnexpected type, , with value, , in Execution Plan values.)&rZ   rm   r5   r9   r   rG   rn   r   rH   r	   rI   r   rJ   r   r   r
   itemsr:   r   r   r   r   r   r|   r1   emptyr   r   r~   ri   r}   rl   r   r   r   rM   rF   r   )r-   r   r5   unboxed_listitemtensor_listir   s           r(   r    Interpreter.load_from_value_list   s    axx!!((-11 c3$'KKDS!T""$'LLDS!V$$$'NNDS!V$$$'NNDS!gx<==L		!$,,,,!$"5"5"<"<T"B"F"FLLLL ##D$7$7$>$>t$D$H$H$P$PQ " %1S!j*<=>>KYY7&&t,"""4#3#3A#67  %0S!V$$""a'(-II_S__%E)  % "33%%c&9&9:OOII)#))S]]C	 )/  %T""$(DS!#DI;nSEA\]  d..s3]CCCCCr'   r6   c                    U R                   R                  U   nUR                  n[        XB5      (       d'  [	        SU S[        U5       S[        U5       S35      e[        U[        [        [        [        [        [        [        [        [        4	5      (       a  X R                   U'   g[        U["        [$        45      (       a  [        U[&        5      (       d   e[)        UR*                  5      [)        U5      :X  d   e/ n[-        [)        UR*                  5      5       H6  nUR*                  U   nX&   U R                   U'   UR/                  X&   5        M8     XPR                   U'   g[	        S[        U5       SU S35      e)	a  
Given an index in the value list, and a value, updates
Interpreter's value in value list at given index in place
If value is meant to be a TensorList at given index,
iterate through all the indices in the TensorList and
update each placeholder with the given Tensor from `input_val`.

Args:
`idx` : index in value lists that we want to set

`input_val` : value we want to put at `self._value_list[idx]`

Returns: No returned values - value list is updated in place
z!Program trying to set a value of z : z in memory location where z is expected.r   r   r   N)rZ   rm   r5   rN   rM   rF   r9   r   r   r	   r   r   r   r
   r   r   rn   r   r   r   re   r   ranger   )r-   r   r6   evaluer5   r   r   val_idxs           r(   	set_valueInterpreter.set_value
  s`    $$++C0jj#))3I;c$y/ARRlmqrumvlw  xE  F 
 $:vtT
 
 %.S!j*<=>>i....syy>S^333K3syy>*))A,,5L  )""9<0 + %0S!#DI;nSEA\] r'   kernelc                 |   U R                   UR                     n[        UR                  R                   Vs/ s H  o3R
                  (       a  M  UPM     sn5      nUR                  R                   Vs/ s H  oUR
                  (       d  M  UPM     nn[        U5      n/ nUR                  SU  H2  n	U R                  U	5        UR                  U R                  U	   5        M4     0 n
[        U5       HD  nUR                  XK-      n	Xk   R                  nU R                  U	5        U R                  U	   X'   MF     U" U0 U
D6nUR                  XG-   S n[        U5      S:X  d   S5       e[        U[        5      (       a  U R                  US   [        U5      5        gU R                  US   U5        gs  snf s  snf )a  
Calls operator from kernel:
1. Determines kernel's operation through kernel.op_index,
   which indexes into operator list from Program's execution plan.
2. After identifying operation, determines number of arguments and
keyword arguments through operator schema.
3. Extracts arguments from value list and calls operator.
4. Sets the given output indices in value list with the values
   returned from operation.

Args:
`kernel` : stores information about operator and which indices in
           the value list contain the necessary arguments

Returns: No returned values - value list is updated with outputs
        from operator in place
Nrd   z>emitter is expected to pack multiple outputs into a TensorListr   )ro   op_indexre   _schema	arguments
kwarg_onlyargsr   r   rn   r   rQ   r9   tupler   rK   )r-   r   rO   argnum_argskwarg
kwarg_list
num_kwargsr   r   kwargsjkeywordresoutput_idxss                  r(   call_kernelInterpreter.call_kernel5  s   & ''8$,,66M6SnnS6M
 *2)9)9)C)CX)CGWGWe)C
X_
 Yh'AOOAKK((+, ( z"AHL)A m((GOOA"..q1FO # ''kk("7"9: !	LK	L!c5!!NN;q>495NN;q>3/9 NXs   F4F44F9F9raw_argsc                 "   [         R                  " U0 45      u  p#UR                  5       U R                  R                  :w  a3  [        SU R                  R                   SUR                  5        35      e[        U R                  R                  5      [        U5      :w  a7  [        S[        U R                  R                  5       S[        U5       35      e[        [        U R                  R                  5      5       H-  nU R                  R                  U   nX$   U R                  U'   M/     [        U R                  R                  5      S:X  d   eU R                  R                  S   nSnU[        UR                  5      :  Ga  UR                  U   n[        UR                  [         5      (       a  U R#                  UR                  5        GO"[        UR                  [$        5      (       aj  U R'                  UR                  R(                  5        U R                  UR                  R*                     (       a  US-   OUR                  R,                  nM  [        UR                  [.        5      (       ak  UR                  R0                  n	UR                  R2                  n
U R'                  U
5        U R'                  U	5        U R                  U
   U R                  U	'   O[        SU S35      eUS-  nU[        UR                  5      :  a  GM  U R                  R4                   Vs/ s H  o@R                  U   PM     nn[         R6                  " U R                  R8                  5      n[         R:                  " X5      $ s  snf )	z
Loops through instructions given some inputs

Args:
`args` : list of inputs required for interpretation

Returns:
Outputs after completing all computations
z:Arguments provided do not match required type. 
Required: z 
Provided: z1Incorrect number of arguments provided. Expected z values, but received rd   r   z+Received unknown instruction from program: .)	ex_pytreetree_flattento_strrg   encoded_inp_strrM   re   rZ   inputsRuntimeErrorr   rn   chainsinstructionsr9   
instr_argsr   r   r   r   cond_value_indexcond_val_indexdestination_instructionr   move_to	move_fromoutputsfrom_strencoded_out_strtree_unflatten)r-   r   r   pytreer   r   chainipinstructionr   r   rettreespecs                r(   runInterpreter.runh  s+    !--xn===?d55EEEMdNeNeNuNuMv  wD  EK  ER  ER  ET  DU  V 
 t""))*c$i7CCH[H[HbHbDcCddz{~  @D  |E  {F  G  s4..5567A%%,,Q/C$(GDS! 8 4&&--.!333##**1-  3u))**,,R0K+00*==  !7!78K22MBB 6 6 G GH ''(>(>(M(MN F %//GG  K22H==%0088'22<<		*(,0,<,<Y,G  )"A+aP  !GB1 3u))**4 -1,?,?,G,GH,Gq",GH%%d&=&=&M&MN''66	 Is   2N)ro   rn   rg   rl   rZ   )r"   r#   r$   r%   r   rq   r   	ValueTyperv   r1   _ops
OpOverloadry   r   r   r:   r   r   r   r   r   r   r   r&   r!   r'   r(   r`   r`      s    
 
D 
2/Y /$D)>)>$? $d6l (+c +d + CD CD CDJ)S )Y )4 )V10* 10 10fA7U\\ A7f A7r'   r`   );rt   typingr   r   r   %executorch.exir.verification.bindingsr   verificationri   executorch.extension.pytree	extensionr   r   r1   r)   executorch.exir.schemar   r   r	   r
   r   r   r   r   r   r   r   r   r   r   r   r   r   r   executorch.exir.tensorr   r   torch.libraryr   r   torch.utils._pytreer   r   rB   rD   r:   ValueListTypestrValueScalarTyper   executorch_libdefiner4   rN   r   r   rY   r^   r`   r!   r'   r(   <module>r      sw    ( ( 9 8 / /      ( J ' &	 	 JKI S%}dJK	 u-   3 4 nfe$ELL U\\  %&HK &HI &H(4. &HR ejj&;&; !	%**

 i7 i7r'   