
    i                        d dl mZ d dlZd dlZd dlZd dlmZmZ ddlm	Z	 ddl
mZmZ erd dlmZ d d	lmZ dd
lmZ  G d d      Z G d dee      Z G d d      Z	 	 	 	 ddZddZ e        y)    )annotationsN)AnyTYPE_CHECKING   )is_function_or_wrapper   )VariableTrackerVariableTrackerMeta)Callable)Self)SymNodeVariablec                       e Zd ZdZddZddZy)	LazyCachez+Container to cache the real VariableTrackerc                d    t        |t              s|sJ || _        || _        d | _        d | _        y N)
isinstanceLazySymNodeFormatStringvaluesource	name_hintvt)selfr   r   s      V/var/www/html/engine/venv/lib/python3.12/site-packages/torch/_dynamo/variables/lazy.py__init__zLazyCache.__init__   s0    %!89M6
%)*.    c                   | j                   J ddlm} ddlm} |j                         }t        | j                  t              r,|j                  j                  || j                        | _         n1 |j                  || j                        | j                        | _         | j                  %| j                   j                  | j                         | `| `| `y )Nr   )InstructionTranslatorr   )builder)r   symbolic_convertr    r   
current_txr   r   r   SourcelessBuildercreateVariableBuilderr   r   set_name_hint)r   r   r   txs       r   realizezLazyCache.realize   s    ww<"--/djj"9://66r4::FDG>g--b$++>tzzJDG>>%GG!!$..1JKNr   N)r   r   r   r   returnNoner(   r)   )__name__
__module____qualname____doc__r   r'    r   r   r   r      s    5/r   r   c                       e Zd ZdZdZdhej                  Zedd       Zd fdZ	ddZ
ddZddZdd	Zdd
ZddZddZddZddZddZej(                  ZeZe	 d 	 	 	 	 	 d!d       ZddZddZddZ xZS )"LazyVariableTrackera  
    A structure that defers the creation of the actual VariableTracker
    for a given underlying value until it is accessed.

    The `realize` function invokes VariableTracker.build() to produce the real object.
    Once a LazyVariableTracker has been realized, internal bookkeeping will
    prevent double realization.

    This object should be utilized for processing containers, or objects that
    reference other objects where we may not want to take on creating all the
    VariableTrackers right away.
    T_cachec                2    t        t        | |      fd|i|S )Nr   )r1   r   )r   r   optionss      r   r#   zLazyVariableTracker.createE   s    "9UF#;VFVgVVr   c                V    t        |t              sJ t        |   di | || _        y )Nr/   )r   r   superr   r2   )r   r2   kwargs	__class__s      r   r   zLazyVariableTracker.__init__I   s*    &),,,"6"r   c                    | j                   j                  2| j                   j                          | j                   j                  J | j                   j                  S )z.Force construction of the real VariableTracker)r2   r   r'   r   s    r   r'   zLazyVariableTracker.realizeN   sB    ;;>>!KK!;;>>---{{~~r   c                J    t         j                  || j                               S )zNCheck isinstance after realizing, used by ImplicitRealizingVariableTrackerMeta)type__instancecheck__r'   )r   clss     r   lazy_isinstancez#LazyVariableTracker.lazy_isinstanceU   s    %%c4<<>::r   c                    | j                         r.| j                  j                  J | j                  j                  S | S )z4Return the real VariableTracker if it already exists)is_realizedr2   r   r:   s    r   unwrapzLazyVariableTracker.unwrapY   s5    ;;>>---;;>>!r   c                2    | j                   j                  d uS r   )r2   r   r:   s    r   rA   zLazyVariableTracker.is_realized`   s    {{~~T))r   c                   |j                  d| j                        | j                  u sJ |j                  d| j                        | j                  ur| j                          t	        j
                  | j                         fi |S )Nr2   r   )getr2   r   r'   r	   clonerB   )r   r7   s     r   rF   zLazyVariableTracker.clonec   sc    zz(DKK0DKK???::h,DKK?LLN$$T[[]=f==r   c                d    | j                         rJ t        | j                  j                        S r   )rA   r<   r2   r   r:   s    r   	peek_typezLazyVariableTracker.peek_typei   s)    ##%%%DKK%%&&r   c                R    | j                         rJ | j                  j                  S r   rA   r2   r   r:   s    r   
peek_valuezLazyVariableTracker.peek_valuem   s$    ##%%%{{   r   c                    | j                         r&| j                  j                  j                  |       y || j                  _        y r   )rA   r2   r   r%   r   )r   names     r   r%   z!LazyVariableTracker.set_name_hintq   s0    KKNN((.$(DKK!r   c                    d}| j                         r"|dt        | j                                dz  }|S |d| j                          dz  }|S )NzLazyVariableTracker(z
realized: )zunrealized: )rA   reprrB   rH   )r   variable_infos     r   __str__zLazyVariableTracker.__str__w   s]    .z$t{{}*=)>a@@M  |DNN,<+=Q??Mr   c                6    t        | j                         |      S r   getattrr'   )r   items     r   __getattr__zLazyVariableTracker.__getattr__   s    t||~t,,r   c           	         i t        |      }|v r|   d   S t        |      }t        |t              r! j	                  |j                               }nt        |t              r?|}|j                  }|j                  }|D ]  }||vs j	                  ||         ||<   ! n|t        u r |D 	cg c]  }	 j	                  |	       }}	nu|t        u rt         fd|D              }nW|t        t        j                  fv r=t        |j                               D 
	ci c]  \  }
}	|
 j	                  |	       }}
}	n|}||f|<   |S c c}	w c c}	}
w )zP
        Walk an object and realize all LazyVariableTrackers inside it.
        r   c              3  B   K   | ]  }j                  |        y wr   )realize_all).0vcacher>   s     r   	<genexpr>z2LazyVariableTracker.realize_all.<locals>.<genexpr>   s     D3??1e4Ds   )idr<   
issubclassr1   rZ   r'   r	   __dict___nonvar_fieldslisttupledictcollectionsOrderedDictitems)r>   r   r]   idx	value_clsresult
value_dictnonvarskeyr\   ks   ` `        r   rZ   zLazyVariableTracker.realize_all   sU    =Ei%<:a= K	i!45__U]]_e<F	?3FJ**G! Ng%&)oojou&MJsON $9>?Acooa/?F?%DeDDF4!8!899?CEKKM?RStq!aE22SFSF e_c
 @ Ts   5E#Ec                    dd| j                         rJ | j                  j                  }t        |t              rt        fd|D              S  |      S )Nc                |    t        j                  |       xs& t        t        |       t              xs t	        |       S r   )inspect	isbuiltinr`   r<   r   )r   s    r   _helperz0LazyVariableTracker.is_hashable.<locals>._helper   s7     !!%( 1d5k401)%0r   c              3  .   K   | ]  } |        y wr   r/   )r[   r\   rt   s     r   r^   z2LazyVariableTracker.is_hashable.<locals>.<genexpr>   s     1awqz1s   )r   r   r(   bool)rA   r2   r   r   rd   all)r   r   rt   s     @r   is_hashablezLazyVariableTracker.is_hashable   sP    	 ##%%%!!eU#15111u~r   c                R    | j                         rJ | j                  j                  S r   rJ   r:   s    r   original_valuez"LazyVariableTracker.original_value   s$    ##%%%{{   r   c                R    | j                         rJ | j                  j                  S r   )rA   r2   r   r:   s    r   original_sourcez#LazyVariableTracker.original_source   s$    ##%%%{{!!!r   )r   r   r   r   r4   r   r(   r1   )r2   r   r7   r   r(   r)   )r(   r	   )r>   r<   r(   rv   )r(   zVariableTracker | Self)r(   rv   )r7   r   r(   r	   )r(   z	type[Any])r(   r   )rM   strr(   r)   r(   r}   )rV   r}   r(   r   r   )r   r   r]   z!dict[int, tuple[Any, Any]] | Noner(   r   )r+   r,   r-   r.   _no_implicit_realizer	   rb   staticmethodr#   r   r'   r?   rB   rA   rF   rH   rK   r%   rR   rW   visit__repr__classmethodrZ   rx   rz   r|   __classcell__)r8   s   @r   r1   r1   3   s      @!?!?@NW W
;*>'!)- !!EH 48%% 1% 
	% %N$!
"r   r1   )	metaclassc                  (    e Zd Z	 	 	 	 	 	 ddZddZy)r   c                r    ddl m} || _        |j                  d|j	                         z   dz         | _        y )Nr   )ConstantVariablez{:})constantr   sym_node_varr#   as_python_constantfmt_var)r   sym_node_variablefmt_spec_varr   s       r   r   z LazySymNodeFormatString.__init__   s7     	/-'..<2244s:
r   c                    t         j                  | j                  j                         t        | j                  j                                     S r   )r}   formatr   r   r   evaluate_exprr:   s    r   r   z LazySymNodeFormatString.__repr__   s:    zzLL++-!!//12
 	
r   N)r   r   r   r	   r(   r)   r~   )r+   r,   r-   r   r   r/   r   r   r   r      s$    
!0
@O
	

r   r   c                p     t        j                  t        t                     	 	 	 	 	 	 	 	 d fd       }|S )Nc                D     t        | j                               |i |S r   rT   )r   argsr7   rM   s      r   realize_and_forwardz8_create_realize_and_forward.<locals>.realize_and_forward   s$     -wt||~t,d=f==r   )r   r1   r   r   r7   r   r(   r   )	functoolswrapsrU   r	   )rM   r   s   ` r   _create_realize_and_forwardr      sO     __W_d34>!>*->9<>	> 5>
 r   c                     t         j                  j                         D ]>  \  } }| t        j                  vst	        |      s%t        t        | t        |              @ y r   )r	   ra   rh   r1   callablesetattrr   )rM   r   s     r   	_populater      sO    &//557 Ve*333+T3Nt3TUVr   )rM   r}   r(   z.Callable[[LazyVariableTracker, Any, Any], Any]r*   )
__future__r   rf   r   rr   typingr   r   utilsr   baser	   r
   collections.abcr   typing_extensionsr   tensorr   r   r1   r   r   r   r/   r   r   <module>r      sq    "    % * 6 (&' @V"/5H V"r
 
$	
	3	V 
r   