All modules for which code is available
-- singler.annotate_integrated +
- singler.aggregate_reference +
- singler.annotate_integrated
- singler.annotate_single
- singler.classify_integrated
- singler.classify_single diff --git a/_modules/singler/aggregate_reference.html b/_modules/singler/aggregate_reference.html new file mode 100644 index 0000000..fb8be3a --- /dev/null +++ b/_modules/singler/aggregate_reference.html @@ -0,0 +1,421 @@ + + + + + + + +
- singler package
- Submodules +
- singler.aggregate_reference module +
- singler.annotate_integrated module
diff --git a/api/singler.html b/api/singler.html
index 5ac2caa..031a746 100644
--- a/api/singler.html
+++ b/api/singler.html
@@ -7,7 +7,7 @@
singler package - singler unknown documentation - + @@ -252,6 +252,50 @@singler package¶
Submodules¶
++ singler.aggregate_reference module¶
+-
+
- +singler.aggregate_reference.aggregate_reference(ref_data, ref_labels, ref_features, num_centers=None, power=0.5, num_top=1000, rank=20, assay_type='logcounts', subset_row=None, check_missing=True, num_threads=1)[source]¶ +
Aggregate reference samples for a given label by using vector quantization to average their count profiles. +The idea is to reduce the size of single-cell reference datasets so as to reduce the computation time of
+train_single()
. +We perform k-means clustering for all cells in each label and aggregate all cells within each k-means cluster. +(More specifically, the clustering is done on the principal components generated from the highly variable genes to better capture the structure within each label.) +This yields one or more profiles per label, reducing the number of separate observations while preserving some level of intra-label heterogeneity.-
+
- Parameters: +
-
+
ref_data (
Any
) – Floating-point matrix of reference expression values, usually containing log-expression values. +Alternatively, aSummarizedExperiment
object containing such a matrix.
+ref_labels (
Sequence
) – Array of length equal to the number of columns inref_data
, containing the labels for each cell.
+ref_features (
Sequence
) – Sequence of identifiers for each feature, i.e., row inref_data
.
+num_centers (
Optional
[int
]) – Maximum number of aggregated profiles to produce for each label withcluster_kmeans()
. +IfNone
, a suitable number of profiles is automatically chosen.
+power (
float
) – Number between 0 and 1 indicating how much aggregation should be performed. +Specifically, we set the number of clusters toX**power
whereX
is the number of cells assigned to that label. +Ignored ifnum_centers
is notNone
.
+num_top (
int
) – Number of highly variable genes to use for PCA prior to clustering, seechoose_highly_variable_genes()
.
+rank (
int
) – Number of principal components to use during clustering, seerun_pca()
.
+assay_type (
Union
[int
,str
]) – Integer or string specifying the assay ofref_data
containing the relevant expression matrix, +ifref
is aSummarizedExperiment
object.
+subset_row (
Optional
[Sequence
]) – Array of row indices specifying the rows ofref_data
to use for clustering. +IfNone
, no additional filtering is performed. +Note that even ifsubset_row
is provided, aggregation is still performed on all genes.
+check_missing (
bool
) – Whether to check for and remove rows with missing (NaN) values fromref_data
.
+num_threads (
int
) – Number of threads to use.
+
+- Return type: +
- + +
- Returns: +
A
+SummarizedExperiment
containing the aggregated values in its first assay. +The label for each aggregated profile is stored in the column data.
+
singler.annotate_integrated module¶
@@ -268,7 +312,7 @@Submodules
SummarizedExperiment
+SummarizedExperiment
containing such a matrix in one of its assays. ref_data (
Sequence
) –Sequence consisting of one or more of the following:
@@ -296,10 +340,10 @@SubmodulesSummarizedExperiment objects.
test_assay_type (
Union
[str
,int
]) – Assay oftest_data
containing the expression matrix, iftest_data
is a -SummarizedExperiment
.
+
SummarizedExperiment
. test_check_missing (
bool
) – Whether to check for and remove missing (i.e., NaN) values from the test dataset.ref_assay_type (
Union
[str
,int
]) – Assay containing the expression matrix for any entry ofref_data
that is a -SummarizedExperiment
.
+ref_check_missing (
bool
) – Whether to check for and remove missing (i.e., NaN) values from the reference datasets.train_single_args (
dict
) – Further arguments to pass totrain_single()
.
@@ -313,7 +357,7 @@
+Tuple
[list
[BiocFrame
],BiocFrame
]- Returns:
Tuple where the first element contains per-reference results (i.e. a @@ -341,7 +385,7 @@
Submodules
SummarizedExperiment
+SummarizedExperiment
containing such a matrix in one of its assays. Non-default assay types can be specified inclassify_args
. @@ -350,7 +394,7 @@Submodulesref argument in
train_single()
).Alternatively, a -
@@ -363,9 +407,9 @@SummarizedExperiment
+SummarizedExperiment
containing such a matrix in one of its assays. Non-default assay types can be specified inclassify_args
.SubmodulesNone, to use the row names of the experiment as features.
+test_assay_type (
Union
[str
,int
]) – Assay containing the expression matrix, iftest_data
is a -SummarizedExperiment
.SummarizedExperiment
. +ref_assay_type (
Union
[str
,int
]) – Assay containing the expression matrix, ifref_data
is a -SummarizedExperiment
.SummarizedExperiment
.test_assay_type – Whether to remove rows with missing values from the test dataset.
ref_assay_type – Whether to remove rows with missing values from the reference dataset.
-train_args (
dict
) – Further arguments to pass to @@ -376,10 +420,10 @@SubmodulesReturn type: -
- +
- Returns:
-A
BiocFrame
of labelling results, see + @@ -400,17 +444,17 @@A
BiocFrame
of labelling results, seeclassify_single()
for details.Submodules
SummarizedExperiment
+SummarizedExperiment
containing such a matrix in one of its assays.results (
list
[BiocFrame
]) – List of classification results generated by running +results (
list
[BiocFrame
]) – List of classification results generated by runningclassify_single()
ontest_data
with each reference. References should be in the same order as that used to constructintegrated_prebuilt
.integrated_prebuilt (
TrainedIntegratedReferences
) – Integrated reference object, constructed withtrain_integrated()
. +assay_type (
Union
[str
,int
]) – Assay containing the expression matrix, iftest_data
is a -SummarizedExperiment
.SummarizedExperiment
. @@ -424,10 +468,10 @@quantile (
float
) – Quantile of the correlation distribution for computing the score for each label. Larger values increase sensitivity of matches at the expense of similarity to the average behavior of each label.SubmodulesReturn type: -
- +
- Returns:
-A
BiocFrame
containing the +A
BiocFrame
containing thebest_label
across all references, defined as the assigned label in the best reference; the identity of thebest_reference
, either as a name string or an integer index; thescores
for the best label in @@ -454,13 +498,13 @@Submodules
SummarizedExperiment
+SummarizedExperiment
containing such a matrix in one of its assays.ref_prebuilt (
TrainedSingleReference
) – A pre-built reference created withtrain_single()
. +assay_type (
Union
[str
,int
]) – Assay containing the expression matrix, iftest_data
is a -SummarizedExperiment
.SummarizedExperiment
. @@ -472,7 +516,7 @@quantile (
float
) – Quantile of the correlation distribution for computing the score for each label. Larger values increase sensitivity of matches at the expense of similarity to the average behavior of each label.SubmodulesReturn type: -
- +
- Returns:
A
BiocFrame
containing thebest
@@ -500,7 +544,7 @@Submodules
SummarizedExperiment
+SummarizedExperiment
containing a matrix-like object in one of its assays.Alternatively, a list of such matrices or
SummarizedExperiment
objects, typically for multiple batches of the same reference; it @@ -522,7 +566,7 @@Submodulesref.
assay_type (
Union
[str
,int
]) – Name or index of the assay of interest, ifref
is or contains -SummarizedExperiment
+SummarizedExperiment
objects.check_missing (
bool
) – Whether to check for and remove rows with missing (NaN) values in the reference matrices. This can be set to False if it is known @@ -567,7 +611,7 @@Submodules
singler.train_integrated module¶
- -class singler.train_integrated.TrainedIntegratedReferences(ptr, ref_labels, test_num_features)[source]¶ +class singler.train_integrated.TrainedIntegratedReferences(ptr, ref_labels)[source]¶
Bases:
object
Object containing integrated references, typically constructed by
@@ -611,7 +655,7 @@train_integrated()
.Submodules
singler.train_single module¶
- -class singler.train_single.TrainedSingleReference(ptr, full_data, full_label_codes, labels, features, markers, test_num_features)[source]¶ +class singler.train_single.TrainedSingleReference(ptr, full_data, full_label_codes, labels, features, markers)[source]¶
Bases:
object
A prebuilt reference object, typically created by
train_single()
. This is intended for @@ -685,7 +729,7 @@Submodules
- -singler.train_single.train_single(ref_data, ref_labels, ref_features, test_features=None, assay_type='logcounts', restrict_to=None, check_missing=True, markers=None, marker_method='classic', marker_args={}, nn_parameters=<knncolle.vptree.VptreeParameters object>, num_threads=1)[source]¶
+singler.train_single.train_single(ref_data, ref_labels, ref_features, test_features=None, assay_type='logcounts', restrict_to=None, check_missing=True, markers=None, marker_method='classic', num_de=None, marker_args={}, aggregate=False, aggregate_args={}, nn_parameters=<knncolle.vptree.VptreeParameters object>, num_threads=1)[source]¶Build a single reference dataset in preparation for classification.
- Parameters: @@ -697,7 +741,7 @@
Submodules
SummarizedExperiment
+SummarizedExperiment
containing such a matrix in one of its assays.
@@ -705,7 +749,7 @@ref_labels (
Sequence
) – Sequence of labels for each reference profile, i.e., column inref_data
.Submodules
Optional
[Sequence
]) – Sequence of identifiers for each feature in the test dataset. +assay_type (
Union
[str
,int
]) – Assay containing the expression matrix, ifref_data
is a -SummarizedExperiment
.SummarizedExperiment
.check_missing (
bool
) – Whether to check for and remove rows with missing (NaN) values fromref_data
. -restrict_to (
Union
[set
,dict
,None
]) – Subset of available features to restrict to. Only features in @@ -716,12 +760,19 @@Submodulesa compared to
b
. All such features should be present infeatures
, and all labels inlabels
should have keys in the inner and outer dictionaries.marker_method (
Literal
['classic'
]) – Method to identify markers from each pairwise comparisons between -labels inref_data
. If “classic”, we call -get_classic_markers()
. + +marker_method (
Literal
['classic'
,'auc'
,'cohens_d'
]) – Method to identify markers from each pairwise comparisons between labels inref_data
. +Ifclassic
, we callget_classic_markers()
. +Ifauc
orcohens_d
, we callscore_markers()
. +Only used ifmarkers
is not supplied.num_de (
Optional
[int
]) – Number of differentially expressed genes to use as markers for each pairwise comparison between labels. +IfNone
andmarker_method = "classic"
, an appropriate number of genes is determined byget_classic_markers()
. +Otherwise, it is set to 10. Only used ifmarkers
is not supplied. +marker_args (
dict
) – Further arguments to pass to the chosen marker detection method. +Ifmarker_method = "classic"
, this isget_classic_markers()
, otherwise it isscore_markers()
. Only used ifmarkers
is not supplied. +aggregate (
bool
) – Whether the reference dataset should be aggregated to pseudo-bulk samples for speed, seeaggregate_reference()
for details.aggregate_args (
dict
) – Further arguments to pass toaggregate_reference()
whenaggregate = True
.nn_parameters (
Optional
[Parameters
]) – Algorithm for constructing the neighbor search index, used to compute scores during classification. @@ -789,6 +840,10 @@num_threads (
int
) – Number of threads to use for reference building.Submodulessingler package
- Submodules +
- singler.aggregate_reference module +
- singler.annotate_integrated module
diff --git a/authors.html b/authors.html
index 4be8902..2df0591 100644
--- a/authors.html
+++ b/authors.html
@@ -7,7 +7,7 @@
Contributors - singler unknown documentation - + diff --git a/changelog.html b/changelog.html index 076fc27..2bbee2b 100644 --- a/changelog.html +++ b/changelog.html @@ -7,7 +7,7 @@Changelog - singler unknown documentation - + @@ -250,6 +250,14 @@Changelog¶
++ Version 0.4.1¶
+-
+
Added the
aggregate_reference()
function to aggregate references for speed. +This is conveniently used via theaggregate=
option intrain_single()
.
+Extend
train_single()
to support marker detection using scrapper to compute Cohen’s d or the AUC of each pairwise comparison.
+
Version 0.4.0¶
-
@@ -341,6 +349,7 @@
- Changelog
-
+
- Version 0.4.1
- Version 0.4.0
- Version 0.3.0
- Version 0.2.0 diff --git a/contributing.html b/contributing.html index f167f13..c19fbc4 100644 --- a/contributing.html +++ b/contributing.html @@ -7,7 +7,7 @@
Contributing - singler unknown documentation - + diff --git a/genindex.html b/genindex.html index 92772f5..d2e543a 100644 --- a/genindex.html +++ b/genindex.html @@ -5,7 +5,7 @@Index - singler unknown documentation - + @@ -249,10 +249,12 @@Index
A
Version 0.1.0
Source code for singler.aggregate_reference
+from typing import Any, Sequence, Optional, Union
+
+import delayedarray
+import summarizedexperiment
+import numpy
+import biocframe
+
+from ._utils import _clean_matrix
+
+
+
+[docs]
+def aggregate_reference(
+ ref_data: Any,
+ ref_labels: Sequence,
+ ref_features: Sequence,
+ num_centers: Optional[int] = None,
+ power: float = 0.5,
+ num_top: int = 1000,
+ rank: int = 20,
+ assay_type: Union[int, str] = "logcounts",
+ subset_row: Optional[Sequence] = None,
+ check_missing: bool = True,
+ num_threads: int = 1
+) -> summarizedexperiment.SummarizedExperiment:
+ """Aggregate reference samples for a given label by using vector quantization to average their count profiles.
+ The idea is to reduce the size of single-cell reference datasets so as to reduce the computation time of :py:func:`~singler.train_single.train_single`.
+ We perform k-means clustering for all cells in each label and aggregate all cells within each k-means cluster.
+ (More specifically, the clustering is done on the principal components generated from the highly variable genes to better capture the structure within each label.)
+ This yields one or more profiles per label, reducing the number of separate observations while preserving some level of intra-label heterogeneity.
+
+ Args:
+ ref_data:
+ Floating-point matrix of reference expression values, usually containing log-expression values.
+ Alternatively, a :py:class:`~summarizedexperiment.SummarizedExperiment.SummarizedExperiment` object containing such a matrix.
+
+ ref_labels:
+ Array of length equal to the number of columns in ``ref_data``, containing the labels for each cell.
+
+ ref_features:
+ Sequence of identifiers for each feature, i.e., row in ``ref_data``.
+
+ num_centers:
+ Maximum number of aggregated profiles to produce for each label with :py:func:`~scranpy.cluster_kmeans.cluster_kmeans`.
+ If ``None``, a suitable number of profiles is automatically chosen.
+
+ power:
+ Number between 0 and 1 indicating how much aggregation should be performed.
+ Specifically, we set the number of clusters to ``X**power`` where ``X`` is the number of cells assigned to that label.
+ Ignored if ``num_centers`` is not ``None``.
+
+ num_top:
+ Number of highly variable genes to use for PCA prior to clustering, see :py:func:`~scranpy.choose_highly_variable_genes.choose_highly_variable_genes`.
+
+ rank:
+ Number of principal components to use during clustering, see :py:func:`~scranpy.run_pca.run_pca`.
+
+ assay_type:
+ Integer or string specifying the assay of ``ref_data`` containing the relevant expression matrix,
+ if ``ref`` is a :py:class:`~summarizedexperiment.SummarizedExperiment.SummarizedExperiment` object.
+
+ subset_row:
+ Array of row indices specifying the rows of ``ref_data`` to use for clustering.
+ If ``None``, no additional filtering is performed.
+ Note that even if ``subset_row`` is provided, aggregation is still performed on all genes.
+
+ check_missing:
+ Whether to check for and remove rows with missing (NaN) values from ``ref_data``.
+
+ num_threads:
+ Number of threads to use.
+
+ Returns:
+ A :py:class:`~summarizedexperiment.SummarizedExperiment.SummarizedExperiment` containing the aggregated values in its first assay.
+ The label for each aggregated profile is stored in the column data.
+ """
+ ref_data, ref_features = _clean_matrix(
+ ref_data,
+ ref_features,
+ assay_type=assay_type,
+ check_missing=check_missing,
+ num_threads=num_threads,
+ )
+
+ by_label = {}
+ for i, lab in enumerate(ref_labels):
+ if lab in by_label:
+ by_label[lab].append(i)
+ else:
+ by_label[lab] = [i]
+
+ output_vals = []
+ output_labels = []
+ output_names = []
+ for lab, chosen in by_label.items():
+ current = ref_data[:,chosen]
+
+ cur_num_centers = num_centers
+ if cur_num_centers is None:
+ cur_num_centers = int(current.shape[1]**power)
+
+ if cur_num_centers <= 1:
+ output = numpy.reshape(current.mean(axis=1), (current.shape[0], 1))
+ else:
+ subcurrent = current
+ if subset_row is not None:
+ subcurrent = subcurrent[subset_row,:]
+
+ # Doing a mini-analysis here: PCA on HVGs followed by k-means.
+ import scranpy
+ stats = scranpy.model_gene_variances(subcurrent, num_threads=num_threads)
+ keep = scranpy.choose_highly_variable_genes(stats.residual, top=num_top)
+ subcurrent = subcurrent[keep,:]
+
+ if rank <= min(subcurrent.shape)-1:
+ pcs = scranpy.run_pca(subcurrent, number=rank, num_threads=num_threads).components
+ else:
+ pcs = subcurrent
+
+ clustered = scranpy.cluster_kmeans(pcs, k=cur_num_centers, num_threads=num_threads)
+ agg = scranpy.aggregate_across_cells(current, [clustered.clusters], num_threads=num_threads)
+ output = agg.sum / agg.counts
+
+ output_vals.append(output)
+ output_labels += [lab] * output.shape[1]
+ for i in range(output.shape[1]):
+ output_names.append(lab + "_" + str(i))
+
+ if len(output_vals) == 0:
+ output_vals.append(numpy.zeros((ref_data.shape[0], 0)))
+
+ output = summarizedexperiment.SummarizedExperiment(
+ { "logcounts": numpy.concatenate(output_vals, axis=1) },
+ column_data = biocframe.BiocFrame({ "label": output_labels })
+ )
+ output.set_column_names(output_names, in_place=True)
+ output.set_row_names(ref_features, in_place=True)
+ return output
+
+
Source code for singler.annotate_integrated
-from typing import Any, Optional, Sequence, Tuple, Union
+from typing import Any, Optional, Sequence, Tuple, Union
-import biocframe
-import warnings
+import biocframe
+import warnings
-from ._utils import _clean_matrix, _restrict_features
-from .train_single import train_single
-from .train_integrated import train_integrated
-from .classify_single import classify_single
-from .classify_integrated import classify_integrated
+from ._utils import _clean_matrix, _restrict_features
+from .train_single import train_single
+from .train_integrated import train_integrated
+from .classify_single import classify_single
+from .classify_integrated import classify_integrated
[docs]
-def annotate_integrated(
+def annotate_integrated(
test_data: Any,
ref_data: Sequence,
ref_labels: list[Sequence],
diff --git a/_modules/singler/annotate_single.html b/_modules/singler/annotate_single.html
index d6f4c2e..de8893c 100644
--- a/_modules/singler/annotate_single.html
+++ b/_modules/singler/annotate_single.html
@@ -6,7 +6,7 @@
singler.annotate_single - singler unknown documentation
-
+
@@ -242,20 +242,20 @@
Source code for singler.annotate_single
-import warnings
-from typing import Any, Optional, Sequence, Union
+import warnings
+from typing import Any, Optional, Sequence, Union
-import biocframe
-import summarizedexperiment
+import biocframe
+import summarizedexperiment
-from .train_single import train_single
-from .classify_single import classify_single
-from ._utils import _clean_matrix, _restrict_features
+from .train_single import train_single
+from .classify_single import classify_single
+from ._utils import _clean_matrix, _restrict_features
[docs]
-def annotate_single(
+def annotate_single(
test_data: Any,
ref_data: Any,
ref_labels: Sequence,
diff --git a/_modules/singler/classify_integrated.html b/_modules/singler/classify_integrated.html
index 870ba9f..ea26825 100644
--- a/_modules/singler/classify_integrated.html
+++ b/_modules/singler/classify_integrated.html
@@ -6,7 +6,7 @@
singler.classify_integrated - singler unknown documentation
-
+
@@ -242,21 +242,21 @@
Source code for singler.classify_integrated
-from typing import Any, Sequence, Union
+from typing import Any, Sequence, Union
-import biocutils
-import biocframe
-import mattress
-import summarizedexperiment
-import numpy
+import biocutils
+import biocframe
+import mattress
+import summarizedexperiment
+import numpy
-from . import lib_singler as lib
-from .train_integrated import TrainedIntegratedReferences
+from . import lib_singler as lib
+from .train_integrated import TrainedIntegratedReferences
[docs]
-def classify_integrated(
+def classify_integrated(
test_data: Any,
results: list[biocframe.BiocFrame],
integrated_prebuilt: TrainedIntegratedReferences,
@@ -323,9 +323,6 @@ Source code for singler.classify_integrated
if isinstance(test_data, summarizedexperiment.SummarizedExperiment):
test_data = test_data.assay(assay_type)
- if test_data.shape[0] != integrated_prebuilt._test_num_features: # TODO: move to singlepp.
- raise ValueError("number of rows in 'test_data' is not consistent with 'test_features=' used to create 'integrated_prebuilt'")
-
ref_labs = integrated_prebuilt.reference_labels
if len(results) != len(ref_labs):
raise ValueError("length of 'results' should equal the number of references")
diff --git a/_modules/singler/classify_single.html b/_modules/singler/classify_single.html
index cce44d8..b5f268e 100644
--- a/_modules/singler/classify_single.html
+++ b/_modules/singler/classify_single.html
@@ -6,7 +6,7 @@
singler.classify_single - singler unknown documentation
-
+
@@ -242,19 +242,19 @@
Source code for singler.classify_single
-from typing import Any, Sequence, Union
+from typing import Any, Sequence, Union
-import biocframe
-import mattress
-import summarizedexperiment
+import biocframe
+import mattress
+import summarizedexperiment
-from . import lib_singler as lib
-from .train_single import TrainedSingleReference
+from . import lib_singler as lib
+from .train_single import TrainedSingleReference
[docs]
-def classify_single(
+def classify_single(
test_data: Any,
ref_prebuilt: TrainedSingleReference,
assay_type: Union[str, int] = 0,
@@ -312,9 +312,6 @@ Source code for singler.classify_single
if isinstance(test_data, summarizedexperiment.SummarizedExperiment):
test_data = test_data.assay(assay_type)
- if test_data.shape[0] != ref_prebuilt._test_num_features: # TODO: move to singlepp
- raise ValueError("number of rows in 'test_data' is not consistent with 'test_features=' used to create 'ref_prebuilt'")
-
test_ptr = mattress.initialize(test_data)
best, raw_scores, delta = lib.classify_single(
diff --git a/_modules/singler/get_classic_markers.html b/_modules/singler/get_classic_markers.html
index 45e72b2..7aa8cb1 100644
--- a/_modules/singler/get_classic_markers.html
+++ b/_modules/singler/get_classic_markers.html
@@ -6,7 +6,7 @@
singler.get_classic_markers - singler unknown documentation
-
+
@@ -242,15 +242,15 @@
Source code for singler.get_classic_markers
-from typing import Any, Optional, Sequence, Union
+from typing import Any, Optional, Sequence, Union
-import delayedarray
-import mattress
-import numpy
-import biocutils
+import delayedarray
+import mattress
+import numpy
+import biocutils
-from . import lib_singler as lib
-from ._utils import (
+from . import lib_singler as lib
+from ._utils import (
_clean_matrix,
_create_map,
_stable_intersect,
@@ -258,7 +258,7 @@ Source code for singler.get_classic_markers
)
-def _get_classic_markers_raw(ref_ptrs: list, ref_labels: list, ref_features: list, num_de=None, num_threads=1):
+def _get_classic_markers_raw(ref_ptrs: list, ref_labels: list, ref_features: list, num_de=None, num_threads=1):
nrefs = len(ref_ptrs)
# We assume that ref_ptrs and ref_features contains the outputs of
@@ -334,7 +334,7 @@ Source code for singler.get_classic_markers
[docs]
-def get_classic_markers(
+def get_classic_markers(
ref_data: Union[Any, list[Any]],
ref_labels: Union[Sequence, list[Sequence]],
ref_features: Union[Sequence, list[Sequence]],
@@ -446,7 +446,7 @@ Source code for singler.get_classic_markers
[docs]
-def number_of_classic_markers(num_labels: int) -> int:
+def number_of_classic_markers(num_labels: int) -> int:
"""Compute the number of markers to detect for a given number of labels,
using the classic SingleR marker detection algorithm.
diff --git a/_modules/singler/train_integrated.html b/_modules/singler/train_integrated.html
index 5673ab7..a5eb3e5 100644
--- a/_modules/singler/train_integrated.html
+++ b/_modules/singler/train_integrated.html
@@ -6,7 +6,7 @@
singler.train_integrated - singler unknown documentation
-
+
@@ -242,31 +242,30 @@
Source code for singler.train_integrated
-from typing import Sequence, Optional, Union
+from typing import Sequence, Optional, Union
-import numpy
-import biocutils
-import warnings
-import mattress
+import numpy
+import biocutils
+import warnings
+import mattress
-from .train_single import TrainedSingleReference
-from . import lib_singler as lib
-from ._utils import _stable_union, _stable_intersect
+from .train_single import TrainedSingleReference
+from . import lib_singler as lib
+from ._utils import _stable_union, _stable_intersect
[docs]
-class TrainedIntegratedReferences:
+class TrainedIntegratedReferences:
"""Object containing integrated references, typically constructed by
:py:meth:`~singler.train_integrated.train_integrated`."""
- def __init__(self, ptr: int, ref_labels: list, test_num_features: int):
+ def __init__(self, ptr: int, ref_labels: list):
self._ptr = ptr
self._labels = ref_labels
- self._test_num_features = test_num_features # TODO: move to singlepp.
@property
- def reference_labels(self) -> list:
+ def reference_labels(self) -> list:
"""List of lists containing the names of the labels for each reference.
Each entry corresponds to a reference in :py:attr:`~reference_names`,
@@ -278,7 +277,7 @@ Source code for singler.train_integrated
[docs]
-def train_integrated(
+def train_integrated(
test_features: Sequence,
ref_prebuilt: list[TrainedSingleReference],
warn_lost: bool = True,
@@ -336,7 +335,6 @@ Source code for singler.train_integrated
return TrainedIntegratedReferences(
ptr=ibuilt,
ref_labels=[x.labels for x in ref_prebuilt],
- test_num_features = len(test_features),
)
diff --git a/_modules/singler/train_single.html b/_modules/singler/train_single.html
index 5583610..92060a4 100644
--- a/_modules/singler/train_single.html
+++ b/_modules/singler/train_single.html
@@ -6,7 +6,7 @@
singler.train_single - singler unknown documentation
-
+
@@ -242,29 +242,30 @@
Source code for singler.train_single
-from typing import Any, Literal, Optional, Sequence, Union
+from typing import Any, Literal, Optional, Sequence, Union
-import biocutils
-import numpy
-import knncolle
-import mattress
-import delayedarray
-import warnings
+import biocutils
+import numpy
+import knncolle
+import mattress
+import delayedarray
+import warnings
-from . import lib_singler as lib
-from ._utils import _clean_matrix, _restrict_features, _stable_intersect
-from .get_classic_markers import get_classic_markers
+from . import lib_singler as lib
+from ._utils import _clean_matrix, _restrict_features, _stable_intersect
+from .get_classic_markers import get_classic_markers
+from .aggregate_reference import aggregate_reference
[docs]
-class TrainedSingleReference:
+class TrainedSingleReference:
"""A prebuilt reference object, typically created by
:py:meth:`~singler.train_single.train_single`. This is intended for
advanced users only and should not be serialized.
"""
- def __init__(
+ def __init__(
self,
ptr: int,
full_data: Any,
@@ -272,7 +273,6 @@ Source code for singler.train_single
labels: Sequence,
features: Sequence,
markers: dict[Any, dict[Any, Sequence]],
- test_num_features: int,
):
self._ptr = ptr
self._full_data = full_data
@@ -280,11 +280,10 @@ Source code for singler.train_single
self._features = features
self._labels = labels
self._markers = markers
- self._test_num_features = test_num_features # TODO: move to singlepp.
[docs]
- def num_markers(self) -> int:
+ def num_markers(self) -> int:
"""
Returns:
Number of markers to be used for classification. This is the
@@ -295,7 +294,7 @@ Source code for singler.train_single
[docs]
- def num_labels(self) -> int:
+ def num_labels(self) -> int:
"""
Returns:
Number of unique labels in this reference.
@@ -304,23 +303,23 @@ Source code for singler.train_single
@property
- def features(self) -> list:
+ def features(self) -> list:
"""The universe of features known to this reference."""
return self._features
@property
- def labels(self) -> Sequence:
+ def labels(self) -> Sequence:
"""Unique labels in this reference."""
return self._labels
@property
- def markers(self) -> dict[Any, dict[Any, list]]:
+ def markers(self) -> dict[Any, dict[Any, list]]:
"""Markers for every pairwise comparison between labels."""
return self._markers
[docs]
- def marker_subset(self, indices_only: bool = False) -> Union[numpy.ndarray, list]:
+ def marker_subset(self, indices_only: bool = False) -> Union[numpy.ndarray, list]:
"""
Args:
indices_only:
@@ -342,7 +341,7 @@ Source code for singler.train_single
-def _markers_from_dict(markers: dict[Any, dict[Any, Sequence]], labels: Sequence, available_features: Sequence):
+def _markers_from_dict(markers: dict[Any, dict[Any, Sequence]], labels: Sequence, available_features: Sequence):
fmapping = {}
for i, x in enumerate(available_features):
fmapping[x] = i
@@ -351,7 +350,7 @@ Source code for singler.train_single
[docs]
-def train_single(
+def train_single(
ref_data: Any,
ref_labels: Sequence,
ref_features: Sequence,
@@ -360,8 +359,11 @@ Source code for singler.train_single
restrict_to: Optional[Union[set, dict]] = None,
check_missing: bool = True,
markers: Optional[dict[Any, dict[Any, Sequence]]] = None,
- marker_method: Literal["classic"] = "classic",
+ marker_method: Literal["classic", "auc", "cohens_d"] = "classic",
+ num_de: Optional[int] = None,
marker_args: dict = {},
+ aggregate: bool = False,
+ aggregate_args: dict = {},
nn_parameters: Optional[knncolle.Parameters] = knncolle.VptreeParameters(),
num_threads: int = 1,
) -> TrainedSingleReference:
@@ -411,15 +413,28 @@ Source code for singler.train_single
should have keys in the inner and outer dictionaries.
marker_method:
- Method to identify markers from each pairwise comparisons between
- labels in ``ref_data``. If "classic", we call
- :py:meth:`~singler.get_classic_markers.get_classic_markers`.
+ Method to identify markers from each pairwise comparisons between labels in ``ref_data``.
+ If ``classic``, we call :py:func:`~singler.get_classic_markers.get_classic_markers`.
+ If ``auc`` or ``cohens_d``, we call :py:func:`~scranpy.score_markers.score_markers`.
+ Only used if ``markers`` is not supplied.
+
+ num_de:
+ Number of differentially expressed genes to use as markers for each pairwise comparison between labels.
+ If ``None`` and ``marker_method = "classic"``, an appropriate number of genes is determined by :py:func:`~singler.get_classic_markers.get_classic_markers`.
+ Otherwise, it is set to 10.
Only used if ``markers`` is not supplied.
marker_args:
Further arguments to pass to the chosen marker detection method.
+ If ``marker_method = "classic"``, this is :py:func:`~singler.get_classic_markers.get_classic_markers`, otherwise it is :py:func:`~scranpy.score_markers.score_markers`.
Only used if ``markers`` is not supplied.
+ aggregate:
+ Whether the reference dataset should be aggregated to pseudo-bulk samples for speed, see :py:func:`~singler.aggregate_reference.aggregate_reference` for details.
+
+ aggregate_args:
+ Further arguments to pass to :py:func:`~singler.aggregate_reference.aggregate_reference` when ``aggregate = True``.
+
nn_parameters:
Algorithm for constructing the neighbor search index, used to
compute scores during classification.
@@ -464,9 +479,7 @@ Source code for singler.train_single
keep.append(i)
ref_data = delayedarray.DelayedArray(ref_data)[:,keep]
ref_labels = biocutils.subset_sequence(ref_labels, keep)
- ref_labels = biocutils.Factor.from_sequence(ref_labels, sort_levels=True) # TODO: add a dtype= option.
- unique_labels = ref_labels.levels
- label_idx = ref_labels.codes.astype(dtype=numpy.uint32, copy=False)
+ unique_labels, label_idx = biocutils.factorize(ref_labels, sort_levels=True, dtype=numpy.uint32, fail_missing=True)
markers = _identify_genes(
ref_data=ref_data,
@@ -475,6 +488,7 @@ Source code for singler.train_single
unique_labels=unique_labels,
markers=markers,
marker_method=marker_method,
+ num_de=num_de,
test_features=test_features,
restrict_to=restrict_to,
marker_args=marker_args,
@@ -491,12 +505,15 @@ Source code for singler.train_single
if test_features is None:
test_features_idx = numpy.array(range(len(ref_features)), dtype=numpy.uint32)
ref_features_idx = numpy.array(range(len(ref_features)), dtype=numpy.uint32)
- test_num_features = len(ref_features)
else:
common_features = _stable_intersect(test_features, ref_features)
test_features_idx = biocutils.match(common_features, test_features, dtype=numpy.uint32)
ref_features_idx = biocutils.match(common_features, ref_features, dtype=numpy.uint32)
- test_num_features = len(test_features)
+
+ if aggregate:
+ aggr = aggregate_reference(ref_data, ref_labels, ref_features, **aggregate_args)
+ ref_data = aggr.assay(0)
+ label_idx = biocutils.match(aggr.get_column_data().get_column("label"), unique_labels, dtype=numpy.uint32)
ref_ptr = mattress.initialize(ref_data)
builder, _ = knncolle.define_builder(nn_parameters)
@@ -515,12 +532,11 @@ Source code for singler.train_single
labels = unique_labels,
features = ref_features,
markers = markers,
- test_num_features = test_num_features,
)
-def _identify_genes(ref_data, ref_features, ref_labels, unique_labels, markers, marker_method, test_features, restrict_to, marker_args, num_threads):
+def _identify_genes(ref_data, ref_features, ref_labels, unique_labels, markers, marker_method, test_features, restrict_to, num_de, marker_args, num_threads):
ref_data, ref_features = _restrict_features(ref_data, ref_features, test_features)
ref_data, ref_features = _restrict_features(ref_data, ref_features, restrict_to)
@@ -532,11 +548,52 @@ Source code for singler.train_single
ref_labels=[ref_labels],
ref_features=[ref_features],
num_threads=num_threads,
+ num_de=num_de,
**marker_args,
)
else:
- raise NotImplementedError("other marker methods are not yet implemented, sorry")
- return markers
+ if marker_method == "auc":
+ compute_auc = True
+ compute_cohens_d = False
+ effect_size = "auc"
+ boundary = 0.5
+ else:
+ compute_auc = False
+ compute_cohens_d = True
+ effect_size = "cohens_d"
+ boundary = 0
+
+ import scranpy
+ stats = scranpy.score_markers(
+ ref_data,
+ groups=ref_labels,
+ num_threads=num_threads,
+ all_pairwise=True,
+ compute_delta_detected=False,
+ compute_delta_mean=False,
+ compute_auc=compute_auc,
+ compute_cohens_d=compute_cohens_d,
+ **marker_args
+ )
+ pairwise = getattr(stats, effect_size)
+
+ if num_de is None:
+ num_de = 10
+
+ markers = {}
+ for g1, group1 in enumerate(stats.groups):
+ group_markers = {}
+ for g2, group2 in enumerate(stats.groups):
+ if g1 == g2:
+ group_markers[group2] = biocutils.StringList()
+ continue
+ cureffects = pairwise[g2, g1, :] # remember, second dimension is the first group in the comparison.
+ keep = biocutils.which(cureffects > boundary)
+ o = numpy.argsort(-cureffects[keep], stable=True)
+ group_markers[group2] = biocutils.StringList(biocutils.subset_sequence(ref_features, keep[o[:min(len(o), num_de)]]))
+ markers[group1] = group_markers
+
+ return markers
# Validating a user-supplied list of markers.
if not isinstance(markers, dict):
diff --git a/_sources/api/singler.rst.txt b/_sources/api/singler.rst.txt
index 4cc52ca..c9f3798 100644
--- a/_sources/api/singler.rst.txt
+++ b/_sources/api/singler.rst.txt
@@ -9,6 +9,14 @@ singler package
Submodules
----------
+singler.aggregate\_reference module
+-----------------------------------
+
+.. automodule:: singler.aggregate_reference
+ :members:
+ :undoc-members:
+ :show-inheritance:
+
singler.annotate\_integrated module
-----------------------------------
diff --git a/_static/pygments.css b/_static/pygments.css
index d0ae3b8..cb16a42 100644
--- a/_static/pygments.css
+++ b/_static/pygments.css
@@ -6,26 +6,26 @@
.highlight .hll { background-color: #ffffcc }
.highlight { background: #eeffcc; }
.highlight .c { color: #408090; font-style: italic } /* Comment */
-.highlight .err { border: 1px solid #FF0000 } /* Error */
+.highlight .err { border: 1px solid #F00 } /* Error */
.highlight .k { color: #007020; font-weight: bold } /* Keyword */
-.highlight .o { color: #666666 } /* Operator */
+.highlight .o { color: #666 } /* Operator */
.highlight .ch { color: #408090; font-style: italic } /* Comment.Hashbang */
.highlight .cm { color: #408090; font-style: italic } /* Comment.Multiline */
.highlight .cp { color: #007020 } /* Comment.Preproc */
.highlight .cpf { color: #408090; font-style: italic } /* Comment.PreprocFile */
.highlight .c1 { color: #408090; font-style: italic } /* Comment.Single */
-.highlight .cs { color: #408090; background-color: #fff0f0 } /* Comment.Special */
+.highlight .cs { color: #408090; background-color: #FFF0F0 } /* Comment.Special */
.highlight .gd { color: #A00000 } /* Generic.Deleted */
.highlight .ge { font-style: italic } /* Generic.Emph */
.highlight .ges { font-weight: bold; font-style: italic } /* Generic.EmphStrong */
-.highlight .gr { color: #FF0000 } /* Generic.Error */
+.highlight .gr { color: #F00 } /* Generic.Error */
.highlight .gh { color: #000080; font-weight: bold } /* Generic.Heading */
.highlight .gi { color: #00A000 } /* Generic.Inserted */
-.highlight .go { color: #333333 } /* Generic.Output */
-.highlight .gp { color: #c65d09; font-weight: bold } /* Generic.Prompt */
+.highlight .go { color: #333 } /* Generic.Output */
+.highlight .gp { color: #C65D09; font-weight: bold } /* Generic.Prompt */
.highlight .gs { font-weight: bold } /* Generic.Strong */
.highlight .gu { color: #800080; font-weight: bold } /* Generic.Subheading */
-.highlight .gt { color: #0044DD } /* Generic.Traceback */
+.highlight .gt { color: #04D } /* Generic.Traceback */
.highlight .kc { color: #007020; font-weight: bold } /* Keyword.Constant */
.highlight .kd { color: #007020; font-weight: bold } /* Keyword.Declaration */
.highlight .kn { color: #007020; font-weight: bold } /* Keyword.Namespace */
@@ -33,45 +33,45 @@
.highlight .kr { color: #007020; font-weight: bold } /* Keyword.Reserved */
.highlight .kt { color: #902000 } /* Keyword.Type */
.highlight .m { color: #208050 } /* Literal.Number */
-.highlight .s { color: #4070a0 } /* Literal.String */
-.highlight .na { color: #4070a0 } /* Name.Attribute */
+.highlight .s { color: #4070A0 } /* Literal.String */
+.highlight .na { color: #4070A0 } /* Name.Attribute */
.highlight .nb { color: #007020 } /* Name.Builtin */
-.highlight .nc { color: #0e84b5; font-weight: bold } /* Name.Class */
-.highlight .no { color: #60add5 } /* Name.Constant */
-.highlight .nd { color: #555555; font-weight: bold } /* Name.Decorator */
-.highlight .ni { color: #d55537; font-weight: bold } /* Name.Entity */
+.highlight .nc { color: #0E84B5; font-weight: bold } /* Name.Class */
+.highlight .no { color: #60ADD5 } /* Name.Constant */
+.highlight .nd { color: #555; font-weight: bold } /* Name.Decorator */
+.highlight .ni { color: #D55537; font-weight: bold } /* Name.Entity */
.highlight .ne { color: #007020 } /* Name.Exception */
-.highlight .nf { color: #06287e } /* Name.Function */
+.highlight .nf { color: #06287E } /* Name.Function */
.highlight .nl { color: #002070; font-weight: bold } /* Name.Label */
-.highlight .nn { color: #0e84b5; font-weight: bold } /* Name.Namespace */
+.highlight .nn { color: #0E84B5; font-weight: bold } /* Name.Namespace */
.highlight .nt { color: #062873; font-weight: bold } /* Name.Tag */
-.highlight .nv { color: #bb60d5 } /* Name.Variable */
+.highlight .nv { color: #BB60D5 } /* Name.Variable */
.highlight .ow { color: #007020; font-weight: bold } /* Operator.Word */
-.highlight .w { color: #bbbbbb } /* Text.Whitespace */
+.highlight .w { color: #BBB } /* Text.Whitespace */
.highlight .mb { color: #208050 } /* Literal.Number.Bin */
.highlight .mf { color: #208050 } /* Literal.Number.Float */
.highlight .mh { color: #208050 } /* Literal.Number.Hex */
.highlight .mi { color: #208050 } /* Literal.Number.Integer */
.highlight .mo { color: #208050 } /* Literal.Number.Oct */
-.highlight .sa { color: #4070a0 } /* Literal.String.Affix */
-.highlight .sb { color: #4070a0 } /* Literal.String.Backtick */
-.highlight .sc { color: #4070a0 } /* Literal.String.Char */
-.highlight .dl { color: #4070a0 } /* Literal.String.Delimiter */
-.highlight .sd { color: #4070a0; font-style: italic } /* Literal.String.Doc */
-.highlight .s2 { color: #4070a0 } /* Literal.String.Double */
-.highlight .se { color: #4070a0; font-weight: bold } /* Literal.String.Escape */
-.highlight .sh { color: #4070a0 } /* Literal.String.Heredoc */
-.highlight .si { color: #70a0d0; font-style: italic } /* Literal.String.Interpol */
-.highlight .sx { color: #c65d09 } /* Literal.String.Other */
+.highlight .sa { color: #4070A0 } /* Literal.String.Affix */
+.highlight .sb { color: #4070A0 } /* Literal.String.Backtick */
+.highlight .sc { color: #4070A0 } /* Literal.String.Char */
+.highlight .dl { color: #4070A0 } /* Literal.String.Delimiter */
+.highlight .sd { color: #4070A0; font-style: italic } /* Literal.String.Doc */
+.highlight .s2 { color: #4070A0 } /* Literal.String.Double */
+.highlight .se { color: #4070A0; font-weight: bold } /* Literal.String.Escape */
+.highlight .sh { color: #4070A0 } /* Literal.String.Heredoc */
+.highlight .si { color: #70A0D0; font-style: italic } /* Literal.String.Interpol */
+.highlight .sx { color: #C65D09 } /* Literal.String.Other */
.highlight .sr { color: #235388 } /* Literal.String.Regex */
-.highlight .s1 { color: #4070a0 } /* Literal.String.Single */
+.highlight .s1 { color: #4070A0 } /* Literal.String.Single */
.highlight .ss { color: #517918 } /* Literal.String.Symbol */
.highlight .bp { color: #007020 } /* Name.Builtin.Pseudo */
-.highlight .fm { color: #06287e } /* Name.Function.Magic */
-.highlight .vc { color: #bb60d5 } /* Name.Variable.Class */
-.highlight .vg { color: #bb60d5 } /* Name.Variable.Global */
-.highlight .vi { color: #bb60d5 } /* Name.Variable.Instance */
-.highlight .vm { color: #bb60d5 } /* Name.Variable.Magic */
+.highlight .fm { color: #06287E } /* Name.Function.Magic */
+.highlight .vc { color: #BB60D5 } /* Name.Variable.Class */
+.highlight .vg { color: #BB60D5 } /* Name.Variable.Global */
+.highlight .vi { color: #BB60D5 } /* Name.Variable.Instance */
+.highlight .vm { color: #BB60D5 } /* Name.Variable.Magic */
.highlight .il { color: #208050 } /* Literal.Number.Integer.Long */
@media not print {
body[data-theme="dark"] .highlight pre { line-height: 125%; }
@@ -80,85 +80,85 @@ body[data-theme="dark"] .highlight span.linenos { color: #aaaaaa; background-col
body[data-theme="dark"] .highlight td.linenos .special { color: #000000; background-color: #ffffc0; padding-left: 5px; padding-right: 5px; }
body[data-theme="dark"] .highlight span.linenos.special { color: #000000; background-color: #ffffc0; padding-left: 5px; padding-right: 5px; }
body[data-theme="dark"] .highlight .hll { background-color: #404040 }
-body[data-theme="dark"] .highlight { background: #202020; color: #d0d0d0 }
-body[data-theme="dark"] .highlight .c { color: #ababab; font-style: italic } /* Comment */
-body[data-theme="dark"] .highlight .err { color: #a61717; background-color: #e3d2d2 } /* Error */
-body[data-theme="dark"] .highlight .esc { color: #d0d0d0 } /* Escape */
-body[data-theme="dark"] .highlight .g { color: #d0d0d0 } /* Generic */
-body[data-theme="dark"] .highlight .k { color: #6ebf26; font-weight: bold } /* Keyword */
-body[data-theme="dark"] .highlight .l { color: #d0d0d0 } /* Literal */
-body[data-theme="dark"] .highlight .n { color: #d0d0d0 } /* Name */
-body[data-theme="dark"] .highlight .o { color: #d0d0d0 } /* Operator */
-body[data-theme="dark"] .highlight .x { color: #d0d0d0 } /* Other */
-body[data-theme="dark"] .highlight .p { color: #d0d0d0 } /* Punctuation */
-body[data-theme="dark"] .highlight .ch { color: #ababab; font-style: italic } /* Comment.Hashbang */
-body[data-theme="dark"] .highlight .cm { color: #ababab; font-style: italic } /* Comment.Multiline */
-body[data-theme="dark"] .highlight .cp { color: #ff3a3a; font-weight: bold } /* Comment.Preproc */
-body[data-theme="dark"] .highlight .cpf { color: #ababab; font-style: italic } /* Comment.PreprocFile */
-body[data-theme="dark"] .highlight .c1 { color: #ababab; font-style: italic } /* Comment.Single */
-body[data-theme="dark"] .highlight .cs { color: #e50808; font-weight: bold; background-color: #520000 } /* Comment.Special */
-body[data-theme="dark"] .highlight .gd { color: #ff3a3a } /* Generic.Deleted */
-body[data-theme="dark"] .highlight .ge { color: #d0d0d0; font-style: italic } /* Generic.Emph */
-body[data-theme="dark"] .highlight .ges { color: #d0d0d0; font-weight: bold; font-style: italic } /* Generic.EmphStrong */
-body[data-theme="dark"] .highlight .gr { color: #ff3a3a } /* Generic.Error */
-body[data-theme="dark"] .highlight .gh { color: #ffffff; font-weight: bold } /* Generic.Heading */
+body[data-theme="dark"] .highlight { background: #202020; color: #D0D0D0 }
+body[data-theme="dark"] .highlight .c { color: #ABABAB; font-style: italic } /* Comment */
+body[data-theme="dark"] .highlight .err { color: #A61717; background-color: #E3D2D2 } /* Error */
+body[data-theme="dark"] .highlight .esc { color: #D0D0D0 } /* Escape */
+body[data-theme="dark"] .highlight .g { color: #D0D0D0 } /* Generic */
+body[data-theme="dark"] .highlight .k { color: #6EBF26; font-weight: bold } /* Keyword */
+body[data-theme="dark"] .highlight .l { color: #D0D0D0 } /* Literal */
+body[data-theme="dark"] .highlight .n { color: #D0D0D0 } /* Name */
+body[data-theme="dark"] .highlight .o { color: #D0D0D0 } /* Operator */
+body[data-theme="dark"] .highlight .x { color: #D0D0D0 } /* Other */
+body[data-theme="dark"] .highlight .p { color: #D0D0D0 } /* Punctuation */
+body[data-theme="dark"] .highlight .ch { color: #ABABAB; font-style: italic } /* Comment.Hashbang */
+body[data-theme="dark"] .highlight .cm { color: #ABABAB; font-style: italic } /* Comment.Multiline */
+body[data-theme="dark"] .highlight .cp { color: #FF3A3A; font-weight: bold } /* Comment.Preproc */
+body[data-theme="dark"] .highlight .cpf { color: #ABABAB; font-style: italic } /* Comment.PreprocFile */
+body[data-theme="dark"] .highlight .c1 { color: #ABABAB; font-style: italic } /* Comment.Single */
+body[data-theme="dark"] .highlight .cs { color: #E50808; font-weight: bold; background-color: #520000 } /* Comment.Special */
+body[data-theme="dark"] .highlight .gd { color: #FF3A3A } /* Generic.Deleted */
+body[data-theme="dark"] .highlight .ge { color: #D0D0D0; font-style: italic } /* Generic.Emph */
+body[data-theme="dark"] .highlight .ges { color: #D0D0D0; font-weight: bold; font-style: italic } /* Generic.EmphStrong */
+body[data-theme="dark"] .highlight .gr { color: #FF3A3A } /* Generic.Error */
+body[data-theme="dark"] .highlight .gh { color: #FFF; font-weight: bold } /* Generic.Heading */
body[data-theme="dark"] .highlight .gi { color: #589819 } /* Generic.Inserted */
-body[data-theme="dark"] .highlight .go { color: #cccccc } /* Generic.Output */
-body[data-theme="dark"] .highlight .gp { color: #aaaaaa } /* Generic.Prompt */
-body[data-theme="dark"] .highlight .gs { color: #d0d0d0; font-weight: bold } /* Generic.Strong */
-body[data-theme="dark"] .highlight .gu { color: #ffffff; text-decoration: underline } /* Generic.Subheading */
-body[data-theme="dark"] .highlight .gt { color: #ff3a3a } /* Generic.Traceback */
-body[data-theme="dark"] .highlight .kc { color: #6ebf26; font-weight: bold } /* Keyword.Constant */
-body[data-theme="dark"] .highlight .kd { color: #6ebf26; font-weight: bold } /* Keyword.Declaration */
-body[data-theme="dark"] .highlight .kn { color: #6ebf26; font-weight: bold } /* Keyword.Namespace */
-body[data-theme="dark"] .highlight .kp { color: #6ebf26 } /* Keyword.Pseudo */
-body[data-theme="dark"] .highlight .kr { color: #6ebf26; font-weight: bold } /* Keyword.Reserved */
-body[data-theme="dark"] .highlight .kt { color: #6ebf26; font-weight: bold } /* Keyword.Type */
-body[data-theme="dark"] .highlight .ld { color: #d0d0d0 } /* Literal.Date */
-body[data-theme="dark"] .highlight .m { color: #51b2fd } /* Literal.Number */
-body[data-theme="dark"] .highlight .s { color: #ed9d13 } /* Literal.String */
-body[data-theme="dark"] .highlight .na { color: #bbbbbb } /* Name.Attribute */
-body[data-theme="dark"] .highlight .nb { color: #2fbccd } /* Name.Builtin */
-body[data-theme="dark"] .highlight .nc { color: #71adff; text-decoration: underline } /* Name.Class */
-body[data-theme="dark"] .highlight .no { color: #40ffff } /* Name.Constant */
-body[data-theme="dark"] .highlight .nd { color: #ffa500 } /* Name.Decorator */
-body[data-theme="dark"] .highlight .ni { color: #d0d0d0 } /* Name.Entity */
-body[data-theme="dark"] .highlight .ne { color: #bbbbbb } /* Name.Exception */
-body[data-theme="dark"] .highlight .nf { color: #71adff } /* Name.Function */
-body[data-theme="dark"] .highlight .nl { color: #d0d0d0 } /* Name.Label */
-body[data-theme="dark"] .highlight .nn { color: #71adff; text-decoration: underline } /* Name.Namespace */
-body[data-theme="dark"] .highlight .nx { color: #d0d0d0 } /* Name.Other */
-body[data-theme="dark"] .highlight .py { color: #d0d0d0 } /* Name.Property */
-body[data-theme="dark"] .highlight .nt { color: #6ebf26; font-weight: bold } /* Name.Tag */
-body[data-theme="dark"] .highlight .nv { color: #40ffff } /* Name.Variable */
-body[data-theme="dark"] .highlight .ow { color: #6ebf26; font-weight: bold } /* Operator.Word */
-body[data-theme="dark"] .highlight .pm { color: #d0d0d0 } /* Punctuation.Marker */
-body[data-theme="dark"] .highlight .w { color: #666666 } /* Text.Whitespace */
-body[data-theme="dark"] .highlight .mb { color: #51b2fd } /* Literal.Number.Bin */
-body[data-theme="dark"] .highlight .mf { color: #51b2fd } /* Literal.Number.Float */
-body[data-theme="dark"] .highlight .mh { color: #51b2fd } /* Literal.Number.Hex */
-body[data-theme="dark"] .highlight .mi { color: #51b2fd } /* Literal.Number.Integer */
-body[data-theme="dark"] .highlight .mo { color: #51b2fd } /* Literal.Number.Oct */
-body[data-theme="dark"] .highlight .sa { color: #ed9d13 } /* Literal.String.Affix */
-body[data-theme="dark"] .highlight .sb { color: #ed9d13 } /* Literal.String.Backtick */
-body[data-theme="dark"] .highlight .sc { color: #ed9d13 } /* Literal.String.Char */
-body[data-theme="dark"] .highlight .dl { color: #ed9d13 } /* Literal.String.Delimiter */
-body[data-theme="dark"] .highlight .sd { color: #ed9d13 } /* Literal.String.Doc */
-body[data-theme="dark"] .highlight .s2 { color: #ed9d13 } /* Literal.String.Double */
-body[data-theme="dark"] .highlight .se { color: #ed9d13 } /* Literal.String.Escape */
-body[data-theme="dark"] .highlight .sh { color: #ed9d13 } /* Literal.String.Heredoc */
-body[data-theme="dark"] .highlight .si { color: #ed9d13 } /* Literal.String.Interpol */
-body[data-theme="dark"] .highlight .sx { color: #ffa500 } /* Literal.String.Other */
-body[data-theme="dark"] .highlight .sr { color: #ed9d13 } /* Literal.String.Regex */
-body[data-theme="dark"] .highlight .s1 { color: #ed9d13 } /* Literal.String.Single */
-body[data-theme="dark"] .highlight .ss { color: #ed9d13 } /* Literal.String.Symbol */
-body[data-theme="dark"] .highlight .bp { color: #2fbccd } /* Name.Builtin.Pseudo */
-body[data-theme="dark"] .highlight .fm { color: #71adff } /* Name.Function.Magic */
-body[data-theme="dark"] .highlight .vc { color: #40ffff } /* Name.Variable.Class */
-body[data-theme="dark"] .highlight .vg { color: #40ffff } /* Name.Variable.Global */
-body[data-theme="dark"] .highlight .vi { color: #40ffff } /* Name.Variable.Instance */
-body[data-theme="dark"] .highlight .vm { color: #40ffff } /* Name.Variable.Magic */
-body[data-theme="dark"] .highlight .il { color: #51b2fd } /* Literal.Number.Integer.Long */
+body[data-theme="dark"] .highlight .go { color: #CCC } /* Generic.Output */
+body[data-theme="dark"] .highlight .gp { color: #AAA } /* Generic.Prompt */
+body[data-theme="dark"] .highlight .gs { color: #D0D0D0; font-weight: bold } /* Generic.Strong */
+body[data-theme="dark"] .highlight .gu { color: #FFF; text-decoration: underline } /* Generic.Subheading */
+body[data-theme="dark"] .highlight .gt { color: #FF3A3A } /* Generic.Traceback */
+body[data-theme="dark"] .highlight .kc { color: #6EBF26; font-weight: bold } /* Keyword.Constant */
+body[data-theme="dark"] .highlight .kd { color: #6EBF26; font-weight: bold } /* Keyword.Declaration */
+body[data-theme="dark"] .highlight .kn { color: #6EBF26; font-weight: bold } /* Keyword.Namespace */
+body[data-theme="dark"] .highlight .kp { color: #6EBF26 } /* Keyword.Pseudo */
+body[data-theme="dark"] .highlight .kr { color: #6EBF26; font-weight: bold } /* Keyword.Reserved */
+body[data-theme="dark"] .highlight .kt { color: #6EBF26; font-weight: bold } /* Keyword.Type */
+body[data-theme="dark"] .highlight .ld { color: #D0D0D0 } /* Literal.Date */
+body[data-theme="dark"] .highlight .m { color: #51B2FD } /* Literal.Number */
+body[data-theme="dark"] .highlight .s { color: #ED9D13 } /* Literal.String */
+body[data-theme="dark"] .highlight .na { color: #BBB } /* Name.Attribute */
+body[data-theme="dark"] .highlight .nb { color: #2FBCCD } /* Name.Builtin */
+body[data-theme="dark"] .highlight .nc { color: #71ADFF; text-decoration: underline } /* Name.Class */
+body[data-theme="dark"] .highlight .no { color: #40FFFF } /* Name.Constant */
+body[data-theme="dark"] .highlight .nd { color: #FFA500 } /* Name.Decorator */
+body[data-theme="dark"] .highlight .ni { color: #D0D0D0 } /* Name.Entity */
+body[data-theme="dark"] .highlight .ne { color: #BBB } /* Name.Exception */
+body[data-theme="dark"] .highlight .nf { color: #71ADFF } /* Name.Function */
+body[data-theme="dark"] .highlight .nl { color: #D0D0D0 } /* Name.Label */
+body[data-theme="dark"] .highlight .nn { color: #71ADFF; text-decoration: underline } /* Name.Namespace */
+body[data-theme="dark"] .highlight .nx { color: #D0D0D0 } /* Name.Other */
+body[data-theme="dark"] .highlight .py { color: #D0D0D0 } /* Name.Property */
+body[data-theme="dark"] .highlight .nt { color: #6EBF26; font-weight: bold } /* Name.Tag */
+body[data-theme="dark"] .highlight .nv { color: #40FFFF } /* Name.Variable */
+body[data-theme="dark"] .highlight .ow { color: #6EBF26; font-weight: bold } /* Operator.Word */
+body[data-theme="dark"] .highlight .pm { color: #D0D0D0 } /* Punctuation.Marker */
+body[data-theme="dark"] .highlight .w { color: #666 } /* Text.Whitespace */
+body[data-theme="dark"] .highlight .mb { color: #51B2FD } /* Literal.Number.Bin */
+body[data-theme="dark"] .highlight .mf { color: #51B2FD } /* Literal.Number.Float */
+body[data-theme="dark"] .highlight .mh { color: #51B2FD } /* Literal.Number.Hex */
+body[data-theme="dark"] .highlight .mi { color: #51B2FD } /* Literal.Number.Integer */
+body[data-theme="dark"] .highlight .mo { color: #51B2FD } /* Literal.Number.Oct */
+body[data-theme="dark"] .highlight .sa { color: #ED9D13 } /* Literal.String.Affix */
+body[data-theme="dark"] .highlight .sb { color: #ED9D13 } /* Literal.String.Backtick */
+body[data-theme="dark"] .highlight .sc { color: #ED9D13 } /* Literal.String.Char */
+body[data-theme="dark"] .highlight .dl { color: #ED9D13 } /* Literal.String.Delimiter */
+body[data-theme="dark"] .highlight .sd { color: #ED9D13 } /* Literal.String.Doc */
+body[data-theme="dark"] .highlight .s2 { color: #ED9D13 } /* Literal.String.Double */
+body[data-theme="dark"] .highlight .se { color: #ED9D13 } /* Literal.String.Escape */
+body[data-theme="dark"] .highlight .sh { color: #ED9D13 } /* Literal.String.Heredoc */
+body[data-theme="dark"] .highlight .si { color: #ED9D13 } /* Literal.String.Interpol */
+body[data-theme="dark"] .highlight .sx { color: #FFA500 } /* Literal.String.Other */
+body[data-theme="dark"] .highlight .sr { color: #ED9D13 } /* Literal.String.Regex */
+body[data-theme="dark"] .highlight .s1 { color: #ED9D13 } /* Literal.String.Single */
+body[data-theme="dark"] .highlight .ss { color: #ED9D13 } /* Literal.String.Symbol */
+body[data-theme="dark"] .highlight .bp { color: #2FBCCD } /* Name.Builtin.Pseudo */
+body[data-theme="dark"] .highlight .fm { color: #71ADFF } /* Name.Function.Magic */
+body[data-theme="dark"] .highlight .vc { color: #40FFFF } /* Name.Variable.Class */
+body[data-theme="dark"] .highlight .vg { color: #40FFFF } /* Name.Variable.Global */
+body[data-theme="dark"] .highlight .vi { color: #40FFFF } /* Name.Variable.Instance */
+body[data-theme="dark"] .highlight .vm { color: #40FFFF } /* Name.Variable.Magic */
+body[data-theme="dark"] .highlight .il { color: #51B2FD } /* Literal.Number.Integer.Long */
@media (prefers-color-scheme: dark) {
body:not([data-theme="light"]) .highlight pre { line-height: 125%; }
body:not([data-theme="light"]) .highlight td.linenos .normal { color: #aaaaaa; background-color: transparent; padding-left: 5px; padding-right: 5px; }
@@ -166,84 +166,84 @@ body:not([data-theme="light"]) .highlight span.linenos { color: #aaaaaa; backgro
body:not([data-theme="light"]) .highlight td.linenos .special { color: #000000; background-color: #ffffc0; padding-left: 5px; padding-right: 5px; }
body:not([data-theme="light"]) .highlight span.linenos.special { color: #000000; background-color: #ffffc0; padding-left: 5px; padding-right: 5px; }
body:not([data-theme="light"]) .highlight .hll { background-color: #404040 }
-body:not([data-theme="light"]) .highlight { background: #202020; color: #d0d0d0 }
-body:not([data-theme="light"]) .highlight .c { color: #ababab; font-style: italic } /* Comment */
-body:not([data-theme="light"]) .highlight .err { color: #a61717; background-color: #e3d2d2 } /* Error */
-body:not([data-theme="light"]) .highlight .esc { color: #d0d0d0 } /* Escape */
-body:not([data-theme="light"]) .highlight .g { color: #d0d0d0 } /* Generic */
-body:not([data-theme="light"]) .highlight .k { color: #6ebf26; font-weight: bold } /* Keyword */
-body:not([data-theme="light"]) .highlight .l { color: #d0d0d0 } /* Literal */
-body:not([data-theme="light"]) .highlight .n { color: #d0d0d0 } /* Name */
-body:not([data-theme="light"]) .highlight .o { color: #d0d0d0 } /* Operator */
-body:not([data-theme="light"]) .highlight .x { color: #d0d0d0 } /* Other */
-body:not([data-theme="light"]) .highlight .p { color: #d0d0d0 } /* Punctuation */
-body:not([data-theme="light"]) .highlight .ch { color: #ababab; font-style: italic } /* Comment.Hashbang */
-body:not([data-theme="light"]) .highlight .cm { color: #ababab; font-style: italic } /* Comment.Multiline */
-body:not([data-theme="light"]) .highlight .cp { color: #ff3a3a; font-weight: bold } /* Comment.Preproc */
-body:not([data-theme="light"]) .highlight .cpf { color: #ababab; font-style: italic } /* Comment.PreprocFile */
-body:not([data-theme="light"]) .highlight .c1 { color: #ababab; font-style: italic } /* Comment.Single */
-body:not([data-theme="light"]) .highlight .cs { color: #e50808; font-weight: bold; background-color: #520000 } /* Comment.Special */
-body:not([data-theme="light"]) .highlight .gd { color: #ff3a3a } /* Generic.Deleted */
-body:not([data-theme="light"]) .highlight .ge { color: #d0d0d0; font-style: italic } /* Generic.Emph */
-body:not([data-theme="light"]) .highlight .ges { color: #d0d0d0; font-weight: bold; font-style: italic } /* Generic.EmphStrong */
-body:not([data-theme="light"]) .highlight .gr { color: #ff3a3a } /* Generic.Error */
-body:not([data-theme="light"]) .highlight .gh { color: #ffffff; font-weight: bold } /* Generic.Heading */
+body:not([data-theme="light"]) .highlight { background: #202020; color: #D0D0D0 }
+body:not([data-theme="light"]) .highlight .c { color: #ABABAB; font-style: italic } /* Comment */
+body:not([data-theme="light"]) .highlight .err { color: #A61717; background-color: #E3D2D2 } /* Error */
+body:not([data-theme="light"]) .highlight .esc { color: #D0D0D0 } /* Escape */
+body:not([data-theme="light"]) .highlight .g { color: #D0D0D0 } /* Generic */
+body:not([data-theme="light"]) .highlight .k { color: #6EBF26; font-weight: bold } /* Keyword */
+body:not([data-theme="light"]) .highlight .l { color: #D0D0D0 } /* Literal */
+body:not([data-theme="light"]) .highlight .n { color: #D0D0D0 } /* Name */
+body:not([data-theme="light"]) .highlight .o { color: #D0D0D0 } /* Operator */
+body:not([data-theme="light"]) .highlight .x { color: #D0D0D0 } /* Other */
+body:not([data-theme="light"]) .highlight .p { color: #D0D0D0 } /* Punctuation */
+body:not([data-theme="light"]) .highlight .ch { color: #ABABAB; font-style: italic } /* Comment.Hashbang */
+body:not([data-theme="light"]) .highlight .cm { color: #ABABAB; font-style: italic } /* Comment.Multiline */
+body:not([data-theme="light"]) .highlight .cp { color: #FF3A3A; font-weight: bold } /* Comment.Preproc */
+body:not([data-theme="light"]) .highlight .cpf { color: #ABABAB; font-style: italic } /* Comment.PreprocFile */
+body:not([data-theme="light"]) .highlight .c1 { color: #ABABAB; font-style: italic } /* Comment.Single */
+body:not([data-theme="light"]) .highlight .cs { color: #E50808; font-weight: bold; background-color: #520000 } /* Comment.Special */
+body:not([data-theme="light"]) .highlight .gd { color: #FF3A3A } /* Generic.Deleted */
+body:not([data-theme="light"]) .highlight .ge { color: #D0D0D0; font-style: italic } /* Generic.Emph */
+body:not([data-theme="light"]) .highlight .ges { color: #D0D0D0; font-weight: bold; font-style: italic } /* Generic.EmphStrong */
+body:not([data-theme="light"]) .highlight .gr { color: #FF3A3A } /* Generic.Error */
+body:not([data-theme="light"]) .highlight .gh { color: #FFF; font-weight: bold } /* Generic.Heading */
body:not([data-theme="light"]) .highlight .gi { color: #589819 } /* Generic.Inserted */
-body:not([data-theme="light"]) .highlight .go { color: #cccccc } /* Generic.Output */
-body:not([data-theme="light"]) .highlight .gp { color: #aaaaaa } /* Generic.Prompt */
-body:not([data-theme="light"]) .highlight .gs { color: #d0d0d0; font-weight: bold } /* Generic.Strong */
-body:not([data-theme="light"]) .highlight .gu { color: #ffffff; text-decoration: underline } /* Generic.Subheading */
-body:not([data-theme="light"]) .highlight .gt { color: #ff3a3a } /* Generic.Traceback */
-body:not([data-theme="light"]) .highlight .kc { color: #6ebf26; font-weight: bold } /* Keyword.Constant */
-body:not([data-theme="light"]) .highlight .kd { color: #6ebf26; font-weight: bold } /* Keyword.Declaration */
-body:not([data-theme="light"]) .highlight .kn { color: #6ebf26; font-weight: bold } /* Keyword.Namespace */
-body:not([data-theme="light"]) .highlight .kp { color: #6ebf26 } /* Keyword.Pseudo */
-body:not([data-theme="light"]) .highlight .kr { color: #6ebf26; font-weight: bold } /* Keyword.Reserved */
-body:not([data-theme="light"]) .highlight .kt { color: #6ebf26; font-weight: bold } /* Keyword.Type */
-body:not([data-theme="light"]) .highlight .ld { color: #d0d0d0 } /* Literal.Date */
-body:not([data-theme="light"]) .highlight .m { color: #51b2fd } /* Literal.Number */
-body:not([data-theme="light"]) .highlight .s { color: #ed9d13 } /* Literal.String */
-body:not([data-theme="light"]) .highlight .na { color: #bbbbbb } /* Name.Attribute */
-body:not([data-theme="light"]) .highlight .nb { color: #2fbccd } /* Name.Builtin */
-body:not([data-theme="light"]) .highlight .nc { color: #71adff; text-decoration: underline } /* Name.Class */
-body:not([data-theme="light"]) .highlight .no { color: #40ffff } /* Name.Constant */
-body:not([data-theme="light"]) .highlight .nd { color: #ffa500 } /* Name.Decorator */
-body:not([data-theme="light"]) .highlight .ni { color: #d0d0d0 } /* Name.Entity */
-body:not([data-theme="light"]) .highlight .ne { color: #bbbbbb } /* Name.Exception */
-body:not([data-theme="light"]) .highlight .nf { color: #71adff } /* Name.Function */
-body:not([data-theme="light"]) .highlight .nl { color: #d0d0d0 } /* Name.Label */
-body:not([data-theme="light"]) .highlight .nn { color: #71adff; text-decoration: underline } /* Name.Namespace */
-body:not([data-theme="light"]) .highlight .nx { color: #d0d0d0 } /* Name.Other */
-body:not([data-theme="light"]) .highlight .py { color: #d0d0d0 } /* Name.Property */
-body:not([data-theme="light"]) .highlight .nt { color: #6ebf26; font-weight: bold } /* Name.Tag */
-body:not([data-theme="light"]) .highlight .nv { color: #40ffff } /* Name.Variable */
-body:not([data-theme="light"]) .highlight .ow { color: #6ebf26; font-weight: bold } /* Operator.Word */
-body:not([data-theme="light"]) .highlight .pm { color: #d0d0d0 } /* Punctuation.Marker */
-body:not([data-theme="light"]) .highlight .w { color: #666666 } /* Text.Whitespace */
-body:not([data-theme="light"]) .highlight .mb { color: #51b2fd } /* Literal.Number.Bin */
-body:not([data-theme="light"]) .highlight .mf { color: #51b2fd } /* Literal.Number.Float */
-body:not([data-theme="light"]) .highlight .mh { color: #51b2fd } /* Literal.Number.Hex */
-body:not([data-theme="light"]) .highlight .mi { color: #51b2fd } /* Literal.Number.Integer */
-body:not([data-theme="light"]) .highlight .mo { color: #51b2fd } /* Literal.Number.Oct */
-body:not([data-theme="light"]) .highlight .sa { color: #ed9d13 } /* Literal.String.Affix */
-body:not([data-theme="light"]) .highlight .sb { color: #ed9d13 } /* Literal.String.Backtick */
-body:not([data-theme="light"]) .highlight .sc { color: #ed9d13 } /* Literal.String.Char */
-body:not([data-theme="light"]) .highlight .dl { color: #ed9d13 } /* Literal.String.Delimiter */
-body:not([data-theme="light"]) .highlight .sd { color: #ed9d13 } /* Literal.String.Doc */
-body:not([data-theme="light"]) .highlight .s2 { color: #ed9d13 } /* Literal.String.Double */
-body:not([data-theme="light"]) .highlight .se { color: #ed9d13 } /* Literal.String.Escape */
-body:not([data-theme="light"]) .highlight .sh { color: #ed9d13 } /* Literal.String.Heredoc */
-body:not([data-theme="light"]) .highlight .si { color: #ed9d13 } /* Literal.String.Interpol */
-body:not([data-theme="light"]) .highlight .sx { color: #ffa500 } /* Literal.String.Other */
-body:not([data-theme="light"]) .highlight .sr { color: #ed9d13 } /* Literal.String.Regex */
-body:not([data-theme="light"]) .highlight .s1 { color: #ed9d13 } /* Literal.String.Single */
-body:not([data-theme="light"]) .highlight .ss { color: #ed9d13 } /* Literal.String.Symbol */
-body:not([data-theme="light"]) .highlight .bp { color: #2fbccd } /* Name.Builtin.Pseudo */
-body:not([data-theme="light"]) .highlight .fm { color: #71adff } /* Name.Function.Magic */
-body:not([data-theme="light"]) .highlight .vc { color: #40ffff } /* Name.Variable.Class */
-body:not([data-theme="light"]) .highlight .vg { color: #40ffff } /* Name.Variable.Global */
-body:not([data-theme="light"]) .highlight .vi { color: #40ffff } /* Name.Variable.Instance */
-body:not([data-theme="light"]) .highlight .vm { color: #40ffff } /* Name.Variable.Magic */
-body:not([data-theme="light"]) .highlight .il { color: #51b2fd } /* Literal.Number.Integer.Long */
+body:not([data-theme="light"]) .highlight .go { color: #CCC } /* Generic.Output */
+body:not([data-theme="light"]) .highlight .gp { color: #AAA } /* Generic.Prompt */
+body:not([data-theme="light"]) .highlight .gs { color: #D0D0D0; font-weight: bold } /* Generic.Strong */
+body:not([data-theme="light"]) .highlight .gu { color: #FFF; text-decoration: underline } /* Generic.Subheading */
+body:not([data-theme="light"]) .highlight .gt { color: #FF3A3A } /* Generic.Traceback */
+body:not([data-theme="light"]) .highlight .kc { color: #6EBF26; font-weight: bold } /* Keyword.Constant */
+body:not([data-theme="light"]) .highlight .kd { color: #6EBF26; font-weight: bold } /* Keyword.Declaration */
+body:not([data-theme="light"]) .highlight .kn { color: #6EBF26; font-weight: bold } /* Keyword.Namespace */
+body:not([data-theme="light"]) .highlight .kp { color: #6EBF26 } /* Keyword.Pseudo */
+body:not([data-theme="light"]) .highlight .kr { color: #6EBF26; font-weight: bold } /* Keyword.Reserved */
+body:not([data-theme="light"]) .highlight .kt { color: #6EBF26; font-weight: bold } /* Keyword.Type */
+body:not([data-theme="light"]) .highlight .ld { color: #D0D0D0 } /* Literal.Date */
+body:not([data-theme="light"]) .highlight .m { color: #51B2FD } /* Literal.Number */
+body:not([data-theme="light"]) .highlight .s { color: #ED9D13 } /* Literal.String */
+body:not([data-theme="light"]) .highlight .na { color: #BBB } /* Name.Attribute */
+body:not([data-theme="light"]) .highlight .nb { color: #2FBCCD } /* Name.Builtin */
+body:not([data-theme="light"]) .highlight .nc { color: #71ADFF; text-decoration: underline } /* Name.Class */
+body:not([data-theme="light"]) .highlight .no { color: #40FFFF } /* Name.Constant */
+body:not([data-theme="light"]) .highlight .nd { color: #FFA500 } /* Name.Decorator */
+body:not([data-theme="light"]) .highlight .ni { color: #D0D0D0 } /* Name.Entity */
+body:not([data-theme="light"]) .highlight .ne { color: #BBB } /* Name.Exception */
+body:not([data-theme="light"]) .highlight .nf { color: #71ADFF } /* Name.Function */
+body:not([data-theme="light"]) .highlight .nl { color: #D0D0D0 } /* Name.Label */
+body:not([data-theme="light"]) .highlight .nn { color: #71ADFF; text-decoration: underline } /* Name.Namespace */
+body:not([data-theme="light"]) .highlight .nx { color: #D0D0D0 } /* Name.Other */
+body:not([data-theme="light"]) .highlight .py { color: #D0D0D0 } /* Name.Property */
+body:not([data-theme="light"]) .highlight .nt { color: #6EBF26; font-weight: bold } /* Name.Tag */
+body:not([data-theme="light"]) .highlight .nv { color: #40FFFF } /* Name.Variable */
+body:not([data-theme="light"]) .highlight .ow { color: #6EBF26; font-weight: bold } /* Operator.Word */
+body:not([data-theme="light"]) .highlight .pm { color: #D0D0D0 } /* Punctuation.Marker */
+body:not([data-theme="light"]) .highlight .w { color: #666 } /* Text.Whitespace */
+body:not([data-theme="light"]) .highlight .mb { color: #51B2FD } /* Literal.Number.Bin */
+body:not([data-theme="light"]) .highlight .mf { color: #51B2FD } /* Literal.Number.Float */
+body:not([data-theme="light"]) .highlight .mh { color: #51B2FD } /* Literal.Number.Hex */
+body:not([data-theme="light"]) .highlight .mi { color: #51B2FD } /* Literal.Number.Integer */
+body:not([data-theme="light"]) .highlight .mo { color: #51B2FD } /* Literal.Number.Oct */
+body:not([data-theme="light"]) .highlight .sa { color: #ED9D13 } /* Literal.String.Affix */
+body:not([data-theme="light"]) .highlight .sb { color: #ED9D13 } /* Literal.String.Backtick */
+body:not([data-theme="light"]) .highlight .sc { color: #ED9D13 } /* Literal.String.Char */
+body:not([data-theme="light"]) .highlight .dl { color: #ED9D13 } /* Literal.String.Delimiter */
+body:not([data-theme="light"]) .highlight .sd { color: #ED9D13 } /* Literal.String.Doc */
+body:not([data-theme="light"]) .highlight .s2 { color: #ED9D13 } /* Literal.String.Double */
+body:not([data-theme="light"]) .highlight .se { color: #ED9D13 } /* Literal.String.Escape */
+body:not([data-theme="light"]) .highlight .sh { color: #ED9D13 } /* Literal.String.Heredoc */
+body:not([data-theme="light"]) .highlight .si { color: #ED9D13 } /* Literal.String.Interpol */
+body:not([data-theme="light"]) .highlight .sx { color: #FFA500 } /* Literal.String.Other */
+body:not([data-theme="light"]) .highlight .sr { color: #ED9D13 } /* Literal.String.Regex */
+body:not([data-theme="light"]) .highlight .s1 { color: #ED9D13 } /* Literal.String.Single */
+body:not([data-theme="light"]) .highlight .ss { color: #ED9D13 } /* Literal.String.Symbol */
+body:not([data-theme="light"]) .highlight .bp { color: #2FBCCD } /* Name.Builtin.Pseudo */
+body:not([data-theme="light"]) .highlight .fm { color: #71ADFF } /* Name.Function.Magic */
+body:not([data-theme="light"]) .highlight .vc { color: #40FFFF } /* Name.Variable.Class */
+body:not([data-theme="light"]) .highlight .vg { color: #40FFFF } /* Name.Variable.Global */
+body:not([data-theme="light"]) .highlight .vi { color: #40FFFF } /* Name.Variable.Instance */
+body:not([data-theme="light"]) .highlight .vm { color: #40FFFF } /* Name.Variable.Magic */
+body:not([data-theme="light"]) .highlight .il { color: #51B2FD } /* Literal.Number.Integer.Long */
}
}
\ No newline at end of file
diff --git a/api/modules.html b/api/modules.html
index 2995928..1d0b03a 100644
--- a/api/modules.html
+++ b/api/modules.html
@@ -7,7 +7,7 @@
singler - singler unknown documentation
-
+
@@ -254,6 +254,10 @@ singler¶
SummarizedExperiment
.
SubmodulesReturn type:
-