
    Vhd                         d dl Z d dlZd dlZd dlmZmZmZmZmZ d dl	m
Z
 ddlmZ ddlmZ ddlmZ  G d	 d
      Ze G d de             Z G d d      Zdedeeeegef   fdZddZ e        y)    N)AnyCallablefinalOptionalUnion)Self   )is_function_or_wrapper   )VariableTracker)SymNodeVariablec                   ,    e Zd ZdZdededdfdZddZy)		LazyCachez+Container to cache the real VariableTrackervaluesourcereturnNc                 V    t        |t              s|sJ || _        || _        d | _        y N)
isinstanceLazySymNodeFormatStringr   r   vt)selfr   r   s      L/home/dcms/DCMS/lib/python3.12/site-packages/torch/_dynamo/variables/lazy.py__init__zLazyCache.__init__   s)    %!89M6
-1    c                     | j                   J ddlm} |j                         }t	        | j
                  t              rd }n| j                  }t        j                  || j
                  |      | _         | `| `y )Nr	   )InstructionTranslator)
r   symbolic_convertr   
current_txr   r   r   r   r   build)r   r   txr   s       r   realizezLazyCache.realize   sb    ww<"--/djj"9:F[[F!''DJJ?JKr   r   N)__name__
__module____qualname____doc__r   r   r"    r   r   r   r      s$    52c 23 24 2r   r   c                   h    e Zd ZdZdhej
                  Zededededd fd       Zde	dedd	f fd
Z
defdZdeeef   fdZdefdZdedefdZdee   fdZdefdZdef fdZdedefdZej0                  ZeZe	 ddedeeeeeef   f      defd       ZdefdZ defdZ!def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.
    _cacher   r   optionsr   c                 2    t        t        | |      fd|i|S )Nr   )r*   r   )r   r   r,   s      r   createzLazyVariableTracker.create7   s    "9UF#;VFVgVVr   kwargsNc                 V    t        |t              sJ t        |   di | || _        y )Nr(   )r   r   superr   r+   )r   r+   r/   	__class__s      r   r   zLazyVariableTracker.__init__;   s*    &),,,"6"r   c                     | j                   j                  2| j                   j                          | j                   j                  J | j                   j                  S )z.Force construction of the real VariableTracker)r+   r   r"   r   s    r   r"   zLazyVariableTracker.realize@   sB    ;;>>!KK!;;>>---{{~~r   c                     | j                         r.| j                  j                  J | j                  j                  S | S )z4Return the real VariableTracker if it already exists)is_realizedr+   r   r4   s    r   unwrapzLazyVariableTracker.unwrapG   s5    ;;>>---;;>>!r   c                 2    | j                   j                  d uS r   )r+   r   r4   s    r   r6   zLazyVariableTracker.is_realizedN   s    {{~~T))r   c                    |j                  d| j                        | j                  u sJ |j                  d| j                        | j                  ur| j                          t	        j
                  | j                         fi |S )Nr+   r   )getr+   r   r"   r   cloner7   )r   r/   s     r   r;   zLazyVariableTracker.cloneQ   sc    zz(DKK0DKK???::h,DKK?LLN$$T[[]=f==r   c                 d    | j                         rJ t        | j                  j                        S r   )r6   typer+   r   r4   s    r   	peek_typezLazyVariableTracker.peek_typeW   s)    ##%%%DKK%%&&r   c                 R    | j                         rJ | j                  j                  S r   r6   r+   r   r4   s    r   
peek_valuezLazyVariableTracker.peek_value[   s$    ##%%%{{   r   c                 r    | j                         rt        | j                               S t        |          S r   )r6   reprr7   r1   __repr__)r   r2   s    r   __str__zLazyVariableTracker.__str___   s.    &&w!!r   itemc                 6    t        | j                         |      S r   getattrr"   )r   rF   s     r   __getattr__zLazyVariableTracker.__getattr__d   s    t||~t,,r   cachec           	          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vrK   clss     r   	<genexpr>z2LazyVariableTracker.realize_all.<locals>.<genexpr>   s     D3??1e4Ds   )idr=   
issubclassr*   rN   r"   r   __dict___nonvar_fieldslisttupledictcollectionsOrderedDictitems)rQ   r   rK   idx	value_clsresult
value_dictnonvarskeyrP   ks   ` `        r   rN   zLazyVariableTracker.realize_allk   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t         dt        fd| j                         rJ | j                  j                  }t        |t              rt        fd|D              S  |      S )Nr   r   c                 |    t        j                  |       xs& t        t        |       t              xs t	        |       S r   )inspect	isbuiltinrT   r=   r
   )r   s    r   _helperz0LazyVariableTracker.is_hashable.<locals>._helper   s7     !!%( 1d5k401)%0r   c              3   .   K   | ]  } |        y wr   r(   )rO   rP   rh   s     r   rR   z2LazyVariableTracker.is_hashable.<locals>.<genexpr>   s     1awqz1s   )r   boolr6   r+   r   r   rX   all)r   r   rh   s     @r   is_hashablezLazyVariableTracker.is_hashable   s^    	3 	4 	 ##%%%!!eU#15111u~r   c                 R    | j                         rJ | j                  j                  S r   r@   r4   s    r   original_valuez"LazyVariableTracker.original_value   s$    ##%%%{{   r   c                 R    | j                         rJ | j                  j                  S r   )r6   r+   r   r4   s    r   original_sourcez#LazyVariableTracker.original_source   s$    ##%%%{{!!!r   r   )$r$   r%   r&   r'   r   rV   staticmethodr   r.   r   r   r"   r   r   r7   rj   r6   r;   r=   r>   rA   strrE   rJ   visitrD   classmethodr   rY   intrX   rN   rl   rn   rp   __classcell__)r2   s   @r   r*   r*   &   si    @!?!?@NWc W3 W3 W;P W Wy C D 
 ot34 *T *>c >o >'49 '!C !" "
- - - !!EH 7;%% S%S/123% 
	% %NT $! !
" "r   r*   c                   ,    e Zd ZdededdfdZdefdZy)r   sym_node_variablefmt_spec_varr   Nc                 r    ddl m} || _        |j                  d|j	                         z   dz         | _        y )Nr   )ConstantVariablez{:})constantr{   sym_node_varr.   as_python_constantfmt_var)r   rx   ry   r{   s       r   r   z LazySymNodeFormatString.__init__   s7     	/-'..<2244s:
r   c                     t         j                  | j                  j                         t        | j                  j                                     S r   )rr   formatr   r   r~   evaluate_exprr4   s    r   rD   z LazySymNodeFormatString.__repr__   s:    zzLL++-!!//12
 	
r   )r$   r%   r&   r   r   r   rr   rD   r(   r   r   r   r      s+    
!0
@O
	

# 
r   r   namer   c           	           t        j                  t        t                     dt        dt
        dt
        dt
        f fd       }|S )Nr   argsr/   r   c                 D     t        | j                               |i |S r   rH   )r   r   r/   r   s      r   realize_and_forwardz8_create_realize_and_forward.<locals>.realize_and_forward   s$     -wt||~t,d=f==r   )	functoolswrapsrI   r   r*   r   )r   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   rU   r\   r*   callablesetattrr   )r   r   s     r   	_populater      sO    &//557 Ve*333+T3Nt3TUVr   r#   )rZ   r   rf   typingr   r   r   r   r   typing_extensionsr   utilsr
   baser   tensorr   r   r*   r   rr   r   r   r(   r   r   <module>r      s       8 8 " * ! # 4 F"/ F" F"R
 
$	
	"C-s23	V 
r   