U
    vId3                  	   @   s^  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	m
Z
mZmZmZmZ d dl	mZmZm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m Z m!Z!m"Z" d	dl#m$Z$ ddl%m&Z&m'Z'm(Z(m)Z)m*Z* ddl+m,Z,m-Z- d dl.m/Z/ edZ0dei deee1f eee1 eddddZ2e(ei fddZ3ee1ef ed edddZ4d8dej5dd ee1ef eed e6df ee1 eej7 e8ed!d"d#Z9d9d$d%eej:ef ee1 e
ej;gej7f ee1 e<d&d'd(Z=e'ej>d)d*d+Z?ej>d)d,d-Z@e'ej;d.d/d0ZAe'ej;ej7e8d1d2d3ZBd:d4d5ZCd;d6d7ZDdS )<    N)partial)warn)Path)MappingProxyType)CallableTypeTypeVarUnionLiteral)
CollectionSequenceMapping)sparse   )SparseDataset)AnnDataFileManager)AnnData)_from_fixed_length_strings_decode_structured_array
_clean_uns)read_dispatched   )H5PY_V3report_read_key_on_errorreport_write_key_on_erroridx_chunks_along_axis_read_legacy_raw)	read_elem
write_elem)OldFormatWarningT )as_densedataset_kwargs)filepathadatar"   r#   returnc             	   K   s  ddl m} t|tr|g}d|kr:t|}d||d< tdd |D rTtdd|krn|jd krnt	d|
  |jd k	r|
|jj ||}t| } |jrd	nd
}|jr|j  t| |}|d }|jdd |jdd d|kr"t|jtjtfr"t|d|j|d n.|jr>t|jt| ksPt|d|j|d d|krt|jjtjtfrt|d|jj|d t|d|jj|d t|dt|jj|d n|jd k	rt|d|j|d t|d|j|d t|d|j|d t|dt|j|d t|dt|j|d t|dt|j|d t|dt|j |d t|dt|j!|d t|dt|j"|d W 5 Q R X d S )Nr   )write_dispatchedraw.Xraw/Xc                 s   s   | ]}|d kV  qdS )   Xr)   Nr!   ).0valr!   r!   I/home/sam/Atlas/atlas_env/lib/python3.8/site-packages/anndata/_io/h5ad.py	<genexpr>3   s     zwrite_h5ad.<locals>.<genexpr>zBCurrently, only `X` and `raw/X` are supported values in `as_dense`u>   Cannot specify writing `raw/X` to dense if it doesn’t exist.aw/encoding-typeanndatazencoding-versionz0.1.0r+   )r#   zraw/varzraw/varmrawobsvarobsmvarmobspvarplayersuns)#Zanndata.experimentalr'   
isinstancestrlistindexanyNotImplementedErrorr5   
ValueErrorZstrings_to_categoricalsr7   r   Zisbackedfilecloseh5pyFileattrs
setdefaultr+   r   spmatrixr   write_sparse_as_densefilenamer   dictr9   r6   r8   r:   r;   r<   r=   )r$   r%   r"   r#   kwargsr'   modefr!   r!   r.   
write_h5ad$   sn    


      
 rR   c                 C   s   d }|| krPt |tjtjtfrJ|jj| jjkrJ|}tdd|	d}n| |= | j
|f|j|jd|}tt |tj}t|j|dD ]}||  ||< q|d k	r| |= | | | |< | |= d S )Nz(.*)(\w(?!.*/))z\1_\2r2   )shapedtypei  )r>   rG   GroupDatasetr   rE   rM   resubrstripZcreate_datasetrS   rT   intr   
csc_matrixr   Ztoarray)rQ   keyvaluer#   Zreal_keyZdsetZcompressed_axisidxr!   r!   r.   rL   f   s"    rL   )rr+)rM   rP   r&   c                    s   t | |d}t| | ddddddg}dd	g}d
 jkrF|| n"|D ]}| krJt | ||< qJ| fdd|D  t d	dhd|d< tf |}t	 d tj
rt| |S )N)rM   filemoder8   r9   r:   r;   r=   r<   r6   r7   r3   c                    s"   i | ]}| kr|t  | qS r!   )r   r,   krQ   r!   r.   
<dictcomp>   s       z$read_h5ad_backed.<locals>.<dictcomp>rI   r5   )rN   rG   rH   rI   extendread_dataframeupdate	_read_rawr   r>   rV   r   )rM   rP   d
attributesZdf_attributesrc   r%   r!   rd   r.   read_h5ad_backed}   s    

rm   p  )	as_sparseas_sparse_fmt
chunk_size)rM   backedro   rp   rq   r&   c          	   	      s.  |dkr.|}|dkrd}|dks$t t| |S |tjtjfkrFtdt trX g nt  t	t
 D ].} | dkrd |< ql | dkrltd	qltt||d
t| dntd fddtd}dkrtf t }|j|_||_td tjr t| W 5 Q R X |S )ad      Read `.h5ad`-formatted hdf5 file.

    Parameters
    ----------
    filename
        File name of data file.
    backed
        If `'r'`, load :class:`~anndata.AnnData` in `backed` mode
        instead of fully loading it into memory (`memory` mode).
        If you want to modify backed attributes of the AnnData object,
        you need to choose `'r+'`.

        Currently, `backed` only support updates to `X`. That means any
        changes to other slots like `obs` will not be written to disk in
        `backed` mode. If you would like save changes made to these slots
        of a `backed` :class:`~anndata.AnnData`, write them to a new file
        (see :meth:`~anndata.AnnData.write`). For an example, see
        [here] (https://anndata-tutorials.readthedocs.io/en/latest/getting-started.html#Partial-reading-of-large-data).
    as_sparse
        If an array was saved as dense, passing its name here will read it as
        a sparse_matrix, by chunk of size `chunk_size`.
    as_sparse_fmt
        Sparse format class to read elements from `as_sparse` in as.
    chunk_size
        Used only when loading sparse dataset that is stored as dense.
        Loading iterates through chunks of the dataset of this row size
        until it reads the whole dataset.
        Higher size means higher memory consumption and higher (to a point)
        loading speed.
    >   NFTr`   >   r_   r`   zCDense formats can only be read to CSR or CSC matrices at this time.>   r(   r5   r+   r)   r*   z5Currently only `X` and `raw/X` can be read as sparse.)sparse_format
axis_chunkr_   )	elem_namec                    s   |j dks|dr2tf  fdd  D S |dr@d S |dkrXdkrX S |dkrltS |d	kr|t S |  S )
Nr4   r2   c                    s&   i | ]}| d s|t|  qS )zraw.)
startswithr   rb   )callbackelemr!   r.   re      s   
 z/read_h5ad.<locals>.callback.<locals>.<dictcomp>z/raw.z/Xr+   z/raw>   /obs/var)Zencoding_typeendswithr   keysrw   rj   rh   )funcrv   ry   Ziospecro   rx   rQ   rdasp)ry   r.   rx      s    	
zread_h5ad.<locals>.callback)rx   r(   r6   )AssertionErrorrm   r   
csr_matrixr[   rC   r>   r?   r@   rangelenr   read_dense_as_sparserG   rH   r   r   rj   Z	obs_namesr5   rV   r   )	rM   rr   ro   rp   rq   rP   ir%   r5   r!   r   r.   	read_h5ad   sF    '


  
r   )r+   r7   r9   rf   )rQ   ro   r   rI   r&   c                C   s   |r|d k	st di }d|krHd| krHd|kr4|nt}|| d |d< dD ]0}||krLd| | krLt| d|  ||< qLt| |tt|dS )Nz*must supply rdasp if as_sparse is suppliedr+   r)   )r7   r9   zraw/rf   )r   r   r   rh   )rQ   ro   r   rI   r5   Zread_xvr!   r!   r.   rj     s    rj   )r&   c                 C   s`   t d| j dt tr6ttt| d | jd}ntt| d }|j	|j
d dd |S )z Read pre-anndata 0.7 dataframes.'zH' was written with a very old version of AnnData. Consider rewriting it.r!   rT   r   T)Zinplace)r   namer   r   pd	DataFramer   r   rT   Z	set_indexcolumns)datasetZdfr!   r!   r.   read_dataframe_legacy  s    
 r   c                 C   s    t | tjst| S t| S dS )zBackwards compat functionN)r>   rG   rU   r   r   )groupr!   r!   r.   rh   )  s    rh   )r   c                 C   s   t r*t| j}|d k	r*|jdkr*|  } | d }t|ds@|S t|jtrNn^t	|jj
tjr~|t}t|dkr|d S n.t|jjdkr|j}t|}t rt||d}|jdkr|d }|S )Nzutf-8r!   rT   r   r   r   )r   rG   Zcheck_string_dtyperT   encodingZasstrhasattrr>   r?   
issubclasstypenpZstring_Zastyper   descrr   r   rS   )r   Zstring_dtyper]   rT   r!   r!   r.   read_dataset1  s*    



r   r   rt   ru   c                 C   s:   |t jkrt| |S |t jkr(t| |S td| d S )Nz!Cannot read dense array as type: )r   r   read_dense_as_csrr[   read_dense_as_cscrD   r   r!   r!   r.   r   L  s
    



r   c                 C   sB   g }t | jd|D ] }| | }t|}|| qtj|ddS )Nr   Zcsrformat)r   rS   r   r   appendZvstack)r   ru   sub_matricesr^   Zdense_chunk
sub_matrixr!   r!   r.   r   X  s    
r   c                 C   s>   g }t | jd|D ]}t| | }|| qtj|ddS )Nr   Zcscr   )r   rS   r   r[   r   Zhstack)r   ru   r   r^   r   r!   r!   r.   r   a  s
    r   )N)r!   N)rn   )rn   )ErW   	functoolsr   warningsr   pathlibr   typesr   typingr   r   r   r	   r
   r   r   r   rG   numpyr   Zpandasr   Zscipyr   Z_core.sparse_datasetr   Z_core.file_backingr   Z_core.anndatar   compatr   r   r   Zexperimentalr   utilsr   r   r   r   r   specsr   r   Zanndata._warningsr   r    r?   rR   rL   rm   r   boolrK   rZ   r   rH   rV   rN   rj   r   r   rh   r   r   r   r   r!   r!   r!   r.   <module>   s   
B 
k    
	