scprint


Namescprint JSON
Version 2.3.5 PyPI version JSON
download
home_pageNone
SummaryscPRINT is a Large Cell Model for Gene Network Inference, Denoising and more from scRNAseq data
upload_time2025-08-05 14:47:03
maintainerNone
docs_urlNone
authorNone
requires_python<3.13,>=3.10
licenseNone
keywords grn foundation model gene regulatory network large cell model scprint scrnaseq transformer
VCS
bugtrack_url
requirements accelerate aiobotocore aiohttp aioitertools aiosignal anndata antlr4-python3-runtime anyio appdirs argon2-cffi argon2-cffi-bindings array_api_compat arrow asgiref asttokens async-lru async-timeout attridict attrs Babel beautifulsoup4 bio biomart bionty bionty-base biopython biothings-client bitsandbytes bleach botocore cachetools cellxgene-census certifi cffi chardet charset-normalizer click cmake comm contourpy cycler datasets debugpy decorator decoupler defusedxml Deprecated deprecation dill dj-database-url Django docker-pycreds docstring-parser einops evaluate exceptiongroup executing None fastjsonschema fastobo filelock fonttools fqdn frozenlist fsspec galore_torch gget gitdb GitPython gotrue gprofiler-official graphviz gseapy h11 h5py httpcore httpx huggingface-hub hydra-core idna igraph importlib-resources ipykernel ipython ipywidgets isoduration jedi Jinja2 jmespath joblib json5 jsonargparse jsonpointer jsonschema jsonschema-specifications jupyter jupyter-console jupyter-events jupyter-lsp jupyter_client jupyter_core jupyter_server jupyter_server_terminals jupyterlab jupyterlab_pygments jupyterlab_server jupyterlab_widgets kiwisolver lamin_cli lamin_utils lamindb lamindb_setup leidenalg lightning lightning-utilities lion-pytorch lit llvmlite lnschema_bionty lnschema_core loguru lxml markdown-it-py MarkupSafe matplotlib matplotlib-inline mdurl mistune mpmath multidict multiprocess mygene mysql-connector-python natsort nbclient nbconvert nbformat nest-asyncio networkx notebook notebook_shim numba numpy nvidia-cublas-cu11 nvidia-cuda-cupti-cu11 nvidia-cuda-cupti-cu12 nvidia-cuda-nvrtc-cu11 nvidia-cuda-nvrtc-cu12 nvidia-cuda-runtime-cu11 nvidia-cuda-runtime-cu12 nvidia-cudnn-cu11 nvidia-cufft-cu11 nvidia-cufft-cu12 nvidia-curand-cu11 nvidia-curand-cu12 nvidia-cusolver-cu11 nvidia-cusparse-cu11 nvidia-ml-py nvidia-nccl-cu11 nvidia-nccl-cu12 nvidia-nvjitlink-cu12 nvidia-nvtx-cu11 nvidia-nvtx-cu12 nvitop omegaconf overrides owlready2 packaging pandas pandocfilters parso patsy peft pexpect pillow platformdirs pooch postgrest prometheus_client prompt-toolkit pronto protobuf psutil psycopg2-binary ptyprocess pure-eval pyarrow pyarrow-hotfix pycparser pydantic pydot Pygments pynndescent pyparsing python-dateutil python-dotenv python-json-logger pytorch-fast-transformers pytorch-lightning pytz PyYAML pyzmq qtconsole QtPy rapidfuzz realtime referencing regex requests responses rfc3339-validator rfc3986-validator rich rich-click rpds-py s3fs safetensors scanpy scdataloader scib scikit-learn scikit-misc scipy seaborn Send2Trash sentry-sdk session-info setproctitle six smmap sniffio somacore soupsieve sqlparse stack-data statsmodels stdlib-list storage3 StrEnum supabase supafunc sympy tensorboardX termcolor terminado texttable threadpoolctl tiledb tiledbsoma tinycss2 tokenizers tomli torch torchaudio torchdata torchmetrics torchtext torchvision tornado tqdm traitlets transformers triton types-python-dateutil typeshed-client typing_extensions tzdata umap-learn universal-pathlib uri-template urllib3 wandb wcwidth webcolors webencodings websocket-client websockets widgetsnbextension wrapt xxhash yarl
Travis-CI No Travis.
coveralls test coverage No coveralls.
            > â„šī¸ main place where scprint is built and maintained

# scPRINT: Large Cell Model for scRNAseq data

[![codecov](https://codecov.io/gh/cantinilab/scPRINT/branch/main/graph/badge.svg?token=GRnnData_token_here)](https://codecov.io/gh/cantinilab/scPRINT)
[![CI](https://github.com/cantinilab/scPRINT/actions/workflows/main.yml/badge.svg)](https://github.com/cantinilab/scPRINT/actions/workflows/main.yml)
[![PyPI version](https://badge.fury.io/py/scprint.svg)](https://badge.fury.io/py/scprint)
[![Downloads](https://pepy.tech/badge/scprint)](https://pepy.tech/project/scprint)
[![Downloads](https://pepy.tech/badge/scprint/month)](https://pepy.tech/project/scprint)
[![Downloads](https://pepy.tech/badge/scprint/week)](https://pepy.tech/project/scprint)
[![GitHub issues](https://img.shields.io/github/issues/cantinilab/scPRINT)](https://img.shields.io/github/issues/cantinilab/scPRINT)
[![Code style: black](https://img.shields.io/badge/code%20style-black-000000.svg)](https://github.com/psf/black)
[![DOI](https://zenodo.org/badge/DOI/10.5281/zenodo.14749466.svg)](https://doi.org/10.5281/zenodo.14749466)
[![hugging face](https://huggingface.co/datasets/huggingface/badges/resolve/main/model-on-hf-md.svg)](https://huggingface.co/jkobject/scPRINT)

![logo](docs/logo.png)

scPRINT is a large transformer model built for the inference of gene networks (connections between genes explaining the cell's expression profile) from scRNAseq data.

It uses novel encoding and decoding of the cell expression profile and new pre-training methodologies to learn a cell model.

scPRINT can be used to perform the following analyses in a zero-shot mode:

- __expression denoising__: increase the resolution of your scRNAseq data
- __cell embedding__: generate a low-dimensional representation of your dataset
- __label prediction__: predict the cell type, disease, sequencer, sex, and ethnicity of your cells
- __gene network inference__: generate a gene network from any cell or cell cluster in your scRNAseq dataset

It is a foundation model and can be fine-tuned to perform any other analysis

[Read the manuscript!](https://www.biorxiv.org/content/10.1101/2024.07.29.605556v1) if you would like to know more about scPRINT. Have a look at some of my [X-plainers](https://twitter.com/jkobject). 

![figure1](docs/figure1.png)

🎊 test scPRINT and scDataloader on this simple [google collab](https://colab.research.google.com/drive/1CacoQDAwJn86tq2sBhUoZ6M-xAqsYFDI#scrollTo=Lb4E9IhQ7NK8)

## Table of Contents

- [scPRINT: Large Cell Model for scRNAseq data](#scprint-large-cell-model-for-scrnaseq-data)
  - [Table of Contents](#table-of-contents)
  - [Use `scPRINT`](#use-scprint)
    - [try scPRINT in superbio.ai!](#try-scprint-in-superbioai)
    - [try scPRINT on a google colab notebook!](#try-scprint-on-a-google-colab-notebook)
    - [To know: lamin.ai](#to-know-laminai)
    - [install](#install)
    - [pytorch and GPUs](#pytorch-and-gpus)
    - [dev install](#dev-install)
  - [Reproducibility](#reproducibility)
  - [Usage](#usage)
    - [scPRINT's basic commands](#scprints-basic-commands)
    - [Notes on GPU/CPU usage with triton](#notes-on-gpucpu-usage-with-triton)
    - [Simple tests:](#simple-tests)
  - [FAQ](#faq)
    - [I have a dataset and want a quick analysis:](#i-have-a-dataset-and-want-a-quick-analysis)
    - [I have a dataset and want some more control over what is going on and which model to use:](#i-have-a-dataset-and-want-some-more-control-over-what-is-going-on-and-which-model-to-use)
    - [I want to generate gene networks from scRNAseq data:](#i-want-to-generate-gene-networks-from-scrnaseq-data)
    - [I want to generate cell embeddings and cell label predictions from scRNAseq data:](#i-want-to-generate-cell-embeddings-and-cell-label-predictions-from-scrnaseq-data)
    - [I want to denoise my scRNAseq dataset:](#i-want-to-denoise-my-scrnaseq-dataset)
    - [I want to generate an atlas-level embedding](#i-want-to-generate-an-atlas-level-embedding)
    - [I need to generate gene tokens using pLLMs](#i-need-to-generate-gene-tokens-using-pllms)
    - [I want to re-train scPRINT from scratch on my own data](#i-want-to-re-train-scprint-from-scratch-on-my-own-data)
    - [I want to fine-tune scPRINT on my own data](#i-want-to-fine-tune-scprint-on-my-own-data)
    - [how can I find if scPRINT was trained on my data?](#how-can-i-find-if-scprint-was-trained-on-my-data)
    - [can I use scPRINT on other organisms rather than human?](#can-i-use-scprint-on-other-organisms-rather-than-human)
    - [how long does scPRINT takes? what kind of resources do I need? (or in alternative: can i run scPRINT locally?)](#how-long-does-scprint-takes-what-kind-of-resources-do-i-need-or-in-alternative-can-i-run-scprint-locally)
    - [I have different scRNASeq batches. Should I integrate my data before running scPRINT?](#i-have-different-scrnaseq-batches-should-i-integrate-my-data-before-running-scprint)
    - [where to find the input gene embeddings?](#where-to-find-the-input-gene-embeddings)
    - [I want to extract output gene embeddings from scPRINT](#i-want-to-extract-output-gene-embeddings-from-scprint)
  - [Documentation](#documentation)
  - [Model Weights](#model-weights)
  - [Docker](#docker)
    - [Building the Docker Image](#building-the-docker-image)
    - [Pulling the Docker Image from Docker Hub](#pulling-the-docker-image-from-docker-hub)
    - [Running the Docker Container](#running-the-docker-container)
  - [Development](#development)
  - [Work in progress (PR welcomed):](#work-in-progress-pr-welcomed)


## Use `scPRINT`

For the moment scPRINT has been tested on MacOS and Linux (Ubuntu 20.04) with Python 3.10. Its instalation takes on average 10 minutes.

If you want to be using flashattention2, know that it only supports triton 2.0 MLIR's version and torch==2.0.0 for now.

### try scPRINT in superbio.ai!

[HERE](https://app.superbio.ai/apps/67333115ed44f27eb717cf84)

### try scPRINT on a google colab notebook!

[![Open In Colab](https://colab.research.google.com/assets/colab-badge.svg)](https://colab.research.google.com/drive/1CacoQDAwJn86tq2sBhUoZ6M-xAqsYFDI#scrollTo=Vj73HINSzKHL)

### To know: lamin.ai

To use scPRINT, you will need to use [lamin.ai](https://lamin.ai/). This is needed to load biological informations like genes, cell types, organisms.. (but also to manage the pre-training datasets if this is something you want to set up)

### install

To start you will need to do:
(I would really push you to use uv as it is so much faster for the installation! [Here, is how to install uv](https://docs.astral.sh/uv/getting-started/installation/)

```bash
uv venv <env-name> --python 3.10 #scprint might work with python >3.10, but it is not tested
#one of
uv pip install scprint 
# OR uv pip install scprint[dev] # for the dev dependencies (building etc..) OR
# OR uv pip install scprint[flash] # to use flashattention2 with triton: only if you have a compatible gpu (e.g. not available for apple GPUs for now, see https://github.com/triton-lang/triton?tab=readme-ov-file#compatibility)
#OR pip install scPRINT[dev,flash]

lamin init --storage ./testdb --name test --modules bionty
```

if you start with lamin and had to do a `lamin init`, you will also need to populate your ontologies. This is because scPRINT is using ontologies to define its cell types, diseases, sexes, ethnicities, etc.

you can do it via the command 

`scdataloader populate all` 

or with this function:

```python
from scdataloader.utils import populate_my_ontology

populate_my_ontology() #to populate everything (recommended) (can take 2-10mns)

populate_my_ontology( #the minimum for scprint to run some inferences (denoising, grn inference)
organisms: List[str] = ["NCBITaxon:10090", "NCBITaxon:9606"],
    sex: List[str] = ["PATO:0000384", "PATO:0000383"],
    celltypes = None,
    ethnicities = None,
    assays = None,
    tissues = None,
    diseases = None,
    dev_stages = None,
)
```

We make use of some additional packages we developed alongside scPRINT (they are also shipped with scprint already).

Please refer to their documentation for more information:

- [scDataLoader](https://github.com/jkobject/scDataLoader): a dataloader for training large cell models.
- [GRnnData](https://github.com/cantinilab/GRnnData): a package to work with gene networks from single cell data.
- [benGRN](https://github.com/jkobject/benGRN): a package to benchmark gene network inference methods from single cell data.

### pytorch and GPUs

scPRINT can run on machines without GPUs, but it will be slow. It is highly recommended to use a GPU for inference.

Most of the time, everything works out of the box, otherwise please follow up:

#### follow up

If you start fresh in GPU programming, you need to have installed the required drivers, you might need to install a specific version of pytorch that is compatible with your drivers (e.g. nvidia 550 drivers will lead to a nvidia toolkit 11.7 or 11.8 which might mean you need to re-install a different flavor of pytorch for things to work. e.g. using the command:
`pip install torch==2.2.0 torchvision==0.17.0 torchaudio==2.2.0 --index-url https://download.pytorch.org/whl/cu118` on my case on linux.

I was able to test it with nvidia 11.7, 11.8, 12.2.

If you do not have [triton](https://triton-lang.org/main/python-api/triton.html) installed you will not be able to take advantage of GPU acceleration, but you can still use the model on the CPU.

If you do not have gpus and loading from a checkpoint, you will need to specify `transformer="normal"` in the `load_from_checkpoint` function like so:

```python
model = scPrint.load_from_checkpoint(
    '../data/temp/last.ckpt', precpt_gene_emb=None,
    transformer="normal")
```

you will know more by following the [get-started](https://cantinilab.github.io/scPRINT/notebooks/cancer_usecase/) notebook.

## Usage

To get a sense of how scPRINT works, have a look at our [get-started](https://cantinilab.github.io/scPRINT/notebooks/cancer_usecase/) notebook.

To start you will also need to download a checkpoint of a pretrain model like v2-medium or some others from [hugging face](https://huggingface.co/jkobject/scPRINT/)

```bash
$ hf download jkobject/scPRINT v2-medium.ckpt --local-dir .
``` 

### scPRINT's basic commands

This is the a template of how you would go and use scPRINT most of the time:

```py
# import stuff
from lightning.pytorch import Trainer
from scprint import scPrint
from scdataloader import DataModule

# setup a datamodule to train scprint from scratch
datamodule = DataModule(...)
# setup a model parameter
model = scPrint(...)
# to train / fit / test the model setup a trainer
trainer = Trainer(...)
# call the fit function
trainer.fit(model, datamodule=datamodule)
# to do predictions Denoiser, Embedder, GNInfer
denoiser = Denoiser(...)
adata = sc.read_h5ad(...)
denoiser(model, adata=adata)
...
```

or, from a bash command line

then finetune or analyse on your data
```bash
$ scprint fit/train/predict/test/denoise/embed/gninfer --config config/[medium|large|vlarge] ...
```
to denoise a dataset:
```bash
$ scprint denoise --adata my_human_anndata.h5ad --ckpt_path v2-medium.ckpt --species "NCBITaxon:9606" --output_filename denoised.h5ad
```
to do embedding and classification on a dataset:
(the current version implies doing a PCA and Umap so it might need a lot of RAM if run as is)
```bash
$ scprint embed --adata my_human_anndata.h5ad --ckpt_path v2-medium.ckpt --species "NCBITaxon:9606" --output_filename embedded.h5ad
```
to do gene network inference on a dataset:
```bash
$ scprint gninfer --adata my_human_anndata.h5ad --ckpt_path v2-medium.ckpt --species "NCBITaxon:9606" --cell_type 'cell_type_name_from-cell_type-obs_col' --output_filename grn.h5ad
```
to finetune scPRINT on your data:
```bash
$ scprint fit --config config/base_v2.yml --config config/pretrain_large.yml --ckpt_path large.ckpt
```

find out more about the commands by running `scprint --help` or `scprint [command] --help`.

more examples of using the command line are available in the [docs](./docs/usage.md).

## Documentation

For more information on usage please see the documentation in [https://www.jkobject.com/scPRINT/](https://cantinilab.github.io/scPRINT)

## Docker

By using the `scPRINT Docker image`, you can bypass the complexities of manual package installation, ensuring a consistent deployment environment. Included in this repository is a Dockerfile that lets you craft a container for the project; you have the choice to either build this image on your own or conveniently pull it from Docker Hub.

Make sure that you have the `docker` command line interface installed on your system.

A recommended way to install docker with the correct nvidia drivers on linux is to use this [script](https://gist.github.com/xueerchen1990/baad7baa545cb547e8633bc9e5b84786)

/!\ A MORE UP TO DATE DOCKER IMAGE is made as part of the open-problems benchmark and available in their github for all tasks where scPRINT is benchmarked

### Simple tests:

An instalation of scPRINT and a simple test of the denoiser is performed during each commit to the main branch with a [Github action](https://github.com/cantinilab/scPRINT/actions) and [pytest workflow](.github/workflows/main.yml). It also provides an expected runtime for the installation and run of scPRINT.

We now explore the different usages of scPRINT:

## FAQ

### I have a dataset and want a quick analysis:

-> use [superbio](#try-scprint-in-superbioai)

### I have a dataset and want some more control over what is going on and which model to use:

you will need to understand a few things like lamindb, scdataloader and scprint's inference tool. 

-> start with a quick intro using the [google collab notebook](#try-scprint-on-a-google-colab-notebook)

-> look at the other FAQ element based on your desired use-case

### What does my anndata need to contain to be run with scPRINT

-> your anndata only needs to contain the species ontology id in its obs['organism_ontology_term_id'] (e.g. "NCBITaxon:9606"). It also needs to contain .var_names or .var.index with gene ids defined as ENSEMBL_IDs or HUGO_SYMBOL.

-> That's it. you can then follow the preprocessing steps from various example notebooks to align your anndata to our gene set, make sure that it fits our requirements and then send it to the model!

### I want to generate gene networks from scRNAseq data:

-> Refer to the section . gene network inference in [this notebook](./docs/notebooks/cancer_usecase.ipynb#).

-> More examples in this notebook [./notebooks/assessments/bench_omni.ipynb](./notebooks/bench_omni.ipynb).

### I want to generate cell embeddings and cell label predictions from scRNAseq data:

-> Refer to the embeddings and cell annotations section in [this notebook](./docs/notebooks/cancer_usecase.ipynb#).

### I want to denoise my scRNAseq dataset:

-> Refer to the Denoising of B-cell section in [this notebook](./docs/notebooks/cancer_usecase.ipynb).

-> More example in our benchmark notebook [./notebooks/assessments/bench_denoising.ipynb](./notebooks/bench_denoising.ipynb).

### I want to generate an atlas-level embedding

-> Refer to the notebook [nice_umap.ipynb](./figures/nice_umap.ipynb).

### I need to generate gene tokens using pLLMs

To run scPRINT, you can use the option to define the gene tokens using protein language model embeddings of genes. This is done by providing the path to a parquet file of the precomputed set of embeddings for each gene name to scPRINT via "precpt_gene_emb"

-> To generate this file please refer to the notebook [generate_gene_embeddings](notebooks/generate_gene_embeddings.ipynb).

### I want to re-train scPRINT from scratch on my own data

-> Refer to the documentation page [pretrain scprint](docs/pretrain.md)

### I want to fine-tune scPRINT on my own data

-> make sure that you did a few run of scPRINT's inference e.g. [this one](#i-want-to-generate-cell-embeddings-and-cell-label-predictions-from-scrnaseq-data)

-> make sure that you read the [pretrain scprint](docs/pretrain.md) documentation

-> re-use the same logic as in the [scprint-train](notebooks/scprint_train.ipynb) notebook but apply the necessary modification in term of tasks, learning rate or parameter-efficient-fine-tuning method, if you think you will need it (given the small size of the model, this not necessary at all). This is the step where you will get your hands dirty. you might want to really understand how the model [collates](https://www.jkobject.com/scDataLoader/collator/) data, and [train](https://cantinilab.github.io/scPRINT/model/#scprint.model.model.scPrint.training_step)

### how can I find if scPRINT was trained on my data?

If your data is available in cellxgene, scPRINT was likely trained on it. However some cells, datasets were dropped due to low quality data and some were randomly removed to be part of the validation / test sets.

### can I use scPRINT on other organisms rather than human?

scPRINT has been pretrained on both humans and mouse, and can be used on any organism with a similar gene set. If you want to use scPRINT on very different organisms, you will need to generate gene embeddings for that organism and re-train scPRINT

### how long does scPRINT takes? what kind of resources do I need? (or in alternative: can i run scPRINT locally?)

please look at our supplementary tables in the [manuscript](https://www.biorxiv.org/content/10.1101/2024.07.29.605556v1)

### I have different scRNASeq batches. Should I integrate my data before running scPRINT?

scPRINT takes raw count as inputs, so please don't use integrated data. Just give the raw counts to scPRINT and it will take care of the rest.

### where to find the input gene embeddings?

If you think you need the gene embeddings file for loading the model from a checkpoint, you don't, as the embeddings are also stored in the model weights. You just need to load the weights like this:

```python
model = scPrint.load_from_checkpoint(
    '../../data/temp/last.ckpt',
    precpt_gene_emb=None,
)
```

You can also recreate the gene embedding file through [this notebook](notebooks/generate_gene_embeddings.ipynb). Just call the functions, and it should recreate the file itself.

the file itself is also available on [hugging face](https://huggingface.co/jkobject/scPRINT/tree/main)

/!\ Please understand that what I mean by gene embedding are the immutable input gene embeddings encoding the gene name. scPRINT directly takes raw counts as input and takes care of doing the embedding on the fly. (it does similarly for a gene's location in the genome).

### I want to extract output gene embeddings from scPRINT

I created a novel task script that should work similarly to the other ones (make sure that you understood how they work by running at least one inference notebook) in [scprint/tasks/gene_emb.py](scprint/tasks/gene_emb.py)
`
## Development

### dev install

If you want to use the latest version of scPRINT and work on the code yourself use `git clone` and `pip -e` instead of `pip install`.

```bash
git clone https://github.com/cantinilab/scPRINT
git clone https://github.com/jkobject/scDataLoader
git clone https://github.com/cantinilab/GRnnData
git clone https://github.com/jkobject/benGRN
pip install -e scPRINT[dev]
pip install -e scDataLoader[dev]
pip install -e GRnnData[dev]
pip install -e benGRN[dev]
```

### Reproducibility 

__To reproduce the paper please use the version / tag `1.6.4` and you will have to git clone the repo to have access to all the pre-training functionalities!__

âš ī¸ When re-training scPRINT from scratch, by default, every N epoch, the `test()`  function will be called `. It is using a predownloadedtest datasets paths (see https://github.com/cantinilab/scPRINT/issues/12). Replace them with your own paths you want to use these test functions. They are also made available on hf.co: https://huggingface.co/jkobject/scPRINT/tree/main

### Building the Docker Image

To build the Docker image from the provided `Dockerfile`, run the following command from the root directory of this repository:

```bash
docker build -t scprint:latest -f Dockerfile .
```

### Pulling the Docker Image from Docker Hub

If you don't want to build the image yourself, you can pull it directly from Docker Hub:

```bash
docker pull jkobject/scprint:1.2.0
docker tag jkobject/scprint:1.2.0 scprint:latest
```

### Running the Docker Container

Once you have the image (either by building it or pulling it), you can start a container with:

```bash
docker run --gpus all --rm -it scprint:latest bash
```

Please note: When running the Docker container, ensure you mount any necessary folders using the -v option to access them inside the container.

### Participate

Read the [CONTRIBUTING.md](CONTRIBUTING.md) file.

Read the [training runs](https://wandb.ai/ml4ig/scprint_scale/reports/scPRINT-trainings--Vmlldzo4ODIxMjgx?accessToken=80metwx7b08hhourotpskdyaxiflq700xzmzymr6scvkp69agybt79l341tv68hp) document to know more about how pre-training was performed and the its behavior.

code coverage is not right as I am using the command line interface for now. >50% of the code is covered by my current unit test.

Acknowledgement:
[python template](https://github.com/rochacbruno/python-project-template)
[laminDB](https://lamin.ai/)
[lightning](https://lightning.ai/)

## Work in progress (PR welcomed):

1. remove the triton dependencies
2. add version with additional labels (tissues, age) and organisms (mouse, zebrafish) and more datasets from cellxgene
3. version with separate transformer blocks for the encoding part of the bottleneck learning and for the cell embeddings
4. improve classifier to output uncertainties and topK predictions when unsure
5. setup latest lamindb version

Awesome Large Cell Model created by Jeremie Kalfon.

            

Raw data

            {
    "_id": null,
    "home_page": null,
    "name": "scprint",
    "maintainer": null,
    "docs_url": null,
    "requires_python": "<3.13,>=3.10",
    "maintainer_email": null,
    "keywords": "GRN, foundation model, gene regulatory network, large cell model, scPRINT, scRNAseq, transformer",
    "author": null,
    "author_email": "jeremie kalfon <jkobject@gmail.com>",
    "download_url": "https://files.pythonhosted.org/packages/11/66/8d35cf32e26546b4ccf4d5ffc8b1ff07dfcf32cfa0905057466324ca06f7/scprint-2.3.5.tar.gz",
    "platform": null,
    "description": "> \u2139\ufe0f main place where scprint is built and maintained\n\n# scPRINT: Large Cell Model for scRNAseq data\n\n[![codecov](https://codecov.io/gh/cantinilab/scPRINT/branch/main/graph/badge.svg?token=GRnnData_token_here)](https://codecov.io/gh/cantinilab/scPRINT)\n[![CI](https://github.com/cantinilab/scPRINT/actions/workflows/main.yml/badge.svg)](https://github.com/cantinilab/scPRINT/actions/workflows/main.yml)\n[![PyPI version](https://badge.fury.io/py/scprint.svg)](https://badge.fury.io/py/scprint)\n[![Downloads](https://pepy.tech/badge/scprint)](https://pepy.tech/project/scprint)\n[![Downloads](https://pepy.tech/badge/scprint/month)](https://pepy.tech/project/scprint)\n[![Downloads](https://pepy.tech/badge/scprint/week)](https://pepy.tech/project/scprint)\n[![GitHub issues](https://img.shields.io/github/issues/cantinilab/scPRINT)](https://img.shields.io/github/issues/cantinilab/scPRINT)\n[![Code style: black](https://img.shields.io/badge/code%20style-black-000000.svg)](https://github.com/psf/black)\n[![DOI](https://zenodo.org/badge/DOI/10.5281/zenodo.14749466.svg)](https://doi.org/10.5281/zenodo.14749466)\n[![hugging face](https://huggingface.co/datasets/huggingface/badges/resolve/main/model-on-hf-md.svg)](https://huggingface.co/jkobject/scPRINT)\n\n![logo](docs/logo.png)\n\nscPRINT is a large transformer model built for the inference of gene networks (connections between genes explaining the cell's expression profile) from scRNAseq data.\n\nIt uses novel encoding and decoding of the cell expression profile and new pre-training methodologies to learn a cell model.\n\nscPRINT can be used to perform the following analyses in a zero-shot mode:\n\n- __expression denoising__: increase the resolution of your scRNAseq data\n- __cell embedding__: generate a low-dimensional representation of your dataset\n- __label prediction__: predict the cell type, disease, sequencer, sex, and ethnicity of your cells\n- __gene network inference__: generate a gene network from any cell or cell cluster in your scRNAseq dataset\n\nIt is a foundation model and can be fine-tuned to perform any other analysis\n\n[Read the manuscript!](https://www.biorxiv.org/content/10.1101/2024.07.29.605556v1) if you would like to know more about scPRINT. Have a look at some of my [X-plainers](https://twitter.com/jkobject). \n\n![figure1](docs/figure1.png)\n\n\ud83c\udf8a test scPRINT and scDataloader on this simple [google collab](https://colab.research.google.com/drive/1CacoQDAwJn86tq2sBhUoZ6M-xAqsYFDI#scrollTo=Lb4E9IhQ7NK8)\n\n## Table of Contents\n\n- [scPRINT: Large Cell Model for scRNAseq data](#scprint-large-cell-model-for-scrnaseq-data)\n  - [Table of Contents](#table-of-contents)\n  - [Use `scPRINT`](#use-scprint)\n    - [try scPRINT in superbio.ai!](#try-scprint-in-superbioai)\n    - [try scPRINT on a google colab notebook!](#try-scprint-on-a-google-colab-notebook)\n    - [To know: lamin.ai](#to-know-laminai)\n    - [install](#install)\n    - [pytorch and GPUs](#pytorch-and-gpus)\n    - [dev install](#dev-install)\n  - [Reproducibility](#reproducibility)\n  - [Usage](#usage)\n    - [scPRINT's basic commands](#scprints-basic-commands)\n    - [Notes on GPU/CPU usage with triton](#notes-on-gpucpu-usage-with-triton)\n    - [Simple tests:](#simple-tests)\n  - [FAQ](#faq)\n    - [I have a dataset and want a quick analysis:](#i-have-a-dataset-and-want-a-quick-analysis)\n    - [I have a dataset and want some more control over what is going on and which model to use:](#i-have-a-dataset-and-want-some-more-control-over-what-is-going-on-and-which-model-to-use)\n    - [I want to generate gene networks from scRNAseq data:](#i-want-to-generate-gene-networks-from-scrnaseq-data)\n    - [I want to generate cell embeddings and cell label predictions from scRNAseq data:](#i-want-to-generate-cell-embeddings-and-cell-label-predictions-from-scrnaseq-data)\n    - [I want to denoise my scRNAseq dataset:](#i-want-to-denoise-my-scrnaseq-dataset)\n    - [I want to generate an atlas-level embedding](#i-want-to-generate-an-atlas-level-embedding)\n    - [I need to generate gene tokens using pLLMs](#i-need-to-generate-gene-tokens-using-pllms)\n    - [I want to re-train scPRINT from scratch on my own data](#i-want-to-re-train-scprint-from-scratch-on-my-own-data)\n    - [I want to fine-tune scPRINT on my own data](#i-want-to-fine-tune-scprint-on-my-own-data)\n    - [how can I find if scPRINT was trained on my data?](#how-can-i-find-if-scprint-was-trained-on-my-data)\n    - [can I use scPRINT on other organisms rather than human?](#can-i-use-scprint-on-other-organisms-rather-than-human)\n    - [how long does scPRINT takes? what kind of resources do I need? (or in alternative: can i run scPRINT locally?)](#how-long-does-scprint-takes-what-kind-of-resources-do-i-need-or-in-alternative-can-i-run-scprint-locally)\n    - [I have different scRNASeq batches. Should I integrate my data before running scPRINT?](#i-have-different-scrnaseq-batches-should-i-integrate-my-data-before-running-scprint)\n    - [where to find the input gene embeddings?](#where-to-find-the-input-gene-embeddings)\n    - [I want to extract output gene embeddings from scPRINT](#i-want-to-extract-output-gene-embeddings-from-scprint)\n  - [Documentation](#documentation)\n  - [Model Weights](#model-weights)\n  - [Docker](#docker)\n    - [Building the Docker Image](#building-the-docker-image)\n    - [Pulling the Docker Image from Docker Hub](#pulling-the-docker-image-from-docker-hub)\n    - [Running the Docker Container](#running-the-docker-container)\n  - [Development](#development)\n  - [Work in progress (PR welcomed):](#work-in-progress-pr-welcomed)\n\n\n## Use `scPRINT`\n\nFor the moment scPRINT has been tested on MacOS and Linux (Ubuntu 20.04) with Python 3.10. Its instalation takes on average 10 minutes.\n\nIf you want to be using flashattention2, know that it only supports triton 2.0 MLIR's version and torch==2.0.0 for now.\n\n### try scPRINT in superbio.ai!\n\n[HERE](https://app.superbio.ai/apps/67333115ed44f27eb717cf84)\n\n### try scPRINT on a google colab notebook!\n\n[![Open In Colab](https://colab.research.google.com/assets/colab-badge.svg)](https://colab.research.google.com/drive/1CacoQDAwJn86tq2sBhUoZ6M-xAqsYFDI#scrollTo=Vj73HINSzKHL)\n\n### To know: lamin.ai\n\nTo use scPRINT, you will need to use [lamin.ai](https://lamin.ai/). This is needed to load biological informations like genes, cell types, organisms.. (but also to manage the pre-training datasets if this is something you want to set up)\n\n### install\n\nTo start you will need to do:\n(I would really push you to use uv as it is so much faster for the installation! [Here, is how to install uv](https://docs.astral.sh/uv/getting-started/installation/)\n\n```bash\nuv venv <env-name> --python 3.10 #scprint might work with python >3.10, but it is not tested\n#one of\nuv pip install scprint \n# OR uv pip install scprint[dev] # for the dev dependencies (building etc..) OR\n# OR uv pip install scprint[flash] # to use flashattention2 with triton: only if you have a compatible gpu (e.g. not available for apple GPUs for now, see https://github.com/triton-lang/triton?tab=readme-ov-file#compatibility)\n#OR pip install scPRINT[dev,flash]\n\nlamin init --storage ./testdb --name test --modules bionty\n```\n\nif you start with lamin and had to do a `lamin init`, you will also need to populate your ontologies. This is because scPRINT is using ontologies to define its cell types, diseases, sexes, ethnicities, etc.\n\nyou can do it via the command \n\n`scdataloader populate all` \n\nor with this function:\n\n```python\nfrom scdataloader.utils import populate_my_ontology\n\npopulate_my_ontology() #to populate everything (recommended) (can take 2-10mns)\n\npopulate_my_ontology( #the minimum for scprint to run some inferences (denoising, grn inference)\norganisms: List[str] = [\"NCBITaxon:10090\", \"NCBITaxon:9606\"],\n    sex: List[str] = [\"PATO:0000384\", \"PATO:0000383\"],\n    celltypes = None,\n    ethnicities = None,\n    assays = None,\n    tissues = None,\n    diseases = None,\n    dev_stages = None,\n)\n```\n\nWe make use of some additional packages we developed alongside scPRINT (they are also shipped with scprint already).\n\nPlease refer to their documentation for more information:\n\n- [scDataLoader](https://github.com/jkobject/scDataLoader): a dataloader for training large cell models.\n- [GRnnData](https://github.com/cantinilab/GRnnData): a package to work with gene networks from single cell data.\n- [benGRN](https://github.com/jkobject/benGRN): a package to benchmark gene network inference methods from single cell data.\n\n### pytorch and GPUs\n\nscPRINT can run on machines without GPUs, but it will be slow. It is highly recommended to use a GPU for inference.\n\nMost of the time, everything works out of the box, otherwise please follow up:\n\n#### follow up\n\nIf you start fresh in GPU programming, you need to have installed the required drivers, you might need to install a specific version of pytorch that is compatible with your drivers (e.g. nvidia 550 drivers will lead to a nvidia toolkit 11.7 or 11.8 which might mean you need to re-install a different flavor of pytorch for things to work. e.g. using the command:\n`pip install torch==2.2.0 torchvision==0.17.0 torchaudio==2.2.0 --index-url https://download.pytorch.org/whl/cu118` on my case on linux.\n\nI was able to test it with nvidia 11.7, 11.8, 12.2.\n\nIf you do not have [triton](https://triton-lang.org/main/python-api/triton.html) installed you will not be able to take advantage of GPU acceleration, but you can still use the model on the CPU.\n\nIf you do not have gpus and loading from a checkpoint, you will need to specify `transformer=\"normal\"` in the `load_from_checkpoint` function like so:\n\n```python\nmodel = scPrint.load_from_checkpoint(\n    '../data/temp/last.ckpt', precpt_gene_emb=None,\n    transformer=\"normal\")\n```\n\nyou will know more by following the [get-started](https://cantinilab.github.io/scPRINT/notebooks/cancer_usecase/) notebook.\n\n## Usage\n\nTo get a sense of how scPRINT works, have a look at our [get-started](https://cantinilab.github.io/scPRINT/notebooks/cancer_usecase/) notebook.\n\nTo start you will also need to download a checkpoint of a pretrain model like v2-medium or some others from [hugging face](https://huggingface.co/jkobject/scPRINT/)\n\n```bash\n$ hf download jkobject/scPRINT v2-medium.ckpt --local-dir .\n``` \n\n### scPRINT's basic commands\n\nThis is the a template of how you would go and use scPRINT most of the time:\n\n```py\n# import stuff\nfrom lightning.pytorch import Trainer\nfrom scprint import scPrint\nfrom scdataloader import DataModule\n\n# setup a datamodule to train scprint from scratch\ndatamodule = DataModule(...)\n# setup a model parameter\nmodel = scPrint(...)\n# to train / fit / test the model setup a trainer\ntrainer = Trainer(...)\n# call the fit function\ntrainer.fit(model, datamodule=datamodule)\n# to do predictions Denoiser, Embedder, GNInfer\ndenoiser = Denoiser(...)\nadata = sc.read_h5ad(...)\ndenoiser(model, adata=adata)\n...\n```\n\nor, from a bash command line\n\nthen finetune or analyse on your data\n```bash\n$ scprint fit/train/predict/test/denoise/embed/gninfer --config config/[medium|large|vlarge] ...\n```\nto denoise a dataset:\n```bash\n$ scprint denoise --adata my_human_anndata.h5ad --ckpt_path v2-medium.ckpt --species \"NCBITaxon:9606\" --output_filename denoised.h5ad\n```\nto do embedding and classification on a dataset:\n(the current version implies doing a PCA and Umap so it might need a lot of RAM if run as is)\n```bash\n$ scprint embed --adata my_human_anndata.h5ad --ckpt_path v2-medium.ckpt --species \"NCBITaxon:9606\" --output_filename embedded.h5ad\n```\nto do gene network inference on a dataset:\n```bash\n$ scprint gninfer --adata my_human_anndata.h5ad --ckpt_path v2-medium.ckpt --species \"NCBITaxon:9606\" --cell_type 'cell_type_name_from-cell_type-obs_col' --output_filename grn.h5ad\n```\nto finetune scPRINT on your data:\n```bash\n$ scprint fit --config config/base_v2.yml --config config/pretrain_large.yml --ckpt_path large.ckpt\n```\n\nfind out more about the commands by running `scprint --help` or `scprint [command] --help`.\n\nmore examples of using the command line are available in the [docs](./docs/usage.md).\n\n## Documentation\n\nFor more information on usage please see the documentation in [https://www.jkobject.com/scPRINT/](https://cantinilab.github.io/scPRINT)\n\n## Docker\n\nBy using the `scPRINT Docker image`, you can bypass the complexities of manual package installation, ensuring a consistent deployment environment. Included in this repository is a Dockerfile that lets you craft a container for the project; you have the choice to either build this image on your own or conveniently pull it from Docker Hub.\n\nMake sure that you have the `docker` command line interface installed on your system.\n\nA recommended way to install docker with the correct nvidia drivers on linux is to use this [script](https://gist.github.com/xueerchen1990/baad7baa545cb547e8633bc9e5b84786)\n\n/!\\ A MORE UP TO DATE DOCKER IMAGE is made as part of the open-problems benchmark and available in their github for all tasks where scPRINT is benchmarked\n\n### Simple tests:\n\nAn instalation of scPRINT and a simple test of the denoiser is performed during each commit to the main branch with a [Github action](https://github.com/cantinilab/scPRINT/actions) and [pytest workflow](.github/workflows/main.yml). It also provides an expected runtime for the installation and run of scPRINT.\n\nWe now explore the different usages of scPRINT:\n\n## FAQ\n\n### I have a dataset and want a quick analysis:\n\n-> use [superbio](#try-scprint-in-superbioai)\n\n### I have a dataset and want some more control over what is going on and which model to use:\n\nyou will need to understand a few things like lamindb, scdataloader and scprint's inference tool. \n\n-> start with a quick intro using the [google collab notebook](#try-scprint-on-a-google-colab-notebook)\n\n-> look at the other FAQ element based on your desired use-case\n\n### What does my anndata need to contain to be run with scPRINT\n\n-> your anndata only needs to contain the species ontology id in its obs['organism_ontology_term_id'] (e.g. \"NCBITaxon:9606\"). It also needs to contain .var_names or .var.index with gene ids defined as ENSEMBL_IDs or HUGO_SYMBOL.\n\n-> That's it. you can then follow the preprocessing steps from various example notebooks to align your anndata to our gene set, make sure that it fits our requirements and then send it to the model!\n\n### I want to generate gene networks from scRNAseq data:\n\n-> Refer to the section . gene network inference in [this notebook](./docs/notebooks/cancer_usecase.ipynb#).\n\n-> More examples in this notebook [./notebooks/assessments/bench_omni.ipynb](./notebooks/bench_omni.ipynb).\n\n### I want to generate cell embeddings and cell label predictions from scRNAseq data:\n\n-> Refer to the embeddings and cell annotations section in [this notebook](./docs/notebooks/cancer_usecase.ipynb#).\n\n### I want to denoise my scRNAseq dataset:\n\n-> Refer to the Denoising of B-cell section in [this notebook](./docs/notebooks/cancer_usecase.ipynb).\n\n-> More example in our benchmark notebook [./notebooks/assessments/bench_denoising.ipynb](./notebooks/bench_denoising.ipynb).\n\n### I want to generate an atlas-level embedding\n\n-> Refer to the notebook [nice_umap.ipynb](./figures/nice_umap.ipynb).\n\n### I need to generate gene tokens using pLLMs\n\nTo run scPRINT, you can use the option to define the gene tokens using protein language model embeddings of genes. This is done by providing the path to a parquet file of the precomputed set of embeddings for each gene name to scPRINT via \"precpt_gene_emb\"\n\n-> To generate this file please refer to the notebook [generate_gene_embeddings](notebooks/generate_gene_embeddings.ipynb).\n\n### I want to re-train scPRINT from scratch on my own data\n\n-> Refer to the documentation page [pretrain scprint](docs/pretrain.md)\n\n### I want to fine-tune scPRINT on my own data\n\n-> make sure that you did a few run of scPRINT's inference e.g. [this one](#i-want-to-generate-cell-embeddings-and-cell-label-predictions-from-scrnaseq-data)\n\n-> make sure that you read the [pretrain scprint](docs/pretrain.md) documentation\n\n-> re-use the same logic as in the [scprint-train](notebooks/scprint_train.ipynb) notebook but apply the necessary modification in term of tasks, learning rate or parameter-efficient-fine-tuning method, if you think you will need it (given the small size of the model, this not necessary at all). This is the step where you will get your hands dirty. you might want to really understand how the model [collates](https://www.jkobject.com/scDataLoader/collator/) data, and [train](https://cantinilab.github.io/scPRINT/model/#scprint.model.model.scPrint.training_step)\n\n### how can I find if scPRINT was trained on my data?\n\nIf your data is available in cellxgene, scPRINT was likely trained on it. However some cells, datasets were dropped due to low quality data and some were randomly removed to be part of the validation / test sets.\n\n### can I use scPRINT on other organisms rather than human?\n\nscPRINT has been pretrained on both humans and mouse, and can be used on any organism with a similar gene set. If you want to use scPRINT on very different organisms, you will need to generate gene embeddings for that organism and re-train scPRINT\n\n### how long does scPRINT takes? what kind of resources do I need? (or in alternative: can i run scPRINT locally?)\n\nplease look at our supplementary tables in the [manuscript](https://www.biorxiv.org/content/10.1101/2024.07.29.605556v1)\n\n### I have different scRNASeq batches. Should I integrate my data before running scPRINT?\n\nscPRINT takes raw count as inputs, so please don't use integrated data. Just give the raw counts to scPRINT and it will take care of the rest.\n\n### where to find the input gene embeddings?\n\nIf you think you need the gene embeddings file for loading the model from a checkpoint, you don't, as the embeddings are also stored in the model weights. You just need to load the weights like this:\n\n```python\nmodel = scPrint.load_from_checkpoint(\n    '../../data/temp/last.ckpt',\n    precpt_gene_emb=None,\n)\n```\n\nYou can also recreate the gene embedding file through [this notebook](notebooks/generate_gene_embeddings.ipynb). Just call the functions, and it should recreate the file itself.\n\nthe file itself is also available on [hugging face](https://huggingface.co/jkobject/scPRINT/tree/main)\n\n/!\\ Please understand that what I mean by gene embedding are the immutable input gene embeddings encoding the gene name. scPRINT directly takes raw counts as input and takes care of doing the embedding on the fly. (it does similarly for a gene's location in the genome).\n\n### I want to extract output gene embeddings from scPRINT\n\nI created a novel task script that should work similarly to the other ones (make sure that you understood how they work by running at least one inference notebook) in [scprint/tasks/gene_emb.py](scprint/tasks/gene_emb.py)\n`\n## Development\n\n### dev install\n\nIf you want to use the latest version of scPRINT and work on the code yourself use `git clone` and `pip -e` instead of `pip install`.\n\n```bash\ngit clone https://github.com/cantinilab/scPRINT\ngit clone https://github.com/jkobject/scDataLoader\ngit clone https://github.com/cantinilab/GRnnData\ngit clone https://github.com/jkobject/benGRN\npip install -e scPRINT[dev]\npip install -e scDataLoader[dev]\npip install -e GRnnData[dev]\npip install -e benGRN[dev]\n```\n\n### Reproducibility \n\n__To reproduce the paper please use the version / tag `1.6.4` and you will have to git clone the repo to have access to all the pre-training functionalities!__\n\n\u26a0\ufe0f When re-training scPRINT from scratch, by default, every N epoch, the `test()`  function will be called `. It is using a predownloadedtest datasets paths (see https://github.com/cantinilab/scPRINT/issues/12). Replace them with your own paths you want to use these test functions. They are also made available on hf.co: https://huggingface.co/jkobject/scPRINT/tree/main\n\n### Building the Docker Image\n\nTo build the Docker image from the provided `Dockerfile`, run the following command from the root directory of this repository:\n\n```bash\ndocker build -t scprint:latest -f Dockerfile .\n```\n\n### Pulling the Docker Image from Docker Hub\n\nIf you don't want to build the image yourself, you can pull it directly from Docker Hub:\n\n```bash\ndocker pull jkobject/scprint:1.2.0\ndocker tag jkobject/scprint:1.2.0 scprint:latest\n```\n\n### Running the Docker Container\n\nOnce you have the image (either by building it or pulling it), you can start a container with:\n\n```bash\ndocker run --gpus all --rm -it scprint:latest bash\n```\n\nPlease note: When running the Docker container, ensure you mount any necessary folders using the -v option to access them inside the container.\n\n### Participate\n\nRead the [CONTRIBUTING.md](CONTRIBUTING.md) file.\n\nRead the [training runs](https://wandb.ai/ml4ig/scprint_scale/reports/scPRINT-trainings--Vmlldzo4ODIxMjgx?accessToken=80metwx7b08hhourotpskdyaxiflq700xzmzymr6scvkp69agybt79l341tv68hp) document to know more about how pre-training was performed and the its behavior.\n\ncode coverage is not right as I am using the command line interface for now. >50% of the code is covered by my current unit test.\n\nAcknowledgement:\n[python template](https://github.com/rochacbruno/python-project-template)\n[laminDB](https://lamin.ai/)\n[lightning](https://lightning.ai/)\n\n## Work in progress (PR welcomed):\n\n1. remove the triton dependencies\n2. add version with additional labels (tissues, age) and organisms (mouse, zebrafish) and more datasets from cellxgene\n3. version with separate transformer blocks for the encoding part of the bottleneck learning and for the cell embeddings\n4. improve classifier to output uncertainties and topK predictions when unsure\n5. setup latest lamindb version\n\nAwesome Large Cell Model created by Jeremie Kalfon.\n",
    "bugtrack_url": null,
    "license": null,
    "summary": "scPRINT is a Large Cell Model for Gene Network Inference, Denoising and more from scRNAseq data",
    "version": "2.3.5",
    "project_urls": {
        "repository": "https://github.com/jkobject/scPRINT"
    },
    "split_keywords": [
        "grn",
        " foundation model",
        " gene regulatory network",
        " large cell model",
        " scprint",
        " scrnaseq",
        " transformer"
    ],
    "urls": [
        {
            "comment_text": null,
            "digests": {
                "blake2b_256": "4ad56aef92fb8e795e716bd4d5f3cfa6cfc7a657950c797a71e55716807b0187",
                "md5": "fa44732abf15f295854cd260728035ec",
                "sha256": "e56abf61b8d6e5777aa3448561dd4c4d726ebded0ef45ddf2126a2860a8e6dc1"
            },
            "downloads": -1,
            "filename": "scprint-2.3.5-py3-none-any.whl",
            "has_sig": false,
            "md5_digest": "fa44732abf15f295854cd260728035ec",
            "packagetype": "bdist_wheel",
            "python_version": "py3",
            "requires_python": "<3.13,>=3.10",
            "size": 121361,
            "upload_time": "2025-08-05T14:47:02",
            "upload_time_iso_8601": "2025-08-05T14:47:02.281156Z",
            "url": "https://files.pythonhosted.org/packages/4a/d5/6aef92fb8e795e716bd4d5f3cfa6cfc7a657950c797a71e55716807b0187/scprint-2.3.5-py3-none-any.whl",
            "yanked": false,
            "yanked_reason": null
        },
        {
            "comment_text": null,
            "digests": {
                "blake2b_256": "11668d35cf32e26546b4ccf4d5ffc8b1ff07dfcf32cfa0905057466324ca06f7",
                "md5": "175c8e0503b29be25467119881f79157",
                "sha256": "2d68424853b0b31e9309da0eb4db09ff1dbb55ba8cfbd2ee25ce880663e3ed61"
            },
            "downloads": -1,
            "filename": "scprint-2.3.5.tar.gz",
            "has_sig": false,
            "md5_digest": "175c8e0503b29be25467119881f79157",
            "packagetype": "sdist",
            "python_version": "source",
            "requires_python": "<3.13,>=3.10",
            "size": 94959,
            "upload_time": "2025-08-05T14:47:03",
            "upload_time_iso_8601": "2025-08-05T14:47:03.545252Z",
            "url": "https://files.pythonhosted.org/packages/11/66/8d35cf32e26546b4ccf4d5ffc8b1ff07dfcf32cfa0905057466324ca06f7/scprint-2.3.5.tar.gz",
            "yanked": false,
            "yanked_reason": null
        }
    ],
    "upload_time": "2025-08-05 14:47:03",
    "github": true,
    "gitlab": false,
    "bitbucket": false,
    "codeberg": false,
    "github_user": "jkobject",
    "github_project": "scPRINT",
    "travis_ci": false,
    "coveralls": false,
    "github_actions": true,
    "requirements": [
        {
            "name": "accelerate",
            "specs": [
                [
                    "==",
                    "0.28.0"
                ]
            ]
        },
        {
            "name": "aiobotocore",
            "specs": [
                [
                    "==",
                    "2.11.2"
                ]
            ]
        },
        {
            "name": "aiohttp",
            "specs": [
                [
                    "==",
                    "3.9.3"
                ]
            ]
        },
        {
            "name": "aioitertools",
            "specs": [
                [
                    "==",
                    "0.11.0"
                ]
            ]
        },
        {
            "name": "aiosignal",
            "specs": [
                [
                    "==",
                    "1.3.1"
                ]
            ]
        },
        {
            "name": "anndata",
            "specs": [
                [
                    "==",
                    "0.10.3"
                ]
            ]
        },
        {
            "name": "antlr4-python3-runtime",
            "specs": [
                [
                    "==",
                    "4.9.3"
                ]
            ]
        },
        {
            "name": "anyio",
            "specs": [
                [
                    "==",
                    "4.2.0"
                ]
            ]
        },
        {
            "name": "appdirs",
            "specs": [
                [
                    "==",
                    "1.4.4"
                ]
            ]
        },
        {
            "name": "argon2-cffi",
            "specs": [
                [
                    "==",
                    "23.1.0"
                ]
            ]
        },
        {
            "name": "argon2-cffi-bindings",
            "specs": [
                [
                    "==",
                    "21.2.0"
                ]
            ]
        },
        {
            "name": "array_api_compat",
            "specs": [
                [
                    "==",
                    "1.4.1"
                ]
            ]
        },
        {
            "name": "arrow",
            "specs": [
                [
                    "==",
                    "1.3.0"
                ]
            ]
        },
        {
            "name": "asgiref",
            "specs": [
                [
                    "==",
                    "3.7.2"
                ]
            ]
        },
        {
            "name": "asttokens",
            "specs": [
                [
                    "==",
                    "2.4.1"
                ]
            ]
        },
        {
            "name": "async-lru",
            "specs": [
                [
                    "==",
                    "2.0.4"
                ]
            ]
        },
        {
            "name": "async-timeout",
            "specs": [
                [
                    "==",
                    "4.0.3"
                ]
            ]
        },
        {
            "name": "attridict",
            "specs": [
                [
                    "==",
                    "0.0.8"
                ]
            ]
        },
        {
            "name": "attrs",
            "specs": [
                [
                    "==",
                    "23.2.0"
                ]
            ]
        },
        {
            "name": "Babel",
            "specs": [
                [
                    "==",
                    "2.14.0"
                ]
            ]
        },
        {
            "name": "beautifulsoup4",
            "specs": [
                [
                    "==",
                    "4.12.3"
                ]
            ]
        },
        {
            "name": "bio",
            "specs": [
                [
                    "==",
                    "1.6.2"
                ]
            ]
        },
        {
            "name": "biomart",
            "specs": [
                [
                    "==",
                    "0.9.2"
                ]
            ]
        },
        {
            "name": "bionty",
            "specs": [
                [
                    "==",
                    "0.42.6"
                ]
            ]
        },
        {
            "name": "bionty-base",
            "specs": [
                [
                    "==",
                    "0.37.2"
                ]
            ]
        },
        {
            "name": "biopython",
            "specs": [
                [
                    "==",
                    "1.83"
                ]
            ]
        },
        {
            "name": "biothings-client",
            "specs": [
                [
                    "==",
                    "0.3.1"
                ]
            ]
        },
        {
            "name": "bitsandbytes",
            "specs": [
                [
                    "==",
                    "0.43.0"
                ]
            ]
        },
        {
            "name": "bleach",
            "specs": [
                [
                    "==",
                    "6.1.0"
                ]
            ]
        },
        {
            "name": "botocore",
            "specs": [
                [
                    "==",
                    "1.34.34"
                ]
            ]
        },
        {
            "name": "cachetools",
            "specs": [
                [
                    "==",
                    "5.3.3"
                ]
            ]
        },
        {
            "name": "cellxgene-census",
            "specs": [
                [
                    "==",
                    "1.10.2"
                ]
            ]
        },
        {
            "name": "certifi",
            "specs": [
                [
                    "==",
                    "2024.2.2"
                ]
            ]
        },
        {
            "name": "cffi",
            "specs": [
                [
                    "==",
                    "1.16.0"
                ]
            ]
        },
        {
            "name": "chardet",
            "specs": [
                [
                    "==",
                    "5.2.0"
                ]
            ]
        },
        {
            "name": "charset-normalizer",
            "specs": [
                [
                    "==",
                    "3.3.2"
                ]
            ]
        },
        {
            "name": "click",
            "specs": [
                [
                    "==",
                    "8.1.7"
                ]
            ]
        },
        {
            "name": "cmake",
            "specs": [
                [
                    "==",
                    "3.28.3"
                ]
            ]
        },
        {
            "name": "comm",
            "specs": [
                [
                    "==",
                    "0.2.1"
                ]
            ]
        },
        {
            "name": "contourpy",
            "specs": [
                [
                    "==",
                    "1.2.0"
                ]
            ]
        },
        {
            "name": "cycler",
            "specs": [
                [
                    "==",
                    "0.12.1"
                ]
            ]
        },
        {
            "name": "datasets",
            "specs": [
                [
                    "==",
                    "2.18.0"
                ]
            ]
        },
        {
            "name": "debugpy",
            "specs": [
                [
                    "==",
                    "1.8.1"
                ]
            ]
        },
        {
            "name": "decorator",
            "specs": [
                [
                    "==",
                    "5.1.1"
                ]
            ]
        },
        {
            "name": "decoupler",
            "specs": [
                [
                    "==",
                    "1.5.0"
                ]
            ]
        },
        {
            "name": "defusedxml",
            "specs": [
                [
                    "==",
                    "0.7.1"
                ]
            ]
        },
        {
            "name": "Deprecated",
            "specs": [
                [
                    "==",
                    "1.2.14"
                ]
            ]
        },
        {
            "name": "deprecation",
            "specs": [
                [
                    "==",
                    "2.1.0"
                ]
            ]
        },
        {
            "name": "dill",
            "specs": [
                [
                    "==",
                    "0.3.8"
                ]
            ]
        },
        {
            "name": "dj-database-url",
            "specs": [
                [
                    "==",
                    "2.1.0"
                ]
            ]
        },
        {
            "name": "Django",
            "specs": [
                [
                    "==",
                    "5.0.2"
                ]
            ]
        },
        {
            "name": "docker-pycreds",
            "specs": [
                [
                    "==",
                    "0.4.0"
                ]
            ]
        },
        {
            "name": "docstring-parser",
            "specs": [
                [
                    "==",
                    "0.15"
                ]
            ]
        },
        {
            "name": "einops",
            "specs": [
                [
                    "==",
                    "0.7.0"
                ]
            ]
        },
        {
            "name": "evaluate",
            "specs": [
                [
                    "==",
                    "0.4.1"
                ]
            ]
        },
        {
            "name": "exceptiongroup",
            "specs": [
                [
                    "==",
                    "1.2.0"
                ]
            ]
        },
        {
            "name": "executing",
            "specs": [
                [
                    "==",
                    "2.0.1"
                ]
            ]
        },
        {
            "name": null,
            "specs": []
        },
        {
            "name": "fastjsonschema",
            "specs": [
                [
                    "==",
                    "2.19.1"
                ]
            ]
        },
        {
            "name": "fastobo",
            "specs": [
                [
                    "==",
                    "0.12.3"
                ]
            ]
        },
        {
            "name": "filelock",
            "specs": [
                [
                    "==",
                    "3.13.1"
                ]
            ]
        },
        {
            "name": "fonttools",
            "specs": [
                [
                    "==",
                    "4.49.0"
                ]
            ]
        },
        {
            "name": "fqdn",
            "specs": [
                [
                    "==",
                    "1.5.1"
                ]
            ]
        },
        {
            "name": "frozenlist",
            "specs": [
                [
                    "==",
                    "1.4.1"
                ]
            ]
        },
        {
            "name": "fsspec",
            "specs": [
                [
                    "==",
                    "2024.2.0"
                ]
            ]
        },
        {
            "name": "galore_torch",
            "specs": []
        },
        {
            "name": "gget",
            "specs": [
                [
                    "==",
                    "0.28.4"
                ]
            ]
        },
        {
            "name": "gitdb",
            "specs": [
                [
                    "==",
                    "4.0.11"
                ]
            ]
        },
        {
            "name": "GitPython",
            "specs": [
                [
                    "==",
                    "3.1.42"
                ]
            ]
        },
        {
            "name": "gotrue",
            "specs": [
                [
                    "==",
                    "2.1.0"
                ]
            ]
        },
        {
            "name": "gprofiler-official",
            "specs": [
                [
                    "==",
                    "1.0.0"
                ]
            ]
        },
        {
            "name": "graphviz",
            "specs": [
                [
                    "==",
                    "0.20.1"
                ]
            ]
        },
        {
            "name": "gseapy",
            "specs": [
                [
                    "==",
                    "1.1.1"
                ]
            ]
        },
        {
            "name": "h11",
            "specs": [
                [
                    "==",
                    "0.14.0"
                ]
            ]
        },
        {
            "name": "h5py",
            "specs": [
                [
                    "==",
                    "3.10.0"
                ]
            ]
        },
        {
            "name": "httpcore",
            "specs": [
                [
                    "==",
                    "0.17.3"
                ]
            ]
        },
        {
            "name": "httpx",
            "specs": [
                [
                    "==",
                    "0.24.1"
                ]
            ]
        },
        {
            "name": "huggingface-hub",
            "specs": [
                [
                    "==",
                    "0.20.3"
                ]
            ]
        },
        {
            "name": "hydra-core",
            "specs": [
                [
                    "==",
                    "1.3.2"
                ]
            ]
        },
        {
            "name": "idna",
            "specs": [
                [
                    "==",
                    "3.6"
                ]
            ]
        },
        {
            "name": "igraph",
            "specs": [
                [
                    "==",
                    "0.11.4"
                ]
            ]
        },
        {
            "name": "importlib-resources",
            "specs": [
                [
                    "==",
                    "6.1.1"
                ]
            ]
        },
        {
            "name": "ipykernel",
            "specs": [
                [
                    "==",
                    "6.29.2"
                ]
            ]
        },
        {
            "name": "ipython",
            "specs": [
                [
                    "==",
                    "8.21.0"
                ]
            ]
        },
        {
            "name": "ipywidgets",
            "specs": [
                [
                    "==",
                    "8.1.2"
                ]
            ]
        },
        {
            "name": "isoduration",
            "specs": [
                [
                    "==",
                    "20.11.0"
                ]
            ]
        },
        {
            "name": "jedi",
            "specs": [
                [
                    "==",
                    "0.19.1"
                ]
            ]
        },
        {
            "name": "Jinja2",
            "specs": [
                [
                    "==",
                    "3.1.3"
                ]
            ]
        },
        {
            "name": "jmespath",
            "specs": [
                [
                    "==",
                    "1.0.1"
                ]
            ]
        },
        {
            "name": "joblib",
            "specs": [
                [
                    "==",
                    "1.3.2"
                ]
            ]
        },
        {
            "name": "json5",
            "specs": [
                [
                    "==",
                    "0.9.17"
                ]
            ]
        },
        {
            "name": "jsonargparse",
            "specs": [
                [
                    "==",
                    "4.27.5"
                ]
            ]
        },
        {
            "name": "jsonpointer",
            "specs": [
                [
                    "==",
                    "2.4"
                ]
            ]
        },
        {
            "name": "jsonschema",
            "specs": [
                [
                    "==",
                    "4.21.1"
                ]
            ]
        },
        {
            "name": "jsonschema-specifications",
            "specs": [
                [
                    "==",
                    "2023.12.1"
                ]
            ]
        },
        {
            "name": "jupyter",
            "specs": [
                [
                    "==",
                    "1.0.0"
                ]
            ]
        },
        {
            "name": "jupyter-console",
            "specs": [
                [
                    "==",
                    "6.6.3"
                ]
            ]
        },
        {
            "name": "jupyter-events",
            "specs": [
                [
                    "==",
                    "0.9.0"
                ]
            ]
        },
        {
            "name": "jupyter-lsp",
            "specs": [
                [
                    "==",
                    "2.2.3"
                ]
            ]
        },
        {
            "name": "jupyter_client",
            "specs": [
                [
                    "==",
                    "8.6.0"
                ]
            ]
        },
        {
            "name": "jupyter_core",
            "specs": [
                [
                    "==",
                    "5.7.1"
                ]
            ]
        },
        {
            "name": "jupyter_server",
            "specs": [
                [
                    "==",
                    "2.12.5"
                ]
            ]
        },
        {
            "name": "jupyter_server_terminals",
            "specs": [
                [
                    "==",
                    "0.5.2"
                ]
            ]
        },
        {
            "name": "jupyterlab",
            "specs": [
                [
                    "==",
                    "4.1.2"
                ]
            ]
        },
        {
            "name": "jupyterlab_pygments",
            "specs": [
                [
                    "==",
                    "0.3.0"
                ]
            ]
        },
        {
            "name": "jupyterlab_server",
            "specs": [
                [
                    "==",
                    "2.25.3"
                ]
            ]
        },
        {
            "name": "jupyterlab_widgets",
            "specs": [
                [
                    "==",
                    "3.0.10"
                ]
            ]
        },
        {
            "name": "kiwisolver",
            "specs": [
                [
                    "==",
                    "1.4.5"
                ]
            ]
        },
        {
            "name": "lamin_cli",
            "specs": [
                [
                    "==",
                    "0.12.1"
                ]
            ]
        },
        {
            "name": "lamin_utils",
            "specs": [
                [
                    "==",
                    "0.13.1"
                ]
            ]
        },
        {
            "name": "lamindb",
            "specs": [
                [
                    "==",
                    "0.69.9"
                ]
            ]
        },
        {
            "name": "lamindb_setup",
            "specs": [
                [
                    "==",
                    "0.69.0"
                ]
            ]
        },
        {
            "name": "leidenalg",
            "specs": [
                [
                    "==",
                    "0.10.2"
                ]
            ]
        },
        {
            "name": "lightning",
            "specs": [
                [
                    "==",
                    "2.2.0.post0"
                ]
            ]
        },
        {
            "name": "lightning-utilities",
            "specs": [
                [
                    "==",
                    "0.10.1"
                ]
            ]
        },
        {
            "name": "lion-pytorch",
            "specs": [
                [
                    "==",
                    "0.1.2"
                ]
            ]
        },
        {
            "name": "lit",
            "specs": [
                [
                    "==",
                    "17.0.6"
                ]
            ]
        },
        {
            "name": "llvmlite",
            "specs": [
                [
                    "==",
                    "0.42.0"
                ]
            ]
        },
        {
            "name": "lnschema_bionty",
            "specs": [
                [
                    "==",
                    "0.41.7"
                ]
            ]
        },
        {
            "name": "lnschema_core",
            "specs": [
                [
                    "==",
                    "0.64.6"
                ]
            ]
        },
        {
            "name": "loguru",
            "specs": [
                [
                    "==",
                    "0.7.2"
                ]
            ]
        },
        {
            "name": "lxml",
            "specs": [
                [
                    "==",
                    "5.1.0"
                ]
            ]
        },
        {
            "name": "markdown-it-py",
            "specs": [
                [
                    "==",
                    "3.0.0"
                ]
            ]
        },
        {
            "name": "MarkupSafe",
            "specs": [
                [
                    "==",
                    "2.1.5"
                ]
            ]
        },
        {
            "name": "matplotlib",
            "specs": [
                [
                    "==",
                    "3.8.3"
                ]
            ]
        },
        {
            "name": "matplotlib-inline",
            "specs": [
                [
                    "==",
                    "0.1.6"
                ]
            ]
        },
        {
            "name": "mdurl",
            "specs": [
                [
                    "==",
                    "0.1.2"
                ]
            ]
        },
        {
            "name": "mistune",
            "specs": [
                [
                    "==",
                    "3.0.2"
                ]
            ]
        },
        {
            "name": "mpmath",
            "specs": [
                [
                    "==",
                    "1.3.0"
                ]
            ]
        },
        {
            "name": "multidict",
            "specs": [
                [
                    "==",
                    "6.0.5"
                ]
            ]
        },
        {
            "name": "multiprocess",
            "specs": [
                [
                    "==",
                    "0.70.16"
                ]
            ]
        },
        {
            "name": "mygene",
            "specs": [
                [
                    "==",
                    "3.2.2"
                ]
            ]
        },
        {
            "name": "mysql-connector-python",
            "specs": [
                [
                    "==",
                    "8.0.29"
                ]
            ]
        },
        {
            "name": "natsort",
            "specs": [
                [
                    "==",
                    "8.4.0"
                ]
            ]
        },
        {
            "name": "nbclient",
            "specs": [
                [
                    "==",
                    "0.9.0"
                ]
            ]
        },
        {
            "name": "nbconvert",
            "specs": [
                [
                    "==",
                    "7.16.1"
                ]
            ]
        },
        {
            "name": "nbformat",
            "specs": [
                [
                    "==",
                    "5.9.2"
                ]
            ]
        },
        {
            "name": "nest-asyncio",
            "specs": [
                [
                    "==",
                    "1.6.0"
                ]
            ]
        },
        {
            "name": "networkx",
            "specs": [
                [
                    "==",
                    "3.2.1"
                ]
            ]
        },
        {
            "name": "notebook",
            "specs": [
                [
                    "==",
                    "7.1.1"
                ]
            ]
        },
        {
            "name": "notebook_shim",
            "specs": [
                [
                    "==",
                    "0.2.4"
                ]
            ]
        },
        {
            "name": "numba",
            "specs": [
                [
                    "==",
                    "0.59.0"
                ]
            ]
        },
        {
            "name": "numpy",
            "specs": [
                [
                    "==",
                    "1.26.4"
                ]
            ]
        },
        {
            "name": "nvidia-cublas-cu11",
            "specs": [
                [
                    "==",
                    "11.10.3.66"
                ]
            ]
        },
        {
            "name": "nvidia-cuda-cupti-cu11",
            "specs": [
                [
                    "==",
                    "11.7.101"
                ]
            ]
        },
        {
            "name": "nvidia-cuda-cupti-cu12",
            "specs": [
                [
                    "==",
                    "12.1.105"
                ]
            ]
        },
        {
            "name": "nvidia-cuda-nvrtc-cu11",
            "specs": [
                [
                    "==",
                    "11.7.99"
                ]
            ]
        },
        {
            "name": "nvidia-cuda-nvrtc-cu12",
            "specs": [
                [
                    "==",
                    "12.1.105"
                ]
            ]
        },
        {
            "name": "nvidia-cuda-runtime-cu11",
            "specs": [
                [
                    "==",
                    "11.7.99"
                ]
            ]
        },
        {
            "name": "nvidia-cuda-runtime-cu12",
            "specs": [
                [
                    "==",
                    "12.1.105"
                ]
            ]
        },
        {
            "name": "nvidia-cudnn-cu11",
            "specs": [
                [
                    "==",
                    "8.5.0.96"
                ]
            ]
        },
        {
            "name": "nvidia-cufft-cu11",
            "specs": [
                [
                    "==",
                    "10.9.0.58"
                ]
            ]
        },
        {
            "name": "nvidia-cufft-cu12",
            "specs": [
                [
                    "==",
                    "11.0.2.54"
                ]
            ]
        },
        {
            "name": "nvidia-curand-cu11",
            "specs": [
                [
                    "==",
                    "10.2.10.91"
                ]
            ]
        },
        {
            "name": "nvidia-curand-cu12",
            "specs": [
                [
                    "==",
                    "10.3.2.106"
                ]
            ]
        },
        {
            "name": "nvidia-cusolver-cu11",
            "specs": [
                [
                    "==",
                    "11.4.0.1"
                ]
            ]
        },
        {
            "name": "nvidia-cusparse-cu11",
            "specs": [
                [
                    "==",
                    "11.7.4.91"
                ]
            ]
        },
        {
            "name": "nvidia-ml-py",
            "specs": [
                [
                    "==",
                    "12.535.133"
                ]
            ]
        },
        {
            "name": "nvidia-nccl-cu11",
            "specs": [
                [
                    "==",
                    "2.14.3"
                ]
            ]
        },
        {
            "name": "nvidia-nccl-cu12",
            "specs": [
                [
                    "==",
                    "2.19.3"
                ]
            ]
        },
        {
            "name": "nvidia-nvjitlink-cu12",
            "specs": [
                [
                    "==",
                    "12.3.101"
                ]
            ]
        },
        {
            "name": "nvidia-nvtx-cu11",
            "specs": [
                [
                    "==",
                    "11.7.91"
                ]
            ]
        },
        {
            "name": "nvidia-nvtx-cu12",
            "specs": [
                [
                    "==",
                    "12.1.105"
                ]
            ]
        },
        {
            "name": "nvitop",
            "specs": [
                [
                    "==",
                    "1.3.2"
                ]
            ]
        },
        {
            "name": "omegaconf",
            "specs": [
                [
                    "==",
                    "2.3.0"
                ]
            ]
        },
        {
            "name": "overrides",
            "specs": [
                [
                    "==",
                    "7.7.0"
                ]
            ]
        },
        {
            "name": "owlready2",
            "specs": [
                [
                    "==",
                    "0.45"
                ]
            ]
        },
        {
            "name": "packaging",
            "specs": [
                [
                    "==",
                    "23.2"
                ]
            ]
        },
        {
            "name": "pandas",
            "specs": [
                [
                    "==",
                    "2.2.0"
                ]
            ]
        },
        {
            "name": "pandocfilters",
            "specs": [
                [
                    "==",
                    "1.5.1"
                ]
            ]
        },
        {
            "name": "parso",
            "specs": [
                [
                    "==",
                    "0.8.3"
                ]
            ]
        },
        {
            "name": "patsy",
            "specs": [
                [
                    "==",
                    "0.5.6"
                ]
            ]
        },
        {
            "name": "peft",
            "specs": [
                [
                    "==",
                    "0.9.0"
                ]
            ]
        },
        {
            "name": "pexpect",
            "specs": [
                [
                    "==",
                    "4.9.0"
                ]
            ]
        },
        {
            "name": "pillow",
            "specs": [
                [
                    "==",
                    "10.2.0"
                ]
            ]
        },
        {
            "name": "platformdirs",
            "specs": [
                [
                    "==",
                    "4.2.0"
                ]
            ]
        },
        {
            "name": "pooch",
            "specs": [
                [
                    "==",
                    "1.8.0"
                ]
            ]
        },
        {
            "name": "postgrest",
            "specs": [
                [
                    "==",
                    "0.13.2"
                ]
            ]
        },
        {
            "name": "prometheus_client",
            "specs": [
                [
                    "==",
                    "0.20.0"
                ]
            ]
        },
        {
            "name": "prompt-toolkit",
            "specs": [
                [
                    "==",
                    "3.0.43"
                ]
            ]
        },
        {
            "name": "pronto",
            "specs": [
                [
                    "==",
                    "2.5.5"
                ]
            ]
        },
        {
            "name": "protobuf",
            "specs": [
                [
                    "==",
                    "4.25.3"
                ]
            ]
        },
        {
            "name": "psutil",
            "specs": [
                [
                    "==",
                    "5.9.8"
                ]
            ]
        },
        {
            "name": "psycopg2-binary",
            "specs": [
                [
                    "==",
                    "2.9.9"
                ]
            ]
        },
        {
            "name": "ptyprocess",
            "specs": [
                [
                    "==",
                    "0.7.0"
                ]
            ]
        },
        {
            "name": "pure-eval",
            "specs": [
                [
                    "==",
                    "0.2.2"
                ]
            ]
        },
        {
            "name": "pyarrow",
            "specs": [
                [
                    "==",
                    "15.0.0"
                ]
            ]
        },
        {
            "name": "pyarrow-hotfix",
            "specs": [
                [
                    "==",
                    "0.6"
                ]
            ]
        },
        {
            "name": "pycparser",
            "specs": [
                [
                    "==",
                    "2.21"
                ]
            ]
        },
        {
            "name": "pydantic",
            "specs": [
                [
                    "==",
                    "1.10.14"
                ]
            ]
        },
        {
            "name": "pydot",
            "specs": [
                [
                    "==",
                    "2.0.0"
                ]
            ]
        },
        {
            "name": "Pygments",
            "specs": [
                [
                    "==",
                    "2.17.2"
                ]
            ]
        },
        {
            "name": "pynndescent",
            "specs": [
                [
                    "==",
                    "0.5.11"
                ]
            ]
        },
        {
            "name": "pyparsing",
            "specs": [
                [
                    "==",
                    "3.1.1"
                ]
            ]
        },
        {
            "name": "python-dateutil",
            "specs": [
                [
                    "==",
                    "2.8.2"
                ]
            ]
        },
        {
            "name": "python-dotenv",
            "specs": [
                [
                    "==",
                    "1.0.1"
                ]
            ]
        },
        {
            "name": "python-json-logger",
            "specs": [
                [
                    "==",
                    "2.0.7"
                ]
            ]
        },
        {
            "name": "pytorch-fast-transformers",
            "specs": [
                [
                    "==",
                    "0.4.0"
                ]
            ]
        },
        {
            "name": "pytorch-lightning",
            "specs": [
                [
                    "==",
                    "2.2.0.post0"
                ]
            ]
        },
        {
            "name": "pytz",
            "specs": [
                [
                    "==",
                    "2024.1"
                ]
            ]
        },
        {
            "name": "PyYAML",
            "specs": [
                [
                    "==",
                    "6.0.1"
                ]
            ]
        },
        {
            "name": "pyzmq",
            "specs": [
                [
                    "==",
                    "25.1.2"
                ]
            ]
        },
        {
            "name": "qtconsole",
            "specs": [
                [
                    "==",
                    "5.5.1"
                ]
            ]
        },
        {
            "name": "QtPy",
            "specs": [
                [
                    "==",
                    "2.4.1"
                ]
            ]
        },
        {
            "name": "rapidfuzz",
            "specs": [
                [
                    "==",
                    "3.6.1"
                ]
            ]
        },
        {
            "name": "realtime",
            "specs": [
                [
                    "==",
                    "1.0.2"
                ]
            ]
        },
        {
            "name": "referencing",
            "specs": [
                [
                    "==",
                    "0.33.0"
                ]
            ]
        },
        {
            "name": "regex",
            "specs": [
                [
                    "==",
                    "2023.12.25"
                ]
            ]
        },
        {
            "name": "requests",
            "specs": [
                [
                    "==",
                    "2.31.0"
                ]
            ]
        },
        {
            "name": "responses",
            "specs": [
                [
                    "==",
                    "0.18.0"
                ]
            ]
        },
        {
            "name": "rfc3339-validator",
            "specs": [
                [
                    "==",
                    "0.1.4"
                ]
            ]
        },
        {
            "name": "rfc3986-validator",
            "specs": [
                [
                    "==",
                    "0.1.1"
                ]
            ]
        },
        {
            "name": "rich",
            "specs": [
                [
                    "==",
                    "13.7.0"
                ]
            ]
        },
        {
            "name": "rich-click",
            "specs": [
                [
                    "==",
                    "1.7.3"
                ]
            ]
        },
        {
            "name": "rpds-py",
            "specs": [
                [
                    "==",
                    "0.18.0"
                ]
            ]
        },
        {
            "name": "s3fs",
            "specs": [
                [
                    "==",
                    "2024.2.0"
                ]
            ]
        },
        {
            "name": "safetensors",
            "specs": [
                [
                    "==",
                    "0.4.2"
                ]
            ]
        },
        {
            "name": "scanpy",
            "specs": [
                [
                    "==",
                    "1.9.8"
                ]
            ]
        },
        {
            "name": "scdataloader",
            "specs": []
        },
        {
            "name": "scib",
            "specs": [
                [
                    "==",
                    "1.1.4"
                ]
            ]
        },
        {
            "name": "scikit-learn",
            "specs": [
                [
                    "==",
                    "1.4.1.post1"
                ]
            ]
        },
        {
            "name": "scikit-misc",
            "specs": [
                [
                    "==",
                    "0.3.1"
                ]
            ]
        },
        {
            "name": "scipy",
            "specs": [
                [
                    "==",
                    "1.12.0"
                ]
            ]
        },
        {
            "name": "seaborn",
            "specs": [
                [
                    "==",
                    "0.13.2"
                ]
            ]
        },
        {
            "name": "Send2Trash",
            "specs": [
                [
                    "==",
                    "1.8.2"
                ]
            ]
        },
        {
            "name": "sentry-sdk",
            "specs": [
                [
                    "==",
                    "1.40.4"
                ]
            ]
        },
        {
            "name": "session-info",
            "specs": [
                [
                    "==",
                    "1.0.0"
                ]
            ]
        },
        {
            "name": "setproctitle",
            "specs": [
                [
                    "==",
                    "1.3.3"
                ]
            ]
        },
        {
            "name": "six",
            "specs": [
                [
                    "==",
                    "1.16.0"
                ]
            ]
        },
        {
            "name": "smmap",
            "specs": [
                [
                    "==",
                    "5.0.1"
                ]
            ]
        },
        {
            "name": "sniffio",
            "specs": [
                [
                    "==",
                    "1.3.0"
                ]
            ]
        },
        {
            "name": "somacore",
            "specs": [
                [
                    "==",
                    "1.0.7"
                ]
            ]
        },
        {
            "name": "soupsieve",
            "specs": [
                [
                    "==",
                    "2.5"
                ]
            ]
        },
        {
            "name": "sqlparse",
            "specs": [
                [
                    "==",
                    "0.4.4"
                ]
            ]
        },
        {
            "name": "stack-data",
            "specs": [
                [
                    "==",
                    "0.6.3"
                ]
            ]
        },
        {
            "name": "statsmodels",
            "specs": [
                [
                    "==",
                    "0.14.1"
                ]
            ]
        },
        {
            "name": "stdlib-list",
            "specs": [
                [
                    "==",
                    "0.10.0"
                ]
            ]
        },
        {
            "name": "storage3",
            "specs": [
                [
                    "==",
                    "0.7.0"
                ]
            ]
        },
        {
            "name": "StrEnum",
            "specs": [
                [
                    "==",
                    "0.4.15"
                ]
            ]
        },
        {
            "name": "supabase",
            "specs": [
                [
                    "==",
                    "2.2.1"
                ]
            ]
        },
        {
            "name": "supafunc",
            "specs": [
                [
                    "==",
                    "0.3.3"
                ]
            ]
        },
        {
            "name": "sympy",
            "specs": [
                [
                    "==",
                    "1.12"
                ]
            ]
        },
        {
            "name": "tensorboardX",
            "specs": [
                [
                    "==",
                    "2.6.2.2"
                ]
            ]
        },
        {
            "name": "termcolor",
            "specs": [
                [
                    "==",
                    "2.4.0"
                ]
            ]
        },
        {
            "name": "terminado",
            "specs": [
                [
                    "==",
                    "0.18.0"
                ]
            ]
        },
        {
            "name": "texttable",
            "specs": [
                [
                    "==",
                    "1.7.0"
                ]
            ]
        },
        {
            "name": "threadpoolctl",
            "specs": [
                [
                    "==",
                    "3.3.0"
                ]
            ]
        },
        {
            "name": "tiledb",
            "specs": [
                [
                    "==",
                    "0.25.0"
                ]
            ]
        },
        {
            "name": "tiledbsoma",
            "specs": [
                [
                    "==",
                    "1.7.1"
                ]
            ]
        },
        {
            "name": "tinycss2",
            "specs": [
                [
                    "==",
                    "1.2.1"
                ]
            ]
        },
        {
            "name": "tokenizers",
            "specs": [
                [
                    "==",
                    "0.13.3"
                ]
            ]
        },
        {
            "name": "tomli",
            "specs": [
                [
                    "==",
                    "2.0.1"
                ]
            ]
        },
        {
            "name": "torch",
            "specs": [
                [
                    "==",
                    "2.0.0"
                ]
            ]
        },
        {
            "name": "torchaudio",
            "specs": [
                [
                    "==",
                    "2.0.1"
                ]
            ]
        },
        {
            "name": "torchdata",
            "specs": [
                [
                    "==",
                    "0.6.0"
                ]
            ]
        },
        {
            "name": "torchmetrics",
            "specs": [
                [
                    "==",
                    "1.3.1"
                ]
            ]
        },
        {
            "name": "torchtext",
            "specs": [
                [
                    "==",
                    "0.15.1"
                ]
            ]
        },
        {
            "name": "torchvision",
            "specs": [
                [
                    "==",
                    "0.15.1"
                ]
            ]
        },
        {
            "name": "tornado",
            "specs": [
                [
                    "==",
                    "6.4"
                ]
            ]
        },
        {
            "name": "tqdm",
            "specs": [
                [
                    "==",
                    "4.66.2"
                ]
            ]
        },
        {
            "name": "traitlets",
            "specs": [
                [
                    "==",
                    "5.14.1"
                ]
            ]
        },
        {
            "name": "transformers",
            "specs": [
                [
                    "==",
                    "4.31.0"
                ]
            ]
        },
        {
            "name": "triton",
            "specs": [
                [
                    "==",
                    "2.0.0.dev20221202"
                ]
            ]
        },
        {
            "name": "types-python-dateutil",
            "specs": [
                [
                    "==",
                    "2.8.19.20240106"
                ]
            ]
        },
        {
            "name": "typeshed-client",
            "specs": [
                [
                    "==",
                    "2.4.0"
                ]
            ]
        },
        {
            "name": "typing_extensions",
            "specs": [
                [
                    "==",
                    "4.9.0"
                ]
            ]
        },
        {
            "name": "tzdata",
            "specs": [
                [
                    "==",
                    "2024.1"
                ]
            ]
        },
        {
            "name": "umap-learn",
            "specs": [
                [
                    "==",
                    "0.5.5"
                ]
            ]
        },
        {
            "name": "universal-pathlib",
            "specs": [
                [
                    "==",
                    "0.1.4"
                ]
            ]
        },
        {
            "name": "uri-template",
            "specs": [
                [
                    "==",
                    "1.3.0"
                ]
            ]
        },
        {
            "name": "urllib3",
            "specs": [
                [
                    "==",
                    "2.0.7"
                ]
            ]
        },
        {
            "name": "wandb",
            "specs": [
                [
                    "==",
                    "0.16.3"
                ]
            ]
        },
        {
            "name": "wcwidth",
            "specs": [
                [
                    "==",
                    "0.2.13"
                ]
            ]
        },
        {
            "name": "webcolors",
            "specs": [
                [
                    "==",
                    "1.13"
                ]
            ]
        },
        {
            "name": "webencodings",
            "specs": [
                [
                    "==",
                    "0.5.1"
                ]
            ]
        },
        {
            "name": "websocket-client",
            "specs": [
                [
                    "==",
                    "1.7.0"
                ]
            ]
        },
        {
            "name": "websockets",
            "specs": [
                [
                    "==",
                    "11.0.3"
                ]
            ]
        },
        {
            "name": "widgetsnbextension",
            "specs": [
                [
                    "==",
                    "4.0.10"
                ]
            ]
        },
        {
            "name": "wrapt",
            "specs": [
                [
                    "==",
                    "1.16.0"
                ]
            ]
        },
        {
            "name": "xxhash",
            "specs": [
                [
                    "==",
                    "3.4.1"
                ]
            ]
        },
        {
            "name": "yarl",
            "specs": [
                [
                    "==",
                    "1.9.4"
                ]
            ]
        }
    ],
    "lcname": "scprint"
}
        
Elapsed time: 1.06800s