alterlab-geniml — independently scanned and version-tracked by SaferSkills.
SaferSkills independently audited alterlab-geniml (Agent Skill) and scored it 100/100 (green). The audit ran 55 deterministic rules across Security, Supply Chain, Maintenance, Transparency, and Community; it found 0 high-severity and 0 lower-severity findings. The full rule-by-rule trace and per-finding evidence are below. Free, methodology-open.
Findings & checks · 0 flagged
Every scanned point with the score it earned and what moved between them.
First recorded scan — no prior version to compare against.
The primary manifest — the file an agent reads to learn what this artifact does.
Geniml is a Python package for building machine learning models on genomic interval data from BED files. It provides unsupervised methods for learning embeddings of genomic regions, single cells, and metadata labels, enabling similarity searches, clustering, and downstream ML tasks.
Verified against geniml 0.8.4. Install with uv (prefer uv run --with for one-off runs so nothing leaks into the project env):
uv pip install 'geniml[ml]' # [ml] pulls torch/gensim; needed for region2vec/scembedscEmbed and scATAC-seq examples also need scanpy: uv pip install scanpy. Universe building (build-universe) and hard tokenization shell out to external binaries — uniwig (coverage tracks) and bedtools — so install those separately.
Development version: uv pip install git+https://github.com/databio/geniml.git
geniml's subpackage __init__.py files do not re-export their internals, so the obvious short imports fail with ImportError. Import from the concrete module instead:
| Want | Wrong (fails) | Correct (verified) |
|---|---|---|
| Hard tokenization | from geniml.tokenization import hard_tokenization | from geniml.tokenization.main import hard_tokenization_main |
| Region2Vec (legacy fn) | from geniml.region2vec import region2vec | from geniml.region2vec.main_legacy import region2vec |
| Region2Vec (model class) | — | from geniml.region2vec.main import Region2VecExModel |
| scEmbed | from geniml.scembed import ScEmbed | from geniml.scembed.main import ScEmbed |
| Token dataset | from geniml.io import tokenize_cells (does not exist) | from geniml.region2vec.utils import Region2VecDataset |
| Tokenizer | — | from gtars.tokenizers import Tokenizer |
Tokenizing cells is handled internally by ScEmbed via a gtars Tokenizer; there is no geniml.io.tokenize_cells function.
Geniml provides five primary capabilities, each detailed in dedicated reference files:
Train unsupervised embeddings of genomic regions using word2vec-style learning.
Use for: Dimensionality reduction of BED files, region similarity analysis, feature vectors for downstream ML.
Workflow:
Reference: See references/region2vec.md for detailed workflow, parameters, and examples.
Train shared embeddings for region sets and metadata labels using StarSpace.
Use for: Metadata-aware searches, cross-modal queries (region→label or label→region), joint analysis of genomic content and experimental conditions.
Workflow:
Reference: See references/bedspace.md for detailed workflow, search types, and examples.
Train Region2Vec models on single-cell ATAC-seq data for cell-level embeddings.
Use for: scATAC-seq clustering, cell-type annotation, dimensionality reduction of single cells, integration with scanpy workflows.
Workflow:
Reference: See references/scembed.md for detailed workflow, parameters, and examples.
Build reference peak sets (universes) from BED file collections using multiple statistical methods.
Use for: Creating tokenization references, standardizing regions across datasets, defining consensus features with statistical rigor.
Workflow:
Methods:
Reference: See references/consensus_peaks.md for method comparison, parameters, and examples.
Additional tools for caching, randomization, evaluation, and search.
Available utilities:
Reference: See references/utilities.md for detailed usage of each utility.
from geniml.tokenization.main import hard_tokenization_main
from geniml.region2vec.main_legacy import region2vec
# Step 1: Tokenize BED files against a universe.
# `fraction` (default 1e-9) is the minimum overlap fraction for a hit — NOT a p-value.
# Requires the `bedtools` binary on PATH.
hard_tokenization_main(
src_folder='bed_files/',
dst_folder='tokens/',
universe_file='universe.bed',
fraction=1e-9,
)
# Step 2: Train Region2Vec (word2vec-style over the token "sentences")
region2vec(
token_folder='tokens/',
save_dir='model/',
num_shufflings=1000, # this is also the number of training epochs
embedding_dim=100,
context_win_size=5, # half-window; CLI flag is --context-len
)import scanpy as sc
from geniml.scembed.main import ScEmbed
from geniml.region2vec.utils import Region2VecDataset
from gtars.tokenizers import Tokenizer
# Step 1: Load AnnData. Peaks must live in adata.var with chr/start/end.
adata = sc.read_h5ad('scatac_data.h5ad')
# Step 2: Build a model bound to a universe tokenizer (gtars).
model = ScEmbed(tokenizer=Tokenizer('universe.bed'))
# Step 3: Train on pre-tokenized cells (a parquet of .gtok tokens).
# Embedding size / negative samples are passed via gensim_params, e.g.
# gensim_params={'vector_size': 100, 'negative': 5}
dataset = Region2VecDataset('tokens.parquet', convert_to_str=True)
model.train(dataset, epochs=100, min_count=1)
# Step 4: Generate cell embeddings and store them.
adata.obsm['scembed_X'] = model.encode(adata, pooling='mean')
# Step 5: Cluster with scanpy
sc.pp.neighbors(adata, use_rep='scembed_X')
sc.tl.leiden(adata)
sc.tl.umap(adata)# Generate coverage
cat bed_files/*.bed > combined.bed
uniwig -m 25 combined.bed chrom.sizes coverage/
# Build universe with coverage cutoff (top-level command is `build-universe`)
geniml build-universe cc \
--coverage-folder coverage/ \
--output-file universe.bed \
--cutoff 5 \
--merge 100 \
--filter-size 50
# Assess universe quality (command is `assess-universe`)
geniml assess-universe --help # see flags; varies by metricGeniml provides command-line interfaces for major operations:
# Region2Vec training (--context-len is the half-window; there is no --window-size)
geniml region2vec --token-folder tokens/ --save-dir model/ --num-shuffle 1000 --embed-dim 100
# BEDspace preprocessing
geniml bedspace preprocess --input regions/ --metadata labels.csv --universe universe.bed --output preprocessed/
# BEDspace training (StarSpace must be installed separately)
geniml bedspace train --input preprocessed.txt --output model/ --dim 100
# BEDspace search — the query is POSITIONAL (last arg), not a -q flag
geniml bedspace search -t r2l -d distances.pkl -n 10 query.bed
# Universe building (top-level command is `build-universe`; --output-file, not --output)
geniml build-universe cc --coverage-folder coverage/ --output-file universe.bed --cutoff 5
# BEDshift randomization (-b bedfile, -g refgenie genome OR -l chrom sizes; perturbations
# are rates: -d drop, -a add, -s shift, -c cut, -m merge; -r repeat, -o output)
geniml bedshift -b peaks.bed -g hg38 -s 0.3 -r 100 -o randomized.bed| You have / want | Tool |
|---|---|
| Bulk region sets (ChIP/ATAC-seq), unsupervised embeddings, no metadata | Region2Vec |
| Region sets plus metadata labels; cross-modal label↔region search | BEDspace |
| scATAC-seq cells to cluster/annotate (scanpy integration) | scEmbed |
| A consensus peak set / tokenization reference from many BEDs | build-universe |
| Cache remote BEDs, null models, embedding metrics | Utilities (BBClient/BEDshift/eval) |
| Plain interval overlap/intersection/merge counts, no ML | gtars — not geniml |
adata.obsm entriesGeniml is part of the BEDbase ecosystem:
`ImportError` on `from geniml.X import ...`: the subpackage __init__ doesn't re-export it — import from the concrete module (see the Import paths table above).
"Tokenization coverage too low":
fraction (e.g. 1e-6 instead of 1e-9) — note this is an overlap fraction, not a p-value"Training not converging":
init_lr / gensim params, ~0.01-0.05)num_shufflings for region2vec; epochs for scEmbed)"Out of memory errors":
embedding_dim"StarSpace not found" (BEDspace):
bedspace train/distances at it with -s / --path-to-starsapce (note: the geniml CLI flag is literally misspelled "starsapce")For detailed troubleshooting and method-specific issues, consult the appropriate reference file.
~30 seconds. Free. No account. Every finding cites a rule and a line of evidence.