U
    mdp                     @   s   d dl mZm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 dd
lmZ ddlmZmZ dZee Zdeeeeedf ee eee ee	 ee ee ee edddZdS )    )UnionOptionalN)AnnData)spmatrix   )_utils)logging   )get_init_pos_from_paga)Literal)	AnyRandom_choose_graph)frdrlkkgrid_frZlglrtZrt_circularfar   F)adatalayoutinit_posrootrandom_staten_jobs	adjacencykey_added_extneighbors_keyobspcopyc                 K   s<  t d|}|tkr(tdt d|
r4|  n| } |dkrLt| |	|}|| j krf| j| }nB|dksr|rt| ||||	d}n"t	j
| t	j

|jd df}|d	krzdd
lm} W n" tk
r   t d d}Y nX |d	krV|ddddddddddddd}d|kr"|d }nd|kr6|d }nd}|j|||d}t	|}nt
| t|}|dkr|j|fd| i|}n@d|kr|dk	r|g}|j|fd|i|}n|j|f|}t	|j}i | jd< t||d| jd d< d|p| }|| j|< t jd|d |d!d" |
r8| S dS )#a      Force-directed graph drawing [Islam11]_ [Jacomy14]_ [Chippada18]_.

    An alternative to tSNE that often preserves the topology of the data
    better. This requires to run :func:`~scanpy.pp.neighbors`, first.

    The default layout ('fa', `ForceAtlas2`) [Jacomy14]_ uses the package |fa2|_
    [Chippada18]_, which can be installed via `pip install fa2`.

    `Force-directed graph drawing`_ describes a class of long-established
    algorithms for visualizing graphs.
    It has been suggested for visualizing single-cell data by [Islam11]_.
    Many other layouts as implemented in igraph [Csardi06]_ are available.
    Similar approaches have been used by [Zunder15]_ or [Weinreb17]_.

    .. |fa2| replace:: `fa2`
    .. _fa2: https://github.com/bhargavchippada/forceatlas2
    .. _Force-directed graph drawing: https://en.wikipedia.org/wiki/Force-directed_graph_drawing

    Parameters
    ----------
    adata
        Annotated data matrix.
    layout
        'fa' (`ForceAtlas2`) or any valid `igraph layout
        <http://igraph.org/c/doc/igraph-Layout.html>`__. Of particular interest
        are 'fr' (Fruchterman Reingold), 'grid_fr' (Grid Fruchterman Reingold,
        faster than 'fr'), 'kk' (Kamadi Kawai', slower than 'fr'), 'lgl' (Large
        Graph, very fast), 'drl' (Distributed Recursive Layout, pretty fast) and
        'rt' (Reingold Tilford tree layout).
    root
        Root for tree layouts.
    random_state
        For layouts with random initialization like 'fr', change this to use
        different intial states for the optimization. If `None`, no seed is set.
    adjacency
        Sparse adjacency matrix of the graph, defaults to neighbors connectivities.
    key_added_ext
        By default, append `layout`.
    proceed
        Continue computation, starting off with 'X_draw_graph_`layout`'.
    init_pos
        `'paga'`/`True`, `None`/`False`, or any valid 2d-`.obsm` key.
        Use precomputed coordinates for initialization.
        If `False`/`None` (the default), initialize randomly.
    neighbors_key
        If not specified, draw_graph looks .obsp['connectivities'] for connectivities
        (default storage place for pp.neighbors).
        If specified, draw_graph looks
        .obsp[.uns[neighbors_key]['connectivities_key']] for connectivities.
    obsp
        Use .obsp[obsp] as adjacency. You can't specify both
        `obsp` and `neighbors_key` at the same time.
    copy
        Return a copy instead of writing to adata.
    **kwds
        Parameters of chosen igraph layout. See e.g. `fruchterman-reingold`_
        [Fruchterman91]_. One of the most important ones is `maxiter`.

        .. _fruchterman-reingold: http://igraph.org/python/doc/igraph.Graph-class.html#layout_fruchterman_reingold

    Returns
    -------
    Depending on `copy`, returns or updates `adata` with the following field.

    **X_draw_graph_layout** : `adata.obsm`
        Coordinates of graph layout. E.g. for layout='fa' (the default),
        the field is called 'X_draw_graph_fa'
    z'drawing single-cell graph using layout zProvide a valid layout, one of .NZpaga)r   r   r   r   r   r   )ForceAtlas2zPackage 'fa2' is not installed, falling back to layout 'fr'.To use the faster and better ForceAtlas2 layout, install package 'fa2' (`pip install fa2`).r   Fg      ?Tg333333?g       @)ZoutboundAttractionDistributionZ
linLogModeZadjustSizesZedgeWeightInfluenceZjitterToleranceZbarnesHutOptimizeZbarnesHutThetaZmultiThreadedZscalingRatioZstrongGravityModeZgravityverbosemaxiter
iterationsi  )posr#   >   r   r   r   r   seedr   r   
draw_graph)r   r   paramsZX_draw_graph_z    finishedz
added
    z(, graph_drawing coordinates (adata.obsm))timedeep)logginfo_LAYOUTS
ValueErrorr   r   Zobsmkeysr
   nprandomr%   shapeZfa2r    ImportErrorwarningforceatlas2arrayr   Zget_igraph_from_adjacencyr   tolistZcoordsZunsdict)r   r   r   r   r   r   r   r   r   r   r   kwdsstartZinit_coordsr    r4   r#   Z	positionsgZ	ig_layoutZ	key_added r;   Q/home/sam/Atlas/atlas_env/lib/python3.8/site-packages/scanpy/tools/_draw_graph.pyr&      s    S





  







r&   )
r   NNr   NNNNNF)typingr   r   numpyr/   r0   Zanndatar   Zscipy.sparser    r   r   r*   r
   Z_compatr   r   r   r,   Z_Layoutstrboolintr&   r;   r;   r;   r<   <module>   sD             