U
    vId#                     @  s  d dl mZ d dlmZ d dlmZmZmZ d dlm	Z	 d dl
mZmZ d dlmZmZmZmZmZmZ d dlmZ d dlZd d	lmZ d dlZd dlZG d
d dZeeee ej!ej"f Z#ee#ee#e#f ef Z$ej%Z&ej'Z(d dl)m*Z+ zd dl,m-Z. d dl/m%Z0 W n2 e1k
r8   G dd dZ.G dd dZ0Y nX zd dl2Z2e2j-Z3W n$ e1k
rp   G dd dZ3Y nX zd dl4m5Z5 W n$ e1k
r   G dd dZ5Y nX zd dl6m-Z7 W n$ e1k
r   G dd dZ7Y nX eefddddddZ8e89ej:efd dddd!d"Z;d#d$ Z<d>d&d'd(d&d)d*d+Z=d&d&d,d-d.Z>d/d0d1d2Z?d3d4 Z@dd5d6d7d8d9d:ZAd?d;dddd<d=ZBdS )@    )annotations)deepcopy)reducesingledispatchwrapsdecode)	signature	Parameter)AnyTupleUnionMappingMutableMappingOptional)warnN)spmatrixc                   @  s   e Zd ZdS )EmptyN)__name__
__module____qualname__ r   r   P/home/sam/Atlas/atlas_env/lib/python3.8/site-packages/anndata/compat/__init__.pyr      s   r   version)Array)Groupc                   @  s   e Zd Zedd ZdS )	ZarrArrayc                   C  s   dS )Nzmock zarr.core.Arrayr   r   r   r   r   __repr__#   s    zZarrArray.__repr__Nr   r   r   staticmethodr   r   r   r   r   r   "   s   r   c                   @  s   e Zd Zedd ZdS )	ZarrGroupc                   C  s   dS )Nzmock zarr.core.Groupr   r   r   r   r   r   (   s    zZarrGroup.__repr__Nr   r   r   r   r   r!   '   s   r!   c                   @  s   e Zd Zedd ZdS )AwkArrayc                   C  s   dS )Nzmock awkward.highlevel.Arrayr   r   r   r   r   r   5   s    zAwkArray.__repr__Nr   r   r   r   r   r"   4   s   r"   )
ZappyArrayc                   @  s   e Zd Zedd ZdS )r#   c                   C  s   dS )Nzmock zappy.base.ZappyArrayr   r   r   r   r   r   ?   s    zZappyArray.__repr__Nr   r   r   r   r   r#   >   s   r#   c                   @  s   e Zd Zedd ZdS )	DaskArrayc                   C  s   dS )Nzmock dask.array.core.Arrayr   r   r   r   r   r   I   s    zDaskArray.__repr__Nr   r   r   r   r   r$   H   s   r$   r   strzOptional[Any]attrsnamedefaultc                 C  s"   |t kr| | S | j||dS d S )N)r)   )r   getr&   r   r   r   
_read_attrN   s    r+   zh5py.AttributeManagerc                 C  sv   || kr|t k	r|S | | }| |}t|j}|dkr>|S |jdkrL|S t|jdkrd|dS dd |D S dS )al  
    Read an HDF5 attribute and perform all necessary conversions.

    At the moment, this only implements conversions for string attributes, other types
    are passed through. String conversion is needed compatibility with other languages.
    For example Julia's HDF5.jl writes string attributes as fixed-size strings, which
    are read as bytes by h5py.
    Nr   utf-8c                 S  s   g | ]}t |d qS )r,   r   ).0sr   r   r   
<listcomp>o   s     z#_read_attr_hdf5.<locals>.<listcomp>)	r   Zget_idh5pycheck_string_dtypedtypelengthlenshaper   )r'   r(   r)   attrZattr_idr2   r   r   r   _read_attr_hdf5V   s    


r7   c                 C  s   g }| j jD ]}t|}|d }t|t}|r6|d }tt |jtjrfdt	|dd  |d< n |s~t
t |tjrd|d< |t| q| |S )zw    Convert from fixed length strings to unicode.

    For backwards compatability with older h5ad and zarr files.
       r   U   NO)r2   descrlist
isinstancetuple
issubclassnptypeZstring_intZ
issubdtypeZstr_appendastype)value	new_dtypedtZdt_listdt_typeZis_annotatedr   r   r   _from_fixed_length_stringsr   s    
rJ   Fz
np.ndarrayzOptional[np.dtype]bool)arrr2   copyreturnc                 C  sx   |r|   } |dkr| j}tdd dd}|j D ]<\}\}}t|}|dk	r6|jdkr6|| | | | d q6| S )a  
    h5py 3.0 now reads all strings as bytes. There is a helper method which can convert these to strings,
    but there isn't anything for fields of structured dtypes.

    Params
    ------
    arr
        An array with structured dtype
    dtype
        dtype of the array. This is checked for h5py string data types.
        Passing this is allowed for cases where array may have been processed by another function before hand.
    Nc                 S  s
   |  dS )Nr,   r   )xr   r   r   <lambda>       z*_decode_structured_array.<locals>.<lambda>r8   r,   )out)	rM   r2   rA   Z
frompyfuncfieldsitemsr0   r1   encoding)rL   r2   rM   r   krH   _checkr   r   r   _decode_structured_array   s    
rY   )rF   rN   c                 C  sn   g }| j j D ]R\}\}}|jdkrTtdd | d|D }||d|ff q|||f q| |S )z    Convert variable length strings to fixed length.

    Currently a workaround for
    https://github.com/zarr-developers/zarr-python/pull/422
    r;   c                 s  s   | ]}t | V  qd S )N)r4   encode)r-   rO   r   r   r   	<genexpr>   s     z+_to_fixed_length_strings.<locals>.<genexpr>r9   )r2   rS   rT   kindmaxZgetfieldrD   rE   )rF   rG   Zdt_namerI   Z	dt_offsetsizer   r   r   _to_fixed_length_strings   s    
r_   z	'AnnData')adatac                 C  s   t  }| j D ]\}}|ds$q|dd}t|ttfrD|g}| j| j	fD ]H}||kr^qP|| j
}t|t|k s|qPtj||||< || qPq|D ]}| j|= qdS )z
    Compat function for when categorical keys were stored in uns.
    This used to be buggy because when storing categorical columns in obs and var with
    the same column name, only one `<colname>_categories` is retained.
    Z_categories N)setunsrT   endswithreplacer>   r%   rC   ZobsvarvaluesrA   allr4   pdZCategoricalZ
from_codesadd)r`   Zk_to_deleteZ	cats_nameZcatsr(   anncodesr   r   r   
_clean_uns   s"    

rm   c                 C  s   |  di  di }| di }dD ]X}||kr$t|| ttjfr$t|| jdkr$td| d| dt	 |
|||< q$d	S )
zF
    Read-time fix for moving adjacency matrices from uns to obsp
    rc   Z	neighborsobsp)Z	distancesZconnectivitiesr:   z'Moving element from .uns['neighbors']['z'] to .obsp['z4'].

This is where adjacency matrices should go now.N)r*   
setdefaultr>   r   rA   ndarrayr4   r5   r   FutureWarningpop)dnrn   rV   r   r   r   _move_adj_mtx   s    ru   rC   r?   r=   )rs   rt   keyspathsc                 C  s^   |   D ]P\}}t|tr0t||||f| qt|tr|j||fkr|||f q|S )z0Find paths to sparse matrices with shape (n, n).)rT   r>   r   _find_sparse_matricesr   r5   rD   )rs   rt   rv   rw   rV   vr   r   r   rx      s    
rx   z1.0 (renaming of 0.25)c                  s     fdd}| dk	r|| S |S )av  Decorator for methods that issues warnings for positional arguments.
    Using the keyword-only argument syntax in pep 3102, arguments after the
    * will issue a warning when passed as a positional argument.

    Parameters
    ----------
    func
        Function to check arguments on.
    version
        The version when positional arguments will result in error.
    c                   sr   t g g  j D ]6\}}|jtjkr: | q|jtjkr| qt fdd}|S )Nc                    s   t | t   }|dkr"| |S dd td | | | d  D }d|}td| d dt |tj|  f |S )Nr   c                 S  s   g | ]\}}d  ||qS )z{}={})format)r-   r(   argr   r   r   r/     s   zi_deprecate_positional_args.<locals>._inner_deprecate_positional_args.<locals>.inner_f.<locals>.<listcomp>z, zPass z as keyword args. From version z> passing these as positional arguments will result in an error)r4   zipjoinr   rq   update
parameters)argskwargs
extra_argsZargs_msg)all_argsfkwonly_argssigr   r   r   inner_f  s    

zU_deprecate_positional_args.<locals>._inner_deprecate_positional_args.<locals>.inner_f)	r	   r   rT   r\   r
   POSITIONAL_OR_KEYWORDrD   KEYWORD_ONLYr   )r   r(   paramr   r   )r   r   r   r   r    _inner_deprecate_positional_args  s    zD_deprecate_positional_args.<locals>._inner_deprecate_positional_argsNr   )funcr   r   r   r   r   _deprecate_positional_args   s    !r   )NF)N)C
__future__r   rM   r   	functoolsr   r   r   codecsr   inspectr	   r
   typingr   r   r   r   r   r   warningsr   r0   Zscipy.sparser   numpyrA   Zpandasri   r   slicerC   r%   Zint64rp   ZIndex1DIndexr   ZH5GroupZDatasetZH5Array	packagingr   _vZ	zarr.corer   r   Zzarr.hierarchyr!   ImportErrorZawkwardr"   Z
zappy.baser#   Z
dask.arrayr$   r+   registerZAttributeManagerr7   rJ   rY   r_   rm   ru   rx   r   r   r   r   r   <module>   sb    

   