o
    #iz                     @   s  d dl Z d dlZ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mZmZmZmZmZ d dlZd dlZd dlm  mZ d dlmZ d dlmZmZ d dlmZ ee Z!z<d dl"Z"de"j#de$fd	d
Z%eG dd dZ&de
ddde
fddZ'G dd dejj(Z)G dd dZ*G dd dZ+W n e,y   dZ-g dZ.Y nw dZ-g dZ.d dl/m0Z1 de2fddZ3de4fddZ5d d! Z6G d"d# d#eZ7G d$d% d%eZ8e6  d&d' Z9dS )(    N)	dataclass)	AnyCallableDictListOptionalSetTupleTypeUnion)TorchDynamoException)ArgumentTarget)sympy_interpereturnc           
         s  t | sJ d|  dt jdtt fdd}t | } t | s)td|  t | s3t 	| r7| 
 S |  }| t|}|| }t jkrOd}nt jt jfv rc fdd	  | }nnt jkr|  d
kspJ | d}t |s|J |  }t jdt jdt jdi}||v r|| }||}n7t jt jfv r|  d
ksJ t| d}|drd|dd   S |S t jkr|  dksJ t|S |d d| }	d|	  dS )Nzunsupported expression type: r   r   c                    s    fddt   D S )Nc                    s   g | ]	}t  |qS  )z3strarg).0ir   r   ]/home/ubuntu/SoloSpeech/.venv/lib/python3.10/site-packages/torch/fx/experimental/validator.py
<listcomp>@   s    z/z3str.<locals>.get_args_str.<locals>.<listcomp>)rangenum_argsr   r   r   r   get_args_str?   s   zz3str.<locals>.get_args_strzcan't print Z3 expression: powc                    s@   t  r   kst gS  fddt  D S )Nc                    s$   g | ]}  |D ]}|qqS r   )r   )r   r   x)collect_str_argsr   r   r   r   _   s    z3z3str.<locals>.collect_str_args.<locals>.<listcomp>)z3is_appdeclkindr   r   r   r   r   r#   r   r   r   [   s
   

zz3str.<locals>.collect_str_args   r   z!=><z(/z(idiv    ())r    is_exprExprRefr   strsimplifyr!   
ValueErroris_int_valueis_rational_value	as_stringr"   r#   Z3_OP_POWER	Z3_OP_ADD	Z3_OP_MUL	Z3_OP_NOTr   r   Z3_OP_EQZ3_OP_LEZ3_OP_GEZ3_OP_TO_INTZ3_OP_TO_REALr   
startswithZ3_OP_UNINTERPRETEDjoinrstrip)
r   r   r"   opargsr   argkindlogic_inverseargstrstringr   r$   r   r   <   sP   








r   c                   @   s`  e Zd ZU ded< edejdejfddZedejdejfddZd	ejd
ejdejfddZ	dejdejfddZ
d	ejd
ejdejfddZdejdejfddZdejdejdejfddZdejdejdejfddZdejdejdejfddZdejdejdejfd d!Zdejdejfd"d#Zdejdejfd$d%Zdejdejfd&d'Zd(S ))_Z3OpsTranslationValidator	validatorr   r   c                 C      |   r| S t| S N)is_realr    ToRealr   r   r   r   to_real      z_Z3Ops.to_realc                 C   rJ   rK   )is_intr    ToIntrN   r   r   r   to_int   rP   z_Z3Ops.to_int	numeratordenominatorc                 C   s$   | j |dk t|t| S Nr   )rI   add_assertionrG   rO   selfrT   rU   r   r   r   div   s   z
_Z3Ops.divnumberc                 C   
   t |S rK   )rG   rS   rY   r[   r   r   r   floor   s   
z_Z3Ops.floorc                 C   s4   |  p|  }t| ||}|rt|S |S rK   )rL   rG   rS   rZ   rO   )rY   rT   rU   cast_result_to_realresultr   r   r   floordiv   s   z_Z3Ops.floordivc                 C   s"   t | ||k | |d |S Nr%   )r    Ifr^   r]   r   r   r   ceil   s
   z_Z3Ops.ceilabc                 C   s   t ||k||S rK   r    rc   rY   re   rf   r   r   r   max      z
_Z3Ops.maxc                 C   s   t ||k ||S rK   rg   rh   r   r   r   min   rj   z
_Z3Ops.minpqc                 C   s   ||  |||  S rK   )ra   rY   rl   rm   r   r   r   mod      z
_Z3Ops.modbaseexpc                 C   s$   | j t|dk|dk || S rV   )rI   rW   r    OrrY   rq   rr   r   r   r   r      s   z
_Z3Ops.powc                 C   s"   t |}| j|dk |d S )Nr         ?)rG   rO   rI   rW   r]   r   r   r   sqrt   s   
z_Z3Ops.sqrtc                 C   r\   rK   )r    Absr]   r   r   r   abs      
z
_Z3Ops.absc                 C   s4   t | |t ddk| |d | |d S )Nr(   ru   )r    rc   ro   IntValrd   r^   r]   r   r   r   round_to_int   s
   	z_Z3Ops.round_to_intN)__name__
__module____qualname____annotations__staticmethodr    ArithRefrO   rS   rZ   r^   ra   rd   ri   rk   ro   r   rv   rx   r{   r   r   r   r   rG      s"   
 	rG   rA   rI   rH   c                    s&  t jt jt jh}| |v   fdd}t|}i t j|tjt j|tjt j|tjt j	||j	t j
||jt j||jt j||jtj||jtj||jtj||jtj||jtj||jtj||jtj|dd tj||jtjtj}| |v r||  S || S )Nc                    s0   dt jffddt  fdd}|S )Nr   c                    s   t | tjtjfr| S t | ts rt | trtt| S t | ttjfr-t	t| S t | t
tjfr<tt
| S tdt|  )Nzcan't lift type: )
isinstancer    r   BoolRefboolintBoolValsympyIntegerrz   floatFloatRealValr0   type)re   as_boolr   r   wrap   s   z z3op.<locals>.lift.<locals>.wrapc                     s   fdd| D } | S )Nc                 3   s    | ]} |V  qd S rK   r   r   re   )r   r   r   	<genexpr>  s    z6z3op.<locals>.lift.<locals>.wrapper.<locals>.<genexpr>r   )rB   wrapped_argsfuncr   r   r   wrapper
  s   z#z3op.<locals>.lift.<locals>.wrapper)r    r-   	functoolswraps)r   r   r   r   r   lift   s   zz3op.<locals>.liftc                 S   s   | r|S |S rK   r   )rf   tfr   r   r   <lambda>'  s    zz3op.<locals>.<lambda>)operatornot_and_or_rG   r    NotAndrs   ra   truedivrZ   ro   rx   builtinsroundr{   mathrd   r^   torch	sym_floatrO   sym_maxri   sym_minrk   sym_ite	_sym_sqrtrv   _assert)rA   rI   boolean_opsr   opsreplacement_mapr   r   r   z3op   sL   	r   c                       s   e Zd Zdejjddf fddZdedee	df d	e
eef d
efddZdedee	df d	e
eef d
ef fddZ  ZS )PopulateValidatorgraphrI   rH   c                    s*   || _ tjji |d}t j|dd d S )N)rootr   T)garbage_collect_values)rI   r   fxGraphModulesuper__init__)rY   r   rI   module	__class__r   r   r   9  s   zPopulateValidator.__init__targetrB   .kwargsr   c                 C   s   t  d }| j|S )Nsymbol)fx_tracebackget_current_metarI   z3var)rY   r   rB   r   r   r   r   r   placeholderA  s   zPopulateValidator.placeholderc                    sV   |t jkrt t|| j||S t|dks!J dt| d| j|d  d S )Nr%   z'expected 1 argument on assertion. Got: r)   r   )r   r   r   call_functionr   rI   lenadd_source_expr)rY   r   rB   r   r   r   r   r   E  s   
 zPopulateValidator.call_function)r|   r}   r~   r   r   Graphr   r   r	   r   r   r.   r   r   r   __classcell__r   r   r   r   r   8  s    *6r   c                   @   s  e Zd Zh dZ				d1ddZded	ejdej	fd
dZ
dejd	ejdejfddZdejd	ejdejfddZdejd	ejdejfddZdejdejdejfddZdejdejdejfddZdejdejdejfddZdejdejdejfddZdejdejdejfdd Zdejdejdejfd!d"Zd#ejd$ejdejfd%d&Zdejd	ejdejfd'd(Zdejd	ejdejfd)d*Zd+edefd,d-Zd.ejdej	fd/d0ZdS )2	SympyToZ3>   eqgegtleltneaddmulrI   rH   r   Nc                 C   s   || _ t| j | _d S rK   )
_validatorrG   _ops)rY   rI   r   r   r   r   W  s   zSympyToZ3.__init__valuedtypec                 C   sV   |t ju rtt|S |t ju rtt|S |t ju r$t	t|S t
d| )Nzunsupported dtype (SympyToZ3): )r   int64r    rz   r   doubler   r   r   r   r0   )rY   r   r   r   r   r   constant^  s   


zSympyToZ3.constantr   c                 C   s$   |t jkr
t|S td| d)Nz	to_dtype z NYI)r   float64r    rM   NotImplementedErrorrY   r   r   r   r   r   to_dtypeh  s   

zSympyToZ3.to_dtypec                 C   r\   rK   )r    rR   r   r   r   r   trunc_to_intm  ry   zSympyToZ3.trunc_to_intc                 C      | j |S rK   )r   r{   r   r   r   r   r{   p     zSympyToZ3.round_to_intrT   rU   c                 C      | j ||S rK   r   rZ   rX   r   r   r   int_truedivs     zSympyToZ3.int_truedivc                 C   r   rK   r   rX   r   r   r   r   v  r   zSympyToZ3.truedivc                 C   r   rK   r   ra   rX   r   r   r   ra   y  r   zSympyToZ3.floordivc                 C   r   rK   r   rX   r   r   r   rZ   |  r   zSympyToZ3.divrq   rr   c                 C   r   rK   r   r   rt   r   r   r   r     r   zSympyToZ3.powc                 C   r   rK   r   rt   r   r   r   pow_by_natural  r   zSympyToZ3.pow_by_naturalrl   rm   c                 C   r   rK   )r   ro   rn   r   r   r   ro     r   zSympyToZ3.modc                 C   r   rK   )r   rd   r   r   r   r   ceil_to_int  r   zSympyToZ3.ceil_to_intc                 C   r   rK   )r   r^   r   r   r   r   floor_to_int  r   zSympyToZ3.floor_to_intnamec                 C   s\   t jt jt j| jj| jj| jj| jjd}||v r|| S || j	v r't
t|S td| )N)r   r   r   r^   rd   minimummaximumzunhandled operator: )r    r   rs   r   r   r^   rd   rk   ri   OPERATOR_HANDLESgetattrr   AttributeError)rY   r   REPLACEMENTr   r   r   __getattr__  s   


zSympyToZ3.__getattr__exprc                 C   s   t | | jj|S rK   )r   r   symbols)rY   r   r   r   r   run  s   zSympyToZ3.run)rI   rH   r   N)r|   r}   r~   r   r   r   r   r   r    r-   r   r   r   r   r{   r   r   ra   rZ   r   r   ro   r   r   r.   r   r   Basicr   r   r   r   r   r   T  s,    

r   c                   @   s   e Zd ZdddZdejdejfddZdejde	dejfd	d
Z
dejddfddZdejdejfddZdejddfddZdejddfddZdeejejf ddfddZdddZdS )rH   r   Nc                 C   s,   t d i | _t | _t | _t | _d S )Nznew instance)logdebugr   set_source_exprs_target_exprs_assertionsrY   r   r   r   r     s
   
zTranslationValidator.__init__r   c                 C   s"   || j v sJ d| | j | S )NzZ3 variable not found for: )r   )rY   r   r   r   r   r     s   
zTranslationValidator.z3varr   c                 C   s   || j v r
| j | S td|j|j |tu r)t|j}|jr(| j	
|dk n|tu r4t|j}n|tu r?t|j}ntd| || j |< |S )Nznew variable: %s (%s)r   z"unsupported type for Z3 variable: )r   r   r   r   r|   r   r    Intis_positiver   r   r   Realr   BoolRuntimeError)rY   r   r   varr   r   r   add_var  s   


zTranslationValidator.add_varr   c                 C   s*   |j D ]}t|tjsJ | | qd S rK   )free_symbolsr   r   Symbolr   )rY   r   sr   r   r   _check_freesymbols  s   
z'TranslationValidator._check_freesymbolsc                 C   s,   t | |}t|tjsJ d| |S )Nz"expected boolean expression. Got: )r   r   r   r    r   rY   r   z3exprr   r   r   to_z3_boolean_expr  s   z'TranslationValidator.to_z3_boolean_exprc                 C   s*   || j vrtdt| | j | d S )Nzadd source guard: %s)r   r   r   r   r   )rY   r   r   r   r   r     s   
z$TranslationValidator.add_source_exprc                 C   s>   |  | | |}|| jvrtdt| | j| d S )Nzadd target guard: %s)r  r  r   r   r   r   r   r  r   r   r   add_target_expr  s
   


z$TranslationValidator.add_target_exprc                 C   s`   t |tjr| | | |}n|}t |tjsJ || jvr(t	dt
| | j| d S )Nzadd assertion: %s)r   r   r   r  r  r    r   r   r   r   r   r   )rY   r   refr   r   r   rW     s   

z"TranslationValidator.add_assertionc                    s   ddl m} t| jdkst| jdkrd S td}|jt d | j	D ]}|
| q%|
ttj| j  |j
| j  td | |j }|tjkrf|  t | j	| j fdd| jD d|tjkrrtd	 d S |tjksyJ td
 d S )Nr   )dynamo_timedQF_NRA)timeoutztranslation validation: startc                    s   g | ]	}  |s|qS r   )evaluate)r   inpmodelr   r   r   .  s
    
z1TranslationValidator.validate.<locals>.<listcomp>)failed_source_exprsz:translation validation: could not validate: got z3.unknownztranslation validation: success)torch._dynamo.utilsr  r   r   r   r    	SolverForr   translation_validation_timeoutr   r   r   r   r   r   checksatr  ValidationExceptionunknownwarningunsat)rY   r  solver	assertionrr   r  r   validate  s.   






zTranslationValidator.validate)r   N)r|   r}   r~   r   r   r  r    r-   r   r
   r  r   r  r   r  r   Exprr	  r   rW   r  r   r   r   r   rH     s    
F)translation_validation_enabledr  r  BisectValidationExceptionT)	r   r   r   r   rH   r!  r  r  r"  )_configc                   C   s   t   totjS rK   )_assert_z3_installed_if_tv_set_HAS_Z3configtranslation_validationr   r   r   r   r!  P  s   
r!  c                   C   s   t jS rK   )r&  r  r   r   r   r   r  W  s   r  c                   C   s   t s	tjrJ dd S d S )Nzotranslation validation requires Z3 package. Please, either install z3-solver or disable translation validation.)r%  r&  r'  r   r   r   r   r$  [  s   r$  c                   @      e Zd Zdd Zdd ZdS )r  c                    s   t sJ dtf fdd}dtfdd}|tt| }|ttt|}|ttt|}	|ttt|}
d| _d| d| d	|	 d
|
 | _d S )Nr   c                    s   |  d |   S )N: r   )symr  r   r   	symbolstrf  rj   z/ValidationException.__init__.<locals>.symbolstrc                 S   s   d dd | D S )N
c                 s   s    | ]}d | V  qdS )z  ==> Nr   )r   r   r   r   r   r   j      zBValidationException.__init__.<locals>.joinlines.<locals>.<genexpr>)r?   )xsr   r   r   	joinlinesi  rp   z/ValidationException.__init__.<locals>.joinlinesztranslation validation failed.zModel:
z

Assertions:
z

Target Expressions:
z

Failed Source Expressions:
)r%  r.   sortedmapr   msgdetails)rY   r  
assertionstarget_exprsr  r+  r/  	model_strassertions_strtarget_exprs_strfailed_source_exprs_strr   r  r   r   c  s"   zValidationException.__init__c                 C      | j  d| j S N

r2  r3  r   r   r   r   __str__  rj   zValidationException.__str__Nr|   r}   r~   r   r>  r   r   r   r   r  b  s    r  c                   @   r(  )r"  c                 C   s.   d| d| | _ d|  d|j | _d S )Nz#translation validation failed when r)  z)Failure occurred while running node:
    r<  )r2  format_noder3  )rY   validation_excr   failed_actiontraced_noder   r   r   r     s   z"BisectValidationException.__init__c                 C   r:  r;  r=  r   r   r   r   r>    rj   z!BisectValidationException.__str__Nr?  r   r   r   r   r"    s    r"  c                    s:  ddl m}mm} ddlm m}m | jdt	j
jd|ffdd}d|dtf fd	d
d|dttt  dtt ffdddt	j
jdtt ffdd}| |  }|sftd d S | jrltjrn|i }dd | jjD }ddt|d }	}
}|	|k r|	| d }
||
 }td|
|| ||||
< ||
 r|
}n|
d }	|	|k s|	|v rt||	 tsJ ||	 }||}| rd}n| sJ d| d}|j}|d usJ t|dksJ d|j dt| t|d tj sJ d|j dt!|d  t"||	 |d ||j#| d)Nr   )ShapeEnvSHAPEENV_EVENT_KEYCURRENT_NODE_KEY)FakeTensorMetaShapeEnvEventreplay_shape_env_eventsnoder   c                    s    | j v sJ | j    S rK   )meta)rJ  )rE  eventsr   r   get_node_event  s   zbisect.<locals>.get_node_event	shape_envc                    s   t |tr|S t |tjrt|j S t |sJ t fdd| D t fdd| D  |	 |j
S )Nc                 3       | ]} |V  qd S rK   r   r   r  new_with_shape_envrN  r   r   r     r-  z5bisect.<locals>.new_with_shape_env.<locals>.<genexpr>c                 3   rO  rK   r   rP  rQ  r   r   r     r-  )r   r   r   SymIntrJ  with_shape_envtuplesizestridestorage_offset	is_nested)rN  fake)rG  rR  rN  r   rR    s   
z"bisect.<locals>.new_with_shape_envtracked_fakesc              
      sp   |d usJ z j  fdd|D dd |D dd |D d W d S  ty7 } z|W  Y d }~S d }~ww )Nc                    s   g | ]} |j qS r   )rZ  r   rQ  r   r   r     s    z8bisect.<locals>.check_shapeenv_fails.<locals>.<listcomp>c                 S      g | ]}|j qS r   )sourcer   r   r   r   r         c                 S   r]  r   )symbolic_contextr   r   r   r   r     r_  )input_contexts)produce_guardsr  )rN  r\  r   )rR  r[  r   check_shapeenv_fails  s   z$bisect.<locals>.check_shapeenv_failsc                    s8   | j   }d |d  }|j  || jS rb   )rK  r   lintr\  )rJ  r[   rN  )rE  rc  rL  rI  r   r   check_node_fails  s   

z bisect.<locals>.check_node_failsz2translation validation succeeded: no errors found.c                 S   s   g | ]
}|j tjkr|qS r   )r   r   r   )r   rJ  r   r   r   r     s    zbisect.<locals>.<listcomp>r%   r(   zbisecting at %s: %s
evaluatingzunexpected event type: zadding runtime assertzbisecting expects z/ to have at least 2 positional arguments. Got: z9 to have a SymPy expression as its second argument. Got: )r   rB  rC  )$%torch.fx.experimental.symbolic_shapesrD  rE  rF  torch.fx.experimental.recordingrG  rH  rI  rL  r   r   Noder   r   r   r  _snapshot_tracked_fakesr   infoshould_record_eventsr&   translation_validation_no_bisectr   nodesr   r   r   is_evaluate_expris_defer_runtime_assertrB   r   r   r   r   r"  rK  )rN  rD  rF  rH  rM  re  last_exception	exceptionassert_nodesleftmidrightrJ  eventrB  rB   r   )rG  rE  rc  rL  rR  rI  r   bisect  sd   	&$



rx  ):r   loggingr   r   r   r   dataclassesr   typingr   r   r   r   r   r   r	   r
   r   r   torch.fxtorch.fx.tracebackr   	tracebackr   torch._dynamo.excr   torch.fx.noder   r   torch.utils._sympy.interpr   	getLoggerr|   r   r    r-   r.   r   rG   r   Interpreterr   r   rH   ImportErrorr%  __all__torch.fx.experimentalr#  r&  r   r!  r   r  r$  r  r"  rx  r   r   r   r   <module>   sN   ,
%X^E\ 	!
