U
    md                     @   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   .!!