
    %VjiN                        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$dS )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returnNc                 H     t                      j        di | || _        d S N )super__init__value)selfr   kwargs	__class__s      V/root/voice-cloning/.venv/lib/python3.11/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    1DJ1111r#   c                     | j         S Nr&   r'   s    r"   as_python_constantz$ItertoolsVariable.as_python_constant3   s
    zr#   txr   argslist[VariableTracker]r    dict[str, VariableTracker]r   c                 L     j         t          j        u r
t          d                                 D                       rat          dd  d d dd                    t                                                    dhz
             g t          j	                   d                                v rd         
                                }nd	}fd
D             }d t          j        |d|iD             }t          j        |t                                S  j         t          j        u rst                    dk    rډd                                       rd	                                         rd                                       }d	         
                                }g }t          j        ||          D ]6}|                    t          j        t+          |                               7t          j        |t                                S  j         t          j        u rBt          d                                 D                       rat          dd  d d dd                    t                                                    dhz
             g t          j	                    fdt                    d	k    r7d                                       rd                                       }	n0t          dd  d d d d ddgt          j                   dv rfd}
nfd}
g }	 t          j        |	|
          D ]\  }}|                    t          j        t          j                            |          rt          j                            |          n|t          j        t+          |          t                                gt                                           n@# t6          $ r3}t          dd  d d dg t          j        |           Y d }~nd }~ww xY wt          j        |t                                S  j         t          j        u rdt                    dk     rt          j        dt                      iS                     t?          j         tB          j                            S  j         t          j"        u rt          j#        dt                      iS  j         t          j$        u rt                    d	k    s-t                    dk    rd	                                         rst                    dk    rd	         
                                }nd }d  t          j$        d         %                              |          D             }t          j        |t                                S tM                      '                              S )!Nc              3   "   K   | ]
}|d k    V  dS )repeatNr   .0kws     r"   	<genexpr>z2ItertoolsVariable.call_function.<locals>.<genexpr>?   s&      ::b2>::::::r#   z(Unsupported kwargs for itertools.productcall_function  z#Expected kwargs: 'repeat', but got ,r2   gb_typecontextexplanationhintsr   c                 :    g | ]}|                               S r   )force_unpack_var_sequence)r4   argr,   s     r"   
<listcomp>z3ItertoolsVariable.call_function.<locals>.<listcomp>L   s'    FFF#C11"55FFFr#   c                 P    g | ]#}t          j        t          |                    $S r   r   TupleVariablelistr4   items     r"   rB   z3ItertoolsVariable.call_function.<locals>.<listcomp>M   s9        'T

33  r#   )mutation_typer   r   c              3   "   K   | ]
}|d k    V  dS )keyNr   r3   s     r"   r6   z2ItertoolsVariable.call_function.<locals>.<genexpr>e   s&      7722;777777r#   z(Unsupported kwargs for itertools.groupbyz Expected kwargs: 'key', but got rK   c           
      L   t          | t          j                  r|                                 S t          | t          j                  r|                                 S t          dd d d dt          t          |                      dg t          j
                   d S )Nz*Unsupported key type for itertools.groupbyr7   r8   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)rK   r-   r    r   s    r"   retrieve_const_keyz;ItertoolsVariable.call_function.<locals>.retrieve_const_keyn   s    c9#<== ,,...Y%?@@ 
11333$ L G G G G Gv G G%c<?S		NN%c %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                 l                          d                              | gi                     S )NrK   )getcall_function)xr    rS   r,   s    r"   keyfuncz0ItertoolsVariable.call_function.<locals>.keyfunc   s;    --

5))77QCDD  r#   c                      |           S r*   r   )rW   rS   s    r"   rX   z0ItertoolsVariable.call_function.<locals>.keyfunc   s    --a000r#   )rK   z7Unexpected failure during itertools.groupby() iterationz6Unexpected failure in invoking function during groupby)r;   r<   r=   r>   from_excrI   c                 P    g | ]#}t          j        t          |                    $S r   rD   rG   s     r"   rB   z3ItertoolsVariable.call_function.<locals>.<listcomp>   s9        'T

33  r#   )(r   	itertoolsproductanykeysr   joinsetr   
USER_ERRORr+   r   ListIteratorVariabler   combinationslenhas_unpack_var_sequenceis_python_constantunpack_var_sequenceappendrE   rF   groupbyrR   r   
is_literalcreate	Exceptionr2   RepeatIteratorVariableinline_user_function_returnr   buildr   countCountIteratorVariablepermutationsr@   r   rV   )r   r,   r-   r    rseqsitemsiterablerH   seqrX   resultkverS   r!   s   ````           @r"   rV   zItertoolsVariable.call_function6   sP    :***::FKKMM:::::  FCTCCDCC6CC!CxxFKKMM 2 2hZ ?@@!C !C9-89    6;;==((8$7799FFFFFFFD %-t>A>>  E 1%5%7%7    J)000 1D		QQ//33 Q**,,  Aw22266HQ**,,AE!.x;; B BY4T$ZZ@@AAAA1%5%7%7    Z9,,,7777777  FCTCCDCC6CC!@xxFKKMM 2 2eW <==!@ !@9-89          4yyA~~$q'"A"A""E"E~1g11"55 ICTCCDCC6CC!D48!D !DGM!D !D !D
 T*6           1 1 1 1 1 F%-cw???  DAqMM!/ $-#=#H#H#K#K!'	 : A A! D D D%& ) >$(GG;K;M;M!" !" !"	 +;*<*<
 
 
        UCTCCDCC6CC X:-9:         1&6&8&8    Z9+++4yy1}} 7)9););   11%b)*:;;T6   Z9?**2%5%7%7   J)000TaCIINNtAw7Q7Q7S7SN %3 4yyA~~G..00 %2G55b991   E 1%5%7%7    77((T6:::s   B>P 
Q%)QQr   N)r,   r   r-   r.   r    r/   r   r   )	__name__
__module____qualname__r   rP   r(   r+   rV   __classcell__r!   s   @r"   r   r   +   s             2# 2 2 2 2  ^;#^; &^; -	^;
 
^; ^; ^; ^; ^; ^; ^; ^; ^; ^;r#   r   c                   R     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   Nc                 :     t                      j        di | d S r   )r   r   )r   r    r!   s     r"   r   zIteratorVariable.__init__   s&    ""6"""""r#   c                 L    t          dd|  ddg t          j                   d S )NzUnimplemented next() callznext(r%   z(This abstract method must be implementedr:   )r   r   
DYNAMO_BUGr   r,   s     r"   next_variablezIteratorVariable.next_variable   s@    /#DOOOB1%01		
 	
 	
 	
 	
 	
r#   c                 @    g }|                      ||j                   |S r*   )force_apply_to_var_sequenceri   )r   r,   ry   s      r"   r@   z*IteratorVariable.force_unpack_var_sequence   s$    ((V];;;r#   c                     	 	  ||                      |                     n # t          $ r t          |           Y d S w xY wAr*   )r   r   r   )r   r,   fns      r"   r   z,IteratorVariable.force_apply_to_var_sequence   sb    	4%%b))****,   )"---	s   " ??c                     dS NTr   r   s     r"   has_force_unpack_var_sequencez.IteratorVariable.has_force_unpack_var_sequence   s    tr#   r}   )r~   r   r   r   r   rF   r   r@   r   boolr   r   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                 V     t                      j        di | || _        d| _        d S )NFr   )r   r   r   generator_exhausted)r   r   r    r!   s      r"   r   zObjectIteratorVariable.__init__  s5    ""6"""#(   r#   c                     | j         rt          t          |           	 | j                            |          S # t
          $ r	 d| _          w xY wr   )r   r   StopIterationr   r   r   r   s     r"   r   z$ObjectIteratorVariable.next_variable  s`    # 	8$]B777	8))"---( 	 	 	 (,D$		s	   8 A)r~   r   r   __doc__r   r   r   r   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 )
rn   rH   r   Nc                 H     t                      j        di | || _        d S r   )r   r   rH   )r   rH   r    r!   s      r"   r   zRepeatIteratorVariable.__init__  s+    ""6"""			r#   c                     | j         S r*   )rH   r   s     r"   r   z$RepeatIteratorVariable.next_variable   s
    yr#   codegenr   c                                          fd            | j                                       t          dd                     d S )Nc                                                                 t                                         d          g          S )Nr2   extend_outputcreate_load_python_moduler\   create_load_attrr   s   r"   <lambda>z4RepeatIteratorVariable.reconstruct.<locals>.<lambda>%  s>    G))55i@@,,X66  r#   r   F)add_push_nullrH   r   r	   r   r   s    `r"   reconstructz"RepeatIteratorVariable.reconstruct#  sh       	
 	
 	
 		21e<<=====r#   r   r   )r~   r   r   r   r   r   r   r   r   s   @r"   rn   rn     sn        _ 4      
  
> 
> 
> 
> 
> 
> 
> 
>r#   rn   c                   <     e Zd Zddededdf fdZd ZddZ xZS )rr   r   r   rH   stepr   Nc                      t                      j        di | t          |t                    st	          j        |          }t          |t                    st	          j        |          }|| _        || _        d S r   )r   r   rM   r   r   rl   rH   r   )r   rH   r   r    r!   s       r"   r   zCountIteratorVariable.__init__1  sv    ""6"""$00 	1#*400D$00 	1#*400D				r#   c                     |                                  sJ | j        }|j        j                            |            | j                            |d| j        gi           | _        |S )N__add__)
is_mutablerH   outputside_effectsmutationcall_methodr   )r   r,   old_items      r"   r   z#CountIteratorVariable.next_variable:  s^         9
	''---I))"i$)bII	r#   r   r   c                                          fd            | j                    | j                                       t	          dd                     d S )Nc                                                                 t                                         d          g          S )Nrq   r   r   s   r"   r   z3CountIteratorVariable.reconstruct.<locals>.<lambda>C  s>    G))55i@@,,W55  r#   r   F)r   rH   r   r   r	   r   s    `r"   r   z!CountIteratorVariable.reconstructA  sz       	
 	
 	
 			21e<<=====r#   )r   r   r   )r~   r   r   intr   r   r   r   r   s   @r"   rr   rr   0  sz         S C $        > > > > > > > >r#   rr   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strictF	iterablesr   Nc                      t                      j        di | t          |t                    sJ || _        d| _        || _        d S Nr   r   )r   r   rM   rF   r   r   r   )r   r   r   r    r!   s       r"   r   zZipVariable.__init__Z  sQ     	""6""")T*****"
r#   c                     t           S r*   )zipr'   s    r"   python_typezZipVariable.python_typeg      
r#   c                 D    t          fd| j        D                       S )Nc              3   l   K   | ].}t          |t                    p|                              V  /d S r*   )rM   rF   rf   )r4   itr,   s     r"   r6   z6ZipVariable.has_unpack_var_sequence.<locals>.<genexpr>k  sT       
 
 r4  BB$>$>r$B$B
 
 
 
 
 
r#   )allr   r   s    `r"   rf   z#ZipVariable.has_unpack_var_sequencej  s=     
 
 
 
n
 
 
 
 
 	
r#   r   c                 \   |                      |          sJ g }| j        D ]b}t          |t                    r#|                    || j        d                     :|                    |                    |                     c| j        r	d| j        ini }t          |i |}d |D             S )Nr   c                 P    g | ]#}t          j        t          |                    $S r   rD   )r4   vars     r"   rB   z3ZipVariable.unpack_var_sequence.<locals>.<listcomp>z  s)    EEEs	'S		22EEEr#   )	rf   r   rM   rF   ri   r   rh   r   r   )r   r,   r   r   r    zippeds         r"   rh   zZipVariable.unpack_var_sequencep  s    ++B/////	. 	= 	=B"d## =  DJLL!12222  !7!7!;!;<<<<,0K?(DK((Ri*6**EEfEEEEr#   c                    |                                  sJ t          | j                  dk    rt          t                     | j        g }fd}	 t          | j                  D ]#\  }}|                     ||                     $ny# t          $ rl | j	        rc|dk    r8| j        D ]/}	  ||           n# t          $ r t                     Y *w xY w n t                     t          t          d          d  w xY wj        j                            |            | xj        dz  c_        t!          j        |          S )Nr   c                     t          | t                    r0t          |           k    rt          t                     |          S |                               S r*   )rM   rF   re   r   r   r   )r   	old_indexr,   s    r"   get_itemz+ZipVariable.next_variable.<locals>.get_item  sT    "d## ,B'',]B???)}$''+++r#   z3zip() has one argument of len differing from othersr   )r   re   r   r   r   r   	enumerateri   r   r   r   r   
ValueErrorr   r   r   r   rE   )r   r,   r-   r   idxr   r   s    `    @r"   r   zZipVariable.next_variable|  s        t~!##$]B777J		, 	, 	, 	, 	, 	,	$T^44 * *RHHRLL))))*( 	 	 	{ !88"n 
 
%$HRLLLL8 % % %5b999$H%  )"---I   )	, 		''---

a

&t,,,s0   8B  D0B<;D<CDC-Dr   r   c           	         | j         D ]x}t          |t                    rV|| j        d          }|                    |           |                    t          dt          |                               m ||           yd S NBUILD_TUPLErA   )r   rM   rF   r   foreachappend_outputr
   re   )r   r   r   remaining_itemss       r"   reconstruct_itemszZipVariable.reconstruct_items  s    . 	 	B"d## "$TZ\\"2000%%&}#o:N:NOOO    	 	r#   c           	                              fdd           |                                                    t          dt	          | j                                       t          j        dk    rd                    	                    d          	                    | j
                  t          dd	          t          d
d	          g           d S                     t          d
d                     d S )Nc                  0                          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
   re   r   sysversion_infor   create_load_constr   r   s    `r"   r   zZipVariable.reconstruct  s   ????RV 	 	
 	
 	
 	w'''}#dn2E2EFFF	
 	
 	
 w&&!!--h77--dk::&{:::&'9qAAA	     !!"45GQ"O"O"OPPPPPr#   )Fr   )r~   r   r   r   r   _nonvar_fieldsrF   r   r   r   r   rf   rh   r   r   r   r   r   s   @r"   r   r   O  s        
 	 
	(N  ( 
 
       
T 
 
 
 

F.?)@ 
F 
F 
F 
F,- ,- ,-\	 	 	 	Q Q Q Q Q Q Q Qr#   r   c                   |     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                 J     t                      j        |fi | || _        d S 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                     dS )NFr   r   s     r"   rf   z#MapVariable.has_unpack_var_sequence  s    ur#   c                     t                                          |          }| j                            ||j        i           S r*   )r   r   r   rV   rv   )r   r,   r-   r!   s      r"   r   zMapVariable.next_variable  s6    ww$$R((w$$RR888r#   r   r   c                                         fdd            | j                   |                                                    t	          dt          | j                  dz             t	          dd          g           d S )	Nc                  0                          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
   re   r   r   s    `r"   r   zMapVariable.reconstruct  s    ????RV 	 	
 	
 	
 	w'''"=c$.6I6IA6MNNN"#51===	
 	
 	
 	
 	
r#   r   )r~   r   r   r   r   rF   r   r   r   r   rf   r   r   r   r   s   @r"   r   r     s          d?3_DEF
 
       T    9 9 9 9 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   rw   r   Nc                 d     t                      j        di | || _        || _        d| _        d S r   )r   r   r   rw   r   )r   r   rw   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                 j    t          | j        t                    p| j                            |          S r*   )rM   rw   rF   rf   r   s     r"   rf   z&FilterVariable.has_unpack_var_sequence  s2    $-.. 
$-2W2W3
 3
 	
r#   r   c                 *   |                      |          sJ d }t          | j        t                    r| j        | j        d          }n| j                            |          }| j                            ||i           }t          j	        |g          gS r*   )
rf   rM   rw   rF   r   rh   r   rV   r   rE   )r   r,   r   filtereds       r"   rh   z"FilterVariable.unpack_var_sequence  s    ++B/////dmT** 	7tz||,BB22266B7((R44'
3344r#   c                 j     fd}	  |            } xj         dz  c_         t           j        t                    r j        j        |}n j                            |gi           }t          j        t          j	                                      |gi           }|
                                r|S )Nc                      j         } t          j        t                    r:| t	          j                  k    rt          t                     j        |          S j                                      S r*   )r   rM   rw   rF   re   r   r   r   )r   r   r,   s    r"   _nextz+FilterVariable.next_variable.<locals>._next  sf    
I$-.. 7DM 2 222,]B???}Y//}222666r#   Tr   )r   rM   r   r   r   rV   r   UserFunctionVariabler   	predicater+   )r   r,   r   rH   respred_ress   ``    r"   r   zFilterVariable.next_variable  s    	7 	7 	7 	7 	7 	7	577DJJ!OJJ$'#344 <9Ng++B;; 5# mBr**  **,, 	r#   r   r   c                    t          | j        t                    r\| j        | j        d          }|                    |           |                    t          dt          |                               d S  || j                   d S r   )rM   rw   rF   r   r   r   r
   re   )r   r   r   s      r"   r   z FilterVariable.reconstruct_items/  s    dmT** 	#"mDJLL9OOOO,,,!!"=c/6J6JKKK     GDM"""""r#   c                                          fd            | j                   |                                                    t	          dd                     d S )Nc                  0                          dd          S )Nr   r   r   r   s   r"   r   z,FilterVariable.reconstruct.<locals>.<lambda>:  s    g&>&>z8&T&T r#   r   F)r   r   r   r   r	   r   s    `r"   r   zFilterVariable.reconstruct9  sl    TTTTUUUw'''21e<<=====r#   r   )r~   r   r   r   r   r   r   r   rF   r   r   r   rf   rh   r   r   r   r   r   s   @r"   r   r     s        
 			(N
		 _->?	
 
	 	 	 	 	 	  
T 
 
 
 

5.?)@ 5 5 5 5  0# # # #> > > > > > > >r#   r   )%r   r\   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   rn   rr   r   r   r   r   r#   r"   <module>r     s        



 ' ' ' ' ' ' ' ' 6 6 6 6 6 6 6 6 6 6 N N N N N N N N              4 3 3 3 3 3 3 3 & & & & & &  E//////DDDDDD   i; i; i; i; i; i; i; i;X               F    -   @> > > > >- > > >,> > > > >, > > >>xQ xQ xQ xQ xQ" xQ xQ xQv#
 #
 #
 #
 #
+ #
 #
 #
LM> M> M> M> M>% M> M> M> M> M>r#   