
    Vha                        d Z ddlZddlZddlZddlmZmZ ddlZddlZddl	m
Z
mZmZ ddlmZmZ ddlmZ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mZmZ d
dl m!Z!m"Z" d
dl#m$Z$ d
dl%m&Z&m'Z' d
dl(m)Z) erddl*m+Z+ ddl,m-Z-  G d de"      Z. G d de.      Z/ G d de.      Z0 G d de0      Z1 G d de0      Z2 G d de.      Z3 G d de3      Z4 G d d e3      Z5 G d! d"e"      Z6 G d# d$e)      Z7 G d% d&e7      Z8y)'aT  
Variable tracking implementations for list-like data structures in Dynamo.

This module provides specialized variable tracking for various collection types:
- Lists and list subclasses (including torch.nn.ModuleList, ParameterList)
- Tuples and named tuples
- Ranges and slices
- Collections.deque
- torch.Size with special proxy handling

The implementations support both mutable and immutable collections, iteration,
and common sequence operations. Each collection type has a dedicated Variable
class that handles its unique behaviors while integrating with Dynamo's
variable tracking system.
    N)OptionalTYPE_CHECKING   )graph_break_hints	polyfills	variables)create_call_functioncreate_instruction)raise_observed_exceptionunimplementedunimplemented_v2)
AttrSource)	cmp_name_to_op_mappingcmp_name_to_op_str_mappingget_fake_valueguard_if_dyniter_containsLitnamedtuple_fieldsodict_valuesset_example_value   )ValueMutationNewVariableTracker)ConstantVariable)UserFunctionVariableUserMethodVariable)IteratorVariable)	PyCodegen)InstructionTranslatorc                        e Zd Zed        Zed        Zdee   ddf fdZd Z	d Z
ed	        Zd
 Zd Zd ZdddefdZd Zded   deedf   ddf fdZ xZS )BaseListVariablec                 >    t         j                  t        |             S N)r"   cls_fortypeobjs    M/home/dcms/DCMS/lib/python3.12/site-packages/torch/_dynamo/variables/lists.pycls_for_instancez!BaseListVariable.cls_for_instance6   s    ''S	22    c                 8   t         t        t        t        t        t
        t        j                  t        t        t        t        t        t        j                  j                  t        t        j                  j                  t        t        j                   t"        i	|    S r$   )iterListIteratorVariablelistListVariablesliceSliceVariabletorchSizeSizeVariabletupleTupleVariabler   nnParameterList
ModuleListcollectionsdequeDequeVariabler'   s    r)   r%   zBaseListVariable.cls_for:   sd     &,=JJ=,HH""LHH}

 
 
	r+   itemsreturnNc                 ~    t        |   di | t        |t              sJ t	        d |D              sJ || _        y )Nc              3   <   K   | ]  }t        |t                y wr$   )
isinstancer   .0xs     r)   	<genexpr>z,BaseListVariable.__init__.<locals>.<genexpr>O   s     Aa:a1A    )super__init__rB   r/   allr>   )selfr>   kwargs	__class__s      r)   rJ   zBaseListVariable.__init__H   s@    
 	"6"%&&&A5AAAA,1
r+   c                 \    | j                   D cg c]  }|j                          c}S c c}w r$   )r>   as_proxyrL   rE   s     r)   	_as_proxyzBaseListVariable._as_proxyR   s     &*jj1

111s   )c                 &     t        |       |fi |S r$   )r&   )rL   r>   rM   s      r)   modifiedzBaseListVariable.modifiedU   s    tDz%*6**r+   c                 "    | j                         S r$   as_python_constantrL   s    r)   valuezBaseListVariable.valueX   s    &&((r+   c                 R    |dj                  d | j                  D              z   |z   S )Nz, c              3   <   K   | ]  }|j                           y wr$   )
debug_repr)rD   is     r)   rF   z5BaseListVariable.debug_repr_helper.<locals>.<genexpr>]   s     !EQ!,,.!ErG   )joinr>   )rL   prefixsuffixs      r)   debug_repr_helperz"BaseListVariable.debug_repr_helper\   s%    		!E$**!EEENNr+   c                      | j                         | j                  D cg c]  }|j                          c}      S c c}w r$   )python_typer>   rW   rQ   s     r)   rW   z#BaseListVariable.as_python_constant_   s3    !t!4::"Na1#7#7#9"NOO"Ns   =c                 z    | j                         t        usJ  | j                         | j                               S r$   )rc   r5   rR   rX   s    r)   rP   zBaseListVariable.as_proxyb   s6    !555!t!$.."233r+   txr    argc                 Z   ddl m} t        ||      r|j                  }n|j	                         }t        |t
              r<| j                  | j                  |   d | j                  rt                     S d       S t        |t        t        j                  f      sJ | j                  |   S )Nr   SymNodeVariable)r>   sourcemutation_type)tensorri   rB   sym_numrW   r1   cloner>   rk   r   intr3   SymIntrL   re   rf   ri   indexs        r)   getitem_constzBaseListVariable.getitem_constf   s    +c?+KKE**,EeU#::jj'484F4F.0    MQ    ec5<<%8999::e$$r+   c                 ,    t        | j                        S r$   r/   r>   rL   re   s     r)   unpack_var_sequencez$BaseListVariable.unpack_var_sequencey       DJJr+   argsr   rM   c                 P   |dk(  rddl m} |st        |      dk(  sJ t        |d   |      rt	        |d   j                         j                  |      }|j                  U|j                  j                         dk(  r8t        j                  j                  |j                  j                               }nt        d       n|d   }| j                  ||      S |dk(  r3t        |      dk(  sJ |rJ t        | j!                  |      |d   |      S |dk(  rB|j#                  t%        j&                  |t(        j*                        | gt-        |      z   |      S |t.        v r5| }|d   }t        |t0              rt        |t0              s|dk(  r6t        j2                  t4        j6                        j9                  |||fi       S |d	k(  r6t        j2                  t4        j:                        j9                  |||fi       S t<        |   }	|j?                         }
|j?                         }|	 d
|
 d| d}tA        tB        ||g       t        jD                  t(        jF                        j9                  |t        j2                  t.        |         ||gi       S tH        |   ||||      S )N__getitem__r   )TensorVariabler   z$__getitem__ with non-constant tensor__contains__rr   __eq____ne__z% not supported between instances of 'z' and ''ry   )&rl   r|   lenrB   r   rP   nodeconstantnumelr   r   createitemr   rs   r   rw   inline_user_function_returnr   buildr   rr   r/   r   r"   BuiltinVariableoperatoris_call_functionis_notr   python_type_namer   	TypeErrorr   list_cmprI   call_method)rL   re   namery   rM   r|   rY   leftrightop_strleft_tyright_tymsgrN   s                r)   r   zBaseListVariable.call_method|   s    = .#d)q.00$q'>2&tAw'7'7'9'>'>C>>-%..2F2F2HA2M%66==enn>Q>Q>STE!"HIQ%%b%00^#t9>!>: !9!9"!=tAwKKW_11%%b)//:d# 
 ++DGE
 d$45Z'> 8#$44X\\BPPT5M2  X%$44X__ESST5M2  8=F"335G$557H#H$I'RYZbYccdeC,Y#G11)2D2DESS**+A$+GH$PUV  w"2tT6::r+   )__name__
__module____qualname__staticmethodr*   r%   r/   r   rJ   rR   rT   propertyrY   ra   rW   rP   rs   rw   dictstrr   __classcell__rN   s   @r)   r"   r"   5   s    3 3  2O$2 
	22+ ) )OP4% 7 %o %& =; $%	=;
 S++,=; 
=; =;r+   r"   c                        e Zd Zd fdZd Zd Zd Zd Zd Zd Z	d Z
d	 Zd
 Zd ZdddefdZd ZddZddZddZ xZS )RangeVariablec                 <   |}t         j                  j                  d      }d }t         j                  j                  d      }t        |      dk(  r|\  }n/t        |      dk(  r|\  }}nt        |      dk(  r|\  }}}nt        |J t        |   |||gfi | y )Nr   r   r      )r   r   r   r   AssertionErrorrI   rJ   rL   r>   rM   items_to_mapstartstopsteprN   s          r)   rJ   zRangeVariable.__init__   s    **11!4))003|!"GT!#&KE4!# ,E4  %t,77r+   c                 &    | j                  dd      S )Nzrange()ra   rX   s    r)   r\   zRangeVariable.debug_repr       %%h44r+   c                     t         S r$   )rangerX   s    r)   rc   zRangeVariable.python_type       r+   c                 <    | j                   d   j                         S Nr   r>   rW   rX   s    r)   r   zRangeVariable.start       zz!}//11r+   c                 <    | j                   d   j                         S Nr   r   rX   s    r)   r   zRangeVariable.stop   r   r+   c                 <    | j                   d   j                         S )Nr   r   rX   s    r)   r   zRangeVariable.step   r   r+   c                     | j                         }| j                         }| j                         }|dk7  sJ |dkD  r||k  rd|dz
  |z
  |z  z   S |dk  r||kD  rd|dz
  |z
  d|z
  z  z   S y)Nr   r   r   r   r   )rL   lohir   s       r)   range_lengthzRangeVariable.range_length   s    ZZ\YY[yy{qyy!8RQ,,,AX"r'QT222r+   c                 d   d}|j                   d}d}n|j                   }|j                   dk  }|rd}||z   }nd}|}|j                  |r|n|}n|j                  }|dk  r||z  }||k  r
|}n||kD  r|}|j                  |r|n|}n%|j                  }|dk  r||z  }||k  r
|}n||kD  r|}|||gS )Nr   r   F)r   r   r   )	rL   lengthr1   step_is_negativer   lowerupperr   r   s	            r)   _get_slice_indicesz RangeVariable._get_slice_indices   s    ::D$::D$zzA~ EUNEEE ;;-E5EKKE19VOEu}u} ::,5%D ::Dax%< D%< DtT""r+   c                     | j                         }|dk  r||z   }|dk  s||k\  rt        d| d      t        j                  j	                  | j                         || j                         z  z         S )Nr   zindex z is out of range)r   
IndexErrorr   r   r   r   r   )rL   rr   r   s      r)   apply_indexzRangeVariable.apply_index  so    ""$19UNE19veW,<=>>))00AT1UVVr+   c                 L     j                   j                         |      \  }}} fd} j                         |z  } ||      } ||      }t        |||fD 	cg c]!  }	t        j
                  j                  |	      # c}	 j                  r
t               nd       }
|
S c c}	w )Nc                 L    j                         | j                         z  z   S r$   )r   r   )rr   rL   s    r)   compute_itemz/RangeVariable.apply_slice.<locals>.compute_item+  s    ::<5499;#677r+   rk   )	r   r   r   r   r   r   r   rk   r   )rL   r1   slice_start
slice_stop
slice_stepr   sub_step	sub_startsub_stoprE   results   `          r)   apply_slicezRangeVariable.apply_slice&  s    040G0G1
-j*	8 99;+ -	
+ $Xx8 **11!4 150B0B*,
 s   &B!c                 h    t        | j                  D cg c]  }|j                          c} S c c}w r$   )r   r>   rW   rQ   s     r)   rW   z RangeVariable.as_python_constant;  s(    tzzB!q++-BCCB   /re   r    rf   c                     |j                         }t        |t              r| j                  |      S | j	                  |      S r$   )rW   rB   r1   r   r   )rL   re   rf   rr   s       r)   rs   zRangeVariable.getitem_const>  s<    &&(eU###E**##E**r+   c                 D     | j                         | j                          S r$   )rc   rR   rX   s    r)   rP   zRangeVariable.as_proxyG  s    !t!4>>#344r+   c                     | j                         D cg c]!  }t        j                  j                  |      # c}S c c}w r$   )rW   r   r   r   )rL   re   rE   s      r)   rw   z!RangeVariable.unpack_var_sequenceJ  s0    >B>U>U>WX	**11!4XXXs   &<c                     dj                   j                  vsJ j                  fd       j                  | j                         j                  t        dd             y )Nr   c                  L     j                   j                  t                    S r$   )append_outputcreate_load_python_moduler   codegens   r)   <lambda>z+RangeVariable.reconstruct.<locals>.<lambda>P  s    G))'*K*KE*RS r+   r   F)re   	f_globalsadd_push_nullforeachr>   extend_outputr	   rL   r   s    `r)   reconstructzRangeVariable.reconstructM  sT    gjj22222S	
 	

#21e<=r+   c                 j    g d}||vrt        d|        | j                  |j                  |         S )Nr   zrange.)r   r>   rr   rL   re   r   fieldss       r)   var_getattrzRangeVariable.var_getattrU  s5    *vF4&/*zz&,,t,--r+   r?   Nr$   r   r   r?   Nre   r    )r   r   r   rJ   r\   rc   r   r   r   r   r   r   r   rW   r   rs   rP   rw   r   r   r   r   s   @r)   r   r      sf    8$5222/#bW*D+ 7 +o +5Y>.r+   r   c                   @     e Zd ZdZded   deedf   ddf fdZ xZS )CommonListMethodsVariablezE
    Implement methods common to List and other List-like things
    ry   r   rM   r?   c                 L   ddl m} |dk(  rm| j                         r]|rJ |\  }|j                  j                  j                  |        | j                  j                  |       t        j                  d       S |dk(  r| j                         r|r|d   j                  |      rn|rJ |\  }|j                  |      }|j                  j                  j                  |        | j                  j                  |       t        j                  d       S |dk(  r| j                         r|rJ |\  }}	t        ||      r|j                         }
n|j                         }
|j                  j                  j                  |        | j                  j!                  |
|	       t        j                  d       S |dk(  rn| j                         r^|rJ |j                  j                  j                  |         | j                  j"                  |D cg c]  }|j                          c} S |dk(  rj| j                         rZ|s|rJ |j                  j                  j                  |        | j                  j%                          t        j                  d       S |d	k(  r| j                         r|r|d   j'                         r|rJ |\  }}	|j                  j                  j                  |        t        |t(              r1t+        |	j                        | j                  |j                         <   n|	| j                  |j                         <   t        j                  d       S |d
k(  r8|rJ |rJ t+        | j                        }| j-                  |t/                     S |dk(  rl| j                         r\|rJ |rJ | j                  j1                          |j                  j                  j                  |        t        j                  d       S t2        | i  ||||      S c c}w )Nr   rh   appendextendr   insertpopclear__setitem__copyr   reverse)rl   ri   
is_mutableoutputside_effectsmutationr>   r   r   r   has_force_unpack_var_sequenceforce_unpack_var_sequencer   rB   evaluate_exprrW   r   r   r   is_python_constantr2   r/   rT   r   r   rI   r   )rL   re   r   ry   rM   ri   rf   seqidxrY   	const_idxakeyr>   rN   s                 r)   r   z%CommonListMethodsVariable.call_methoda  sg    	,8 1:FSII""++D1JJc"#**400H!Q55b9:FS//3CII""++D1JJc"#**400X$//"3:JC#/--/	224	II""++D1JJi/#**400U]t0:II""++D1!4::>>D#IqA$8$8$:#IJJW_!2d**II""++D1JJ#**400M!!Q**,:JCII""++D1#}-7;EKK7H

311347<

31134#**400V^:O8$E==6F6H=IIY4??#4:O8JJ II""++D1#**4007&r4v>>C $Js   P!)	r   r   r   __doc__r/   r   r   r   r   r   s   @r)   r   r   \  sF    I? $%	I?
 S++,I? 
I? I?r+   r   c                   ~     e Zd Zd ZdefdZd ZddZded   de	edf   ddf fd	Z
 fd
Zdddeddf fdZ xZS )r0   c                     t         S r$   )r/   rX   s    r)   rc   zListVariable.python_type  s    r+   r?   c                 `    | j                   j                   dt        | j                         dS N(length=r   rN   r   r   r>   rX   s    r)   __repr__zListVariable.__repr__  )    ..))*(3tzz?2C1EEr+   c                 &    | j                  dd      S )N[]r   rX   s    r)   r\   zListVariable.debug_repr      %%c3//r+   c                     |j                  | j                         |j                  t        dt	        | j                                     y )N
BUILD_LISTrf   r   r>   r   r
   r   r   s     r)   r   zListVariable.reconstruct  s0    

#03tzz?STr+   ry   r   rM   c           	         |dk(  r| j                         r|r|d   j                         r|rJ |\  }}|j                  j                  j	                  |        t        |t              rM|j                  |      st        d| d       |j                  |      | j                  |j                         <   n|| j                  |j                         <   t        j                  d       S |dk(  r| j                         rt        |      dk(  sJ |j                  dt        j                  d             }|j                  dt        j                  d            j                         t        |      dk(  sJ |j                         r+|j                         | j                  j!                         }n+| j                  D 	cg c]  }	|j#                  ||	gi        }}	t%        d	 |D              st        d
       |j                  j                  j	                  |        t'        fdt)        t+        || j                              D        t-        j.                  dd            }
|
D 	cg c]  ^}	}|	 c}}	| j                  d d  t        j                  d       S |dk(  r| j                         r|rJ t        |      dk(  rt        j                  d       S t        |      dk(  rp|d   j                  |      r\|\  }|j                  j                  j	                  |        |j                  |      | j                  d d  t        j                  d       S t0        | e  ||||      S c c}	w c c}}	w )Nr   r   z%Missing dynamo support for expanding z" into a list for slice assignment.sortr  r   Fc              3   <   K   | ]  }|j                           y wr$   )r  )rD   ks     r)   rF   z+ListVariable.call_method.<locals>.<genexpr>  s     <!q++-<rG   zsort with non-constant keysc              3   Z   K   | ]"  \  }\  }}||j                         r| n|f $ y wr$   rV   )rD   r]   r  rE   r   s       r)   rF   z+ListVariable.call_method.<locals>.<genexpr>  s=       "6Aq	 ,,.%1s   (+r   r   )r  r   rJ   )r   r  r   r   r   rB   r2   r   r   r   r>   rW   r   r   r   r   r   r   rK   sorted	enumeratezipr   
itemgetterrI   r   )rL   re   r   ry   rM   r  rY   
key_fn_varkeysrE   sorted_items_with_keys_rf   r   rN   s                @r)   r   zListVariable.call_method  s    M!!Q**,:JCII""++D1#}-::2>!?wFhi 8=7V7V8

31134 8=

31134#**4006>doo/t9>!>E+;+B+B4+HIJjj+2259  "  v;!### --/113;zz(GKzzR!
00aS"=RR<t<<;<II""++D1%+ &/s4/D%E ''1-&" -CC51qQCDJJqM#**400:$//"3:4yA~'..t44TaDG$I$I"$M		&&//5 # = =b A

1'..t44w"2tT6::? S$ Ds   M+.M0c                    |dk(  rj| j                   rt        | j                   |      nd }| j                         }|t        u rt	        j
                  ||      S t	        j                  ||      S t        | !  ||      S NrN   )rj   )	rj   r   rc   r/   r   r   UserDefinedClassVariablerI   r   rL   re   r   rj   
class_typerN   s        r)   r   zListVariable.var_getattr  sq    ;6:kkZT2tF))+JT! 00FKK 99*VTTw"2t,,r+   re   r    r   c                     | j                         t        urt        |   ||      S t        j
                  j                  t        g |            S r$   )rc   r/   rI   call_obj_hasattrr   r   r   hasattrrL   re   r   rN   s      r)   r+  zListVariable.call_obj_hasattr  sF     T)7+B55))00T1BCCr+   r   r   r   r   rc   r   r  r\   r   r/   r   r   r   r+  r   r   s   @r)   r0   r0     s    F# F0UI; $%	I;
 S++,I; 
I;V-D)D14D	D Dr+   r0   c                   p     e Zd Zdd fdZd Zd Zd ZddZd fdZde	d	   d
e
ed	f   dd	f fdZ xZS )r=   r?   c                 $   |t        j                  d       }|j                         sJ d|j                                 || _        t        |      }| j                  j                         ||j                          d  }t        |    |fi | y )Nz maxlen must be a constant, got: )	r   r   r  r\   maxlenr/   rW   rI   rJ   )rL   r>   r1  rM   rN   s       r)   rJ   zDequeVariable.__init__  s    >%,,T2F((* 	
.v/@/@/B.CD	
* U;;))+76446689E)&)r+   c                 "    t         j                  S r$   )r;   r<   rX   s    r)   rc   zDequeVariable.python_type%  s       r+   c                     | j                   j                         0| j                  dd| j                   j                         z   dz         S | j                  dd      S )Nzdeque([z
], maxlen=r   ]))r1  rW   ra   r\   rX   s    r)   r\   zDequeVariable.debug_repr(  sY    ;;))+3))<$++*@*@*BBSH  %%i66r+   c                      | j                         | j                  D cg c]  }|j                          c}| j                  j                               S c c}w )Nr1  )rc   r>   rW   r1  rQ   s     r)   rW   z DequeVariable.as_python_constant/  sH    !t!-1ZZ8Q!!#8;;113
 	
8s   Ac                 ,   j                  fd       j                  | j                         j                  t	        dt        | j                              g        | j                         j                  j                  ddd             y )Nc                  `     j                   j                  t        j                              S r$   )r   r   r;   r<   r   s   r)   r   z+DequeVariable.reconstruct.<locals>.<lambda>7  s&    G))11+2C2CD r+   r  r  r   r6  F)r   r   r>   r   r
   r   r1  create_call_function_kwr   s    `r)   r   zDequeVariable.reconstruct5  sr    	

 	

#1,C

OTUVg==aeTUr+   c                 F    |dk(  r| j                   S t        | 	  ||      S )Nr1  )r1  rI   r   r-  s      r)   r   zDequeVariable.var_getattr@  s'    8;;w"2t,,r+   ry   r   rM   c                    |dk(  r| j                         r|r|d   j                         rt        |      dk(  sJ |rJ |\  }}|j                         sJ t        |j	                         t
              sJ |j                  j                  j                  |        || j                  |j	                         <   t        j                  d       S | j                  j	                         }|t        | d       }nd }|dk(  r| j                         rt        |      dkD  r|d   j                  |      rt        |      dk(  sJ |rJ |d   j                  |      }	|j                  j                  j                  |        g t!        |	      | j                  | j                  d d  t        d |      }t        j                  d       }
n|dk(  rZ| j                         rJ|rJ |rJ |j                  j                  j                  |        | j                  ^}
| j                  d d  n&|dk(  rt        |      dkD  r| j                         rzt        |      dk(  sJ |rJ |j                  j                  j                  |        |d   g| j                  | j                  d d  t        d |      }t        j                  d       }
n|dk(  rrt        |      dkD  rd| j                         rTt        |      dk(  sJ |rJ |+t        | j                        |k(  rt#        t$        |d	g
       t&        | Q  ||||      }
nt&        | Q  ||||      }
|6|4t        | j                        |kD  r| j                  |   | j                  d d  |
S )Nr   r   r   
extendleftr   popleft
appendleftr   z!deque already at its maximum sizer   )r   r  r   rB   rW   ro   r   r   r   r>   r   r   r1  r1   r   r   reversedr   r   rI   r   )rL   re   r   ry   rM   r  rY   r1  slice_within_maxlenr_   r   rN   s              r)   r   zDequeVariable.call_methodE  s)    M!!Q**,t9>!>:JC))+++c446<<<II""++D138DJJs--/0#**400//1"'"6"& L !D	AQ55b9t9>!>:!W66r:FII""++D1<hv.<<DJJqM"'f"5%,,T2FY4??#4O8:II""++D1%)ZZ"FTZZ]\!c$i!m8It9>!>:II""++D1!!W2tzz2DJJqM"'f"5%,,T2FX#d)a-DOO4Et9>!>:!c$**o&?(*M)N W(T4@FW(T4@F  +"DJJ&( JJ':;DJJqMr+   r$   r   r   r   )r   r   r   rJ   rc   r\   rW   r   r   r/   r   r   r   r   r   s   @r)   r=   r=     s`    
*!7
	V-
F $%	F
 S++,F 
F Fr+   r=   c                   ~     e Zd Zd ZdefdZd ZddZded   de	edf   ddf fd	Z
 fd
Zdddeddf fdZ xZS )r7   c                     t         S r$   )r6   rX   s    r)   rc   zTupleVariable.python_type  r   r+   r?   c                 `    | j                   j                   dt        | j                         dS r  r  rX   s    r)   r  zTupleVariable.__repr__  r  r+   c                 &    | j                  dd      S )N(r   r   rX   s    r)   r\   zTupleVariable.debug_repr  r  r+   c                     |j                  | j                         |j                  t        dt	        | j                                     y )NBUILD_TUPLEr  r  r   s     r)   r   zTupleVariable.reconstruct  0    

#0C

OTUr+   ry   r   rM   c                 (    t         |   ||||      S r$   )rI   r   rL   re   r   ry   rM   rN   s        r)   r   zTupleVariable.call_method  s     w"2tT6::r+   c                    |dk(  rj| j                   rt        | j                   |      nd }| j                         }|t        u rt	        j
                  ||      S t	        j                  ||      S t        | !  ||      S r&  )	rj   r   rc   r6   r   r   r'  rI   r   r(  s        r)   r   zTupleVariable.var_getattr  sq    ;6:kkZT2tF))+JU" 00FKK 99*VTTw"2t,,r+   re   r    r   c                     | j                         t        urt        |   ||      S t        j
                  j                  t        d|            S NrH   )rc   r6   rI   r+  r   r   r   r,  r-  s      r)   r+  zTupleVariable.call_obj_hasattr  sF     U*7+B55))00T1BCCr+   r   r.  r   s   @r)   r7   r7     s    F# F0V; $%	;
 S++,; 
;-D)D14D	D Dr+   r7   c                        e Zd ZdZdhej
                  Z	 ddee   dee	j                  j                     ddf fdZd Zd Zd	 Zdd
Zd Zd Zded   deedf   ddf fdZdddefdZdddeddfdZ xZS )r5   ztorch.Size(...)proxyNr>   r?   c                 4    || _         t        |   |fi | y r$   )rO  rI   rJ   )rL   r>   rO  rM   rN   s       r)   rJ   zSizeVariable.__init__  s     
)&)r+   c                 &    | j                  dd      S )Nztorch.Size([r4  r   rX   s    r)   r\   zSizeVariable.debug_repr  s    %%nd;;r+   c                 "    t         j                  S r$   )r3   r4   rX   s    r)   rc   zSizeVariable.python_type  s    zzr+   c                 
   | j                   | j                   S d }| j                         }|D ]4  }t        |t        j                  j
                        s(|j                  } n |t        j                  |      S |j                  dt        j                  |fi       }t        |j                  t        j                  |D cg c]-  }t        |t              s|j                  j                  d   n|/ c}             |S c c}w )Nr   example_value)rO  rR   rB   r3   fxProxytracerr4   create_proxyr   r   ro   meta)rL   rW  proxiesrO  ps        r)   rP   zSizeVariable.as_proxy  s    ::!::. .." 	E%0	
 >::g&&##OUZZ'RPJJJJ % 9C1c8JAFFKK0PQQ	
 s   2D c                     j                  fd       j                  | j                         t        dt	        | j                              gt        dd      z   }j                  |       y )Nc                  (     j                  dd      S )Nr3   r4   )load_import_fromr   s   r)   r   z*SizeVariable.reconstruct.<locals>.<lambda>  s    g&>&>w&O r+   rG  r  r   F)r   r   r>   r
   r   r	   r   )rL   r   build_torch_sizes    ` r)   r   zSizeVariable.reconstruct  s\    OP

#}#djj/B
 E*+ 	./r+   c                 ,    t        | j                        S r$   ru   rv   s     r)   rw   z SizeVariable.unpack_var_sequence  rx   r+   c                    ddl m} ddlm} d}g }| j                  D ]O  }t        |t              r||j                  z  }#t        ||      sJ t        |             |j                  |       Q t        j                  |      }|r	|dk(  r|^}}|r|dk(  r|S  |t        j                        }|D ]  }|j                  |||gi       } |S )Nr   )r   rh   r   )builtinr   rl   ri   r>   rB   r   rY   r&   r   r   r   mulr   )	rL   re   r   ri   const_result	sym_sizesvr   rc  s	            r)   r   zSizeVariable.numel  s    ,+	 	$A!-.'!!_5>tAw>5  #	$ "((6*!*FYLA-Mhll+ 	<A&&rFA;;F	<r+   ry   r   rM   c                     |dk(  r)|st        |      dk(  sJ | j                  ||d         }|S |dk(  r|s|rJ | j                  |      S t        |   ||||      S )Nr{   r   r   r   )r   get_item_dynr   rI   r   )rL   re   r   ry   rM   outrN   s         r)   r   zSizeVariable.call_method$  sq     = #d)q.00##BQ0CJW_F**::b>!w"2tT6::r+   re   r    rf   c                    ddl m} t        ||      r|j                  }n|j	                         }t        |t
              rt        | j                  |         S t        |t        t        j                  f      sJ | j                  |   S )Nr   rh   )rl   ri   rB   rm   rW   r1   r5   r>   ro   r3   rp   rq   s        r)   rh  zSizeVariable.get_item_dyn5  sl    +c?+KKE**,EeU#

5 122ec5<<%8999::e$$r+   r   c                 p    t         j                  j                  t        t        j
                  |            S r$   )r   r   r   r,  r3   r4   rL   re   r   s      r)   r+  zSizeVariable.call_obj_hasattrC  s&     ))00T1JKKr+   r$   r   )r   r   r   r  r7   _nonvar_fieldsr/   r   r   r3   rU  rV  rJ   r\   rc   rP   r   rw   r   r   r   r   rh  r+  r   r   s   @r)   r5   r5     s     			%	%N +/*O$* '*
 
*<-^0 8; $%	;
 S++,; 
;"%6 %_ %L)L14L	Lr+   r5   c                        e Zd Zddhej                  Zd fdZd Zd Zd Zd Z	d	 Z
d
 Zd ZddZdee   deeef   def fdZd fdZdddeddfdZ xZS )NamedTupleVariable	tuple_clsdynamic_attributesr?   c                 B    t        |   |fi | || _        i | _        y r$   )rI   rJ   rp  rq  )rL   r>   rp  rM   rN   s       r)   rJ   zNamedTupleVariable.__init__P  s$    )&)""$r+   c                     t        t        | j                  dd       t              xr  t	        t        | j                  dd             S )N_fields_make)rB   getattrrp  r6   callablerX   s    r)   is_namedtuplez NamedTupleVariable.is_namedtupleU  s;    '$..)TBEJ 
xDNNGT2P
 	
r+   c                 $    | j                          S r$   )rx  rX   s    r)   is_structseqzNamedTupleVariable.is_structseqZ  s    %%'''r+   c                 ,    t        | j                        S r$   )r   rp  rX   s    r)   r   zNamedTupleVariable.fields]  s     00r+   c                    | j                         rIt        | j                  | j                  D cg c]  }t	        |j                                c}            S t         | j                  d | j                  D               S c c}w )Nc              3   N   K   | ]  }t        |j                                 y wr$   )r   r\   rC   s     r)   rF   z0NamedTupleVariable.debug_repr.<locals>.<genexpr>e  s     $MQS%8$Ms   #%)rz  reprrp  r>   r   r\   rQ   s     r)   r\   zNamedTupleVariable.debug_repr`  sb    TZZ'PALLN(;'PQRRNDNN$M$**$MNOO (Qs    Bc                     | j                   S r$   )rp  rX   s    r)   rc   zNamedTupleVariable.python_typeg  s    ~~r+   c                     | j                         r< | j                         | j                  D cg c]  }|j                          c}      S  | j                         | j                  D cg c]  }|j                          c} S c c}w c c}w r$   )rz  rc   r>   rW   rQ   s     r)   rW   z%NamedTupleVariable.as_python_constantj  ss    %4##%tzz&R!q';';'=&RSS!t!DJJ#OqA$8$8$:#OPP 'S#Os   B+Bc                     | j                         t        usJ | j                         r$ | j                         | j                               S  | j                         | j                          S r$   )rc   r5   rz  rR   rX   s    r)   rP   zNamedTupleVariable.as_proxyq  s_    !555%4##%dnn&677!t!4>>#344r+   c                 F   | j                         r| j                  n| j                  j                  j                  fd       j	                  | j
                         j                  t        dt        | j
                              gt        dd      z          y )Nc                  D     j                   j                              S r$   )r   create_load_const_unchecked)r   	create_fns   r)   r   z0NamedTupleVariable.reconstruct.<locals>.<lambda>  s     G))33I> r+   rG  r  r   F)
rz  rp  ru  r   r   r>   r   r
   r   r	   )rL   r   r  s    `@r)   r   zNamedTupleVariable.reconstructy  s    
 '+&7&7&9DNNt~~?S?S		

 	

#"=c$**oF #1e,-	
r+   ry   rM   c                    |dk(  rt        |      dk(  sJ t        |      dk(  sJ |\  }}|j                         }| j                         s0| j                  j                  t
        fk(  s|| j                         v rt        t        |       |j                  j                  j                  |        || j                  |<   t        j                  d       S t        | A  ||||      S )N__setattr__r   r   )r   rW   rz  rp  	__bases__r6   r   r   AttributeErrorr   r   r   rq  r   r   rI   r   )rL   re   r   ry   rM   attrrY   rN   s          r)   r   zNamedTupleVariable.call_method  s     = t9>!>v;!###KD%**,D !!#>>++x74;;=((<II""++D1,1D##D)#**400w"2tT6::r+   re   r    c                       fd} j                   v r j                      S  j                         }|vr |       }|st           |      S |S  j                  |j                           S )Nc                  Z   t        j                  j                  d       } t        | t              r3t        | j                  t        j                  j                              S t        | t              rt        | j                        S t        j                  |       rt        |       S y r$   )inspectgetattr_staticrp  rB   classmethodr   __func__r   r'  r   r   
isfunction)methodr   rL   s    r)   check_and_create_methodz?NamedTupleVariable.var_getattr.<locals>.check_and_create_method  s    ++DNND$GF&+.)OO66t~~F  FL1+FOO<<##F+)&$77r+   )rq  r   rI   r   r>   rr   )rL   re   r   r  r   r  rN   s   ` `   r)   r   zNamedTupleVariable.var_getattr  sv    	 4*****400v,.Fw*2t44Mzz&,,t,--r+   r   r   c                     t         j                  j                  || j                  v xs t	        | j
                  |            S r$   )r   r   r   rq  r,  rp  rl  s      r)   r+  z#NamedTupleVariable.call_obj_hasattr  s;     ))00D+++Lwt~~t/L
 	
r+   r   r   r   )r   r   r   r7   rm  rJ   rx  rz  r   r\   rc   rW   rP   r   r/   r   r   r   r   r   r+  r   r   s   @r)   ro  ro  I  s     
	%	%N%


(1PQ5
&; ?#	;
 S/)*; 
;6.6
)
14
	
r+   ro  c                   H     e Zd Zd fdZd Zd Zd Zd Zd	dZd
dZ	 xZ
S )r2   c           	         |}t         j                  j                  d       gdz  \  }}}t        |      dk(  r|\  }n/t        |      dk(  r|\  }}nt        |      dk(  r|\  }}}nt        t        |t         j                        st        |t         j                        r(t        dd| d| d| dg t        j                  	       |||f| _
        t        | 0  d
i | y )Nr   r   r   z%Dynamic slicing with Tensor argumentszSliceVariable start: z, stop: z, step: zfCreating slices with Tensor arguments is not supported. e.g. `l[:x]`, where `x` is a 1-element tensor.)gb_typecontextexplanationhintsrH   )r   r   r   r   r   rB   r|   r   r   SUPPORTABLEr>   rI   rJ   r   s          r)   rJ   zSliceVariable.__init__  s    &77>>tDEItT|!"GT!#&KE4!# ,E4  eY556*)**;
 ?/whtfHTFSA&22 T4(
"6"r+   c                 &    | j                  dd      S )Nzslice(r   r   rX   s    r)   r\   zSliceVariable.debug_repr  r   r+   c                 h    t        | j                  D cg c]  }|j                          c} S c c}w r$   )r1   r>   rP   rQ   s     r)   rP   zSliceVariable.as_proxy  s%    TZZ8qzz|8998r   c                     t         S r$   )r1   rX   s    r)   rc   zSliceVariable.python_type  r   r+   c                 ^    t        | j                  D cg c]  }t        |       c} S c c}w r$   )r1   r>   r   rQ   s     r)   rW   z SliceVariable.as_python_constant  s#    

;1|A;<<;s   *c                     |j                  | j                         |j                  t        dt	        | j                                     y )NBUILD_SLICEr  r  r   s     r)   r   zSliceVariable.reconstruct  rH  r+   c                     |t         v rt        j                  | |      S g d}||vrt        d|        | j                  |j                  |         S )Nr   zslice.)r   r   GetAttrVariabler   r>   rr   r   s       r)   r   zSliceVariable.var_getattr  sQ    )),,T488*vF4&/*zz&,,t,--r+   r   r   r   )r   r   r   rJ   r\   rP   rc   rW   r   r   r   r   s   @r)   r2   r2     s'    #:5:=V.r+   r2   c                        e Zd Zdhej                  Zddeddf fdZdefdZd Z		 	 	 	 d fdZ
d Zd	 Zd
 Zdee   fdZddZ xZS )r.   rr   r?   Nc                 d    t        |   di | t        |t              sJ || _        || _        y rM  )rI   rJ   rB   r/   r>   rr   )rL   r>   rr   rM   rN   s       r)   rJ   zListIteratorVariable.__init__  s3    "6"%&&&
 

r+   c                     | j                   j                   dt        | j                         dt	        | j
                         dS )Nr  z, index=r   )rN   r   r   r>   r~  rr   rX   s    r)   r  zListIteratorVariable.__repr__  s=    ..))*(3tzz?2C8DQUQ[Q[L\K]]^__r+   c                     | j                         sJ | j                  }|t        | j                        k\  rt	        t
        |       |j                  j                  j                  |        | xj                  dz  c_        | j                  |   S r   )	r   rr   r   r>   r   StopIterationr   r   r   )rL   re   	old_indexs      r)   next_variablez"ListIteratorVariable.next_variable  si       JJ	DJJ'$]B7
		''-

a
zz)$$r+   c                     |dk(  r;t        |      dk(  sJ |rJ t        | j                  | j                  d  |d   |      S t        |   ||||      S )Nr}   r   r   )r   r   r>   rr   rI   r   rJ  s        r)   r   z ListIteratorVariable.call_method  s]     >!t9>!>: DJJL!947BGGw"2tT6::r+   c                 *    t        t        g             S r$   )r&   r-   rX   s    r)   rc   z ListIteratorVariable.python_type,  s    DH~r+   c                     | j                   dkD  rt        t        | j                  D cg c]  }|j	                          c}      S c c}w r   )rr   NotImplementedErrorr-   r>   rW   rQ   s     r)   rW   z'ListIteratorVariable.as_python_constant/  s9    ::>%%TZZ@Q))+@AA@s   Ac                 F    t        | j                  | j                  d        S r$   )r/   r>   rr   rv   s     r)   rw   z(ListIteratorVariable.unpack_var_sequence4  s    DJJtzz|,--r+   c                 $    | j                  |      S r$   )rw   rv   s     r)   r   z.ListIteratorVariable.force_unpack_var_sequence7  s    ''++r+   c                     | j                   | j                  d  }|j                  |       |j                  t	        dt        |            t	        d      g       y )NrG  r  GET_ITER)r>   rr   r   r   r
   r   )rL   r   remaining_itemss      r)   r   z ListIteratorVariable.reconstruct:  sL    **TZZ\2("=c/6JK":.	
r+   )r   )ry   zlist[VariableTracker]rM   zdict[str, VariableTracker]r   )r   r   r   r   rm  ro   rJ   r   r  r  r   rc   rW   rw   r/   r   r   r   r   r   s   @r)   r.   r.     s    		(	(N
S 4 `# `%; &	;
 -;B
.,tO/D ,
r+   r.   c                       e Zd Zy)TupleIteratorVariableN)r   r   r   rH   r+   r)   r  r  E  s    r+   r  )9r  r;   r  r   typingr   r   r3   torch.fx r   r   r   bytecode_transformationr	   r
   excr   r   r   rj   r   utilsr   r   r   r   r   r   r   r   r   baser   r   r   r   	functionsr   r   r-   r   torch._dynamo.codegenr   torch._dynamo.symbolic_convertr    r"   r   r   r0   r=   r7   r5   ro  r2   r.   r  rH   r+   r)   <module>r     s       *   6 6 N K K 
 
 
 4 & ? " /DD; D;N].$ ].@N? 0 N?bhD, hDVs- sl&D$ &DROL= OLd~
 ~
B4.O 4.nA
+ A
H	0 	r+   