
    VhbL                     P   d Z ddl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 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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)OptionalTYPE_CHECKINGUnion   )	polyfills	variables)create_call_functioncreate_instruction)handle_observed_exceptionObservedUserStopIterationraise_observed_exceptionunimplemented	UserError   )ValueMutationNewVariableTracker)ConstantVariable)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      L/home/dcms/DCMS/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                 f   | j                   t        j                  u rst        fd|D              rx|D cg c]  }|j	                         }}t        j                  | D cg c]   }t        j                  t        |            " }}t        j                  |t                     S | j                   t        j                  u rddlm} t        d j                         D              r9t        ddj!                  t#        j                               dd	hz
                j%                  d      }	t'        |      d
v r|d   j)                        r|d   j	                        }
d	v rt'        |      dk(  rd	   j*                  }ndt'        |      dk(  r|d   j*                  }nFt'        |      dk(  r! |t,        j.                        j*                  }nt        d       nt        d       g }|	|j1                  |	       
D ]%  }|	|}	n	  |	|gi       }	|j1                  |	       ' t        j                  |t                     S | j                   t        j4                  u rǉst'        |      dk(  r|d   j)                        r|d   j7                         r|d   j	                        }|d   j9                         }g }t        j4                  ||      D ]/  }|j1                  t        j                  t        |                   1 t        j                  |t                     S | j                   t        j:                  u rt        d j                         D              r8t        ddj!                  t#        j                               dhz
                d t'        |      dk(  r)|d   j)                        r|d   j	                        }
nt        d       dv rfd}nfd}g }	 t        j:                  
|      D ]  \  }}|j1                  t        j                  t
        j<                  j?                  |      rt
        j<                  jA                  |      n|t        j                  t        |      t                     gt                             	 t        j                  |t                     S | j                   t        jB                  u r`t'        |      dk  rt        jD                  |dt               iS jG                  tI        jJ                  tL        jB                        |      S | j                   t        jN                  u rt        jP                  |dt               iS | j                   t        jR                  u rt        jT                  |dt               iS tV        | U  |      S c c}w c c}w # t2        $ r!}t        d d| |	 d|       Y d }~d }~ww xY w# t2        $ r}t        d|       Y d }~qd }~ww xY w)Nc              3   @   K   | ]  }|j                          y wr)   )has_unpack_var_sequence).0argtxs     r!   	<genexpr>z2ItertoolsVariable.call_function.<locals>.<genexpr>A   s     DC//3Ds   )mutation_typer   )BuiltinVariablec              3   $   K   | ]  }|d v 
 yw))initialfuncNr   )r.   keys     r!   r1   z2ItertoolsVariable.call_function.<locals>.<genexpr>M   s     Kc311Ks   z-Unsupported kwargs for itertools.accumulate: ,r5   r6   )r   r   r   r   zDitertools.accumulate can only accept one of: `func` kwarg, pos 2 argz.Unsupported arguments for itertools.accumulatezOUnexpected failure in invoking function during accumulate. Failed running func (r$   )from_excc              3   &   K   | ]	  }|d k7    yw)r7   Nr   )r.   kws     r!   r1   z2ItertoolsVariable.call_function.<locals>.<genexpr>   s     722;7s   z*Unsupported kwargs for itertools.groupby: r7   c                     t        | t        j                        r| j                         S t        | t        j                        r| j                         S t        dt        t        |             z          y )Nz,Unsupported key type for itertools.groupby: )	
isinstancer   SymNodeVariableevaluate_exprr   r*   r   strtyper7   s    r!   retrieve_const_keyz;ItertoolsVariable.call_function.<locals>.retrieve_const_key   sY    c9#<#<=,,..Y%?%?@1133!FTRUYWr"   z+Unsupported arguments for itertools.groupbyc                 V     j                  d      j                  | gi             S )Nr7   )getcall_function)xr   rD   r0   s    r!   keyfuncz0ItertoolsVariable.call_function.<locals>.keyfunc   s-    -

5)77QCD r"   c                      |       S r)   r   )rH   rD   s    r!   rI   z0ItertoolsVariable.call_function.<locals>.keyfunc   s    -a00r"   rC   z1Unexpected failure when calling itertools.groupbyr2   ),r   	itertoolsproductallunpack_var_sequencer   TupleVariablelistListIteratorVariabler   
accumulatebuiltinr3   anykeysr   joinsetrF   lenr-   rG   operatoraddappend	Exceptioncombinationsis_python_constantr*   groupbyr   
is_literalcreaterepeatRepeatIteratorVariableinline_user_function_returnr   buildr   countCountIteratorVariablecycleCycleIteratorVariabler   )r   r0   argsr   r/   seqsitemitemsr3   accseqr6   eiterablerrI   resultkvrD   r    s    ` `               @r!   rG   zItertoolsVariable.call_function6   s    JJ)+++DtDD;?@CC++B/@D@@I@Q@QSW@X8<	''T
3E  11%5%7  ZZ9///0KV[[]KKCxxFKKM 2i5H HIJL
 **Y'C4yF"tAw'F'Fr'J1g11"5V#D	Q!&>77DY!^700DY!^*8<<8FFD!^ NOES! ";C"2T{B7 S!" 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@xxFKKM 2eW <=>@
 4yA~$q'"A"A""E1g11"5KL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  ZZ9??*22%5%7  7(T6::e AV % %mnrmsstuytz{~z  @A  B%& X  G s<   W)%WW"B3X "	X+XX	X0X++X0r   N)r0   r   rj   zlist[VariableTracker]r   zdict[str, VariableTracker]r   r   )	__name__
__module____qualname__r   rA   r'   r*   rG   __classcell__r    s   @r!   r   r   +   sO    2# 2_;#_; &_; -	_;
 
_; _;r"   r   c                   D     e Zd Zd fdZd Zdee   f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                     t        d       y )Nzabstract method, must implement)r   r   r0   s     r!   next_variablezIteratorVariable.next_variable   s    78r"   c                     g }	 	 |j                  | j                  |             "# t        $ r t        |       Y |S w xY wr)   )r[   r   r   r   )r   r0   rs   s      r!   force_unpack_var_sequencez*IteratorVariable.force_unpack_var_sequence   sL    d0045  - )"-s    & >>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   rP   r   r   boolr   rz   r{   s   @r!   r}   r}      s*    #9tO/D 4 r"   r}   c                   4     e Zd Zdeddf fdZd Zd Z xZS )rc   rl   r   Nc                 2    t        |   di | || _        y r   )r   r   rl   )r   rl   r   r    s      r!   r   zRepeatIteratorVariable.__init__   s    "6"	r"   c                     | j                   S r)   )rl   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 )Nrb   extend_outputcreate_load_python_modulerK   create_load_attrcodegens   r!   <lambda>z4RepeatIteratorVariable.reconstruct.<locals>.<lambda>   s3    G))55i@,,X6 r"   r   F)add_push_nullrl   r   r	   r   r   s    `r!   reconstructz"RepeatIteratorVariable.reconstruct   s:    	
 			21e<=r"   )rw   rx   ry   r   r   r   r   rz   r{   s   @r!   rc   rc      s     _ 4 

>r"   rc   c                   :     e Zd Zddededdf fdZd Zd Z xZS )	rg   rl   stepr   Nc                     t        |   di | t        |t              st	        j
                  |      }t        |t              st	        j
                  |      }|| _        || _        y r   )r   r   r>   r   r   ra   rl   r   )r   rl   r   r   r    s       r!   r   zCountIteratorVariable.__init__
  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_mutablerl   outputside_effectsmutationcall_methodr   )r   r0   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 )Nrf   r   r   s   r!   r   z3CountIteratorVariable.reconstruct.<locals>.<lambda>  s3    G))55i@,,W5 r"   r   F)r   rl   r   r   r	   r   s    `r!   r   z!CountIteratorVariable.reconstruct  sF    	
 					21e<=r"   )r   r   )rw   rx   ry   intr   r   r   rz   r{   s   @r!   rg   rg   	  s'    S C $ >r"   rg   c                   T     e Zd Z	 	 	 d	dedeee      dedee   ddf
 fdZd Z	 xZ
S )
ri   Niteratorsavedsaved_indexrl   r   c                 d    |g }t        |   di | || _        || _        || _        || _        y r   )r   r   r   r   r   rl   )r   r   r   r   rl   r   r    s         r!   r   zCycleIteratorVariable.__init__)  s<     =E"6" 
&	r"   c                    | j                         sJ | j                  	 | j                  j                  |      }t        | j                        t
        kD  rt        d       |j                  j                  j                  |        | j                  j                  |       || _        | j                  | j                  |      S | j                  S t        | j                        dkD  r[|j                  j                  j                  |        | j                  dz   t        | j                        z  | _        | j                  S t        t         |       y # t        $ r& t        |       d | _        | j                  |      cY S w xY w)Nz4input iterator to itertools.cycle has too many itemsr   r   )r   r   r   rX   r   MAX_ITERATOR_LIMITr   r   r   r   r[   rl   r   r   r   r   StopIteration)r   r0   new_items      r!   r   z#CycleIteratorVariable.next_variable9  s8      ==$.==66r:tzz?%77!N 		&&//5

!!(+$	99$--b11yy 
 _q II""++D1 $ 0 01 4DJJGD99$]B7 - .)"- $))"--.s   B%E E ,FF)Nr   N)rw   rx   ry   r}   r   rP   r   r   r   r   rz   r{   s   @r!   ri   ri   (  sW     26*." _-. 	
 ' 
 8r"   ri   c                        e Zd ZdZddhej
                  Z	 ddeeee   ef      de	ddf fdZ
d Zde	fd	Zded
   fdZd Zd Z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>   rP   r   r   r   )r   r   r   r   r    s       r!   r   zZipVariable.__init__`  s:     	"6")T***"
r"   c                     t         S r)   )zipr&   s    r!   python_typezZipVariable.python_typem      
r"   c                 @    t        fd| j                  D              S )Nc              3   d   K   | ]'  }t        |t              xs |j                         ) y wr)   )r>   rP   r-   )r.   itr0   s     r!   r1   z6ZipVariable.has_unpack_var_sequence.<locals>.<genexpr>q  s3      
 r4 BB$>$>r$BB
s   -0)rM   r   r   s    `r!   r-   z#ZipVariable.has_unpack_var_sequencep  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>   rP   r[   r   rN   r   r   r   rO   )r   r0   r   r   r   zippedvars          r!   rN   zZipVariable.unpack_var_sequencev  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 | 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)Nc                     t        | t              r#t        |       k\  rt        t               |    S | j                        S r)   )r>   rP   rX   r   r   r   )r   	old_indexr0   s    r!   get_itemz+ZipVariable.next_variable.<locals>.get_item  s>    "d#B',]B?)}$''++r"   r   z3zip() has one argument of len differing from othersr   )r   r   	enumerater   r[   r   r   r   r   
ValueErrorr   r   r   r   rO   )r   r0   rj   r   idxr   r   s    `    @r!   r   zZipVariable.next_variable  s      JJ		,	$T^^4 *RHRL)*0 			''-

a
&&t,,1 ) 	{{!8"nn 
%$RL8 %5b9$% 
 )"-I  )	s/   4B. .)DC! D!C85D7C88%Dc           	          | j                   D ]`  }t        |t              rF|| j                  d  }|j	                  |       |j                  t        dt        |                   Y ||       b y NBUILD_TUPLEr/   )r   r>   rP   r   foreachappend_outputr
   rX   )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
   rX   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"   )F)rw   rx   ry   __doc__r}   _nonvar_fieldsrP   r   r   r   r   r   r-   rN   r   r   r   rz   r{   s   @r!   r   r   U  s    
 	 
	(	(N d?3_DEF 
 

T 

F.?)@ 
F(-T	Qr"   r   c                   h     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
 Z xZS )MapVariablez(
    Represents map(fn, *iterables)
    fnr   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   rG   rm   )r   r0   rj   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
   rX   r   r   s    `r!   r   zMapVariable.reconstruct  sn    ?RV 	 	
 	w'"=c$..6IA6MN"#51=	
r"   )rw   rx   ry   r   r   rP   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 Zd Z xZS )FilterVariablez)
    Represents filter(fn, iterable)
    r   r   rq   r   Nc                 N    t        |   di | || _        || _        d| _        y r   )r   r   r   rq   r   )r   r   rq   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>   rq   rP   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>   rq   rP   r   rN   r   rG   r   rO   )r   r0   r   filtereds       r!   rN   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_          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>   rq   rP   rX   r   r   r   )r   r   r0   s    r!   _nextz+FilterVariable.next_variable.<locals>._next  sY    

I$--.DMM 22,]B?}}Y//}}22266r"   r   )r   r   rG   r   UserFunctionVariabler   	predicater*   )r   r0   r   rl   respred_ress   ``    r!   r   zFilterVariable.next_variable  s    	7 7DJJ!OJ''''TFB7C 55##mBr*  **, r"   c                     t        | j                  t              rP| j                  | j                  d  }|j	                  |       |j                  t        dt        |                   y  || j                         y r   )r>   rq   rP   r   r   r   r
   rX   )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>9  s    g&>&>z8&T r"   r   F)r   r   r   r   r	   r   s    `r!   r   zFilterVariable.reconstruct8  sB    TUw'21e<=r"   )rw   rx   ry   r   r}   r   r   r   rP   r   r   r   r-   rN   r   r   r   rz   r{   s   @r!   r   r     s    
 			(	(N
		 _->?	
 
	
T 

5.?)@ 5*#>r"   r   )$r   rK   rY   r   typingr   r   r    r   r   bytecode_transformationr	   r
   excr   r   r   r   r   baser   r   constantr   torch._dynamo.symbolic_convertr   r   r   r}   rc   rg   ri   r   r   r   r   r"   r!   <module>r     s      
 1 1 # N  4 & D   j; j;Z 6>- >,>, >>*8, *8ZtQ" tQn#
+ #
LJ>% J>r"   