aristoteleo / dynamo-release

Inclusive model of expression dynamics with conventional or metabolic labeling based scRNA-seq / multiomics, vector field reconstruction and differential geometry analyses
https://dynamo-release.readthedocs.io/en/latest/
BSD 3-Clause "New" or "Revised" License
413 stars 57 forks source link

LinAlgError: SVD did not converge in dyn.tl.cell_wise_confidence(adata) #220

Closed Roger-GOAT closed 3 years ago

Roger-GOAT commented 3 years ago

Hi, thank you for the last question. It was solved and I go through model='stochastic'. In the dyn.tl.cell_wise_confidence(adata), it shows LoweringError: Failed in nopython mode pipeline (step: native lowering) Invalid store of i64 to i32 in <numba.core.datamodel.models.RangeModel object at 0x7f116e222970> (trying to write member #1) But I still get some figure.(It is the conflit with UMAP?) I try (adata, model='stochastic', est_method='negbin') and get great result in streamline_plot. But get error in this

dyn.pp.recipe_monocle(adata)
dyn.tl.dynamics(adata, model='stochastic', est_method='negbin', cores=16)
dyn.tl.gene_wise_confidence(adata, group='leiden', lineage_dict={'2': ['8']})
dyn.pl.phase_portraits(adata, genes=adata.var_names[adata.var.use_for_dynamics][:7], figsize=(6, 4), color='leiden')
dyn.tl.cell_velocities(adata, method='pearson', other_kernels_dict={'transform': 'sqrt'})
dyn.tl.cell_wise_confidence(adata) 
(get error:TypeError: Invalid store of i64 to i32 in <numba.core.datamodel.models.RangeModel object at 0x7f116e222970> (trying to write member #1)

But I keep going

dyn.tl.confident_cell_velocities(adata, group='leiden', lineage_dict={'2': ['8']})
dyn.pl.streamline_plot(adata, color=['leiden'], basis='umap', show_legend='on data', show_arrowed_spines=True)
dyn.vf.VectorField(adata, basis='umap', M=1000, pot_curl_div=True)
|-----> vectorfield calculation begins...
|-----> Retrieve X and V based on basis: UMAP. 
        Vector field will be learned in the UMAP space.
|-----> Generating high dimensional grids and convert into a row matrix.
|-----> Learning vector field with method: sparsevfc.
|-----> [SparseVFC] begins...
|-----> Sampling control points based on data velocity magnitude...
|-----> [SparseVFC] in progress: 100.0000%
|-----> [SparseVFC] finished [26.7085s]
|-----------> current cosine correlation between input velocities and learned velocities is less than 0.6. Make a 1-th vector field reconstruction trial.
|-----> [SparseVFC] begins...
|-----> Sampling control points based on data velocity magnitude...
|-----> [SparseVFC] in progress: 100.0000%
|-----> [SparseVFC] finished [25.9473s]
|-----------> current cosine correlation between input velocities and learned velocities is less than 0.6. Make a 2-th vector field reconstruction trial.
|-----> [SparseVFC] begins...
|-----> Sampling control points based on data velocity magnitude...
|-----> [SparseVFC] in progress: 100.0000%
|-----> [SparseVFC] finished [27.7039s]
|-----------> current cosine correlation between input velocities and learned velocities is less than 0.6. Make a 3-th vector field reconstruction trial.
|-----> [SparseVFC] begins...
|-----> Sampling control points based on data velocity magnitude...
|-----> [SparseVFC] in progress: 100.0000%
|-----> [SparseVFC] finished [29.2147s]
|-----------> current cosine correlation between input velocities and learned velocities is less than 0.6. Make a 4-th vector field reconstruction trial.
|-----> [SparseVFC] begins...
|-----> Sampling control points based on data velocity magnitude...
|-----> [SparseVFC] in progress: 100.0000%
|-----> [SparseVFC] finished [29.9431s]
|-----------> current cosine correlation between input velocities and learned velocities is less than 0.6. Make a 5-th vector field reconstruction trial.
|-----? Cosine correlation between input velocities and learned velocities is less than 0.6 after 5 trials of vector field reconstruction.
|-----> <insert> velocity_umap_SparseVFC to obsm in AnnData Object.
|-----> <insert> X_umap_SparseVFC to obsm in AnnData Object.
|-----> <insert> VecFld_umap to uns in AnnData Object.
|-----> Running ddhodge to estimate vector field based pseudotime in umap basis...
|-----> [graphize_vecfld] in progress: 100.0000%
|-----> [graphize_vecfld] finished [104.3597s]
---------------------------------------------------------------------------
LinAlgError                               Traceback (most recent call last)
/tmp/ipykernel_256607/1425499946.py in <module>
----> 1 dyn.vf.VectorField(adata, basis='umap', M=1000, pot_curl_div=True)

~/miniconda3/envs/dyn/lib/python3.9/site-packages/dynamo_release-1.0.0-py3.9.egg/dynamo/vectorfield/topography.py in VectorField(adata, basis, layer, dims, genes, normalize, grid_velocity, grid_num, velocity_key, method, min_vel_corr, restart_num, restart_seed, model_buffer_path, return_vf_object, map_topography, pot_curl_div, cores, result_key, copy, **kwargs)
    871         logger.info(f"Running ddhodge to estimate vector field based pseudotime in {basis} basis...")
    872 
--> 873         ddhodge(adata, basis=basis, cores=cores)
    874         if X.shape[1] == 2:
    875             logger.info("Computing curl...")

~/miniconda3/envs/dyn/lib/python3.9/site-packages/dynamo_release-1.0.0-py3.9.egg/dynamo/external/hodge.py in ddhodge(adata, X_data, layer, basis, n, VecFld, adjmethod, distance_free, n_downsamples, up_sampling, sampling_method, seed, enforce, cores)
    171 
    172     ddhodge_div = div(g)
--> 173     potential_ = potential(g, -ddhodge_div)
    174 
    175     if up_sampling and to_downsample:

~/miniconda3/envs/dyn/lib/python3.9/site-packages/dynamo_release-1.0.0-py3.9.egg/dynamo/tools/graph_operators.py in potential(g, div_neg)
     70     L = np.array(g_undirected.laplacian())
     71     Q, R = qr(L)
---> 72     p = np.linalg.pinv(R).dot(Q.T).dot(div_neg)
     73 
     74     res = p - p.min()

<__array_function__ internals> in pinv(*args, **kwargs)

~/miniconda3/envs/dyn/lib/python3.9/site-packages/numpy/linalg/linalg.py in pinv(a, rcond, hermitian)
   2000         return wrap(res)
   2001     a = a.conjugate()
-> 2002     u, s, vt = svd(a, full_matrices=False, hermitian=hermitian)
   2003 
   2004     # discard small singular values

<__array_function__ internals> in svd(*args, **kwargs)

~/miniconda3/envs/dyn/lib/python3.9/site-packages/numpy/linalg/linalg.py in svd(a, full_matrices, compute_uv, hermitian)
   1658 
   1659         signature = 'D->DdD' if isComplexType(t) else 'd->ddd'
-> 1660         u, s, vh = gufunc(a, signature=signature, extobj=extobj)
   1661         u = u.astype(result_t, copy=False)
   1662         s = s.astype(_realType(result_t), copy=False)

~/miniconda3/envs/dyn/lib/python3.9/site-packages/numpy/linalg/linalg.py in _raise_linalgerror_svd_nonconvergence(err, flag)
     95 
     96 def _raise_linalgerror_svd_nonconvergence(err, flag):
---> 97     raise LinAlgError("SVD did not converge")
     98 
     99 def _raise_linalgerror_lstsq(err, flag):

LinAlgError: SVD did not converge

Thank you for your time!

Xiaojieqiu commented 3 years ago

the first error

dyn.tl.cell_wise_confidence(adata) 
(get error:TypeError: Invalid store of i64 to i32 in <numba.core.datamodel.models.RangeModel object at 0x7f116e222970> (trying to write member #1)

seems like a numba version error. what is your numba version?

for the second of SVD, it may be because your dataset is too big, how many cells do you have? Consider using: dyn.vf.VectorField(adata, basis='umap', M=1000, pot_curl_div=False)

If you want to do downstream differential geometry analysis, you should learn vector field in pca space and then follow the tutorial on this page: https://dynamo-release.readthedocs.io/en/latest/Differential_geometry.html

Roger-GOAT commented 3 years ago

Thank you xiaojie.