
    iN                     T   d Z ddlZddlZddlmZm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mZ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 dZ G d de      Z G d de      Z G d de      Z G d de      Z  G d de      Z! G d de      Z" G d de"      Z# G d de      Z$y)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                   N     e Zd Zd fdZdefdZd Z	 	 	 	 	 	 	 	 d fdZ xZS )ItertoolsVariablereturnc                 2    t        |   di | || _        y N )super__init__value)selfr   kwargs	__class__s      V/var/www/html/engine/venv/lib/python3.12/site-packages/torch/_dynamo/variables/iter.pyr   zItertoolsVariable.__init__,   s    "6"
    c                 "    d| j                    dS )NzItertoolsVariable()r   r   s    r"   __repr__zItertoolsVariable.__repr__0   s    #DJJ<q11r#   c                     | j                   S Nr&   r'   s    r"   as_python_constantz$ItertoolsVariable.as_python_constant3   s    zzr#   c                      j                   t        j                  u rt        d j	                         D              rUt        dd  d d ddj                  t        j	                               dhz
         g t        j                         dj	                         v rd   j                         }nd	}D cg c]  }|j                         }}t        j                  |d|iD cg c]   }t        j                  t        |            " }}t        j                  |t!               
      S  j                   t        j"                  u rǉst%              dk(  rd   j'                        rd	   j)                         rd   j+                        }	d	   j                         }g }t        j"                  |	|      D ]/  }|j-                  t        j                  t        |                   1 t        j                  |t!               
      S  j                   t        j.                  u rt        d j	                         D              rUt        dd  d d ddj                  t        j	                               dhz
         g t        j                          fdt%              d	k(  r)d   j'                        rd   j+                        }
n0t        dd  d d d d ddgt        j0                         dv rfd}nfd}g }	 t        j.                  
|      D ]  \  }}|j-                  t        j                  t        j2                  j5                  |      rt        j2                  j7                  |      n|t        j                  t        |      t!               
      gt!               
              	 t        j                  |t!               
      S  j                   t        j:                  u r`t%              dk  rt        j<                  dt!               iS j?                  tA        jB                  tD        j:                              S  j                   t        jF                  u rt        jH                  dt!               iS  j                   t        jJ                  u rt%              d	k(  s!t%              dk(  rd	   j)                         rst%              dk(  rd	   j                         }nd }t        jJ                  d   j                        |      D cg c]   }t        j                  t        |            " }}t        j                  |t!               
      S tL                 S c c}w c c}w # t8        $ r4}t        dd  d d dg t        j0                  |       Y d }~d }~ww xY wc c}w )Nc              3   &   K   | ]	  }|d k7    yw)repeatNr   .0kws     r"   	<genexpr>z2ItertoolsVariable.call_function.<locals>.<genexpr>?   s     :b2>:   z(Unsupported kwargs for itertools.productcall_function  z#Expected kwargs: 'repeat', but got ,r.   gb_typecontextexplanationhintsr   )mutation_typer   r   c              3   &   K   | ]	  }|d k7    yw)keyNr   r/   s     r"   r2   z2ItertoolsVariable.call_function.<locals>.<genexpr>e   s     722;7r3   z(Unsupported kwargs for itertools.groupbyz Expected kwargs: 'key', but got r>   c           
      *   t        | t        j                        r| j                         S t        | t        j                        r| j                         S t        dd d d dt        t        |              dg t        j                         y )Nz*Unsupported key type for itertools.groupbyr4   r5   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.)r7   )
isinstancer   SymNodeVariableevaluate_exprr   r+   r   strtyper   SUPPORTABLE)r>   argsr    r   s    r"   retrieve_const_keyz;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     j                  d      j                  | gi             S )Nr>   )getcall_function)xr    rG   txs    r"   keyfuncz0ItertoolsVariable.call_function.<locals>.keyfunc   s-    -

5)77QCD r#   c                      |       S r*   r   )rK   rG   s    r"   rM   z0ItertoolsVariable.call_function.<locals>.keyfunc   s    -a00r#   )r>   z7Unexpected failure during itertools.groupby() iterationz6Unexpected failure in invoking function during groupby)r8   r9   r:   r;   from_excr<   )(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groupbyrE   r   
is_literalcreate	Exceptionr.   RepeatIteratorVariableinline_user_function_returnr   buildr   countCountIteratorVariablepermutationsr   rJ   )r   rL   rF   r    rargseqsitemitemsiterableseqrM   resultkverG   r!   s   ````            @r"   rJ   z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#C11"5FDF &--t>A> ''T
3E  11%5%7  JJ)000D	QQ//3Q**,Aw2226HQ**,AE!..x; BY44T$Z@AB11%5%7  ZZ9,,,777 F,TF!D66(C"BxxFKKM 2eW <=>!@9-889 4yA~$q'"A"A""E1g11"5 I,TF!D66(C!4486vh OD!D
 T*66 1 F%--cw? DAqMM!// $-#=#=#H#H#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NtAw7Q7Q7S4yA~G..0 &22G55b91 ''T
3E  11%5%7  7(T6::Q Gx   U,TF!D66(C X:-99: Bs+   V-6%V23B3V7 %W77	W4 )W//W4r   N)rL   r   rF   zlist[VariableTracker]r    zdict[str, VariableTracker]r   r   )	__name__
__module____qualname__r   rC   r(   r+   rJ   __classcell__r!   s   @r"   r   r   +   sO    2# 2^;#^; &^; -	^;
 
^; ^;r#   r   c                   L     e Zd Zd fdZd Zdee   fdZddZde	fdZ
 xZS )IteratorVariabler   c                 $    t        |   di | y r   )r   r   )r   r    r!   s     r"   r   zIteratorVariable.__init__   s    "6"r#   c                 J    t        dd|  ddg t        j                         y )NzUnimplemented next() callznext(r%   z(This abstract method must be implementedr7   )r   r   
DYNAMO_BUGr   rL   s     r"   next_variablezIteratorVariable.next_variable   s*    /D6OB1%001		
r#   c                 B    g }| j                  ||j                         |S r*   )force_apply_to_var_sequencer`   )r   rL   rr   s      r"   rW   z*IteratorVariable.force_unpack_var_sequence   s     ((V]];r#   c                 j    	 	  || j                  |             # t        $ r t        |       Y y w xY wr*   )r   r   r   )r   rL   fns      r"   r   z,IteratorVariable.force_apply_to_var_sequence   s>    4%%b)*  - )"-s    22c                      yNTr   r   s     r"   has_force_unpack_var_sequencez.IteratorVariable.has_force_unpack_var_sequence   s    r#   rv   )rw   rx   ry   r   r   rY   r   rW   r   boolr   rz   r{   s   @r"   r}   r}      s/    #
tO/D 
4 r#   r}   c                   .     e Zd ZdZdef fdZd Z xZS )ObjectIteratorVariableaZ  
    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        |   di | || _        d| _        y )NFr   )r   r   r   generator_exhausted)r   r   r    r!   s      r"   r   zObjectIteratorVariable.__init__  s"    "6"#( r#   c                     | j                   rt        t        |       	 | j                  j	                  |      S # t
        $ r	 d| _          w xY wr   )r   r   StopIterationr   r   r   r   s     r"   r   z$ObjectIteratorVariable.next_variable  sK    ##$]B7	88))"--( 	 (,D$		s	   9 A)rw   rx   ry   __doc__r   r   r   rz   r{   s   @r"   r   r      s    )O )

r#   r   c                   6     e Zd Zdeddf fdZd ZddZ xZS )re   rn   r   Nc                 2    t        |   di | || _        y r   )r   r   rn   )r   rn   r    r!   s      r"   r   zRepeatIteratorVariable.__init__  s    "6"	r#   c                     | j                   S r*   )rn   r   s     r"   r   z$RepeatIteratorVariable.next_variable   s    yyr#   c                     j                  fd        | j                         j                  t        dd             y )Nc                  n     j                   j                  t               j                  d      g      S )Nr.   extend_outputcreate_load_python_modulerP   create_load_attrcodegens   r"   <lambda>z4RepeatIteratorVariable.reconstruct.<locals>.<lambda>%  s3    G))55i@,,X6 r#   r   F)add_push_nullrn   r   r	   r   r   s    `r"   reconstructz"RepeatIteratorVariable.reconstruct#  s:    	
 			21e<=r#   r   r   )rw   rx   ry   r   r   r   r   rz   r{   s   @r"   re   re     s     _ 4 

>r#   re   c                   <     e Zd Zddededdf fdZd Zd	dZ xZS )
ri   rn   stepr   Nc                     t        |   di | t        |t              st	        j
                  |      }t        |t              st	        j
                  |      }|| _        || _        y r   )r   r   r@   r   r   rc   rn   r   )r   rn   r   r    r!   s       r"   r   zCountIteratorVariable.__init__1  sU    "6"$0#**40D$0#**40D		r#   c                     | j                         sJ | j                  }|j                  j                  j	                  |        | j                  j                  |d| j                  gi       | _        |S )N__add__)
is_mutablern   outputside_effectsmutationcall_methodr   )r   rL   old_items      r"   r   z#CountIteratorVariable.next_variable:  sZ       99
		''-II))"i$))bI	r#   c                     j                  fd        | j                          | j                         j                  t	        dd             y )Nc                  n     j                   j                  t               j                  d      g      S )Nrh   r   r   s   r"   r   z3CountIteratorVariable.reconstruct.<locals>.<lambda>C  s3    G))55i@,,W5 r#   r   F)r   rn   r   r   r	   r   s    `r"   r   z!CountIteratorVariable.reconstructA  sF    	
 					21e<=r#   )r   r   r   )rw   rx   ry   intr   r   r   rz   r{   s   @r"   ri   ri   0  s'    S C $ >r#   ri   c                        e Zd ZdZddhej
                  Z	 ddee   deddf fdZ	d Z
defd	Zded
   fdZd ZddZddZ xZS )ZipVariablez$
    Represents zip(*iterables)
    indexstrict	iterablesr   Nc                 r    t        |   di | t        |t              sJ || _        d| _        || _        y Nr   r   )r   r   r@   rY   r   r   r   )r   r   r   r    r!   s       r"   r   zZipVariable.__init__Z  s:     	"6")T***"
r#   c                     t         S r*   )zipr'   s    r"   python_typezZipVariable.python_typeg      
r#   c                 @    t        fd| j                  D              S )Nc              3   d   K   | ]'  }t        |t              xs |j                         ) y wr*   )r@   rY   r]   )r0   itrL   s     r"   r2   z6ZipVariable.has_unpack_var_sequence.<locals>.<genexpr>k  s3      
 r4 BB$>$>r$BB
s   -0)allr   r   s    `r"   r]   z#ZipVariable.has_unpack_var_sequencej  s!     
nn
 
 	
r#   r   c                    | j                  |      sJ g }| j                  D ]Q  }t        |t              r|j	                  || j
                  d         2|j	                  |j                  |             S | j                  rd| j                  ini }t        |i |}|D cg c]   }t        j                  t        |            " c}S c c}w )Nr   )r]   r   r@   rY   r`   r   r_   r   r   r   rX   )r   rL   r   r   r    zippedvars          r"   r_   zZipVariable.unpack_var_sequencep  s    ++B///	.. 	=B"d#  DJJL!12  !7!7!;<		=
 -1KK(DKK(Ri*6*>DEs	''S	2EEEs   !%C	c                    | j                         sJ t        | j                        dk(  rt        t               | j
                  g }fd}	 t        | j                        D ]  \  }}|j                   ||              	 j                  j                  j                  |        | xj
                  dz  c_        t!        j"                  |      S # t        $ rf | j                  rXdk(  r7| j                  D ]'  }	  ||       n# t        $ r t               Y #w xY w n  t               t        t        d      d  w xY w)Nr   c                     t        | t              r#t        |       k\  rt        t               |    S | j                        S r*   )r@   rY   r\   r   r   r   )r   	old_indexrL   s    r"   get_itemz+ZipVariable.next_variable.<locals>.get_item  s>    "d#B',]B?)}$''++r#   z3zip() has one argument of len differing from othersr   )r   r\   r   r   r   r   	enumerater`   r   r   r   r   
ValueErrorr   r   r   r   rX   )r   rL   rF   r   idxr   r   s    `    @r"   r   zZipVariable.next_variable|  s1      t~~!#$]B7JJ		,	$T^^4 *RHRL)*0 			''-

a
&&t,,1 ) 	{{!8"nn 
%$RL8 %5b9$% 
 )"-I  )	s0   4C )E D	E	D ED  %Ec           	          | j                   D ]`  }t        |t              rF|| j                  d  }|j	                  |       |j                  t        dt        |                   Y ||       b y NBUILD_TUPLErl   )r   r@   rY   r   foreachappend_outputr
   r\   )r   r   r   remaining_itemss       r"   reconstruct_itemszZipVariable.reconstruct_items  sa    .. 	B"d#"$TZZ\"20%%&}#o:NO 	r#   c           	         j                  fdd       | j                         j                  t        dt	        | j
                                     t        j                  dk\  rTj                  j                  d      j                  | j                        t        dd	      t        d
d	      g       y j                  t        d
d             y )Nc                  (     j                  dd      S )Nbuiltinsr   load_import_fromr   s   r"   r   z)ZipVariable.reconstruct.<locals>.<lambda>      G,,Z? r#   Tcall_function_exr   r   )   
   r   	BUILD_MAPr   CALL_FUNCTION_EXr   )r   r   r   r
   r\   r   sysversion_infor   create_load_constr   r   s    `r"   r   zZipVariable.reconstruct  s    ?RV 	 	
 	w'}#dnn2EF	
 w&!!--h7--dkk:&{:&'9qA	 !!"45GQ"OPr#   )Fr   )rw   rx   ry   r   r}   _nonvar_fieldsrY   r   r   r   r   r]   r_   r   r   r   rz   r{   s   @r"   r   r   O  s    
 	 
	(	(N ( 
 

T 

F.?)@ 
F,-\	Qr#   r   c                   j     e Zd ZdZdedeeee   ef      ddf fdZd Zde	fdZ
 fd	Zdd
Z xZS )MapVariablez(
    Represents map(fn, *iterables)
    r   r   r   Nc                 4    t        |   |fi | || _        y r*   )r   r   r   )r   r   r   r    r!   s       r"   r   zMapVariable.__init__  s     	-f-r#   c                     t         S r*   )mapr'   s    r"   r   zMapVariable.python_type  r   r#   c                      y)NFr   r   s     r"   r]   z#MapVariable.has_unpack_var_sequence  s    r#   c                 p    t         |   |      }| j                  j                  ||j                  i       S r*   )r   r   r   rJ   ro   )r   rL   rF   r!   s      r"   r   zMapVariable.next_variable  s/    w$R(ww$$RR88r#   c                     j                  fdd        | j                         | j                         j                  t	        dt        | j                        dz         t	        dd      g       y )	Nc                  (     j                  dd      S )Nr   r   r   r   s   r"   r   z)MapVariable.reconstruct.<locals>.<lambda>  r   r#   Tr   r   r   r   r   r   )r   r   r   r   r
   r\   r   r   s    `r"   r   zMapVariable.reconstruct  sn    ?RV 	 	
 	w'"=c$..6IA6MN"#51=	
r#   r   )rw   rx   ry   r   r   rY   r   r   r   r   r]   r   r   rz   r{   s   @r"   r   r     sX     d?3_DEF
 
T 9
r#   r   c                        e Zd ZdZdhej
                  Zdedeee   ef   ddf fdZ	d Z
defd	Zded
   fdZd ZddZddZ xZS )FilterVariablez)
    Represents filter(fn, iterable)
    r   r   rp   r   Nc                 N    t        |   di | || _        || _        d| _        y r   )r   r   r   rp   r   )r   r   rp   r    r!   s       r"   r   zFilterVariable.__init__  s*     	"6" 
r#   c                     t         S r*   )filterr'   s    r"   r   zFilterVariable.python_type  s    r#   c                 p    t        | j                  t              xs | j                  j                  |      S r*   )r@   rp   rY   r]   r   s     r"   r]   z&FilterVariable.has_unpack_var_sequence  s.    $--. 
$--2W2W3
 	
r#   r   c                 2   | j                  |      sJ d }t        | j                  t              r| j                  | j                  d  }n| j                  j                  |      }| j                  j                  ||i       }t        j                  |g      gS r*   )
r]   r@   rp   rY   r   r_   r   rJ   r   rX   )r   rL   r   filtereds       r"   r_   z"FilterVariable.unpack_var_sequence  s    ++B///dmmT*tzz|,B2226B77((R4''
344r#   c                 ~     fd}	  |       } xj                   dz  c_         t         j                  t              r j                  j                  |}n j                  j                  |gi       }t        j                  t        j                        j                  |gi       }|j                         r|S )Nc                      j                   } t        j                  t              r7| t	        j                        k\  rt        t               j                  |    S j                  j                        S r*   )r   r@   rp   rY   r\   r   r   r   )r   r   rL   s    r"   _nextz+FilterVariable.next_variable.<locals>._next  sY    

I$--.DMM 22,]B?}}Y//}}22266r#   r   )r   r@   r   r   r   rJ   r   UserFunctionVariabler   	predicater+   )r   rL   r   rn   respred_ress   ``    r"   r   zFilterVariable.next_variable  s    	7 7DJJ!OJ$''#349Ngg++B; 55##mBr*  **, r#   c                     t        | j                  t              rP| j                  | j                  d  }|j	                  |       |j                  t        dt        |                   y  || j                         y r   )r@   rp   rY   r   r   r   r
   r\   )r   r   r   s      r"   r   z FilterVariable.reconstruct_items/  s[    dmmT*"mmDJJL9OOOO,!!"=c/6JK DMM"r#   c                     j                  fd        | j                         | j                         j                  t	        dd             y )Nc                  (     j                  dd      S )Nr   r   r   r   s   r"   r   z,FilterVariable.reconstruct.<locals>.<lambda>:  s    g&>&>z8&T r#   r   F)r   r   r   r   r	   r   s    `r"   r   zFilterVariable.reconstruct9  sB    TUw'21e<=r#   r   )rw   rx   ry   r   r}   r   r   r   rY   r   r   r   r]   r_   r   r   r   rz   r{   s   @r"   r   r     s    
 			(	(N
		 _->?	
 
	
T 

5.?)@ 50#>r#   r   )%r   rP   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   re   ri   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#   