U
    vIÀd¿C  ã                   @   s„  d dl mZmZ d dl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d dlZd dlZd dlmZ d dlZd dlmZ d dlZd dlmZm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% e&ej'ej(ej)e%fej'ej(ej)e%fej'ej(ej)e%fd�Z*dXdd„Z+dYdd„Z,dd„ Z-ej.fdd„Z/dZej)dœdd„Z0ej'ej1ej'ej(ej)e$fej'ej(ej)e$fej'ej(ej)ffee2e2f dddedœdd„Z3d[dd „Z4d\d!d"„Z5d]d#d$„Z6d^d%d&„Z7d_d'd(„Z8d`d)d*„Z9d+d,„ Z:ej;e7e9e:e8e4e5e6gd-�d.d/„ ƒZ<d0d1„ Z=d2d3„ Z>e>d4d5„ ƒZ?edad7d8„ƒZ@e@ Aej(¡dbd9d:„ƒZBe@ Ae¡dcd;d<„ƒZCe@ Ae¡e@ AejD¡ddd=d>„ƒƒZEe@ AejF¡ded?d@„ƒZGe@ Ae%¡dfdAdB„ƒZHe@ Aej)¡dgdCdD„ƒZIe@ Ae$¡dhdEdF„ƒZJe@ Ae
¡didGdH„ƒZKe@ Ae ¡djdIdJ„ƒZLe@ AejM¡dkdKdL„ƒZNe@ AejOjPjQ¡dldMdN„ƒZRe@ Ae¡dmdOdP„ƒZSe@ Ae¡dneeeTeeU dQœdRdS„ƒZVedTdU„ ƒZWeW AejD¡dVdW„ ƒZXdS )oé    )ÚsingledispatchÚwraps)Úascii_letters)ÚTupleÚOptionalÚType)ÚMappingÚ
CollectionN)Úis_numeric_dtype)Úsparse)ÚAnnDataÚRaw)Ú	ArrayView)ÚSparseDataset)ÚAlignedMapping)Úasarray)ÚAwkArrayÚ	DaskArray)Ú
obsm_typesÚ
varm_typesÚlayers_typesc                    s|   | | }t j dd|¡}t  ttƒ¡‰‡fdd„‰ t  ‡ fdd„|D ƒ¡ | |¡}tj|‡ fdd„t	|ƒD ƒd�j
d	|d
�S )Né   é   c                    s   d  tj ˆ | ¡¡S )NÚ )ÚjoinÚnpÚrandomÚchoice)Úl)Úletters© úN/home/sam/Atlas/atlas_env/lib/python3.8/site-packages/anndata/tests/helpers.pyÚ<lambda>'   ó    z#gen_vstr_recarray.<locals>.<lambda>c                    s   g | ]}ˆ |ƒ‘qS r    r    )Ú.0r   ©Úgen_wordr    r!   Ú
<listcomp>(   s     z%gen_vstr_recarray.<locals>.<listcomp>c                    s   g | ]}ˆ d ƒ‘qS )r   r    ©r$   Úir%   r    r!   r'   )   s     )ÚcolumnsF)ÚindexZcolumn_dtypes)r   r   ÚrandintÚarrayÚlistr   ÚreshapeÚpdÚ	DataFrameÚrangeZ
to_records)ÚmÚnÚdtypeÚsizeÚlengthsÚarrr    )r&   r   r!   Úgen_vstr_recarray#   s       ÿr9   c                 C   sü   t  ttƒd¡}| t|ƒkr,|d | d … }tjt t j 	|| ¡¡tjt j 	|| ¡dd�t j 
dd| ¡t j | ¡t jj
d| dd	�t jj
d
d| td	�tjjt jj
d
d| td	�t jj
d
d| td	�d�tjjt jj
d
d| t jd	�t jj
d
d| td	�d�dœ|d�S )NZU1é   T)ZorderediÎÿÿÿé2   éÿ   Úuint8)r6   r5   r   )Úmaskéè  )ÚcatZcat_orderedZint64Zfloat64r=   Úboolznullable-boolznullable-int©r+   )r   ZfromiterÚiterr   Úlenr0   r1   ZCategoricalr   r   r,   rA   ZarraysZBooleanArrayZIntegerArrayÚint32)r4   r+   r   r    r    r!   Úgen_typed_df.   s*    
þþõïrF   c                 C   sh   d}t | ƒs|| d¡ƒS | d }g }|d kr8| |¡}t|ƒD ]}| t| dd … ||ƒ¡ q@|S d S )Né   r?   r   é   )rD   Ú	randranger2   ÚappendÚ_gen_awkward_inner)ÚshapeÚrngr5   ZMAX_RAGGED_DIM_LENZcurr_dim_lenÚlilÚ_r    r    r!   rK   H   s    
rK   c           	      C   sØ   ddl }| d dkrtdƒ‚t d¡}t | ¡} t | dk¡r’dd„ t| ƒD ƒ}dd„ | D ƒ} | tj	| |d�¡}|D ]}|j
||d	 d
�}qv|S t| ||ƒ}| t|ƒ|¡}t| ƒD ]\}}|dk	r¶| ||¡}q¶|S )ah  Function to generate an awkward array with random values.

    Awkward array dimensions can either be fixed-length ("regular") or variable length ("ragged")
    (the first dimension is always fixed-length).


    Parameters
    ----------
    shape
        shape of the array to be generated. Any dimension specified as `None` will be simulated as ragged.
    r   Nz)The first dimension must be fixed-length.é{   c                 S   s   g | ]\}}|d kr|‘qS ©Nr    )r$   r)   Úsr    r    r!   r'   q   s      zgen_awkward.<locals>.<listcomp>c                 S   s   g | ]}|d k	r|‘qS rQ   r    )r$   rR   r    r    r!   r'   r   s      ©r5   rH   )Zaxis)ÚawkwardÚ
ValueErrorr   ÚRandomr   r-   ÚanyÚ	enumerateZArrayÚemptyZ
singletonsrK   Zvalues_astyper   Z
to_regular)	rL   r5   ÚakrM   Zvar_dimsr8   ÚdrN   r)   r    r    r!   Úgen_awkward[   s$    

r\   )Úreturnc                 C   s†   d}t  ¡ }t| ƒ}|||jd  k rZt| |d�}|jd t|ƒ |_|||j< |d7 }q|jd | …d |…f  ¡ }|d k	r‚||_|S )Nr   rH   rB   rO   )r0   r1   rF   rL   r*   ÚstrZilocÚcopy)r3   r4   r+   r*   rR   ÚdfÚnew_valsr    r    r!   Úgen_typed_df_t2_sizeƒ   s    

rb   zCollection[Type])rL   r   r   r   r]   c                    sL  ddl m} | \}}t dd„ t| d ƒD ƒ¡}	t dd„ t| d ƒD ƒ¡}
t||	ƒ}t||
ƒ}|jtdd�d	d
� |jtdd�d	d
� |dkr–d}n|tj	 
dd||f¡ |¡ƒ}ttj	 	|df¡tj	|ddd�t||	ƒt|dfƒ|j	 	|df¡d�}‡fdd„| ¡ D ƒ}ttj	 	|df¡tj	|ddd�t||
ƒt|dfƒ|j	 	|df¡d�}‡fdd„| ¡ D ƒ}ttj	 	||f¡tj	||dd�|j	 	||f¡d�}‡ fdd„| ¡ D ƒ}ttj	 	||f¡tj	||dd�d�}ttj	 	||f¡tj	||dd�d�}tt|dƒtdddtt d¡d�d�tdƒtdƒd �}t|||||||||d!�	}|S )"aá      Helper function to generate a random AnnData for testing purposes.

    Note: For `obsm_types`, `varm_types`, and `layers_types` these currently
    just filter already created objects.
    In future, these should choose which objects are created.

    Params
    ------
    shape
        What shape you want the anndata to be.
    X_type
        What kind of container should `X` be? This will be called on a randomly
        generated 2d array.
    X_dtype
        What should the dtype of the `.X` container be?
    obsm_types
        What kinds of containers should be in `.obsm`?
    varm_types
        What kinds of containers should be in `.varm`?
    layers_types
        What kinds of containers should be in `.layers`?
    r   Nc                 s   s   | ]}d |› �V  qdS )ÚcellNr    r(   r    r    r!   Ú	<genexpr>Á   s     zgen_adata.<locals>.<genexpr>c                 s   s   | ]}d |› �V  qdS )ZgeneNr    r(   r    r    r!   rd   Â   s     rH   Zobs_cat)r@   T)r*   ZinplaceZvar_catéd   g{®Gázt?r;   Zcsr)Úformat)r-   r   r`   Zawk_2d_raggedÚdac                    s"   i | ]\}}t |ƒˆ kr||“qS r    ©Útype©r$   ÚkÚv)r   r    r!   Ú
<dictcomp>Ô   s       zgen_adata.<locals>.<dictcomp>c                    s"   i | ]\}}t |ƒˆ kr||“qS r    rh   rj   )r   r    r!   rm   Ü   s       )r-   r   rg   c                    s"   i | ]\}}t |ƒˆ kr||“qS r    rh   rj   )r   r    r!   rm   â   s       )r-   r   r   r^   é*   g      @)r-   )Z
scalar_strZ
scalar_intZscalar_floatZnested_further)é
   r   )é   NN)Z
O_recarrayÚnestedZawkward_regularZawkward_ragged)	ÚXÚobsÚvarÚobsmÚvarmÚlayersÚobspÚvarpÚuns)Ú
dask.arrayr-   r0   ÚIndexr2   rF   ÚrenameÚdictr   r   ZbinomialZastyper   r\   Úitemsr9   Úaranger   )rL   ZX_typeZX_dtyper   r   r   rg   ÚMÚNÚ	obs_namesÚ	var_namesrs   rt   rr   ru   rv   rw   rx   ry   rz   Zadatar    )r   r   r   r!   Ú	gen_adata“   s€    +


û
ûý ÿ ÿü÷÷r…   r:   c                 C   sH   t jt| ƒtd�}t jjtt| ƒƒt j |t| ƒd¡dd�}d||< |S )NrS   r    F©r6   ÚreplaceT)r   ZzerosrD   rA   r   r   r2   r,   )r+   Úmin_sizeÚbÚselectedr    r    r!   Úarray_bool_subset  s    
ýr‹   c              	   C   sB   t  ¡ �0 t  dt¡ t t| |d� t| ƒd¡¡}W 5 Q R X |S )NÚignore©rˆ   rH   )	ÚwarningsÚcatch_warningsÚsimplefilterÚPendingDeprecationWarningr   Úmatrixr‹   r/   rD   )r+   rˆ   Zindexerr    r    r!   Úmatrix_bool_subset  s    
ÿr“   c                 C   s   t  t| |d� t| ƒd¡¡S )Nr�   rH   )r   Ú
csr_matrixr‹   r/   rD   ©r+   rˆ   r    r    r!   Úspmatrix_bool_subset  s    ÿr–   c                 C   sF   t | ƒ|k r$td|› dt | ƒ› �ƒ‚tjj| tj |t | ƒd¡dd�S ©Nzmin_size (=z$) must be smaller than len(index) (=r    Fr†   )rD   rU   r   r   r   r,   r•   r    r    r!   Úarray_subset  s    ÿ  ÿr˜   c                 C   sP   t | ƒ|k r$td|› dt | ƒ› �ƒ‚tjjt t | ƒ¡tj |t | ƒd¡dd�S r—   )rD   rU   r   r   r   r€   r,   r•   r    r    r!   Úarray_int_subset'  s    ÿýr™   c                 C   sN   t jjt  t| ƒd ¡ddd�}tt|ƒŽ }tt| t| ƒ¡Ž ƒ|kr qJq |S )NrH   r:   Fr†   )	r   r   r   r€   rD   ÚsliceÚsortedr2   Úindices)r+   rˆ   ZpointsrR   r    r    r!   Úslice_subset3  s
     r�   c                 C   s   | t j dt| ƒ¡ S ©Nr   )r   r   r,   rD   rB   r    r    r!   Úsingle_subset<  s    rŸ   )Úparamsc                 C   s   | j S rQ   )Úparam)Úrequestr    r    r!   Úsubset_func@  s    r£   c                 C   s   | d k	rd| ›d�S dS d S )NzError raised from element Ú.r   r    ©Ú	elem_namer    r    r!   Ú
format_msgT  s    r§   c                    s   t ˆ ƒddœ‡ fdd„
ƒ}|S )z2Report name of element being tested if test fails.N©Ú
_elem_namec              
      s–   zˆ ||ŽW S  t k
r� } zf| d k	r|t|dƒs|t| ƒ}t|jƒ}t|ƒdkrV|g}n|d › d|› �|d< t|ƒ|_d|_|‚W 5 d }~X Y nX d S )NÚ_name_attachedr   z

T)Ú	ExceptionÚhasattrr§   r.   ÚargsrD   Útuplerª   )r©   r­   ÚkwargsÚeÚmsg©Úfuncr    r!   Úfunc_wrapper_  s    

z!report_name.<locals>.func_wrapper)r   )r³   r´   r    r²   r!   Úreport_name\  s    rµ   c                 C   s   | |kst ‚dS )z0Allows reporting elem name for simple assertion.N©ÚAssertionError)Úar‰   r    r    r!   Ú_assert_equalr  s    r¹   Fc                 C   s   t | ||d� d S )Nr¨   )r¹   ©r¸   r‰   Úexactr¦   r    r    r!   Úassert_equalx  s    r¼   c                 C   sÀ   t |ƒ}|sRt| ƒrRt|ƒrR| j|jks4tt|ƒƒ‚tj| |dd�s¼tt|ƒƒ‚nj|s¢t| dƒr¢t|dƒr¢t| j	ƒdkr¢t|j	ƒdkr¢t
t | ¡t |¡||ƒ nt | |k¡s¼tt|ƒƒ‚d S )NT)Z	equal_nanr5   rH   r   )r   r
   rL   r·   r§   r   Zallcloser¬   rD   r5   r¼   r0   r1   Úallrº   r    r    r!   Úassert_equal_ndarray}  s     ÿþýüûr¾   c                 C   s   t t| ƒt|ƒ||d� d S ©N©r»   r¦   )r¼   r   rº   r    r    r!   Úassert_equal_arrayview�  s    rÁ   c                 C   s   t | ƒ} t|| ||d� d S ©Nr¥   ©r   r¼   rº   r    r    r!   Úassert_equal_sparse”  s    rÄ   c                 C   s   t | ƒ} t|| ||d� d S rÂ   rÃ   rº   r    r    r!   Úassert_equal_h5py_dataset›  s    rÅ   c                 C   s:   ddl m} |r$|| |dddd� n|| |dddd� d S )Nr   )Ú	assert_eqTF)Úcheck_dtypeZ
check_typeZcheck_graph)Zdask.array.utilsrÆ   )r¸   r‰   r»   r¦   rÆ   r    r    r!   Úassert_equal_dask_array¡  s    rÈ   c                 C   s:   t |tjƒst|| ||ƒ ttjjƒ| ||||dd� d S )NF)Zcheck_index_typeÚcheck_exactr©   Zcheck_frame_type)Ú
isinstancer0   r1   r¼   rµ   ÚtestingZassert_frame_equalrº   r    r    r!   Úare_equal_dataframe¬  s    
úrÌ   c                 C   s\   dd l }|r8| j|jks8t| j› d|j› dt|ƒ› �ƒ‚| | ¡| |¡ksXtt|ƒƒ‚d S )Nr   z != z, )rT   ri   r·   r§   Zto_list)r¸   r‰   r»   r¦   rZ   r    r    r!   Úassert_equal_awkarray»  s    ,rÍ   c                 C   sb   t |  ¡ ƒt | ¡ ƒks$tt|ƒƒ‚|  ¡ D ]0}|d kr<d}t| | || ||› d|› �ƒ q,d S )Nr   ú/)ÚsetÚkeysr·   r§   r¼   )r¸   r‰   r»   r¦   rk   r    r    r!   Úassert_equal_mappingÄ  s
    $rÑ   c                 C   sp   | j j| j jf}|j j|j jf}| jD ]}t|| || ||d� q&| j|jks\tt|ƒƒ‚t| |||d� d S r¿   )	Úparentrƒ   r„   Zaxesr¼   Úattrnamer·   r§   rÑ   )r¸   r‰   r»   r¦   Z	a_indicesZ	b_indicesZaxis_idxr    r    r!   Úassert_equal_aligned_mappingÍ  s    
   ÿrÔ   c                 C   s:   |s t tjjƒ| |dd|d� nt tjjƒ| ||d� d S )NF)Zcheck_namesZcheck_categoricalr©   r¨   )rµ   r0   rË   Zassert_index_equalrº   r    r    r!   Úassert_equal_indexÙ  s    
    ÿrÕ   c                 C   s   t tjjƒ| ||||d� d S )N)rÇ   rÉ   r©   )rµ   r0   rË   Zassert_extension_array_equalrº   r    r    r!   Úassert_equal_extension_arrayã  s    
ûrÖ   c                 C   sL   dd„ }t |ƒ||d� dD ]*}tt| |ƒt||ƒ||› d|› �d� qd S )Nc                 S   s   | d k	st ‚d S rQ   r¶   ©Úxr    r    r!   Úassert_is_not_noneð  s    z,assert_equal_raw.<locals>.assert_is_not_noner¨   )rr   rt   rv   rƒ   rÎ   rÀ   )rµ   r¼   Úgetattr)r¸   r‰   r»   r¦   rÙ   Úattrr    r    r!   Úassert_equal_rawî  s    ürÜ   rº   c                    sÖ   ‡ fdd„}t | j|j||dƒd� t | j|j||dƒd� |s¨tdƒtdƒg}d}t | j|jk¡st| j|d< d	}t | j|jk¡s”| j|d
< d	}|r¨|t|ƒ  ¡ }dD ]$}t t| |ƒt||ƒ|||ƒd� q¬dS )u'      Check whether two AnnData objects are equivalent,
    raising an AssertionError if they arenâ€™t.

    Params
    ------
    a
    b
    exact
        Whether comparisons should be exact or not. This has a somewhat flexible
        meaning and should probably get refined in the future.
    c                    s   ˆ d kr| S ˆ › d| › �S d S )NrÎ   r    r×   r¥   r    r!   Úfmt_name  s    z$assert_adata_equal.<locals>.fmt_namerƒ   r¥   r„   NFr   TrH   )
rr   rs   rt   ru   rv   rw   rz   rx   ry   Úraw)	r¼   rƒ   r„   rš   r   r½   r®   r_   rÚ   )r¸   r‰   r»   r¦   rÝ   ÚidxZchange_flagrÛ   r    r¥   r!   Úassert_adata_equalý  s*    

ürà   c                 C   s   dd l m} | | ¡S rž   )r{   r-   r   )r¸   rg   r    r    r!   Úas_dense_dask_array9  s    rá   c                 C   s   t |  ¡ ƒS rQ   )rá   Ztoarray)r¸   r    r    r!   rO   @  s    rO   )N)N)NN)r:   )r:   )r:   )r:   )r:   )r:   )FN)FN)FN)FN)FN)FN)FN)FN)FN)FN)FN)FN)FN)FN)YÚ	functoolsr   r   Ústringr   Útypingr   r   r   Úcollections.abcr   r	   rŽ   Zh5pyÚnumpyr   Zpandasr0   Zpandas.api.typesr
   ZpytestZscipyr   r   Zanndatar   r   Zanndata._core.viewsr   Zanndata._core.sparse_datasetr   Zanndata._core.aligned_mappingr   Zanndata.utilsr   Zanndata.compatr   r   r~   r”   Zndarrayr1   ZGEN_ADATA_DASK_ARGSr9   rF   rK   rE   r\   rb   Zfloat32Úintr…   r‹   r“   r–   r˜   r™   r�   rŸ   Zfixturer£   r§   rµ   r¹   r¼   Úregisterr¾   rÁ   ZspmatrixrÄ   ZDatasetrÅ   rÈ   rÌ   rÍ   rÑ   rÔ   r|   rÕ   ÚapiÚ
extensionsZExtensionArrayrÖ   rÜ   rA   r^   rà   rá   rO   r    r    r    r!   Ú<module>   sâ   üø

(üüî
íp

	




	ùÿ
	






	
   ÿ   ÿ;

