calico / scnym Goto Github PK
View Code? Open in Web Editor NEWSemi-supervised adversarial neural networks for classification of single cell transcriptomics data
Home Page: https://scnym.research.calicolabs.com
License: Apache License 2.0
Semi-supervised adversarial neural networks for classification of single cell transcriptomics data
Home Page: https://scnym.research.calicolabs.com
License: Apache License 2.0
The scNym package (and tutorials) are broken as it attempts to install leidenalg==0.8.0 from cache and fails. Please see the below error message. Please fix the scNym package requirements.
Collecting scnym
Using cached scnym-0.3.2-py2.py3-none-any.whl (68 kB)
Collecting anndata==0.7.4 (from scnym)
Using cached anndata-0.7.4-py3-none-any.whl (118 kB)
Collecting ConfigArgParse==1.1 (from scnym)
Using cached ConfigArgParse-1.1.tar.gz (41 kB)
Preparing metadata (setup.py) ... done
Collecting h5py==2.10.0 (from scnym)
Using cached h5py-2.10.0.tar.gz (301 kB)
Preparing metadata (setup.py) ... done
Collecting leidenalg==0.8.0 (from scnym)
Using cached leidenalg-0.8.0.tar.gz (4.1 MB)
Installing build dependencies ... done
Getting requirements to build wheel ... done
error: subprocess-exited-with-error
× Preparing metadata (pyproject.toml) did not run successfully.
│ exit code: 1
╰─> See above for output.
note: This error originates from a subprocess, and is likely not a problem with pip.
Preparing metadata (pyproject.toml) ... error
error: metadata-generation-failed
× Encountered error while generating package metadata.
╰─> See above for output.
note: This is an issue with the package mentioned above, not pip.
hint: See above for details.
By default conda install python 3.10
but many required versions of packages for scnym
are not available.
(scnym) nicholas@sci-pvm-nicholas:~$ pip install scnym==0.3.2
Collecting scnym==0.3.2
Using cached scnym-0.3.2-py2.py3-none-any.whl (68 kB)
Collecting scikit-misc==0.1.3
Using cached scikit-misc-0.1.3.tar.gz (887 kB)
Preparing metadata (setup.py) ... error
ERROR: Command errored out with exit status 1:
command: /home/nicholas/miniconda3/envs/scnym/bin/python3.1 -c 'import io, os, sys, setuptools, tokenize; sys.argv[0] = '"'"'/tmp/pip-install-mwr6kflj/scikit-misc_98238cf960f14555a7581927dfe035cc/setup.py'"'"'; __file__='"'"'/tmp/pip-install-mwr6kflj/scikit-misc_98238cf960f14555a7581927dfe035cc/setup.py'"'"';f = getattr(tokenize, '"'"'open'"'"', open)(__file__) if os.path.exists(__file__) else io.StringIO('"'"'from setuptools import setup; setup()'"'"');code = f.read().replace('"'"'\r\n'"'"', '"'"'\n'"'"');f.close();exec(compile(code, __file__, '"'"'exec'"'"'))' egg_info --egg-base /tmp/pip-pip-egg-info-f3_rfcls
cwd: /tmp/pip-install-mwr6kflj/scikit-misc_98238cf960f14555a7581927dfe035cc/
Complete output (7 lines):
Traceback (most recent call last):
File "<string>", line 1, in <module>
File "/tmp/pip-install-mwr6kflj/scikit-misc_98238cf960f14555a7581927dfe035cc/setup.py", line 170, in <module>
setup_package()
File "/tmp/pip-install-mwr6kflj/scikit-misc_98238cf960f14555a7581927dfe035cc/setup.py", line 144, in setup_package
from numpy.distutils.core import setup, numpy_cmdclass
ModuleNotFoundError: No module named 'numpy'
----------------------------------------
WARNING: Discarding https://files.pythonhosted.org/packages/b3/42/1cb9d9aa545e2a459dbc235e2d15e733876431397b1e20b28b80b5e3755e/scikit-misc-0.1.3.tar.gz#sha256=439bded1d0b549c06bd8d0f167d7b9ac6ed18fd18bbd15eec02b31820b0bb4dc (from https://pypi.org/simple/scikit-misc/). Command errored out with exit status 1: python setup.py egg_info Check the logs for full command output.
ERROR: Could not find a version that satisfies the requirement scikit-misc==0.1.3 (from scnym) (from versions: 0.1.0, 0.1.1, 0.1.2, 0.1.3, 0.1.4)
ERROR: No matching distribution found for scikit-misc==0.1.3
(scnym) nicholas@sci-pvm-nicholas:~$ python
Python 3.10.0 | packaged by conda-forge | (default, Oct 12 2021, 21:24:52) [GCC 9.4.0] on linux
Type "help", "copyright", "credits" or "license" for more information.
>>> quit()
python 3.8
does work
Thank you for developing scNym. I've been using it to infer cell populations between datasets. However, after going over your guidelines on how to use scNym I noticed that the argument domain_groupby seems to be missing from the scnym_api function. As such, I'm wondering which steps I need to take in order to be able to run scNym using multiple domains.
I've been using the scNym version 0.3.0 in python 3.8.5.
scNym requires log(CPMs) rather than raw counts. This requirement makes scNym unusable for large datasets, since log(CPMs) require a dense matrix, and dense matrices usually can't fit in memory for datasets with more than a few hundred thousand cells.
Hi,
Thank you for developing scNym
, I have been using it a lot for label transfer tasks and it is great!.
So far, my workflow has worked flawlessly until I moved to a new workstation.
When I run the following:
scnym.api.scnym_api(
adata = combined_object,
task = 'train',
groupby = 'cell_states',
domain_groupby='domain_label',
out_path = '/scnym_models/healthy/',
config = 'new_identity_discovery',
)
It fails with the following error:
CUDA compute device found.
32767 unlabeled observations found.
Using unlabeled data as a target set for semi-supervised, adversarial training.
training examples: (307282, 15412)
target examples: (32767, 15412)
X: (307282, 15412)
y: (307282,)
Using user provided domain labels.
Found 164 source domains and 6 target domains.
Not weighting classes and not balancing classes.
Found 170 unique domains.
Using MixMatch for semi-supervised learning
Scaling ICL over 100 epochs, 0 epochs for burn in.
Scaling ICL over 20 epochs, 0 epochs for burn in.
Using a Domain Adaptation Loss.
Training...
Epoch 0/99|______________________________|
Output exceeds the [size limit](command:workbench.action.openSettings?[). Open the full output data [in a text editor](command:workbench.action.openLargeOutput?f37e811e-484a-43aa-a78f-a31b60f7d9b4)
---------------------------------------------------------------------------
RuntimeError Traceback (most recent call last)
221123_train_scNym_reference-Healthy_model.ipynb Cell 18 in <cell line: 1>()
----> [1](221123_train_scNym_reference-Healthy_model.ipynb#X23sdnNjb2RlLXJlbW90ZQ%3D%3D?line=0) scnym.api.scnym_api(
[2](221123_train_scNym_reference-Healthy_model.ipynb#X23sdnNjb2RlLXJlbW90ZQ%3D%3D?line=1) adata = combined_object,
[3](221123_train_scNym_reference-Healthy_model.ipynb#X23sdnNjb2RlLXJlbW90ZQ%3D%3D?line=2) task = 'train',
[4](221123_train_scNym_reference-Healthy_model.ipynb#X23sdnNjb2RlLXJlbW90ZQ%3D%3D?line=3) groupby = 'cell_states',
[5](221123_train_scNym_reference-Healthy_model.ipynb#X23sdnNjb2RlLXJlbW90ZQ%3D%3D?line=4) domain_groupby='domain_label',
[6](221123_train_scNym_reference-Healthy_model.ipynb#X23sdnNjb2RlLXJlbW90ZQ%3D%3D?line=5) out_path = '/scnym_models/healthy_hlca/',
[7](221123_train_scNym_reference-Healthy_model.ipynb#X23sdnNjb2RlLXJlbW90ZQ%3D%3D?line=6) config = 'new_identity_discovery',
[8](221123_train_scNym_reference-Healthy_model.ipynb#X23sdnNjb2RlLXJlbW90ZQ%3D%3D?line=7) )
File ~/mambaforge/envs/scnym/lib/python3.8/site-packages/scnym/api.py:339, in scnym_api(adata, task, groupby, domain_groupby, out_path, trained_model, config, key_added, copy)
336 msg = f'{groupby} is not a variable in `adata.obs`'
337 raise ValueError(msg)
--> 339 scnym_train(
340 adata=adata,
341 config=config,
342 )
343 else:
344 # check that a pre-trained model was specified or
345 # provided for prediction
346 if trained_model is None:
File ~/mambaforge/envs/scnym/lib/python3.8/site-packages/scnym/api.py:514, in scnym_train(adata, config)
...
-> 1370 ret = torch.addmm(bias, input, weight.t())
1371 else:
1372 output = input.matmul(weight.t())
RuntimeError: CUDA error: CUBLAS_STATUS_EXECUTION_FAILED when calling `cublasSgemm( handle, opa, opb, m, n, k, &alpha, a, lda, b, ldb, &beta, c, ldc)`
Since this happened after I changed workstations, I assume it has to do with some compatibility issues with CUDA, but I can't really get my head around it.
Do you think you could help me with this?
Thank you!
Session info here:
The `sinfo` package has changed name and is now called `session_info` to become more discoverable and self-explanatory. The `sinfo` PyPI package will be kept around to avoid breaking old installs and you can downgrade to 0.3.2 if you want to use it without seeing this message. For the latest features and bug fixes, please install `session_info` instead. The usage and defaults also changed slightly, so please review the latest README at https://gitlab.com/joelostblom/session_info.
-----
anndata 0.8.0
scanpy 1.6.0
sinfo 0.3.4
-----
PIL 9.3.0
absl NA
asttokens NA
backcall 0.2.0
certifi 2022.09.24
chardet 3.0.4
cycler 0.10.0
cython_runtime NA
dateutil 2.8.2
debugpy 1.5.1
decorator 5.1.1
dunamai 1.14.1
entrypoints 0.4
executing 0.8.3
get_version 3.5.4
google NA
h5py 3.7.0
idna 2.10
igraph 0.10.2
importlib_metadata NA
ipykernel 6.9.1
jedi 0.18.1
joblib 1.2.0
kiwisolver 1.4.4
legacy_api_wrap 1.2
leidenalg 0.8.0
llvmlite 0.32.1
louvain 0.7.0
matplotlib 3.5.3
mpl_toolkits NA
natsort 8.2.0
numba 0.49.1
numexpr 2.8.4
numpy 1.23.5
packaging 21.3
pandas 1.5.1
parso 0.8.3
pexpect 4.8.0
pickleshare 0.7.5
pkg_resources NA
prompt_toolkit 3.0.20
ptyprocess 0.7.0
pure_eval 0.2.2
pydev_ipython NA
pydevconsole NA
pydevd 2.6.0
pydevd_concurrency_analyser NA
pydevd_file_utils NA
pydevd_plugins NA
pydevd_tracing NA
pygments 2.11.2
pyparsing 3.0.9
pytz 2022.6
requests 2.23.0
scipy 1.4.1
scnym 0.3.2
setuptools 65.5.1
setuptools_scm NA
six 1.16.0
sklearn 0.22.2.post1
stack_data 0.2.0
tables 3.6.1
tensorboard 2.2.1
texttable 1.6.5
torch 1.4.0
torchvision 0.5.0
tornado 6.1
tqdm 4.44.1
traitlets 5.1.1
typing_extensions NA
urllib3 1.25.8
wcwidth 0.2.5
yaml 5.3.1
zipp NA
zmq 23.2.0
-----
IPython 8.4.0
jupyter_client 7.2.2
jupyter_core 4.10.0
-----
Python 3.8.15 | packaged by conda-forge | (default, Nov 22 2022, 08:49:35) [GCC 10.4.0]
Linux-6.0.8-200.fc36.x86_64-x86_64-with-glibc2.10
16 logical CPU cores, x86_64
-----
Session information updated at 2022-11-23 15:06
I attended the scNym talk at ISMB and I'm interested in trying out scNym! However, I am having some issues setting up a local environment using conda to run scNym. I will detail the issues chronologically as well as my workarounds.
Issue 1: The README instructs to create an empty conda environment, with no specification for python distributions, and then running pip. Even if you activate into the environment, because there is no Python and hence no pip, it will either fail or worse, if you have Python installed natively on the machine, the pip call will default to that.
Solution: Instead of running conda create -n scnym_env
, add in something like conda create -n scnym_env -c conda-forge python
.
Issue 2: After doing the above and running pip install scnym
, scNym (command-line) does not work.
$ scnym --help
Traceback (most recent call last):
File "/home/timlai/anaconda3/envs/scnym_env/bin/scnym", line 8, in <module>
sys.exit(main())
File "/home/timlai/anaconda3/envs/scnym_env/lib/python3.8/site-packages/scnym/main.py", line 1316, in main
import yaml
ModuleNotFoundError: No module named 'yaml'
Solution: https://stackoverflow.com/a/56992964/13906501 takes care of this. Perhaps update the requirements to include this?
Issue 3: Although numbered 3, this seems to be independent of 2. Specifically, attempting this immediately after 1 or after the fix mentioned in 2 results in the same error.
Testing the API:
$ echo "from scnym.api import scnym_api" > test.py
$ python test.py
Traceback (most recent call last):
File "/home/timlai/scRNA/PAGA/scNYM/scnym.py", line 12, in <module>
from scnym.api import scnym_api
ModuleNotFoundError: No module named 'scnym.api'; 'scnym' is not a package
I do not have a solution for this and would appreciate some advice.
Hi, I have been trying to use scNym for annotating a target dataset but training terminates with a Runtime error message "NaN loss encountered in training". I am using the colab notebook as a guide with my own datasets for test and train. I tried running the training a couple of times on a local GPU node and the training was interrupted at epochs 12 and 18 respectively, with the above message.
Any help is appreciated!
Command:
scnym_api(
adata=adata,
task='train',
groupby='ref_annotations',
out_path='./scnym_outputs',
config='no_new_identity',
)
CUDA compute device found.
23428 unlabeled observations found.
Using unlabeled data as a target set for semi-supervised, adversarial training.
training examples: (242783, 1651)
target examples: (23428, 1651)
X: (242783, 1651)
y: (242783,)
Not weighting classes and not balancing classes.
Found 2 unique domains.
Using MixMatch for semi-supervised learning
Scaling ICL over 100 epochs, 0 epochs for burn in.
Scaling ICL over 20 epochs, 0 epochs for burn in.
Using a Domain Adaptation Loss.
Training...
Epoch 12/99|---___________________________|
Traceback:
---------------------------------------------------------------------------
RuntimeError Traceback (most recent call last)
/Users/nagendraKU/atlas_integ_preprocess/scnym_labeltransfer.ipynb Cell 14' in <cell line: 1>()
----> 1 scnym_api(
2 adata=adata,
3 task='train',
4 groupby='ref_annotations',
5 out_path='./scnym_outputs',
6 config='no_new_identity',
7 )
File /home/projects/xxx_condaenv/scnym/lib/python3.8/site-packages/scnym/api.py:339, in scnym_api(adata, task, groupby, domain_groupby, out_path, trained_model, config, key_added, copy)
336 msg = f'{groupby} is not a variable in `adata.obs`'
337 raise ValueError(msg)
--> 339 scnym_train(
340 adata=adata,
341 config=config,
342 )
343 else:
344 # check that a pre-trained model was specified or
345 # provided for prediction
346 if trained_model is None:
File /home/projects/xxx_condaenv/scnym/lib/python3.8/site-packages/scnym/api.py:514, in scnym_train(adata, config)
511 msg = f'{pretrained} file not found.'
512 raise FileNotFoundError(msg)
--> 514 acc, loss = main.fit_model(
515 X=X,
516 y=y,
517 traintest_idx=traintest_idx,
518 val_idx=val_idx,
519 batch_size=config['batch_size'],
520 n_epochs=config['n_epochs'],
521 lr=config['lr'],
522 optimizer_name=config['optimizer_name'],
523 weight_decay=config['weight_decay'],
524 ModelClass=model.CellTypeCLF,
525 out_path=config['out_path'],
526 mixup_alpha=config['mixup_alpha'],
527 unlabeled_counts=unlabeled_counts,
528 input_domain=input_domain,
529 unlabeled_domain=unlabeled_domain,
530 unsup_max_weight=config['unsup_max_weight'],
531 unsup_mean_teacher=config['unsup_mean_teacher'],
532 ssl_method=config['ssl_method'],
533 ssl_kwargs=config['ssl_kwargs'],
534 pretrained=pretrained,
535 patience=config.get('patience', None),
536 save_freq=config.get('save_freq', None),
537 tensorboard=config.get('tensorboard', False),
538 **config['model_kwargs'],
539 )
541 # add the final model results to `adata`
542 results = {
543 'model_path': osp.realpath(osp.join(config['out_path'], '00_best_model_weights.pkl')),
544 'final_acc': acc,
(...)
552 'val_idx': val_idx,
553 }
File /home/projects/xxx_condaenv/scnym/lib/python3.8/site-packages/scnym/main.py:519, in fit_model(X, y, traintest_idx, val_idx, batch_size, n_epochs, lr, optimizer_name, weight_decay, ModelClass, out_path, n_genes, mixup_alpha, unlabeled_counts, unsup_max_weight, unsup_mean_teacher, ssl_method, ssl_kwargs, weighted_classes, balanced_classes, input_domain, unlabeled_domain, pretrained, patience, save_freq, tensorboard, **kwargs)
509 T = SemiSupervisedTrainer(
510 unsup_dataloader=unsup_dataloader,
511 unsup_criterion=USL,
(...)
515 **trainer_kwargs,
516 )
518 print('Training...')
--> 519 T.train()
520 print('Training complete.')
521 print()
File /home/projects/xxx_condaenv/scnym/lib/python3.8/site-packages/scnym/trainer.py:452, in Trainer.train(self)
449 print(msg, end=end_char)
451 # training epoch
--> 452 self.train_epoch()
453 # evaluate model
454 self.val_epoch()
File /home/projects/xxx_condaenv/scnym/lib/python3.8/site-packages/scnym/trainer.py:637, in SemiSupervisedTrainer.train_epoch(self)
635 print('total loss: ', loss.item())
636 if np.isnan(loss.data.cpu().numpy()):
--> 637 raise RuntimeError('NaN loss encountered in training')
639 # compute gradients in a backward pass, update parameters
640 loss.backward()
RuntimeError: NaN loss encountered in training
Attempting to install yields the error
error: subprocess-exited-with-error
× Preparing metadata (pyproject.toml) did not run successfully.
│ exit code: 1
╰─> [1 lines of output]
error in leidenalg setup command: use_2to3 is invalid.
[end of output]
note: This error originates from a subprocess, and is likely not a problem with pip.
error: metadata-generation-failed
× Encountered error while generating package metadata.
╰─> See above for output.
Downgrading setuptools via liftoff/pyminifier#132 doesn't seem to help.
Some cell profiles contain a large majority of reads mapping to a single gene (e.g. the Rn45s
locus for low quality cells). These cells are usually filtered out during quality control, but in the event they persist in a dataset passed to scnym
, they can lead to unstable training dynamics and failures to converge.
We should add simple quality control checks in .api.scnym_api
that search for these cells in user provided datasets and throw a warning if they appear.
Hi,
I have a question about using scNym with my Seurat analysis. I have several samples corresponding to different treatments. I have followed the Seurat workflow including integrating the datasets and dimension reduction followed by clustering. I now have a few clusters from Seurat. I would like to annotate these clusters. Can scNym accomplish this?
I ask because I'm going through the README and it seems that scNym only takes the count matrix as an input, without any a priori clustering or dimension reduction, let alone integration, and attempts to annotate each individual cell? In other words, it seems an scNym workflow foregoes the standard workflow past preprocessing and does the clustering itself, via the automatic annotation.
If I've understood this correct, is it still possible nonetheless to incorporate scNym into my current framework? I understand I need to convert my Seurat object to a scanpy format in order to even attempt it.
Finally, I was also wondering what kind of performance I might be able to expect from scNym on cell lines were the cells are not expected to really differentiate? In particular, I am seeking cluster annotation tools because the manual annotation by comparing markers is proving too difficult.
Thanks.
Hi there,
Could the scnym_atlas_transfer notebook in the README be updated to include the human atlas?
Thanks!
ValueError Traceback (most recent call last)
in ()
5 if ATLAS2USE not in CELL_ATLASES.keys():
6 msg = f'{ATLAS2USE} is not available in the cell atlas directory.'
----> 7 raise ValueError(msg)
ValueError: human is not available in the cell atlas directory.
I followed the installation instructions and when I run
scnym --help
I get the following:
(scnym_env) user-comp:scnym user$ scnym --help
Traceback (most recent call last):
File "/Users/user/anaconda3/envs/scnym_env/bin/scnym", line 11, in <module>
load_entry_point('scnym==0.1', 'console_scripts', 'scnym')()
File "/Users/user/anaconda3/envs/scnym_env/lib/python3.7/site-packages/pkg_resources/__init__.py", line 490, in load_entry_point
return get_distribution(dist).load_entry_point(group, name)
File "/Users/user/anaconda3/envs/scnym_env/lib/python3.7/site-packages/pkg_resources/__init__.py", line 2854, in load_entry_point
return ep.load()
File "/Users/user/anaconda3/envs/scnym_env/lib/python3.7/site-packages/pkg_resources/__init__.py", line 2445, in load
return self.resolve()
File "/Users/user/anaconda3/envs/scnym_env/lib/python3.7/site-packages/pkg_resources/__init__.py", line 2451, in resolve
module = __import__(self.module_name, fromlist=['__name__'], level=0)
File "/Users/user/anaconda3/scnym/scnym/__init__.py", line 8, in <module>
from . import dataprep, model, predict, trainer, utils
File "/Users/user/anaconda3/scnym/scnym/dataprep.py", line 1, in <module>
import torch
File "/Users/user/anaconda3/envs/scnym_env/lib/python3.7/site-packages/torch/__init__.py", line 79, in <module>
from torch._C import *
ImportError: dlopen(/Users/user/anaconda3/envs/scnym_env/lib/python3.7/site-packages/torch/_C.cpython-37m-darwin.so, 9): Library not loaded: /usr/local/opt/libomp/lib/libomp.dylib
Referenced from: /Users/user/anaconda3/envs/scnym_env/lib/python3.7/site-packages/torch/lib/libshm.dylib
Reason: image not found
I get a similar error when I open a jupyter notebook and try to import scnym
:
---------------------------------------------------------------------------
ImportError Traceback (most recent call last)
<ipython-input-3-116a8c9e65d1> in <module>
----> 1 import scnym
2 from scnym.predict import Predicter
~/anaconda3/envs/scnym_env/lib/python3.7/site-packages/scnym-0.1-py3.7.egg/scnym/__init__.py in <module>
6 # e.g.
7 # >> from scnym.model import CellTypeCLF
----> 8 from . import dataprep, model, predict, trainer, utils
~/anaconda3/envs/scnym_env/lib/python3.7/site-packages/scnym-0.1-py3.7.egg/scnym/dataprep.py in <module>
----> 1 import torch
2 import numpy as np
3 from torch.utils.data import Dataset
4 from typing import Callable
5
~/anaconda3/envs/scnym_env/lib/python3.7/site-packages/torch/__init__.py in <module>
77 del _dl_flags
78
---> 79 from torch._C import *
80
81 __all__ += [name for name in dir(_C)
ImportError: dlopen(/Users/user/anaconda3/envs/scnym_env/lib/python3.7/site-packages/torch/_C.cpython-37m-darwin.so, 9): Library not loaded: /usr/local/opt/libomp/lib/libomp.dylib
Referenced from: /Users/user/anaconda3/envs/scnym_env/lib/python3.7/site-packages/torch/lib/libshm.dylib
Reason: image not found
Is there functionality to incorporate multiple categories, in addition to domain? For instance, I'd also like the adversary to classify other annotations such as patient and sequencer.
A declarative, efficient, and flexible JavaScript library for building user interfaces.
🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.
TypeScript is a superset of JavaScript that compiles to clean JavaScript output.
An Open Source Machine Learning Framework for Everyone
The Web framework for perfectionists with deadlines.
A PHP framework for web artisans
Bring data to life with SVG, Canvas and HTML. 📊📈🎉
JavaScript (JS) is a lightweight interpreted programming language with first-class functions.
Some thing interesting about web. New door for the world.
A server is a program made to process requests and deliver data to clients.
Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.
Some thing interesting about visualization, use data art
Some thing interesting about game, make everyone happy.
We are working to build community through open source technology. NB: members must have two-factor auth.
Open source projects and samples from Microsoft.
Google ❤️ Open Source for everyone.
Alibaba Open Source for everyone
Data-Driven Documents codes.
China tencent open source team.