
    Ph3                        d dl Z d dlmZ d dl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mZ dd	lmZmZ  G d
 de      Z G d d      Z G d d      Z G d de      Zd ZdefdZ G d de      Z G d de      Zd Zy)    N)Enum)AnyCallableDictList   )	variables)current_scope_idunimplemented)
AttrSourceSource)identityistypec                       e Zd ZdZdZdZy)MutableLocalSourcez
    If the VariableTracker.mutable_local represents a Variable that:
    - already existed that Dynamo began tracking while introspection (Existing)
    - is a new variable that is created during Dynamo introspection (Local)
    r      N)__name__
__module____qualname____doc__ExistingLocal     gC:\Users\daisl\Desktop\realtime-object-detection\venv\Lib\site-packages\torch/_dynamo/variables/base.pyr   r      s     HEr   r   c                   "    e Zd ZdZd Zd Zd Zy)ParentsTrackerz
    This is a perf optimization to limit the number of objects we need to visit in tx.replace_all.
    This must be a seperate object so that it is not cloned in apply.
    c                 "    t               | _        y N)dictparentsselfs    r   __init__zParentsTracker.__init__   s    376r   c                 "    d| j                   |<   y NT)r"   )r$   parents     r   addzParentsTracker.add!   s    #Vr   c                    t        | j                        }t        | j                        }|rO|j                         j                  D ]/  }||vst	        |t
              sJ d||<   |j                  |       1 |rO|j                         S r'   )r!   r"   listpop
isinstancer   appendkeys)r$   rvworklistr(   s       r   recursive_parentsz ParentsTracker.recursive_parents$   sw    $,,%",,.00#%fn===!%BvJOOF+	 1  wwyr   N)r   r   r   r   r%   r)   r2   r   r   r   r   r      s    
:$	r   r   c                       e Zd ZdZdefdZy)MutableLocalBasez/
    Base class for Variable.mutable_local
    typc                     |t         j                  u rd| _        y |t         j                  u rt	               | _        y t        d|        y )Nr   z Unsupported MutableLocalSource: )r   r   scoper   r
   r   )r$   r5   s     r   r%   zMutableLocalBase.__init__5   sC    0 $---DJ&,,,)+DJ<SEBCr   N)r   r   r   r   r   r%   r   r   r   r4   r4   0   s    D. Dr   r4   c                   .     e Zd ZdZ fdZd Zd Z xZS )MutableLocalz
    Marker used to indicate this (list, iter, etc) was constructed in
    local scope and can be mutated safely in analysis without leaking
    state.
    c                 @    t         |   t        j                         y r    )superr%   r   r   )r$   	__class__s    r   r%   zMutableLocal.__init__\   s    +112r   c                     t        |       S r    )idr#   s    r   __hash__zMutableLocal.__hash___   s    $xr   c                 
    | |u S r    r   )r$   others     r   __eq__zMutableLocal.__eq__b   s    u}r   )r   r   r   r   r%   r?   rB   __classcell__r<   s   @r   r9   r9   U   s    3r   r9   c                     | dk(  S )Nr   r   )scope_ids    r   _is_top_level_scoperG   f   s    q=r   mc                 L    t               }t        |      ry| j                  |k(  S r'   )r
   rG   r7   )rH   rF   s     r   is_side_effect_saferJ   j   s&    !H
 8$77hr   c                       e Zd Zd ZdefdZy)VariableTrackerMetac                 \    t        j                  | g|i |} |j                  |i | |S )zCall __post_init__)type__call____post_init__)clsargskwargsobjs       r   rO   zVariableTrackerMeta.__call__w   s4    mmC1$1&14*6*
r   returnc                     t         j                  t        j                  |      r(| t        t        j                  fvr|j                         }t         j                  | |      S )z-Make isinstance work with LazyVariableTracker)rN   __instancecheck__r	   LazyVariableTrackerVariableTrackerrealize)rQ   instances     r   rW   z%VariableTrackerMeta.__instancecheck__}   sW    !!))8
))
 
  '')H%%c844r   N)r   r   r   rO   boolrW   r   r   r   rL   rL   v   s    	5D 	5r   rL   c            	       t    e Zd ZdZh dZd Zed        Zedd fded gd f   fd       Z	d	 Z
d
 Zd Zd Zd Zd ZdedefdZdedd fdZd Zd Zd Zd Zded    fdZdefdZdee   fdZdedd fdZ	 	 	 	 	 	 d)dZ	 	 	 	 	 	 d)dZd Z d*dZ!d Z"d*d Z#d! Z$ddddd"d#e%d$e&d%ed&e'f fd'Z(d( Z) xZ*S )+rY   z
    Base class for tracked locals and stack values

    VariableTracker instances are immutable and should be copied in
    order to change them.
    >   valueguardssourcemutable_localparents_trackeruser_code_variable_namec                 r    t        | j                        }|j                  |        | j                  di |S )z)Shallow copy with some (optional) changesr   )r!   __dict__updater<   )r$   rS   rR   s      r   clonezVariableTracker.clone   s0    DMM"Ft~~%%%r   c                 .    | j                  t        |      S )z=Deeper (but not full) copy, leaving FX and user objects alone)applyr   )rQ   r^   s     r   copyzVariableTracker.copy   s     yy5))r   Nc                      y)NFr   _s    r   <lambda>zVariableTracker.<lambda>   s    %r   fnc                 *    
t               t        |      }|v r|   d   S t        |t              r |      s` fd}|j	                         }|j                         }  ||            }|s|j                         r ||j	                               }n |      }||j	                         }nt        |t              r"|D 	cg c]  }	 j                  |	       }}	nt        |t              rt         fd|D              }nlt        |t         t        j                  f      rJd|vsJ d       t        |j                               D 
	ci c]  \  }
}	|
 j                  |	       }}
}	n|}||f|<   |S c c}	w c c}	}
w )z
        Walk this object and call fn on all the VariableTracker
        instances to produce a new VariableTracker with the results.
        r   c                     d}t        | j                        }|j                         D ]8  }|| j                  vs||   }j	                  |      ||<   |xs |||   u}: |r | j
                  di |S | S )NFr   )r!   re   r/   _nonvar_fieldsri   rg   )	vchangedr0   keypriorcacherQ   ro   skip_fns	        r   update_object_dictz1VariableTracker.apply.<locals>.update_object_dict   s    #Gajj)B!wwya&6&66$&sGE&)iiE5'&JBsG&-&Ebg1EG	  )
 &qww}},Hr   c              3   F   K   | ]  }j                  |        y wr    )ri   ).0rs   rw   rQ   ro   rx   s     r   	<genexpr>z(VariableTracker.apply.<locals>.<genexpr>   s!     KU399RE7;Us   !r   z(_nonvar_fields should have excluded this)r!   r>   r-   rY   unwrapis_realizedr   r+   ri   tuplecollectionsOrderedDictitems)rQ   ro   r^   rw   rx   idxry   was_realizedresultrs   ks   `` ``      r   ri   zVariableTracker.apply   s    =FEi%<:a= e_-5>
 $002.u56#(9(9(; 0@FE%#]]_FE4 @EF1ciiAug6FFE5!KUKKFED+"9"9:;U*V,VV*@DU[[]@S@S1399RE733@S   F e_c
 G
s   F
Fc                 4    | j                   j                   dS )Nz())r<   r   r#   s    r   __str__zVariableTracker.__str__   s    ..))*"--r   c                     t        |       S r    )strr#   s    r   __repr__zVariableTracker.__repr__   s    4yr   c                     t        |  d      )Nz has no typeNotImplementedErrorr#   s    r   python_typezVariableTracker.python_type   s    !TF,"788r   c                     t        |  d      )zFor constantsz is not a constantr   r#   s    r   as_python_constantz"VariableTracker.as_python_constant   s    !TF*<"=>>r   c                 D    	 | j                          y# t        $ r Y yw xY wNTF)r   r   r#   s    r   is_python_constantz"VariableTracker.is_python_constant   s(    	##%" 		    	c                 d    | j                   r| j                   j                  |      S t               r    )r`   
make_guardr   )r$   ro   s     r   r   zVariableTracker.make_guard   s'    ;;;;))"--!##r   namerU   c                     t               )z/getattr(self, name) returning a python constantr   r$   txr   s      r   const_getattrzVariableTracker.const_getattr   s    !##r   c                    | j                  ||      }t        j                  j                  |      s
t	               d}| j
                  rt        | j
                  |      }t        j                  j                  ||      S )z,getattr(self, name) returning a new variableN)r`   )r   r	   ConstantVariable
is_literalr   r`   r   create)r$   r   r   r^   r`   s        r   var_getattrzVariableTracker.var_getattr   si    ""2t,))44U;%'';;T2F))00v0FFr   c                 D    	 | j                          y# t        $ r Y yw xY wr   )as_proxyr   r#   s    r   is_proxyzVariableTracker.is_proxy
  s%    	MMO" 		r   c                 *    t        t        |             r    )r   r   r#   s    r   r   zVariableTracker.as_proxy  s    !#d),,r   c                     t               r    r   )r$   codegens     r   reconstructzVariableTracker.reconstruct      !##r   c                     ||j                   j                  u sJ d       	 ddlm}  ||      }| j	                  |       y# t
        $ r Y yw xY w)z[If it is possible to reconstruct the Python object this
        VariableTracker represents.zOnly root tx can reconstructr   )	PyCodegenTF)outputroot_txr   r   r   r   )r$   r   r   cgs       r   can_reconstructzVariableTracker.can_reconstruct  sV     RYY&&&F(FF&	+2BR " 		s   A 	AAc                     t               r    r   r$   r   s     r   unpack_var_sequencez#VariableTracker.unpack_var_sequence$  r   r   c                 F    	 | j                  |       y# t        $ r Y yw xY wr   )r   r   r   s     r   has_unpack_var_sequencez'VariableTracker.has_unpack_var_sequence'  s*    	$$R(" 		s    	  c                      t        d|         y )Nzinspect_parameter_names: r   r#   s    r   inspect_parameter_namesz'VariableTracker.inspect_parameter_names.  s    1$89r   c                 N    t        d| j                  j                   d|        y )Nzhasattr  )r   r<   r   r   s      r   call_hasattrzVariableTracker.call_hasattr1  s"    !8!8 94&ABr   c                 ,    t        d|  d| d|        y )Nzcall_function r   r   )r$   r   rR   rS   s       r   call_functionzVariableTracker.call_function4  s     	tfAdV1VH=>r   c           
      l   |dk(  rN| j                  |      r=|s|rJ t        j                  j                  t	        | j                  |                  S |dk(  rFt	        |      dk(  r8|d   j                         r%|s#| j                  ||d   j                               S t        d|  d| d| d|       )N__len____getattr__r   r   zcall_method r   )
r   r	   r   r   lenr   r   r   r   r   )r$   r   r   rR   rS   s        r   call_methodzVariableTracker.call_method9  s     9!=!=b!A''--44S9Q9QRT9U5VWWM!D	QQ**,##BQ(B(B(DEEl4&$qaxHIIr   c                     |j                   j                  |      }| j                  rt        | j                  t              s	|| _        | S | j                  |      }|j                  | |      S )N)rc   )r   new_varra   r-   r9   rc   rg   replace_all)r$   r   r   new_namenew_vts        r   renamezVariableTracker.renameL  s\    99$$T*!!D4F4F)U+3D(KH=~~dF++r   c                     | S )z=Used by LazyVariableTracker to build the real VariableTrackerr   r#   s    r   rZ   zVariableTracker.realizeU      r   c                 0    t         j                  d |       S )zRealize all objects under thisc                 "    | j                         S r    )rZ   )xs    r   rn   z3VariableTracker.recursive_realize.<locals>.<lambda>[  s
    qyy{r   )rY   ri   r#   s    r   recursive_realizez!VariableTracker.recursive_realizeY  s    $$%:DAAr   c                     | S )zSUsed by LazyVariableTracker to return the real VariableTracker if it already existsr   r#   s    r   r}   zVariableTracker.unwrap]  r   r   c                      y)z:Used by LazyVariableTracker to indicate an unrealized nodeTr   r#   s    r   r~   zVariableTracker.is_realizeda  s    r   )r`   ra   rc   rb   r`   ra   rc   rb   c                Z    t         |           || _        || _        || _        || _        y r    )r;   r%   r`   ra   rc   rb   )r$   r`   ra   rc   rb   r<   s        r   r%   zVariableTracker.__init__e  s/     	*'>$.r   c           	            j                   t                _         t        j                   fd j                  j                         D cg c]  \  }}| j                  vs| c}}d        y c c}}w )Nc                 N    | j                   j                  j                         S r    )rb   r)   )noder$   s    r   rn   z/VariableTracker.__post_init__.<locals>.<lambda>x  s    --11$2F2FGr   c                      yr'   r   rl   s    r   rn   z/VariableTracker.__post_init__.<locals>.<lambda>z  s    dr   )rx   )rb   r   rY   ri   re   r   rr   )r$   rR   rS   r   rs   s   `    r   rP   zVariableTracker.__post_init__s  sh    '#1#3D G==..0Q041aAT=P=P4PQ0Q" 	 	
Qs   A4$A4)rR   zList[VariableTracker]rS   zDict[str, VariableTracker]rU   rY   )rU   rY   )+r   r   r   r   rr   rg   classmethodrj   r   ri   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r\   r   r   r   r   r   r   rZ   r   r}   r~   r   r9   r   r%   rP   rC   rD   s   @r   rY   rY      s   N& * * 
 :'(*;;<: :x.9?$
$c $c $GC G,= G-$$.?)@ $T :c :CS C-> C?/?9U?	?
J &	J
 -J 
J&,B &*'+*./ / $	/
 "%/ (/
r   rY   )	metaclassc                      t        |       dk(  r4| \  }t        |t              rt        |      S t	        |      j
                  S dj                  t        t        |             S )Nr   r   )	r   r-   rY   r   rN   r   joinmaptypestr)objsrT   s     r   r   r   ~  sM    
4yA~c?+s8O9%%%xxGT*++r   )r   enumr   typingr   r   r   r    r	   r
   excr   r`   r   r   utilsr   r   r   r   r4   r9   rG   rJ   rN   rL   rY   r   r   r   r   <module>r      s      , ,  /  ' $  2"D "DJ# "	+ 	5$ 5&r
 3 r
j,r   