o
    ZhZ                     @  s  d dl m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m	Z	 d dl
mZmZmZmZ d dlmZmZmZmZ d dlZddlmZ ddlmZ ercd dlZd d	lmZ dd
lmZ ddlmZ dddZee Z!ej"#e dZ$G dd de%Z&G dd de&Z'G dd de&Z(G dd de(Z)G dd de(Z*G dd de(Z+G dd de(Z,G d d! d!e&Z-G d"d# d#e&Z.G d$d% d%e&Z/G d&d' d'e&Z0G d(d) d)e&Z1G d*d+ d+e1Z2G d,d- d-e&Z3G d.d/ d/e3Z4G d0d1 d1e&Z5G d2d3 d3e3Z6G d4d5 d5e3Z7G d6d7 d7e3Z8G d8d9 d9e3Z9G d:d; d;e6Z:G d<d= d=e	Z;G d>d? d?e3Z<G d@dA dAe&Z=G dBdC dCe3Z>G dDdE dEe&Z?G dFdG dGe&Z@G dHdI dIeAZBG dJdK dKeAZCG dLdM dMe&ZDG dNdO dOeDZEG dPdQ dQeDZFG dRdS dSeFZGG dTdU dUeFZHG dVdW dWeDZIG dXdY dYeDZJG dZd[ d[eDZKG d\d] d]eDZLG d^d_ d_eDZMeNeEeOeFePeGeQeIeReHeSeJe%eKeTeLeUeMi	ZVddcddZWdddeddmdnZXddqdrZYejZj[j\ejZj[j]ejZj[j^ejZj[j_fZ`ddxdyZaeb Zcecddzdd}d~ZddddZedddZfecdddddZgdddZhG dd dZiddddZjdddZkdddZl	ddddZmdddZndddZodddZp		ddddZq		ddddZrdS )    )annotationsN)autoEnum)extract_stack
format_excformat_listStackSummary)AnyNoReturnOptionalTYPE_CHECKING   )config)counters)	CompileId)InstructionTranslatorBase)DynamoFrameType	case_namestrreturnc                 C  s   d|  dd S )NzhFor more information about this error, see: https://pytorch.org/docs/main/generated/exportdb/index.html#_-)replacer    r   @/var/www/auris/lib/python3.10/site-packages/torch/_dynamo/exc.pyexportdb_error_message5   s   
r   Zgraph_breaksc                   @     e Zd ZdS )TorchDynamoExceptionN__name__
__module____qualname__r   r   r   r   r   A       r   c                   @  r   )InternalTorchDynamoErrorNr   r   r   r   r   r$   E   r#   r$   c                      s.   e Zd ZU ded< ddd fd	d
Z  ZS )RestartAnalysisOptional[str]restart_reasonN)r'   argsr	   r   Nonec                  s   || _ t j|  d S N)r'   super__init__)selfr'   r(   	__class__r   r   r,   L   s   zRestartAnalysis.__init__)r(   r	   r'   r&   r   r)   r    r!   r"   __annotations__r,   __classcell__r   r   r.   r   r%   I   s   
 r%   c                   @  r   )SpeculationRestartAnalysisNr   r   r   r   r   r3   Q   r#   r3   c                   @  r   )UnspecializeRestartAnalysisNr   r   r   r   r   r4   U   r#   r4   c                   @  r   ) CompileCollectiveRestartAnalysisNr   r   r   r   r   r5   Y   r#   r5   c                   @  r   )TensorifyScalarRestartAnalysisNr   r   r   r   r   r6   ]   r#   r6   c                   @  r   )	SkipFrameNr   r   r   r   r   r7   a   r#   r7   c                   @  r   )TorchRuntimeErrorNr   r   r   r   r   r8   e   r#   r8   c                         e Zd Zd fddZ  ZS )InvalidBackendnamer   r   r)   c                   s   t  d|d d S )NzInvalid backend: z=, see `torch._dynamo.list_backends()` for available backends.r+   r,   )r-   r;   r.   r   r   r,   j   s   
zInvalidBackend.__init__)r;   r   r   r)   r    r!   r"   r,   r2   r   r   r.   r   r:   i       r:   c                      s   e Zd Zd fddZ  ZS )ResetRequiredr   r)   c                   s   t  td d S )Nz
                Must call `torch._dynamo.reset()` before changing backends.  Detected two calls to
                `torch.compile()` with a different backend compiler arguments.
                )r+   r,   textwrapdedentr-   r.   r   r   r,   q   s
   zResetRequired.__init__r   r)   r=   r   r   r.   r   r?   p   r>   r?   c                      s(   e Zd Zd fdd	ZdddZ  ZS )ShortenTracebackr(   r	   first_useful_frameOptional[types.FrameType]kwargsr   r)   c                  s   t  j|i | || _d S r*   )r+   r,   rE   )r-   rE   r(   rG   r.   r   r   r,   }   s   
zShortenTraceback.__init__typing.Selfc                 C  sZ   | j }| jd u s|d u stjr| S |j| jur(|j}|d us"J d|j| jus| |S )Nz#internal error, please report a bug)__traceback__rE   r   verbosetb_frametb_nextwith_traceback)r-   tbr   r   r   remove_dynamo_frames   s   
z%ShortenTraceback.remove_dynamo_frames)r(   r	   rE   rF   rG   r	   r   r)   )r   rH   )r    r!   r"   r,   rO   r2   r   r   r.   r   rD   |   s    rD   c                      s   e Zd Zd fd	d
Z  ZS )BackendCompilerFailed
backend_fnr	   inner_exception	ExceptionrE   rF   r   r)   c                   sF   t |dd| _|| _d| jdt|j d| }t j||d d S )Nr    ?zbackend=z	 raised:
z: )rE   )getattrbackend_namerR   typer    r+   r,   )r-   rQ   rR   rE   msgr.   r   r   r,      s   zBackendCompilerFailed.__init__)rQ   r	   rR   rS   rE   rF   r   r)   r=   r   r   r.   r   rP      r>   rP   c                      s:   e Zd Zddd fd	d
ZdddZddddZ  ZS )UnsupportedNr   rX   r   r   r&   r   r)   c                  s8   t  | tjj | _|| _d | _| 	  || _
d S r*   )r+   r,   torchZ_guardsZTracingContextr   
real_stackrX   categoryadd_to_statsr   )r-   rX   r   r.   r   r   r,      s   
zUnsupported.__init__c                 C  sP   | j d usJ t| j  | j  d8  < t| j  | j dkr&t| j  | j= d S d S )Nr   r   r\   r   rX   rB   r   r   r   remove_from_stats   s
   zUnsupported.remove_from_statsunimplementedr\   c                 C  s    || _ t| | j  d7  < d S )Nr   r^   )r-   r\   r   r   r   r]      s   zUnsupported.add_to_stats)rX   r   r   r&   r   r)   rC   )r`   )r\   r   r   r)   )r    r!   r"   r,   r_   r]   r2   r   r   r.   r   rY      s    
rY   c                   @  r   )$UnknownPropertiesDuringBackwardTraceNr   r   r   r   r   ra      r#   ra   c                   @  r   )RecompileErrorNr   r   r   r   r   rb      r#   rb   c                      r9   )ArgsMismatchErrorrX   r   r   r)   c                      t  | d S r*   r<   r-   rX   r.   r   r   r,         zArgsMismatchError.__init__rX   r   r   r)   r=   r   r   r.   r   rc      r>   rc   c                      r9   )AttributeMutationErrorrX   r   r   r)   c                   rd   r*   r<   re   r.   r   r   r,      rf   zAttributeMutationError.__init__rg   r=   r   r   r.   r   rh      r>   rh   c                      r9   )InfiniteGeneratorErrorrX   r   r   r)   c                   rd   r*   r<   re   r.   r   r   r,      rf   zInfiniteGeneratorError.__init__rg   r=   r   r   r.   r   ri      s    ri   c                      r9   )SideEffectsErrorrX   r   r   r)   c                   rd   r*   r<   re   r.   r   r   r,      rf   zSideEffectsError.__init__rg   r=   r   r   r.   r   rj      r>   rj   c                      s"   e Zd ZdZd fddZ  ZS )	CondOpArgsMismatchErrorz?
    Internal error from cond() due to arguments mismatch.
    rX   r   r   r)   c                   rd   r*   r<   re   r.   r   r   r,      rf   z CondOpArgsMismatchError.__init__rg   )r    r!   r"   __doc__r,   r2   r   r   r.   r   rk      s    rk   c                   @  s<   e Zd Ze Ze Ze Ze Ze Ze Z	e Z
e ZdS )UserErrorTypeN)r    r!   r"   r   ZDYNAMIC_CONTROL_FLOWZANTI_PATTERNZSTANDARD_LIBRARYZCONSTRAINT_VIOLATIONZDYNAMIC_DIMZINVALID_INPUTZINVALID_OUTPUTZ*UNSUPPORTED_ALIASED_MUTATED_DYNAMIC_INPUTSr   r   r   r   rm      s    
rm   c                      s"   e Zd Z	dd fd
dZ  ZS )	UserErrorN
error_typerm   rX   r   r   r&   r   r)   c                   sZ   |durt |tsJ |dr|d7 }n|d7 }|t|7 }t | || _|| _dS )aG  
        Type of errors that would be valid in Eager, but not supported in TorchDynamo.
        The error message should tell user about next actions.

        error_type: Type of user error
        msg: Actionable error message
        case_name: (Optional) Unique name (snake case) for the usage example in exportdb.
        N. 
)
isinstancer   endswithr   r+   r,   ro   message)r-   ro   rX   r   r.   r   r   r,      s   


zUserError.__init__r*   )ro   rm   rX   r   r   r&   r   r)   r=   r   r   r.   r   rn      s    rn   c                   @  r   )SkipCodeRecursiveExceptionNr   r   r   r   r   rv      r#   rv   c                   @  r   )RecompileLimitExceededNr   r   r   r   r   rw      r#   rw   c                   @  r   )UnsafeScriptObjectErrorNr   r   r   r   r   rx      r#   rx   c                   @  r   )UncapturedHigherOrderOpErrorNr   r   r   r   r   ry     r#   ry   c                   @  r   )IncorrectUsageNr   r   r   r   r   rz     r#   rz   c                   @  r   )FailOnRecompileLimitHitNr   r   r   r   r   r{     r#   r{   c                   @  r   )ObservedExceptionNr   r   r   r   r   r|         r|   c                      s(   e Zd ZU ded< d
 fdd	Z  ZS )ObservedUserStopIterationzOptional[Any]valuer(   r	   rG   r   r)   c                   s0   t  d t|dkr|d | _d S d | _d S )Nzunhandled `raise StopIteration`r   )r+   r,   lenr   )r-   r(   rG   r.   r   r   r,     s   
z"ObservedUserStopIteration.__init__)r(   r	   rG   r	   r   r)   r0   r   r   r.   r   r~     s   
 r~   c                   @  r   )ObservedLookupErrorNr   r   r   r   r   r   %  r}   r   c                   @  r   )ObservedIndexErrorNr   r   r   r   r   r   *  r}   r   c                   @  r   )ObservedKeyErrorNr   r   r   r   r   r   /  r}   r   c                   @  r   )ObservedGeneratorExitNr   r   r   r   r   r   4  r#   r   c                   @  r   )ObservedAttributeErrorNr   r   r   r   r   r   8  r}   r   c                   @  r   )ObservedRuntimeErrorNr   r   r   r   r   r   =  r}   r   c                   @  r   )ObservedNotImplementedErrorNr   r   r   r   r   r   B  r#   r   c                   @  r   )ObservedTypeErrorNr   r   r   r   r   r   F  r}   r   exc_typetype[Exception]type[ObservedException]c                 C  s:   | t vrt| dt| }td| dtfi t | < t |  S )Nr    ZObservedError)observed_exception_maprU   r   rW   r|   )r   r;   r   r   r   get_dynamo_observed_exceptionX  s   r   )r(   rG   txr   r(   Optional[list[Any]]rG   Optional[dict[str, Any]]r
   c                C  s:   ddl m} || ||pg |pi }|j| t|  )Nr   )BuiltinVariable)	variablesr   Zcall_functionexn_vt_stackZset_current_exceptionr   )r   r   r(   rG   r   Zexception_vtr   r   r   raise_observed_exceptiona  s   r   r	   r)   c                 C  s   | j   d S r*   )r   Zclear_current_exception)r   r   r   r   handle_observed_exceptionq  s   r   erS   codetypes.CodeTyperX   c                   sN   t | | tjjddd  fddd td  t| t|| d d S )Nartifactc                   S  
   dddS NZdynamo_graph_break_reasonstring)r;   encodingr   r   r   r   r   <lambda>     z,unimplemented_with_warning.<locals>.<lambda>c                         S r*   r   r   Zgraph_break_msgr   r   r         Zmetadata_fnZ
payload_fn%s)from_exc)	format_error_msg_verboserZ   _loggingtrace_structuredgraph_breaks_logdebuglogwarningr`   )r   r   rX   r   r   r   unimplemented_with_warning  s   



r   )r   r   r   r&   c                C  s8   | t jddksJ |turt| |d|t| |d)NBREAKFr   )osenvironget_NOTHINGrY   )rX   r   r   r   r   r   r`     s   r`   gb_typecontextexplanationhints	list[str]c                   sL   t | | tjjddd  fddd td  t||||| dd d S )	Nr   c                   S  r   r   r   r   r   r   r   r     r   z/unimplemented_v2_with_warning.<locals>.<lambda>c                     r   r*   r   r   r   r   r   r     r   r   r   Tr   log_warning)r   rZ   r   r   r   r   unimplemented_v2)r   r   r   r   r   r   r   r   r   unimplemented_v2_with_warning  s   

r   c                 C  sT   t |d }ddd |D }t |d }|  d| d| d| d}|S )N    rr   c                 s  s$    | ]}d t |d  V  qdS )z  Hint: r   N)r@   indentlstrip).0hintr   r   r   	<genexpr>  s    
z-format_graph_break_message.<locals>.<genexpr>z
  Explanation: z

  Developer debug context: )r@   r   r   join)r   r   r   r   Z	hints_strrX   r   r   r   format_graph_break_message  s   
r   Fr   r   boolc                C  s6   t | |||}|rt| |turt||t|)a  
    Called within dynamo to cause a graph break.
    Args:
        gb_type: Context-free graph break type. It should be a short string without any
                 information specific to the tracing context (i.e. no dynamically-generated strings)
        context: Developer context for the graph break. It can contain tracing context/dynamic strings.
        explanation: User-facing context-dependent explanation for the graph break. Can be dynamic.
        hints: List of user-facing hints for the graph break.
    )r   r   r   r   rY   )r   r   r   r   r   r   rX   r   r   r   r     s   

r   c                 C  s.   t d |   d7  < | tjddksJ d S )Nwarningsr   r   F)r   r   r   r   )rX   r   r   r   r     s   r   c                   @  s*   e Zd ZdddZddd	Zdd
dZdS )KeyErrorMsgr   r	   r   r)   c                 C  s
   || _ d S r*   )r   )r-   r   r   r   r   r,        
zKeyErrorMsg.__init__r   c                 C  s
   t | jS r*   )r   r   rB   r   r   r   __str__  r   zKeyErrorMsg.__str__c                 C  s   |   S r*   )r   rB   r   r   r   __repr__  s   zKeyErrorMsg.__repr__N)r   r	   r   r)   )r   r   )r    r!   r"   r,   r   r   r   r   r   r   r     s    

r   rr   excexportc                 C  sT  dd l }d | _t| }|d ur't|dkr'|d | _|dd|| 7 }tjr<t| dr<|d| j	 d| j	 d7 }tj
sHt| d	rH|d
7 }t| drst| jdrst| jdri|d| jj d| jj d7 }n
|d| jj d7 }t| jdkr|dnt| jd }t| trt|| f| jdd   | _d S || }|f| jdd   | _d S )Nr   z
from user code:
  record_filenamez!
Last frame execution written to zD. To run only this frame while debugging, run torch._dynamo.replay('z').
r[   z
Set TORCHDYNAMO_VERBOSE=1 for the internal stack trace (please do this especially if you're reporting a bug to PyTorch). For even more developer context, set TORCH_LOGS="+dynamo"
rR   minifier_pathbuck_commandz
Minifier script written to zW. Run this buck command to find the smallest traced graph which reproduces this error: rr   zQ. Run this script to find the smallest traced graph which reproduces this error.
r   )	tracebackinnermost_user_frame_summaryget_real_stackr   r   r   r   Zreplay_record_enabledhasattrr   rJ   rR   r   r   r(   r   rs   KeyErrorr   )r   rX   r   r   r[   Zold_msgZnew_msgr   r   r   augment_exc_message  sB   

 
"r   
compile_idr   #tuple[Optional[str], Optional[int]]c                 C  s0   d }d }| j d ur| j j}| j j}|| _||fS r*   )r   filenamelinenor   )r   r   r   r   r   r   r   get_exc_messageI  s   
r   r   c                   C  s
   t t S r*   )filter_stackr   r   r   r   r   get_stack_above_dynamoU  r   r   frameOptional[DynamoFrameType]Optional[StackSummary]c                 C  s<   t | dd }|d u rd S |d urt }nt }t|| S )Nr[   )rU   r   r   	from_list)r   r   r[   Zstack_above_dynamor   r   r   r   Y  s   r   stackc                 C  sV   t  }| D ]#}|jd u rqd|jv r |S d|jv s"|jr#d|jv r#q|| q|S )NZconvert_frameZ
eval_frameztorch._dynamo.optimize()r   r   lineappend)r   Z
user_stackr   r   r   r   r   z  s   



r   r;   c                 C  s0   ddl m} t| d| }|r|dS d S )Nr   )TORCH_DYNAMO_RESUME_IN_PREFIXz_(\w+)_at_\d+)Zresume_executionr   rematchgroup)r;   r   r   r   r   r   remove_resume_prefix  s
   
r   c                 C  sZ   t  }| D ]%}|jdu rqt|j}|r%|r%|d j|kr%||d< ||_q|| q|S )a1  
    When we graph break, we create a resume function and make a regular Python call
    to it, which gets intercepted by Dynamo. This behavior is normally shown in the
    traceback, which can be confusing to a user. So we can filter out resume frames
    for better traceback clarity.

    Example:
    File "..." line 3, in f
        <line 3>
    File "..." line 5, in torch_dynamo_resume_in_f_at_80
        <line 5>
    File "..." line 10, in torch_dynamo_resume_in_f_at_120
        <line 10>

    becomes
    File "..." line 10, in f
        <line 10>
    Nr   )r   r   r   r;   r   )r   	new_stackr   r;   r   r   r   collapse_resume_frames  s   

r   r   c                 C  sp   d|j  d|j d|j d}|d7 }|t 7 }t| |}|d ur6|d7 }|dt|7 }|d7 }|d7 }|S )	NWON'T CONVERT rq    line rr   z.========== TorchDynamo Stack Trace ==========
zY
========== The above exception occurred while processing the following code ==========

r   z
==========)co_nameco_filenameco_firstlinenor   r   r   r   )r   r   r   r   rX   r[   r   r   r   r     s   

r   c                 C  s8   t jr
t| |||S d|j d|j d|j dt  S )Nr   rq   r   z 
due to: 
)r   rJ   r   r   r   r   r   )r   r   r   r   r   r   r   format_error_msg  s   r   )r   r   r   r   )r   r   r   r   )
r   r   r   r   r(   r   rG   r   r   r
   )r   r	   r   r)   )r   rS   r   r   rX   r   r   r
   )rX   r   r   r	   r   r&   r   r
   )r   rS   r   r   r   r   r   r   r   r   r   r   r   r
   )
r   r   r   r   r   r   r   r   r   r   )r   r   r   r   r   r   r   r   r   r	   r   r   r   r
   rg   )rr   F)r   rS   rX   r   r   r   r   r)   )r   rS   r   r   r   r   )r   r   r*   )r   rS   r   r   r   r   )r   r   r   r   )r;   r   r   r&   )NN)
r   rS   r   r   r   r&   r   r   r   r   )s
__future__r   loggingr   r   r@   typingenumr   r   r   r   r   r   r   r	   r
   r   r   Ztorch._guardsrZ   r   r   utilsr   typesr   Zsymbolic_convertr   r   r   	getLoggerr    r   r   ZgetArtifactLoggerr   RuntimeErrorr   r$   r%   r3   r4   r5   r6   r7   r8   r:   r?   rD   rP   rY   ra   rb   rc   rh   ri   rj   rk   rm   rn   rv   rw   rx   ry   rS   rz   r{   r|   r~   r   r   r   r   r   r   r   r   StopIterationLookupError
IndexErrorGeneratorExitr   AttributeErrorNotImplementedError	TypeErrorr   r   r   r   Z_subclassesZfake_tensorZDataDependentOutputExceptionZDynamicOutputShapeExceptionZUnsupportedOperatorExceptionZUnsupportedFakeTensorExceptionZ!exceptions_allowed_to_be_fallbackr   objectr   r`   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   <module>   s    

	



	


/

!

	%