
    9iN                     ^   S r SSKrSSKrSSKJrJr  SSKJrJrJ	r	  SSK
JrJr  SSKJrJrJrJrJr  SS	KJrJr  SS
KJr  \(       a  SSKJr  SSKJr  Sr " S S\5      r " S S\5      r " S S\5      r " S S\5      r  " S S\5      r! " S S\5      r" " S S\"5      r# " S S\5      r$g)a  
This module provides iterator-related variable tracking functionality for Dynamo.
It implements variable classes for handling Python iterators and itertools functions
during symbolic execution and tracing.

The module includes:
- Base iterator variable classes for tracking iterator state
- Implementations of built-in iterators (zip, map, filter)
- Support for itertools functions (product, accumulate, combinations, etc.)
- Mutation tracking and reconstruction capabilities for iterator operations

These classes integrate with Dynamo's variable tracking system to enable proper
handling of iterator operations during code transformation and optimization.
    N)TYPE_CHECKINGUnion   )graph_break_hints	polyfills	variables)create_call_functioncreate_instruction)handle_observed_exceptionObservedUserStopIterationraise_observed_exceptionunimplemented_v2	UserError   )ValueMutationNewVariableTracker)ConstantVariable)	PyCodegen)InstructionTranslatori  c                   `   ^  \ rS rSrSU 4S jjrS\4S jrS r        S	U 4S jjrSr	U =r
$ )
ItertoolsVariable+   returnc                 2   > [         TU ]  " S0 UD6  Xl        g N )super__init__value)selfr   kwargs	__class__s      \/var/www/html/land-doc-ocr/venv/lib/python3.13/site-packages/torch/_dynamo/variables/iter.pyr   ItertoolsVariable.__init__,   s    "6"
    c                 "    SU R                    S3$ )NzItertoolsVariable()r   r    s    r#   __repr__ItertoolsVariable.__repr__0   s    #DJJ<q11r%   c                     U R                   $ Nr(   r)   s    r#   as_python_constant$ItertoolsVariable.as_python_constant3   s    zzr%   c                 j  >^ ^^^^ T R                   [        R                  L Ga!  [        S TR	                  5        5       5      (       aR  [        SST  ST ST 3SSR                  [        TR	                  5       5      S1-
  5       3/ [        R                  QS9  STR	                  5       ;   a  TS   R                  5       nOS	nT Vs/ s H  oUR                  T5      PM     nn[        R                  " USU06 Vs/ s H"  n[        R                  " [        U5      5      PM$     nn[        R                  " U[!        5       S
9$ T R                   [        R"                  L a  T(       d  [%        T5      S:X  a  TS   R'                  T5      (       a  TS	   R)                  5       (       a  TS   R+                  T5      n	TS	   R                  5       n/ n[        R"                  " X5       H1  nUR-                  [        R                  " [        U5      5      5        M3     [        R                  " U[!        5       S
9$ T R                   [        R.                  L Ga  [        S TR	                  5        5       5      (       aR  [        SST  ST ST 3SSR                  [        TR	                  5       5      S1-
  5       3/ [        R                  QS9  UUU 4S jm[%        T5      S	:X  a.  TS   R'                  T5      (       a  TS   R+                  T5      n
O-[        SST  ST ST 3ST ST S3S/[        R0                  QS9  ST;   a	  UUU4S jnOU4S jn/ n [        R.                  " W
US9 H  u  pUR-                  [        R                  " [        R2                  R5                  U5      (       a  [        R2                  R7                  U5      OU[        R                  " [        U5      [!        5       S
9/[!        5       S
95        M     [        R                  " U[!        5       S
9$ T R                   [        R:                  L ac  [%        T5      S:  a  [        R<                  " TS[!        5       06$ TR?                  [@        RB                  " T[D        R:                  5      TT5      $ T R                   [        RF                  L a  [        RH                  " TS[!        5       06$ T R                   [        RJ                  L a  [%        T5      S	:X  d'  [%        T5      S:X  a  TS	   R)                  5       (       a  T(       d  [%        T5      S:X  a  TS	   R                  5       nOS n[        RJ                  " TS   R                  T5      U5       Vs/ s H"  n[        R                  " [        U5      5      PM$     nn[        R                  " U[!        5       S
9$ [L        TT ]  TTT5      $ s  snf s  snf ! [8         a1  n[        SST  ST ST 3S/ [        R0                  QUS9   S nAGNS nAff = fs  snf )Nc              3   *   #    U  H	  oS :g  v   M     g7f)repeatNr   .0kws     r#   	<genexpr>2ItertoolsVariable.call_function.<locals>.<genexpr>?   s     :Mb>M   z(Unsupported kwargs for itertools.productcall_function  z#Expected kwargs: 'repeat', but got ,r2   gb_typecontextexplanationhintsr   )mutation_typer   r   c              3   *   #    U  H	  oS :g  v   M     g7f)keyNr   r3   s     r#   r6   r7   e   s     72;r8   z(Unsupported kwargs for itertools.groupbyz Expected kwargs: 'key', but got rC   c           
      8  > [        U [        R                  5      (       a  U R                  5       $ [        U [        R                  5      (       a  U R                  5       $ [        SST ST ST 3S[        [        U 5      5       S3/ [        R                  QS9  g )Nz*Unsupported key type for itertools.groupbyr9   r:   zCDynamo does not know how to trace itertools.groupby with key type: zJ. We only support grouping keys that are constants (int, float, str, etc.)r<   )
isinstancer   SymNodeVariableevaluate_exprr   r.   r   strtyper   SUPPORTABLE)rC   argsr!   r    s    r#   retrieve_const_key;ItertoolsVariable.call_function.<locals>.retrieve_const_keyn   s    c9#<#<==,,..Y%?%?@@1133$ L"0avQvh G%<<?S	N;K Lc%c ? 1 = =>r%   z+Unsupported arguments for itertools.groupbyz?Dynamo does not know how to trace itertools.groupby with args: z and kwargs: ze. itertools.groupby expects an iterable to group and an optional key function to determine groupings.z9Make sure the arguments to itertools.groupby are correct.c                 V   > T" TR                  S5      R                  TU /0 5      5      $ )NrC   )getcall_function)xr!   rL   txs    r#   keyfunc0ItertoolsVariable.call_function.<locals>.keyfunc   s-    -

5)77QCD r%   c                    > T" U 5      $ r-   r   )rQ   rL   s    r#   rS   rT      s    -a00r%   )rC   z7Unexpected failure during itertools.groupby() iterationz6Unexpected failure in invoking function during groupby)r=   r>   r?   r@   from_excrA   )(r   	itertoolsproductanykeysr   joinsetr   
USER_ERRORr.   force_unpack_var_sequencer   TupleVariablelistListIteratorVariabler   combinationslenhas_unpack_var_sequenceis_python_constantunpack_var_sequenceappendgroupbyrJ   r   
is_literalcreate	Exceptionr2   RepeatIteratorVariableinline_user_function_returnr   buildr   countCountIteratorVariablepermutationsr   rP   )r    rR   rK   r!   rargseqsitemitemsiterableseqrS   resultkverL   r"   s   ````            @r#   rP   ItertoolsVariable.call_function6   s    ::***:FKKM::: F,TF!D66(C"ExxFKKM 2hZ ?@A!C9-889 6;;=(8$779AEF#11"5DF &--t>A>>D ''T
3>   11%5%7  JJ)000D	QQ//33Q**,,Aw2226HQ**,AE!..x;Y44T$Z@A <11%5%7  ZZ9,,,7777 F,TF!D66(C"BxxFKKM 2eW <=>!@9-889 4yA~$q'"A"A""E"E1g11"5 I,TF!D66(C!4486vh OD!D
 T*66  1 F%--cw?DAMM!// $-#=#=#H#H#K#K !* : : A A! D%& ) > >$(G;K;M!"	 +;*<
 @, 11&6&8  ZZ9+++4y1} 77)9);  11%%b)*:*:;T6  ZZ9??*22%5%7  JJ)000TaCINtAw7Q7Q7S7S4yA~G..0 &22G55b91D ''T
3   11%5%7  7(T6::Q Gx   U,TF!D66(C X:-99: Bs+   
W(>)W-B3W2 )X02
X-<&X((X-r(   r   N)rR   r   rK   zlist[VariableTracker]r!   zdict[str, VariableTracker]r   r   )__name__
__module____qualname____firstlineno__r   rH   r*   r.   rP   __static_attributes____classcell__r"   s   @r#   r   r   +   sO    2# 2^;#^; &^; -	^;
 
^; ^;r%   r   c                   ^   ^  \ rS rSrS	U 4S jjrS rS\\   4S jrS	S jr	S\
4S jrSrU =r$ )
IteratorVariable   r   c                 &   > [         TU ]  " S0 UD6  g r   )r   r   )r    r!   r"   s     r#   r   IteratorVariable.__init__   s    "6"r%   c                 D    [        SSU  S3S/ [        R                  QS9  g )NzUnimplemented next() callznext(r'   z(This abstract method must be implementedr<   )r   r   
DYNAMO_BUGr    rR   s     r#   next_variableIteratorVariable.next_variable   s*    /D6OB1%001		
r%   c                 @    / nU R                  XR                  5        U$ r-   )force_apply_to_var_sequencerg   )r    rR   ry   s      r#   r^   *IteratorVariable.force_unpack_var_sequence   s    ((]];r%   c                 n      U" U R                  U5      5        M  ! [         a    [        U5         g f = fr-   )r   r   r   )r    rR   fns      r#   r   ,IteratorVariable.force_apply_to_var_sequence   s>    4%%b)*  - )"-s    44c                     gNTr   r   s     r#   has_force_unpack_var_sequence.IteratorVariable.has_force_unpack_var_sequence   s    r%   r   r~   )r   r   r   r   r   r   r`   r   r^   r   boolr   r   r   r   s   @r#   r   r      s4    #
tO/D 
4  r%   r   c                   :   ^  \ rS rSrSrS\4U 4S jjrS rSrU =r	$ )ObjectIteratorVariable   a6  
VariableTracker for iter(obj) that implements the iterator protocol (i.e.,
has a `__next__` method).

We use this class to track the state of the iterator and handle the case
when the iterator is exhausted:

Example usage:
    > b = iter(obj)
    > list(b)  # exhaust the iterator
    > list(b)  # empty list
objc                 @   > [         TU ]  " S0 UD6  Xl        SU l        g )NFr   )r   r   r   generator_exhausted)r    r   r!   r"   s      r#   r   ObjectIteratorVariable.__init__  s     "6"#( r%   c                     U R                   (       a  [        [        U5         U R                  R	                  U5      $ ! [
         a	    SU l         e f = fr   )r   r   StopIterationr   r   r   r   s     r#   r   $ObjectIteratorVariable.next_variable  sK    ##$]B7	88))"--( 	 (,D$		s	   > A)r   r   )
r   r   r   r   __doc__r   r   r   r   r   r   s   @r#   r   r      s    )O )

 
r%   r   c                   D   ^  \ rS rSrS\SS4U 4S jjrS rS	S jrSrU =r	$ )
rl   i  ru   r   Nc                 2   > [         TU ]  " S0 UD6  Xl        g r   )r   r   ru   )r    ru   r!   r"   s      r#   r   RepeatIteratorVariable.__init__  s    "6"	r%   c                     U R                   $ r-   ru   r   s     r#   r   $RepeatIteratorVariable.next_variable   s    yyr%   c                    ^ TR                  U4S j5        T" U R                  5        TR                  [        SS5      5        g )Nc                  n   > T R                  T R                  [        5      T R                  S5      /5      $ )Nr2   extend_outputcreate_load_python_modulerW   create_load_attrcodegens   r#   <lambda>4RepeatIteratorVariable.reconstruct.<locals>.<lambda>%  s1    G))55i@,,X6r%   r   F)add_push_nullru   r   r	   r    r   s    `r#   reconstruct"RepeatIteratorVariable.reconstruct#  s:    	
 			21e<=r%   r   r   r   )
r   r   r   r   r   r   r   r   r   r   r   s   @r#   rl   rl     s%    _ 4 

> 
>r%   rl   c                   L   ^  \ rS rSrS
S\S\SS4U 4S jjjrS rSS jrS	rU =r	$ )rp   i0  ru   stepr   Nc                    > [         TU ]  " S0 UD6  [        U[        5      (       d  [        R
                  " U5      n[        U[        5      (       d  [        R
                  " U5      nXl        X l        g r   )r   r   rE   r   r   rj   ru   r   )r    ru   r   r!   r"   s       r#   r   CountIteratorVariable.__init__1  sW    "6"$00#**40D$00#**40D		r%   c                     U R                  5       (       d   eU R                  nUR                  R                  R	                  U 5        U R                  R                  USU R                  /0 5      U l        U$ )N__add__)
is_mutableru   outputside_effectsmutationcall_methodr   )r    rR   old_items      r#   r   #CountIteratorVariable.next_variable:  s]        99
		''-II))"i$))bI	r%   c                    ^ TR                  U4S j5        T" U R                  5        T" U R                  5        TR                  [	        SS5      5        g )Nc                  n   > T R                  T R                  [        5      T R                  S5      /5      $ )Nro   r   r   s   r#   r   3CountIteratorVariable.reconstruct.<locals>.<lambda>C  s1    G))55i@,,W5r%   r   F)r   ru   r   r   r	   r   s    `r#   r   !CountIteratorVariable.reconstructA  sF    	
 					21e<=r%   )ru   r   )r   r   r   )
r   r   r   r   intr   r   r   r   r   r   s   @r#   rp   rp   0  s1    S C $  > >r%   rp   c                      ^  \ rS rSrSrSS1\R                  kr SS\\   S\	SS4U 4S jjjr
S	 rS\	4S
 jrS\S   4S jrS rSS jrSS jrSrU =r$ )ZipVariableiO  z
Represents zip(*iterables)
indexstrict	iterablesr   Nc                 z   > [         TU ]  " S0 UD6  [        U[        5      (       d   eXl        SU l        X l        g Nr   r   )r   r   rE   r`   r   r   r   )r    r   r   r!   r"   s       r#   r   ZipVariable.__init__Z  s9     	"6")T****"
r%   c                     [         $ r-   )zipr)   s    r#   python_typeZipVariable.python_typeg      
r%   c                 B   ^ [        U4S jU R                   5       5      $ )Nc              3   t   >#    U  H-  n[        U[        5      =(       d    UR                  T5      v   M/     g 7fr-   )rE   r`   rd   )r4   itrR   s     r#   r6   6ZipVariable.has_unpack_var_sequence.<locals>.<genexpr>k  s2      
$ r4 BB$>$>r$BB$s   58)allr   r   s    `r#   rd   #ZipVariable.has_unpack_var_sequencej  s!     
nn
 
 	
r%   r   c                    U R                  U5      (       d   e/ nU R                   HW  n[        U[        5      (       a  UR	                  X0R
                  S  5        M7  UR	                  UR                  U5      5        MY     U R                  (       a  SU R                  0O0 n[        U0 UD6nU Vs/ s H"  n[        R                  " [        U5      5      PM$     sn$ s  snf )Nr   )rd   r   rE   r`   rg   r   rf   r   r   r   r_   )r    rR   r   r   r!   zippedvars          r#   rf   ZipVariable.unpack_var_sequencep  s    ++B////	..B"d##  JJL!12  !7!7!;<	 !
 -1KK(DKK(Ri*6*>DEfs	''S	2fEEEs   2)Cc                   ^^ U R                  5       (       d   e[        U R                  5      S:X  a  [        [        T5        U R
                  m/ nUU4S jn [        U R                  5       H  u  pEUR                  U" U5      5        M     TR                  R                  R                  U 5        U =R
                  S-  sl        [         R"                  " U5      $ ! [         ao    U R                  (       a\  WS:X  a:  U R                   H)  n U" U5        O! [         a    [        T5         M%  f = f  O   e [        T5        [        [        S5      S ee f = f)Nr   c                    > [        U [        5      (       a$  T[        U 5      :  a  [        [        T5        U T   $ U R                  T5      $ r-   )rE   r`   rc   r   r   r   )r   	old_indexrR   s    r#   get_item+ZipVariable.next_variable.<locals>.get_item  sA    "d##B',]B?)}$''++r%   z3zip() has one argument of len differing from othersr   )r   rc   r   r   r   r   	enumeraterg   r   r   r   r   
ValueErrorr   r   r   r   r_   )r    rR   rK   r   idxr   r   s    `    @r#   r   ZipVariable.next_variable|  s(       t~~!#$]B7JJ		,	$T^^4HRL) 50 			''-

a
&&t,,1 ) 	{{!8"nn%$RL8 %5b9$%  - )"-I  )	s0   5C 0EDED1-E0D11&Ec           	          U R                    Hc  n[        U[        5      (       aC  X R                  S  nUR	                  U5        UR                  [        S[        U5      S95        M[  U" U5        Me     g NBUILD_TUPLErs   )r   rE   r`   r   foreachappend_outputr
   rc   )r    r   r   remaining_itemss       r#   reconstruct_itemsZipVariable.reconstruct_items  s]    ..B"d##"$ZZ\"20%%&}#o:NO  !r%   c           
        ^ TR                  U4S jSS9  U R                  T5        TR                  [        S[	        U R
                  5      S95        [        R                  S:  aN  TR                  TR                  S5      TR                  U R                  5      [        SS	S9[        S
S	S9/5        g TR                  [        S
SS95        g )Nc                  (   > T R                  SS5      $ )Nbuiltinsr   load_import_fromr   s   r#   r   )ZipVariable.reconstruct.<locals>.<lambda>      G,,Z?r%   Tcall_function_exr   r   )   
   r   	BUILD_MAPr   CALL_FUNCTION_EXr   )r   r   r   r
   rc   r   sysversion_infor   create_load_constr   r   s    `r#   r   ZipVariable.reconstruct  s    ?RV 	 	
 	w'}#dnn2EF	
 w&!!--h7--dkk:&{:&'9qA	 !!"45GQ"OPr%   )r   r   r   )Fr   )r   r   r   r   r   r   _nonvar_fieldsr`   r   r   r   r   rd   rf   r   r   r   r   r   r   s   @r#   r   r   O  s    
 	 
	(	(N ( 
 
 
T 

F.?)@ 
F,-\	Q Qr%   r   c                   |   ^  \ rS rSrSrS\S\\\\   \4      SS4U 4S jjrS r	S\
4S	 jrU 4S
 jrSS jrSrU =r$ )MapVariablei  z 
Represents map(fn, *iterables)
r   r   r   Nc                 4   > [         TU ]  " U40 UD6  Xl        g r-   )r   r   r   )r    r   r   r!   r"   s       r#   r   MapVariable.__init__  s     	-f-r%   c                     [         $ r-   )mapr)   s    r#   r   MapVariable.python_type  r   r%   c                     g)NFr   r   s     r#   rd   #MapVariable.has_unpack_var_sequence  s    r%   c                 n   > [         TU ]  U5      nU R                  R                  XR                  0 5      $ r-   )r   r   r   rP   rv   )r    rR   rK   r"   s      r#   r   MapVariable.next_variable  s-    w$R(ww$$RR88r%   c                    ^ TR                  U4S jSS9  T" U R                  5        U R                  T5        TR                  [	        S[        U R                  5      S-   S9[	        SSS9/5        g )	Nc                  (   > T R                  SS5      $ )Nr   r  r   r   s   r#   r   )MapVariable.reconstruct.<locals>.<lambda>  r   r%   Tr   r   r   r   r  r   )r   r   r   r   r
   rc   r   r   s    `r#   r   MapVariable.reconstruct  sn    ?RV 	 	
 	w'"=c$..6IA6MN"#51=	
r%   )r   r   )r   r   r   r   r   r   r`   r   r   r   r   rd   r   r   r   r   r   s   @r#   r	  r	    s]     d?3_DEF
 
T 9
 
r%   r	  c                      ^  \ rS rSrSrS1\R                  krS\S\\	\   \4   SS4U 4S jjr
S	 rS\4S
 jrS\	S   4S jrS rSS jrSS jrSrU =r$ )FilterVariablei  z!
Represents filter(fn, iterable)
r   r   rw   r   Nc                 L   > [         TU ]  " S0 UD6  Xl        X l        SU l        g r   )r   r   r   rw   r   )r    r   rw   r!   r"   s       r#   r   FilterVariable.__init__  s&     	"6" 
r%   c                     [         $ r-   )filterr)   s    r#   r   FilterVariable.python_type  s    r%   c                 z    [        U R                  [        5      =(       d    U R                  R                  U5      $ r-   )rE   rw   r`   rd   r   s     r#   rd   &FilterVariable.has_unpack_var_sequence  s.    $--. 
$--2W2W3
 	
r%   r   c                 F   U R                  U5      (       d   eS n[        U R                  [        5      (       a  U R                  U R                  S  nOU R                  R                  U5      nU R                  R                  X0 5      n[        R                  " U/5      /$ r-   )
rd   rE   rw   r`   r   rf   r   rP   r   r_   )r    rR   r   filtereds       r#   rf   "FilterVariable.unpack_var_sequence  s    ++B////dmmT**tzz|,B2226B77((4''
344r%   c                   ^ ^ U U4S jn U" 5       nT =R                   S-  sl         [        T R                  [        5      (       a  T R                  R                  c  UnOT R                  R                  TU/0 5      n[        R                  " [        R                  5      R                  TU/0 5      nUR                  5       (       a  U$ M  )Nc                     > TR                   n [        TR                  [        5      (       a8  U [	        TR                  5      :  a  [        [        T5        TR                  U    $ TR                  R                  T5      $ r-   )r   rE   rw   r`   rc   r   r   r   )r   r    rR   s    r#   _next+FilterVariable.next_variable.<locals>._next  s\    

I$--..DMM 22,]B?}}Y//}}22266r%   r   )r   rE   r   r   r   rP   r   UserFunctionVariabler   	predicater.   )r    rR   r%  ru   respred_ress   ``    r#   r   FilterVariable.next_variable  s    	7 7DJJ!OJ$''#3449Ngg++B; 55##mBr*  **,, r%   c                     [        U R                  [        5      (       aM  U R                  U R                  S  nUR	                  U5        UR                  [        S[        U5      S95        g U" U R                  5        g r   )rE   rw   r`   r   r   r   r
   rc   )r    r   r   s      r#   r    FilterVariable.reconstruct_items/  s^    dmmT**"mmDJJL9OOOO,!!"=c/6JK DMM"r%   c                    ^ TR                  U4S j5        T" U R                  5        U R                  T5        TR                  [	        SS5      5        g )Nc                  (   > T R                  SS5      $ )Nr   r  r   r   s   r#   r   ,FilterVariable.reconstruct.<locals>.<lambda>:  s    g&>&>z8&Tr%   r   F)r   r   r   r   r	   r   s    `r#   r   FilterVariable.reconstruct9  sB    TUw'21e<=r%   )r   r   rw   r   )r   r   r   r   r   r   r  r   r   r`   r   r   r   rd   rf   r   r   r   r   r   r   s   @r#   r  r    s    
 			(	(N
		 _->?	
 
	
T 

5.?)@ 50#> >r%   r  )%r   rW   r  typingr   r    r   r   r   bytecode_transformationr	   r
   excr   r   r   r   r   baser   r   constantr   torch._dynamo.codegenr   torch._dynamo.symbolic_convertr   MAX_ITERATOR_LIMITr   r   r   rl   rp   r   r	  r  r   r%   r#   <module>r;     s     
 ' 6 6 N  4 & /D   i; i;X   F- @>- >,>, >>xQ" xQv#
+ #
LM>% M>r%   