U
    ÅmœdÎ  ã                   @   sä  d 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	m
Z
 ddlmZmZmZ ddlmZmZ ddlZddlZe	e
 d Ze ed¡ G d	d
„ d
ejƒZdd„ Zedœdd„ZG dd„ dejƒZejjZejjZdddddddddddgZdd„ Z ddœd d!„Z!ddœeee"  dœd"d#„Z#ddœd$d%„Z$d&d'„ Z%dddd(œe"eee" ee& ed)œd*d+„Z'e%e'ƒdddd(œed,œd-d.„ƒZ(e%e'ƒdddd(œed,œd/d0„ƒZ)e%e'ƒdddd(œed,œd1d2„ƒZ*e%e'ƒdddd(œed,œd3d4„ƒZ+dS )5zLogging and Profiling
é    N)Úupdate_wrapperÚpartial)ÚCRITICALÚERRORÚWARNINGÚINFOÚDEBUG)ÚdatetimeÚ	timedeltaÚtimezone)ÚOptionalÚIOé   ÚHINTc                       sÚ   e Zd Z‡ fdd„Zddddœeeee eee edœ‡ fdd„Z	ddddœed	œd
d„Z
ddddœed	œdd„Zddddœed	œdd„Zddddœed	œdd„Zddddœed	œdd„Zddddœed	œdd„Z‡  ZS )Ú_RootLoggerc                    s"   t ƒ  |¡ d| _t | ¡t_d S )NF)ÚsuperÚ__init__Ú	propagateÚloggingÚManagerr   Úmanager)ÚselfÚlevel©Ú	__class__© úG/home/sam/Atlas/atlas_env/lib/python3.8/site-packages/scanpy/logging.pyr      s    z_RootLogger.__init__N)ÚextraÚtimeÚdeep)r   Úmsgr   r   r   Úreturnc          	         sd   ddl m} t tj¡}|d kr$d n|| }|p2i |jj|k rB|nd |dœ–}tƒ j	|||d� |S )Né   ©Úsettings)r   Útime_passed)r   )
Ú r$   r	   Únowr   ÚutcÚ	verbosityr   r   Úlog)	r   r   r    r   r   r   r$   r'   r%   r   r   r   r*      s    	ýz_RootLogger.log©r   r   r   ©r!   c                C   s   | j t||||d�S ©Nr+   )r*   r   ©r   r    r   r   r   r   r   r   Úcritical-   s    z_RootLogger.criticalc                C   s   | j t||||d�S r-   )r*   r   r.   r   r   r   Úerror0   s    z_RootLogger.errorc                C   s   | j t||||d�S r-   )r*   r   r.   r   r   r   Úwarning3   s    z_RootLogger.warningc                C   s   | j t||||d�S r-   )r*   r   r.   r   r   r   Úinfo6   s    z_RootLogger.infoc                C   s   | j t||||d�S r-   )r*   r   r.   r   r   r   Úhint9   s    z_RootLogger.hintc                C   s   | j t||||d�S r-   )r*   r   r.   r   r   r   Údebug<   s    z_RootLogger.debug)Ú__name__Ú
__module__Ú__qualname__r   ÚintÚstrr   Údictr	   r*   r/   r0   r1   r2   r3   r4   Ú__classcell__r   r   r   r   r      s$   
ùør   c                 C   sŠ   | j }| j}| j}|d kr$t |¡nt |¡}| tƒ ¡ | |j	¡ t
|jƒdkrf| |jd ¡ nt
|jƒdkr|tdƒ‚| |¡ d S )Nr"   r   u8   Scanpyâ€™s root logger somehow got more than one handler)ZlogfileZlogpathÚ_root_loggerr   ÚStreamHandlerÚFileHandlerÚsetFormatterÚ_LogFormatterÚsetLevelr   ÚlenÚhandlersÚremoveHandlerÚRuntimeErrorÚ
addHandler)r$   ÚfileÚnameÚrootÚhr   r   r   Ú_set_log_file@   s    rK   )r   c                 C   s&   | j }| |¡ |j\}| |¡ d S ©N)r<   rA   rC   )r$   r   rI   rJ   r   r   r   Ú_set_log_levelN   s    
rM   c                       s.   e Zd Zd	‡ fdd„	Zejdœdd„Z‡  ZS )
r@   ú{levelname}: {message}ú%Y-%m-%d %H:%MÚ{c                    s   t ƒ  |||¡ d S rL   )r   r   )r   ÚfmtÚdatefmtÚstyler   r   r   r   V   s    z_LogFormatter.__init__)Úrecordc                 C   sÌ   | j j}|jtkrd| j _n&|jtkr0d| j _n|jtkrBd| j _|jr˜|jjrftt	|j 
¡ ƒd�|_d|jkrˆ|j dt|jƒ¡|_n| j  jd7  _|jr²|j› d|j› �|_tj | |¡}|| j _|S )Nz	{message}z--> {message}z    {message})Úsecondsz{time_passed}z ({time_passed})z: )Ú_styleÚ_fmtÚlevelnor   r   r   r%   Úmicrosecondsr
   r8   Útotal_secondsr    Úreplacer9   r   r   Ú	FormatterÚformat)r   rT   Zformat_origÚresultr   r   r   r]   [   s.    




ÿ
 ÿz_LogFormatter.format)rN   rO   rP   )r5   r6   r7   r   r   Ú	LogRecordr]   r;   r   r   r   r   r@   U   s
        ÿr@   ÚanndataZumapÚnumpyZscipyZpandas)Zsklearnzscikit-learnZstatsmodels)Zigraphzpython-igraphZlouvainZ	leidenalgZpynndescentc              
   c   sZ   | D ]P}t |tƒr|n||f\}}zt|ƒ}||jfV  W q ttfk
rR   Y qX qd S rL   )Ú
isinstanceÚtupleÚ
__import__Ú__version__ÚImportErrorÚAttributeError)ÚdependenciesÚmodÚmod_nameÚ	dist_nameÚimpr   r   r   Ú_versions_dependencies‰   s    rm   ©rG   c                 C   s4   dgt  }td dd„ t|ƒD ƒ¡| p*tjd� dS )zp    Versions that might influence the numerical results.
    Matplotlib and Seaborn are excluded from this.
    Zscanpyú c                 s   s    | ]\}}|› d |› �V  qdS )z==Nr   )Ú.0ri   Úverr   r   r   Ú	<genexpr>œ   s     zprint_header.<locals>.<genexpr>rn   N)Ú_DEPENDENCIES_NUMERICSÚprintÚjoinrm   ÚsysÚstdout)rG   Úmodulesr   r   r   Úprint_header”   s
    
þry   c              	   C   s`   ddl }| dk	rDddlm} t dt¡ || ƒ� tƒ  W 5 Q R X n|jddddd	d
gd� dS )zš    Print versions of imported packages, OS, and jupyter environment.

    For more options (including rich output) use `session_info.show` directly.
    r   N)Úredirect_stdoutzaPassing argument 'file' to print_versions is deprecated, and will be removed in a future version.TFÚbuiltinsZstdlib_listÚimportlib_metadataz	$coverage)rh   ÚhtmlÚexcludes)Úsession_infoÚ
contextlibrz   ÚwarningsÚwarnÚFutureWarningÚprint_versionsÚshow)rG   r   rz   r   r   r   r„   ¡   s$    ý
úýr„   c                 C   s>   ddl m} | dkrtj} td|› dt ¡ d›d�| d� dS )	zL    Useful for starting a notebook so you see when you started working.
    r"   )re   NzRunning Scanpy z, on rO   Ú.rn   )r&   re   rv   rw   rt   r	   r'   )rG   re   r   r   r   Úprint_version_and_dateÂ   s    þr‡   c                 C   s   t t| ddgd�S )NÚ__doc__Ú__annotations__)ÚwrappedÚassigned)r   r   )Úfnr   r   r   Ú_copy_docs_and_signatureÐ   s    r�   r+   )r    r   r   r   r!   c                C   s    ddl m} |jj| |||d�S )uI      Log message with specific level and return current time.

    Parameters
    ==========
    msg
        Message to display.
    time
        A time in the past. If this is passed, the time difference from then
        to now is appended to `msg` as ` (HH:MM:SS)`.
        If `msg` contains `{time_passed}`, the time difference is instead
        inserted at that position.
    deep
        If the current verbosity is higher than the log functionâ€™s level,
        this gets displayed as well
    extra
        Additional values you can specify in `msg` like `{time_passed}`.
    r"   r#   r+   )Ú	_settingsr$   r<   r0   ©r    r   r   r   r$   r   r   r   r0   Ô   s    r0   r,   c                C   s    ddl m} |jj| |||d�S ©Nr"   r#   r+   )rŽ   r$   r<   r1   r�   r   r   r   r1   ò   s    r1   c                C   s    ddl m} |jj| |||d�S r�   )rŽ   r$   r<   r2   r�   r   r   r   r2   ù   s    r2   c                C   s    ddl m} |jj| |||d�S r�   )rŽ   r$   r<   r3   r�   r   r   r   r3      s    r3   c                C   s    ddl m} |jj| |||d�S r�   )rŽ   r$   r<   r4   r�   r   r   r   r4     s    r4   ),rˆ   r   rv   Ú	functoolsr   r   r   r   r   r   r   r	   r
   r   Útypingr   r   r�   Zanndata.loggingr`   r   ÚaddLevelNameÚ
RootLoggerr   rK   r8   rM   r\   r@   Zprint_memory_usageZget_memory_usagers   rm   ry   r9   r„   r‡   r�   r:   r0   r1   r2   r3   r4   r   r   r   r   Ú<module>   sf   .!õ!ûú