
    VhK                     D   d dl Z d dlZd dlZd dlZd dlmZ d dlmZmZm	Z	m
Z
 d dlZd dlmc mZ  ej                   e      Zej&                  j)                  ed      Zg dZe G d d             Zd ad Zd	d
dedefdZd Ze G d d             Zd Z G d de      Z y)    N)	dataclass)AnyCallableOptionalUniontrace_shape_events)ShapeEnvEventrecord_shapeenv_eventreplay_shape_env_eventsFakeTensorMetashape_env_check_state_equalNotEqualErrorc                       e Zd ZU eed<   dZeee      ed<   dZ	ee
eef      ed<   dZeee      ed<   dZee   ed<   ddefdZdefd	Zdefd
ZdefdZdefdZy)r	   fNargskwargstracked_fakesnamereturnc                    ddl mm}m | j                  |u r.| j
                  | j                  J  |di | j                  S J t        | j
                  xs g       t        | j                  xs i       t        j                  |fdf      \  t        j                  fdfdf      \  dt        dt        ffdd	t        d
t        dt        ffd}| j                         r |ddfd       | j!                         s| j#                         r |dd        | j                  i S )Nr   is_symbolicShapeEnvSymTypesc                     S N )_	shape_envs    O/home/dcms/DCMS/lib/python3.12/site-packages/torch/fx/experimental/recording.py<lambda>z#ShapeEnvEvent.run.<locals>.<lambda>s   s    	     c                 0    t        |       xr  |       S r   )
isinstance)xr   r   s    r    r!   z#ShapeEnvEvent.run.<locals>.<lambda>y   s    jH-@+a. r"   c                 X     t        |       | j                  j                              S r   )typenodewith_shape_env)ar   s    r    r!   z#ShapeEnvEvent.run.<locals>.<lambda>z   s!    gd1gaff33I>? r"   r%   r   c                     t        | t        j                  j                        s| S t	        d      sJ j
                  }| j                  |v sJ || j                     S )Nname_to_node)r$   torchfxNodehasattrr,   r   )r%   r,   r   s     r    maybe_convert_nodez-ShapeEnvEvent.run.<locals>.maybe_convert_node   sX    a/
 9n555$11L66\)))''r"   indexkeyfnc                 d    | t              k  r ||          | <   |v r ||         |<   y y r   )len)r2   r3   r4   r   r   s      r    
replaceargz%ShapeEnvEvent.run.<locals>.replacearg   s=    s4y  eoUf} os r"      r   c                 ,    t        fd| D              S )Nc              3   .   K   | ]  } |        y wr   r   ).0r*   r1   s     r    	<genexpr>z6ShapeEnvEvent.run.<locals>.<lambda>.<locals>.<genexpr>   s     %J&8&;%Js   )tuple)r   r1   s    r    r!   z#ShapeEnvEvent.run.<locals>.<lambda>   s    %JT%J J r"   )r2   r3   r4      fx_noder   )%torch.fx.experimental.symbolic_shapesr   r   r   r   r   r   listdictpytreetree_map_onlyr   intstrr   is_create_fx_call_functionis_evaluate_expris_defer_runtime_assert)	selfr   r   r7   r   r   r   r   r1   s	    `  @@@@@r    runzShapeEnvEvent.runa   sO   	
 	
 66X$):t{{?VVV*dkk**$$$DIIO$dkk'R( ++)D&>
f ++@?6N
f	(# 	(# 	(	.c 	. 	. 	. **,
 J
   "d&B&B&D
 QI2DE tvvt&v&&r"   c                     | j                   | j                   n| j                  j                  }d| d| j                   d| j                   dS )Nzevent: z (, ))r   r   __name__r   r   )rJ   r   s     r    __str__zShapeEnvEvent.__str__   sA     II1tyytvvb2dkk]!<<r"   c                      | j                   dk(  S )N_create_fx_call_functionr   rJ   s    r    rG   z(ShapeEnvEvent.is_create_fx_call_function   s    yy666r"   c                      | j                   dk(  S )Nevaluate_exprrS   rT   s    r    rH   zShapeEnvEvent.is_evaluate_expr   s    yyO++r"   c                      | j                   dk(  S )Ndefer_runtime_assertrS   rT   s    r    rI   z%ShapeEnvEvent.is_defer_runtime_assert   s    yy222r"   r   )rO   
__module____qualname__r   __annotations__r   r   rA   r   r   rB   rF   r   r   rK   rP   boolrG   rH   rI   r   r"   r    r	   r	   P   s     K !%D(49
$'+FHT#s(^$+ *.M8DI&- D(3-D'S D'L= =7D 7,$ ,3 3r"   r	   c                 "   ddl m}m}m} dt        |   d|d|fd}d }t        j                  | |j                               D ]J  }t        ||      r	 |||      }t        ||      s% ||      s. |||j                  j                        }L |S )Nr   r   oldnewr   c                      | | |u sJ d       |S )Nzcall with different ShapeEnvr   )r^   r_   s     r    assert_equalz9_extract_shape_env_and_assert_equal.<locals>.assert_equal   s    ?#:===:
r"   )r@   r   r   r   r   	itertoolschainvaluesr$   r(   r   )r   r   r   r   r   ra   r   vals           r    #_extract_shape_env_and_assert_equalrf      s    UU(8, 8  
 ItV]]_5 Dc8$$Y4Ic8$S)9$Y0B0BCI	D r"   F)save_tracked_fakesrg   r   c                 ,     dt         dt         f fd}|S )Nr4   r   c                      t               sJ t        j                         j                  }|r|d   dk(  sJ d        j                  t        j                          fd       }|S )Nr   rJ   zyrecord_shapeenv_event should only wrap methods on ShapeEnv; refactor your code so that it calls into a method on ShapeEnvc            
         ddl m} t        | d   |      sJ t        j	                  ddt
        z  	| dd  |       t
        dz  ad }	 | d   }|j                  r|j                  r | | i |      t
        dz  aS t        | |      }| | | i |      t
        dz  aS |j                         5  
r|j                         nd }t        t        |       ||j                        }|j                  j                  |       	  ||j!                  |            cd d d        t
        dz  aS # t"        $ r |j                  j%                           w xY w# 1 sw Y   nxY wnL# t"        $ r@ t&        j)                  d	| dd  |t&        j+                  t,        j.                        	        w xY w	 t
        dz  ay # t
        dz  aw xY w)
Nr   r   z%scall %s(*%r, **%r)    c                 H    t         j                  ddt        dz
  z  |        | S )Nz%s-> %srl   rm   )trace_shape_events_logdebugNEST)rs    r    retlogzIrecord_shapeenv_event.<locals>.decorator.<locals>.wrapper.<locals>.retlog   s"    &,,Ytax8H!Lr"   rS   z"failed while running %s(*%s, **%s))exc_info)r@   r   r$   ro   rp   rq   should_record_eventsis_recordingrf   
_recording_snapshot_tracked_fakesr	   rA   rO   eventsappendrK   	ExceptionpoplogerrorisEnabledForloggingINFO)r   r   r   rs   r   rJ   r   eventr4   r   rg   s           r    wrapperz9record_shapeenv_event.<locals>.decorator.<locals>.wrapper   s   Fd1gx000 #((&d
D$qr(F AID6 G	 559O9O ""d"5f"56\ 	S ;4H <!"d"5f"56H 	C __&  ;M446RV " *DJBKKE KK&&u-%eiio6# B 	 % )%  ,  		8H --gll;   -B 		sV   	*E$ =E$ "E$ 2AED/	E$ /%EEE E$ #F; $A	F--F; ;G)callableinspectgetfullargspecr   rO   	functoolswraps)r4   r   r   r   rg   s   `  @r    	decoratorz(record_shapeenv_event.<locals>.decorator   su    ||%%b)..Q6) 	
>	
) {{		F	 
F	P r"   )r   )rg   r   s   ` r    r
   r
      s"    Rh R8 Rh r"   c                     ddl m} | d   }|j                  |k(  sJ |j                         }| dd  D ]  }	 |j                  |        |S # t        $ r t
        j                  d|        w xY w)Nr   rk   rm   zfailed when running event: %s)r@   r   r   rK   r{   r}   r~   )ry   r   constructor_eventr   r   s        r    r   r   @  s    >q	(*** "%%'I 	 IIi  	  	II5u=	s   A!A,c                   T   e Zd ZU eeeej                  f   df   ed<   eeeej                  f   df   ed<   eeej                  f   ed<   e	ed<   deeeej                  f   df   fdZ
deeeej                  f   df   fdZdeeej                  f   fd	Zdefd
Zedd       Zy)r   .tensor_sizetensor_stridetensor_storage_offset	is_nestedr   c                     | j                   S r   )r   rT   s    r    sizezFakeTensorMeta.size`  s    r"   c                     | j                   S r   )r   rT   s    r    stridezFakeTensorMeta.stridec  s    !!!r"   c                     | j                   S r   )r   rT   s    r    storage_offsetzFakeTensorMeta.storage_offsetf  s    )))r"   c                 ,    t        | j                        S r   )r6   r   rT   s    r    dimzFakeTensorMeta.dimi  s    4##$$r"   c                     t        | j                         | j                         | j                         | j                        S r   )r   r   r   r   r   )fakes    r    	from_fakezFakeTensorMeta.from_fakel  s1    IIK(;(;(=t~~
 	
r"   N)r   r   )rO   rY   rZ   r=   r   rE   r-   SymIntr[   r\   r   r   r   r   staticmethodr   r   r"   r    r   r   Y  s    uS%,,./455sELL013677 ell!233O eE#u||"34c9:  "eC$56;< "*c5<<&7 8 *%S % 
 
r"   r   c                   	 t        |       j                         t        |      j                         |D ]-  }|v rj                  |       |v sj                  |       / dt        dt        fd	dt
        t        t        gt        f   dt        t        t        t        t        f      f	fd} ||      }t        |      dkD  rt        d|      y )Nvaluer   c                 "    t         t              r=ddj                   fdt         j	                         t
              D              z   dz   S t         t              r'ddj                  d t               D              z   dz   S t               S )N{rM   c              3   2   K   | ]  }| d |      yw)z: Nr   )r;   kr   s     r    r<   zDshape_env_check_state_equal.<locals>.value_to_str.<locals>.<genexpr>  s      V1qcE!H:.Vs   )r3   }c              3   "   K   | ]  }|  	 y wr   r   )r;   vs     r    r<   zDshape_env_check_state_equal.<locals>.value_to_str.<locals>.<genexpr>  s     "AaaS6"As   )r$   rB   joinsortedkeysrF   set)r   s   `r    value_to_strz1shape_env_check_state_equal.<locals>.value_to_str  s|    eT"))Vuzz|QT8UVVW
 eS!"A6%="AAACGG5zr"   	map_valuec                    t              t        	      }}||k7  r:t        ddt        t        ||z
              t        t        ||z
              fg      t	        |      }|j                          |D cg c]  }| | ||          | |	|         f }}|D cg c]  \  }}}||k7  r| d 
|       
|      f! c}}}S c c}w c c}}}w )Nzfield set mismatch:zfound unique fields:z: values don't match.)r   r   rF   r   rA   sort)r   env1_setenv2_setsorted_keysr   mapped_dictval1val2	env1_vars	env2_varsr   s           r    compare_varsz1shape_env_check_state_equal.<locals>.compare_vars  s    !^S^( x% /F8h#678F8h#678	 	 8n !
 	!Yq\*Ia1,FG
 
 "-
 
4t| s'(,t*<l4>PQ
 	


s   6 C$Cr   zfield values don't match:)
varscopyr|   r   rF   r   rA   r=   r6   r   )
env1env2non_state_variable_namesr   r   r   errorsr   r   r   s
          @@@r    r   r     s     T
!IT
!I% 	>MM!	>MM!		C 	C 	!
S#JO,!
	eCcM"	#!
H )$F
6{Q7@@ r"   c                   >     e Zd Zdedeeeeef      ddf fdZ xZS )r   msg
mismatchedr   Nc                     dj                  |D cg c]#  \  }}}dj                  d| d| d| g      % c}}}      }t        | 	  d| d| d       y c c}}}w )N
z==> z  >  Left: z  > Right: zShapeEnv not equal: z

)r   super__init__)rJ   r   r   	inner_msgstr1str2details	__class__s          r    r   zNotEqualError.__init__  s    
 )) .8	 	 *ItT 		yk*%dV,%dV,	
 	E 	 
	
	s   (A)rO   rY   rZ   rF   rA   r=   r   __classcell__)r   s   @r    r   r     s9    

 sC}-.
 
	
 
r"   r   )!r   r   rb   r   dataclassesr   typingr   r   r   r   r-   torch.utils._pytreeutils_pytreerC   	getLoggerrO   r}   _logginggetArtifactLoggerro   __all__r	   rq   rf   r\   r
   r   r   r   r{   r   r   r"   r    <module>r      s        ! 1 1  $ $ g!99" 
z a3 a3 a3H 	L 9> U U( Ux2 
 
 
NDAN
I 
r"   