o
    0h                      @   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
 d dlmZ d dlmZ d dlZd dlZejdd Zdd	 Zd
d Zdd Zdd Zdd ZG dd dejjjZdd Zdededee ej! e
g ed f f fddZ"dS )    N)AbstractContextManager)Callable)
LazyString)configc               	   c   sh    t jj } t jjt jj  zd V  W t jj|  t jj  d S t jj|  t jj  w N)torch_logging	_internal_get_log_state_set_log_stateLogState
_init_logs)
prev_state r   Y/var/www/vscode/kcb/lib/python3.10/site-packages/torch/testing/_internal/logging_utils.pypreserve_log_state   s   r   c                 C   sD   t  }tjjtjd| i}|t	  || t
jj  |S )N
TORCH_LOGS)
contextlib	ExitStackunittestmockpatchdictosenvironenter_contextr   r   r   r	   r   )settings
exit_stacksettings_patchr   r   r   log_settings   s   
r   c                  K   s*   t  }|t  tjjdi |  |S )Nr   )r   r   r   r   r   r   set_logs)kwargsr   r   r   r   log_api"   s   r"   c                     s   dddd g  fdd}|   D ]5\}}t|tr"| qt|tr-||| qt|trE|dkrE|  D ]	\}}||| q:qtdd	S )
N+ -)
      (   c                    s:   t | trt |tr| v r | |   d S td)NInvalid value for setting)
isinstancestrintappend
ValueError)namelevelINT_TO_VERBOSITYr   r   r   append_setting.   s   z*kwargs_to_settings.<locals>.append_settingmodulesr)   ,)itemsr*   boolr-   r,   r   r.   join)r!   r3   r/   valmodule_qnamer0   r   r1   r   kwargs_to_settings)   s   


r;   c                         fdd}|S )Nc                    s    t ddi fdd}|S )Nfx_graph_cacheFc              	      s@  t j  g }tdkr(| |  | | W d    n1 s"w   Y  n3ttdi " | |  | | W d    n1 sGw   Y  W d    n1 sVw   Y  t j  |  tdi + | |  | | W d    n1 sw   Y  W d    d S W d    d S 1 sw   Y  d S )Nr   r   )	r   _dynamoresetlen_handler_watcherr   r;   clearr"   selfrecords)fnr!   r   r   test_fnP   s"   
  
Pz3make_logging_test.<locals>.wrapper.<locals>.test_fn)inductor_configr   rF   rG   r!   rF   r   wrapperO   s   z"make_logging_test.<locals>.wrapperr   )r!   rL   r   rJ   r   make_logging_testN   s   rM   c                    r<   )Nc                    s    fdd}|S )Nc              	      s   t j  g }t+ | |  | | W d    n1 s!w   Y  W d    d S W d    d S 1 s9w   Y  d S r   )r   r>   r?   r   rA   rC   )rF   r   r   r   rG   j   s
   
Pz4make_settings_test.<locals>.wrapper.<locals>.test_fnr   rI   r   rK   r   rL   i   s   z#make_settings_test.<locals>.wrapperr   )r   rL   r   rN   r   make_settings_testh   s   
rO   c                       sD   e Zd Ze fddZedd Zdd Zdd Zd	d
 Z  Z	S )LoggingTestCasec                    sX   t    | jtjjtj	ddi | jtjdd | jtjdd d S )N___LOG_TESTINGr$   z$torch._dynamo.config.suppress_errorsTztorch._dynamo.config.verboseF)
super
setUpClass_exit_stackr   r   r   r   r   r   r   cls	__class__r   r   rS   v   s   
zLoggingTestCase.setUpClassc                 C   s&   | j   tjjj  tj  d S r   )rT   closer   r   r	   	log_staterB   r   rU   r   r   r   tearDownClass   s   
zLoggingTestCase.tearDownClassc                    s   t  fdd|D S )Nc                 3   s    | ]	} |  v V  qd S r   )
getMessage).0rmr   r   	<genexpr>   s    z,LoggingTestCase.hasRecord.<locals>.<genexpr>)anyrD   rE   r`   r   r_   r   	hasRecord   s   zLoggingTestCase.hasRecordc                    s^   d D ] |   v r| jt fddd  qd u r-| d| d  S )Nc                      s   d d  d S )Nzmultiple matching records: z and  among r   r   r^   recordrE   r   r   <lambda>   s    z+LoggingTestCase.getRecord.<locals>.<lambda>)msgzdid not find record with re   )r\   assertIsNoner   failrc   r   rf   r   	getRecord   s   zLoggingTestCase.getRecordc              	      s   t  }fdd tjjj D ]6}t|}t	|j
}| |dd | |dd |j
D ]}|j fdd}|tjj|d	| q.q|S )
Nc                    s     |  d S r   )r-   rg   )record_listr   r   emit_post_hook   s   z8LoggingTestCase._handler_watcher.<locals>.emit_post_hook   zgAll pt2 loggers should only have at most two handlers (debug artifacts and messages above debug level).r   z3All pt2 loggers should have more than zero handlersc                    s   |   |  d S r   r   rm   )ro   old_emitr   r   new_emit   s   z2LoggingTestCase._handler_watcher.<locals>.new_emitemit)r   r   r   r   r	   log_registryget_log_qnameslogging	getLoggerr@   handlersassertLessEqualassertGreaterrs   r   r   r   r   object)rD   rn   r   	log_qnameloggernum_handlershandlerrr   r   )ro   rq   rn   r   rA      s&   


z LoggingTestCase._handler_watcher)
__name__
__module____qualname__classmethodrS   r[   rd   rl   rA   __classcell__r   r   rW   r   rP   u   s    
rP   c                    s@   t  }tj|d tj fddfdd}||fS )zExample:
    logs_to_string("torch._inductor.compile_fx", "post_grad_graphs")
    returns the output of TORCH_LOGS="post_grad_graphs" from the
    torch._inductor.compile_fx module.
    streamc               	   3   s>    zt j} |   d V  W |   d S |   w r   )r   r   getArtifactLogger
addHandlerremoveHandler)r}   )r   
log_optionmoduler   r   tmp_redirect_logs   s   
z)logs_to_string.<locals>.tmp_redirect_logsc                     s   t  } |   | S r   )r   r   r   )r   r   r   r   ctx_manager   s   z#logs_to_string.<locals>.ctx_manager)ioStringIOrv   StreamHandlerr   contextmanager)r   r   
log_streamr   r   )r   r   r   r   r   logs_to_string   s   r   r   log_optionsreturnc                    sZ   dd t tD }dd |D  tj fdddtd ffdd	}||fS )
zExample:
    multiple_logs_to_string("torch._inductor.compile_fx", "pre_grad_graphs", "post_grad_graphs")
    returns the output of TORCH_LOGS="pre_graph_graphs, post_grad_graphs" from the
    torch._inductor.compile_fx module.
    c                 S   s   g | ]}t  qS r   )r   r   )r]   _r   r   r   
<listcomp>   s    z+multiple_logs_to_string.<locals>.<listcomp>c                 S   s   g | ]}t j|d qS )r   )rv   r   )r]   r   r   r   r   r      s    c               
   3   s~    fddD } z$t |  D ]	\}}|| qd V  W t |  D ]	\}}|| q#d S t |  D ]	\}}|| q4w )Nc                    s   g | ]	}t j |qS r   )r   r   r   )r]   option)r   r   r   r      s    zFmultiple_logs_to_string.<locals>.tmp_redirect_logs.<locals>.<listcomp>)zipr   r   )loggersr}   r   )rx   r   r   r   r   r      s   z2multiple_logs_to_string.<locals>.tmp_redirect_logsr   Nc                     s   t d } |   | S )Nz, )r   r8   r   r   )r   r   r   r   r      s   z,multiple_logs_to_string.<locals>.ctx_manager)ranger@   r   r   r   )r   r   log_streamsr   r   )rx   r   r   r   r   multiple_logs_to_string   s   
r   )#torch._dynamo.test_caser   unittest.mockr   r   r   torch._loggingtorch._logging._internalr   typingr   torch._dynamo.utilsr   torch._inductorr   rH   rv   r   r   r   r   r"   r;   rM   rO   r>   	test_caseTestCaserP   r   r+   tuplelistr   r   r   r   r   r   <module>   s,   
	%K4